七月在线公开课笔记(十一)
精排模型 🥇
在召回阶段筛选出候选集后,精排阶段负责进行精确排序。本节我们将介绍两个重要的深度学习精排模型。
Wide & Deep 模型
Wide & Deep模型巧妙地将线性模型与深度神经网络结合。
-
Wide部分:通常是一个线性模型(如LR),负责记忆(memorization),学习特征中特定、精确的规则。
-
Deep部分:是一个深度前馈神经网络,负责泛化(generalization),通过多层网络对特征进行高级抽象,学习更通用的模式。
两部分联合训练,最终输出相结合。如果将Wide部分替换为FM(Factorization Machines),则模型变为DeepFM。Wide & Deep模型是许多深度学习推荐模型的起点,它奠定了同时利用记忆与泛化能力的框架。
ESMM 模型
ESMM是阿里巴巴提出的解决CVR预估难题的模型。在电商场景中,用户行为漏斗是:曝光 -> 点击 -> 转化(购买)。我们分别关注:
-
CTR:点击率
-
CVR:点击后转化率
-
CTCVR:曝光后转化率
CVR预估的难点在于,正样本(点击后转化)非常稀疏。ESMM通过多任务学习巧妙地解决了这个问题。
模型包含两个子网络:
-
CTR预测塔
-
CVR预测塔
它们共享底层特征输入。模型的损失函数由两部分组成:
-
CTR任务的损失(使用全部曝光样本)。
-
CTCVR任务的损失(
CTCVR = CTR * CVR,也使用全部曝光样本)。
通过这种方式,CVR塔虽然只输出CVR,但其训练受到了全部曝光样本(通过CTCVR任务)的间接监督,缓解了样本稀疏问题。线上预测时,我们使用CVR塔的预测值。
ESMM是一个根据具体业务场景(样本稀疏)设计网络结构的优秀范例。类似的还有DIN(Deep Interest Network)等模型。算法工程师需要在经典模型基础上,结合业务理解进行创新。
总结 📝
本节课我们一起学习了工业界推荐系统的核心知识。我们从宏观架构入手,了解了分层设计的系统全貌。然后深入探讨了特征工程,包括Item特征、用户画像、特征类型及处理方式。接着,我们分析了召回阶段的作用与经典协同过滤算法(SVD, SVD++)。最后,我们介绍了精排阶段的深度学习模型,如Wide & Deep和解决实际业务难题的ESMM模型。
希望本课程能帮助你建立起对工业级推荐系统的整体认知,并为深入该领域的学习和实践打下基础。
人工智能—推荐系统公开课(P6):基于内容和协同过滤的推荐系统 🧠
在本节课中,我们将学习推荐系统中两种经典且重要的方法:基于内容的推荐和协同过滤推荐。我们将了解它们的基本原理、适用场景以及如何实现。
概述 📋
推荐系统是现代互联网应用的核心功能之一。本节课将重点介绍两种基础的推荐算法:基于内容的推荐和协同过滤推荐。我们将探讨它们如何工作、各自的优缺点以及在实际场景中的应用。
一、基于内容的推荐 📚
上一节我们概述了课程内容,本节中我们来看看第一种推荐方法:基于内容的推荐。
基于内容的推荐方法被称为 content based recommendation。这种方法有其独特的作用。推荐系统面临一个常见挑战,即“冷启动”问题。如果一个新平台没有大量用户历史行为数据,许多高级算法将无法有效工作。然而,基于内容的算法受此影响较小。
这种方法通常用于与文本相关的产品推荐。它完全基于用户喜欢的物品的属性进行推荐。因此,需要额外分析物品的内容。例如,分析一本书的章节、主题或作者风格,并为其添加标签。
其核心思想是:无需考虑用户之间的关联,只需考虑用户与当前商品之间的匹配程度。
核心概念与实现
以下是基于内容的推荐系统构建步骤:
-
构建物品特征向量:为每个待推荐的内容(如新闻、书籍)构建一份特征资料。常用方法是 TF-IDF。
-
TF (Term Frequency):词在当前文档中出现的频率。频率越高,重要性可能越高。
-
IDF (Inverse Document Frequency):词在所有文档中出现的频率的倒数。在所有文档中出现越频繁,其区分度越低,重要性可能越低。
-
通过TF-IDF,可以为文档中的每个词计算一个权重,从而将文档表示为一个权重向量。
# 伪代码示例:使用TF-IDF构建文档向量 from sklearn.feature_extraction.text import TfidfVectorizer documents = [“文档1内容”, “文档2内容”, ...] vectorizer = TfidfVectorizer() tfidf_matrix = vectorizer.fit_transform(documents) # 得到文档-词权重矩阵 -
-
构建用户偏好向量:根据用户历史浏览或喜欢的多个文档,计算这些文档向量的平均值或通过类似TF-IDF的方法,得到一个代表用户偏好的权重向量。
-
计算相似度并推荐:获得物品向量和用户向量后,计算它们之间的相似度。常用方法是余弦相似度。
-
公式:
cosine_similarity(A, B) = (A·B) / (||A|| * ||B||) -
值越接近1,表示方向越一致,相似度越高。
-
对所有候选物品计算与用户偏好向量的相似度,选取相似度最高的物品进行推荐。
-
示例说明
假设一个用户喜欢书籍 《Building Data Mining Applications for CRM》。系统会:
-
为所有书籍(包括用户喜欢的这本)的标题构建TF-IDF向量。
-
将用户喜欢的这本书的向量作为其偏好向量。
-
计算其他书籍向量与该偏好向量的余弦相似度。
-
推荐相似度最高的前三本书。
二、协同过滤推荐 🤝
上一节我们介绍了基于内容的推荐,本节中我们来看看另一种主流方法:协同过滤。
协同过滤是一种基于邻域的算法。其核心思想是“物以类聚,人以群分”。如果你想知道某部电影是否好看,可以询问兴趣相投的朋友的意见。协同过滤正是基于这种逻辑。
它主要分为两种模式:
1. 基于用户的协同过滤
基于用户的协同过滤的核心是找到与目标用户兴趣相似的其他用户(邻居),然后根据这些邻居的喜好来预测目标用户的喜好。
工作流程如下:
-
找到与目标用户有共同评分行为的其他用户。
-
计算目标用户与这些用户之间的相似度(如余弦相似度、皮尔逊相关系数)。
-
选取最相似的K个用户作为“邻居”。
-
根据邻居们对某个物品的评分,进行加权平均,预测目标用户对该物品的评分。
- 公式(加权平均):
预测评分 = sum(邻居相似度 * 邻居对该物品评分) / sum(邻居相似度)
- 公式(加权平均):
2. 基于物品的协同过滤
基于物品的协同过滤的核心是计算物品之间的相似度。如果用户喜欢物品A,而物品B与A非常相似,那么用户也可能喜欢物品B。
工作流程如下:
-
构建用户-物品评分矩阵(一个稀疏矩阵)。
-
计算物品之间的相似度。通常只考虑同时对两个物品都有评分的用户向量。
-
常用相似度度量:调整余弦相似度、皮尔逊相关系数。
-
皮尔逊相关系数公式(简化理解):先减去各自评分的均值,再计算余弦相似度。
-
-
对于目标用户未评分的物品,找出与该物品最相似的K个物品(这些物品用户已评分)。
-
根据这K个相似物品的评分和相似度,加权预测目标用户对当前物品的评分。
相似度/距离度量
在协同过滤中,衡量用户或物品之间的相似性至关重要。以下是几种常见方法:
-
欧氏距离:衡量空间中的直线距离。距离越小,相似度越高。
- 公式:
distance = sqrt(sum((xi - yi)^2))
- 公式:
-
杰卡德相似系数:适用于只有交互行为(如点击、购买)而无具体评分的场景。衡量集合的交集与并集的比例。
- 公式:
J(A,B) = |A∩B| / |A∪B|
- 公式:
-
余弦相似度:衡量两个向量在方向上的差异,忽略长度。常用于文本和评分向量。
- 公式:
cosine_sim(A,B) = (A·B) / (||A|| * ||B||)
- 公式:
-
皮尔逊相关系数:衡量两个变量之间的线性相关性。在计算相似度前会先减去各自的平均值,能消除用户评分尺度不一的影响。
基于物品的协同过滤实例
假设有一个用户-电影评分矩阵,我们想预测用户5对电影1的评分。
-
计算电影1与其他所有电影的相似度(例如使用皮尔逊相关系数)。
-
发现与电影1最相似的两部电影是电影3和电影6,相似度分别为0.41和0.59。
-
用户5对电影3评分为2,对电影6评分为3。
-
预测用户5对电影1的评分 =
(0.41*2 + 0.59*3) / (0.41+0.59) = 2.6
通过这种方式,可以填充评分矩阵中的空白值,从而为用户生成推荐列表。
总结 🎯
本节课中我们一起学习了推荐系统的两种基础而强大的算法。
-
基于内容的推荐:通过分析物品本身的属性/特征,为用户匹配与其历史喜好相似的物品。它不受“冷启动”问题严重困扰,特别适合文本、音乐等特征易于提取的领域。其核心是TF-IDF特征提取和余弦相似度计算。
-
协同过滤推荐:利用群体智慧进行推荐,分为基于用户和基于物品两种。
-
基于用户的协同过滤:找到相似用户,根据他们的喜好做推荐。关键是计算用户相似度。
-
基于物品的协同过滤:找到相似物品,根据用户的历史喜好做推荐。关键是计算物品相似度。
-
两者都依赖于用户-物品评分矩阵,并使用各种相似度度量方法(如余弦相似度、皮尔逊相关系数)进行计算。
-
这两种方法奠定了现代推荐系统的基础,理解它们对于学习更复杂的混合推荐、深度学习推荐模型至关重要。
人工智能—推荐系统公开课(七月在线出品) - P7:图神经网络在推荐广告场景中的应用 📊
在本节课中,我们将学习图神经网络在推荐和广告场景中的应用。课程内容分为三大部分:首先介绍图神经网络的基础概念,然后探讨其在推荐广告中的具体应用案例,最后分析图神经网络在工业界落地所需的必要组件。
第一部分:图神经网络介绍 🧠
图是一种非常常用的数据结构。典型的例子包括社交网络、用户-商品图、蛋白质结构以及交通路网和知识图谱。这些都可以描述成图结构。甚至规则的网格数据,也是图的一种特殊形式。因此,图是一个非常值得研究的领域。
接下来,我们看看图的研究一般分为哪几种。
以下是图研究的几种主要分类:
-
经典图算法:例如路径搜索、二分图匹配。这些算法在百度地图或高德地图的路径规划,以及滴滴的分单算法中都有应用。
-
概率图模型:例如条件随机场,在自然语言处理领域应用广泛。
-
图神经网络:主要包括图嵌入和GCN,这是我们今天介绍的主题。知识图谱相关内容不在此次讨论范围内。
图神经网络从2016年开始成为一个非常火热的研究方向。这主要有几个原因:首先是深度学习在CV和NLP等规则网格数据领域的成功,促使人们希望将其拓展到不规则的图数据上;其次是图神经网络拥有广泛的使用场景,许多问题都可以建模成图问题。
这里附上一张CV领域的全景图。展示这张图有两个目的:第一,说明GNN的出发点源于CNN在视觉领域和深度学习在NLP领域的成功,是一次成功的迁移;第二,提醒大家,CV、NLP、推荐广告等领域的算法内核其实是一致的,底层原理相通,并且发展有先后顺序。通常,CV领先NLP一到两年,NLP又领先推荐一到两年。因此,从事推荐的同学可以多关注NLP和CV的最新发展,以获得启发。
第二部分:图嵌入详解 🧩
上一节我们介绍了图神经网络概览,本节中我们来看看图嵌入的具体方法。
什么是嵌入?
嵌入在数学上是一个函数,将一个空间映射到另一个空间。通常情况下,是从高维抽象空间映射到低维具象空间。嵌入一般是稠密的分布式表示,这与One-Hot编码相对应。
为什么会出现嵌入这个概念呢?原因有三点:第一,抽象的事物本应有一个低维的表示;第二,计算机更善于处理低维的信息;第三,为了解决One-Hot编码的问题。One-Hot编码的问题在于其维度随物料数量线性增长,并且无法表示词语之间的相似关系。
现在,嵌入技术已经非常成熟,从Word2Vec开始,到Doc2Vec、Node2Vec,以及我们今天要讲的图嵌入。
图嵌入全景图
图嵌入从2016年发展至今,已经衍生出许多分支。我们今天只介绍一些特别重要、必须掌握的方法。
DeepWalk
DeepWalk是图嵌入的“始祖”,其思想非常简单,纯粹借鉴了Word2Vec。想象一下,如果有一个图要做图嵌入,参照Word2Vec还缺什么?Word2Vec有几个要素:词表(对应于图中的节点)、句子(需要从图中构造)和语料库(一堆句子)。DeepWalk就是解决了如何从图上构造这三个要素的问题,其方法就是随机游走。思想非常简单:在一个领域初始阶段,做出贡献相对容易。
具体做法是:给定一个带权图,从一个节点开始,按照边权定义的概率进行随机游走,生成序列。然后并行地进行多次随机游走,得到一批句子(序列),最后按照Word2Vec的方法进行优化即可。
LINE算法
LINE算法在工业界和学术界都应用得非常广泛。其建模思路与DeepWalk已完全不同,不再借鉴Word2Vec。它的思想是定义了两种相似度:一阶相似度和二阶相似度。
-
一阶相似度:由边权决定。边权越大,认为两个节点的相似度越大。
-
二阶相似度:指两个节点邻居的重合度。如果两个节点的邻居集合高度相似,则认为它们的二阶相似度高。
优化目标是让嵌入后的节点相似度分布与定义的一阶/二阶相似度分布尽可能接近。这里引出一个思考题:如何衡量两个分布的差异?常用的方法是交叉熵损失,或更广义的散度。
这里需要注意,一阶相似度和二阶相似度不能直接放在同一个损失函数中相加优化。因为对于某些节点对,一阶相似度可能要求它们远离,而二阶相似度可能要求它们接近,这会导致模型无法学习。通常的做法是分别优化,得到两个图嵌入,然后通过拼接、平均或求和等方式融合。
由此可以得到一个启发:既然可以考虑一阶、二阶相似度,那么是否可以扩展到三阶、四阶相似度呢?答案是完全可以。
Node2Vec算法
Node2Vec也是一个工业界特别常用的算法,其思想来源仍然是Word2Vec,并且改进了DeepWalk。
我们知道DeepWalk的随机游走可以理解为一种深度优先搜索。而LINE算法优化一阶相似度时,可以理解为一种广度优先搜索,它假设与谁边权越大就越相似。Node2Vec则定义了一个二阶的随机游走,平衡了BFS和DFS。
它通过两个参数p和q来控制游走策略:
-
参数p:控制回头率。p越大,越不回头,一直向前走(倾向DFS);p越小,回头概率越大。
-
参数q:控制BFS与DFS的平衡。q=1时,不做区分;q很大时,倾向于BFS(探索直接邻居);q很小时,倾向于DFS(走向远方)。
采样到序列后,就和DeepWalk一样,用Word2Vec的方法优化即可。Node2Vec在广告的Lookalike(相似人群扩展)等场景有应用。
struc2vec算法
前面我们介绍了内容相似性(相邻节点更相似)和结构相似性(在网络中结构地位相似的节点更相似)。DFS能在一定程度上解决结构相似性问题,但如果图很大,节点相隔很远,DFS可能游走不到。struc2vec通过分层的方式定义了一种结构相似性。
其核心思想是:比较两个节点是否相似,先比较它们的一阶邻居是否相似;如果相似,再比较二阶邻居;以此类推。它通过比较节点邻居的度序列(有序列表)的相似度来实现。然后,它会构建一个分层的图,每一层代表一种尺度下的结构相似性,层与层之间通过定义的权重连接。
为什么在风控场景下,struc2vec相对于Node2Vec有提升?最本质的原因是风控场景更需要结构相似性。例如,在支付宝的关系网络中,一个普通用户还款能力强,不代表另一个普通用户还款能力也强;但两个体量相似的商家,它们的还款或借贷能力可能更相似。Node2Vec通过平衡DFS和BFS采样,无法有效获得长距离的结构相似性,而struc2vec可以。
另外,注意到优化目标中的归一化项Z_k。在Word2Vec中,处理Z通常使用负采样或层次Softmax。这里为什么可以用层次Softmax?因为在Word2Vec中,词频不均匀,构建的哈夫曼树不平衡;而在图嵌入中,每个节点出现的“词频”可以视为1,构建的哈夫曼树是平衡的,因此可以使用层次Softmax。
GraphSAGE算法
struc2vec介绍了结构相似性的概念。而GraphSAGE是在推荐系统广告大规模落地中一个非常犀利的武器。
这里先介绍两个概念:归纳式学习和直推式学习。
-
直推式学习:之前介绍的算法都属于此类。给定一个图,学习图中每个节点的嵌入,并存储起来。当图发生变化时,需要重新学习。
-
归纳式学习:GraphSAGE是代表。它既学习节点的嵌入,也学习如何得到这个嵌入的方法论。当图发生变化或出现新节点时,可以通过学到的聚合函数,根据新节点的邻居迅速生成其嵌入。这在推荐系统中非常重要,因为推荐系统的图通常巨大且变化飞快。
GraphSAGE算法分为两步:采样和聚合。
-
采样:对于每个中心节点,采样其一定数量的一阶邻居,然后对每个邻居再采样其一定数量的邻居(二阶),以此类推。
-
聚合:将采样到的邻居信息通过一个聚合函数,逐层聚合到中心节点上,最终得到该节点的嵌入。聚合函数可以是均值池化、最大池化或LSTM等。
GraphSAGE后面我们会介绍其在推荐中的一个重要应用——PinSAGE算法。
GraphWave算法
最后简单提一下GraphWave,这也是一个基于结构相似性假设的算法,但它是完全无监督的,不需要任何先验知识,只需要一个图,通过一些方式就能得到节点的嵌入函数,速度快且效果不错。
图嵌入方法总结
图嵌入最主要的问题是如何选择模型。实际上,选择什么样的模型一定要与你的实际问题相关。最重要的是构图,在图神经网络领域,图往往不是天然形成的,即使像社交网络这样的天然图,也需要进行精炼,例如对边权进行先验加工。在电商领域,一定要把图构好,这是后续所有工作的最关键基础。
第三部分:图卷积网络简介 ⚙️
图卷积网络涉及更多图谱理论背景,在此不做深入介绍,只做类比:
-
图嵌入 类比于 NLP 中的 Word2Vec。
-
图卷积网络 类比于 CV 中的 CNN。
图嵌入一般对应于两阶段建模,即先用某种算法得到图嵌入,再将其作为特征赋能给上游任务。GCN 则通常是端到端的,可以直接做分类等任务。GCN 也可以生成节点嵌入,供上层任务使用。广义上,图嵌入属于 GCN 的一种。图嵌入通常是浅层网络,参数少;而 GCN 可以做得非常深。但需要注意的是,基于谱理论的 GCN 需要在全图上进行卷积,计算性能较慢,目前在工业界大规模落地的场景还不多。
第四部分:图神经网络在推荐广告中的应用案例 🚀
上一部分我们介绍了理论基础,现在进入实践部分,看看图神经网络在推荐广告中的具体应用案例。
应用范式
图神经网络在推荐广告中的应用主要有两大范式:端到端和两阶段。
-
端到端:图神经网络作为模型的一部分,与其他特征处理模型结合,共同进行训练和预测。
-
两阶段:先使用图神经网络预训练得到图嵌入,然后将这些嵌入作为特征,输入到主模型中进行训练。
目前工业界成熟的应用以端到端为主。两阶段建模存在模型更新冲突等问题,应用相对较少。
案例一:GCMC(图卷积矩阵补全)
这是一个比较朴素的方法。其思想很简单:将推荐问题建模为矩阵补全问题,用户-物品交互矩阵中的已知项是真实值,未知项需要预测。做法是构建一个用户-物品二分图,然后对这个图做图嵌入或图卷积,得到用户和物品的嵌入,最后通过计算用户和物品嵌入的相似度来预测链接(即评分)。这篇文章使用的GCN是在全图上操作的,计算开销大,工程复杂性高,不具备落地性,但可以帮助理解GCN在召回中是如何应用的。
案例二:PinSAGE(基于GraphSAGE的大规模落地)
这是基于GraphSAGE的一个成功落地实践,由Pinterest和斯坦福大学共同研究,在工业界的推荐广告场景中被广泛沿用。其业务场景是图片推荐,可以理解为图片版的“抖音”。用户可以将图片收藏到画板中,如果两个图片位于同一个画板,则认为它们之间存在关联,由此构建一个图片-画板二分图。
构图思考:电商场景如何构图?可以只构建商品图(同构图),或用户-商品交互图(异构图)。新闻推荐也可以类似地构建用户-新闻的交互图。
PinSAGE算法:其图神经网络模型基于GraphSAGE,但做了采样和聚合上的优化。采样时不是随机采样,而是基于重要性采样。训练采用有监督方式,正样本是用户短时间内连续点击的图片对,使用带间隔的排序损失进行优化。
工程优化:这篇论文包含大量工程实践,非常值得一读。
-
重要性采样:不是基于随机游走,而是基于边权的重要性进行采样。
-
Warm-up:在大批次训练时使用,防止训练初期跑偏。
-
分布式异步训练:利用多GPU并行计算梯度,异步更新。
-
困难负样本挖掘:不仅使用随机负样本,还加入难以区分的负样本,提升模型区分能力。但困难负样本的比例需要逐步增加,如果一开始全部使用最难样本,模型可能无法收敛。
-
服务端优化:使用MapReduce预先计算所有节点的嵌入,避免线上服务时重复计算,然后进行近似最近邻检索。
案例三:淘宝的图嵌入实践
淘宝的实践展示了电商场景如何构图以及图嵌入的演进。
-
早期(2016-17):基于用户会话构建商品序列图,然后使用DeepWalk等算法学习商品嵌入,用于多路召回。
-
升级版:不仅考虑商品实体,还加入了商品的附加信息(Side Information),如品牌、价格、类别等。它采用了端到端范式中“GNN作为主模型”的方式,将商品属性也作为图中的节点,通过注意力机制区分不同属性的重要性,共同学习得到最终的嵌入。
两阶段建模的应用
两阶段建模在工业界也有应用,但公开案例较少。通常适用于拥有多产品线的大公司。例如,阿里可以用全站数据(淘宝、天猫、1688等)构建一个全局图,训练一个通用的图嵌入模型。这个模型学到的用户和商品嵌入,可以赋能给各个独立产品的推荐系统,实现知识的迁移。
第五部分:图神经网络工业落地必要组件 🛠️
最后,我们介绍图神经网络在工业界落地时需要的必要组件。对于大公司倾向于自研,中小公司可使用开源软件进行二次开发。
除了算法,还需要解决许多工程问题:图太大如何存储?如何实现高性能的图操作(如采样)?图神经网络如何与深度学习框架深度结合?
以阿里的高性能图学习平台Euler为例,其架构通常包含以下几层:
-
图存储与分布式引擎:底层是图的分布式存储。存储方式有两种:按点分区和按边分区。按点分区方便并行采样,但可能受热点节点影响;按边分区则能避免数据倾斜问题。
-
图查询语言:提供类SQL的图查询语言,用户编写查询后,底层会进行优化并执行。
-
消息传递抽象层:将图神经网络的核心操作抽象为消息传递、聚合和更新三个步骤,并提供基础算子。
-
算法层:实现常用的图算法,供用户快速调用。
高性能采样实现:在异构图(多种边类型)上,需要支持按不同类型、不同权重进行采样。通常的作法是存储每个节点的邻居列表、边类型、边权以及边权的前缀和。采样时,根据要采样的边类型和随机数,通过二分查找快速定位到具体的邻居节点,从而实现高效采样。
课程总结 📝
本节课我们一起学习了图神经网络在推荐广告场景中的应用。我们从图神经网络的基础概念讲起,详细介绍了多种图嵌入方法及其特点。然后,通过PinSAGE、淘宝等案例,深入分析了图神经网络在工业界的实际应用范式与优化技巧。最后,探讨了图神经网络落地所必需的工程组件,如图存储、高性能采样等。
希望本课程能帮助你建立起对图神经网络在推荐广告领域应用的系统性认识。图神经网络方兴未艾,在构图、算法、工程等方面仍有广阔的探索空间。
人工智能—推荐系统公开课(七月在线出品) - P8:推荐系统算法技术发展(各模型的演进) 📈
在本节课中,我们将要学习推荐系统核心算法技术的发展脉络,重点聚焦于召回与排序两大模块的演进历程。我们将从最基础的协同过滤开始,逐步深入到当前主流的深度学习模型,了解每个阶段的核心思想、代表性模型及其解决的问题。
概述
推荐系统在我们的数字生活中无处不在,无论是观看视频还是在线购物,我们所接触的内容大多由推荐系统生成。对于亚马逊、京东、字节跳动等平台而言,推荐和广告系统的收益占比极高。推荐系统主要基于用户的行为数据,学习其兴趣偏好,进而进行个性化推荐。
其核心流程通常分为两步:召回和排序。召回阶段负责从海量商品(如千万甚至上亿级别)中快速筛选出数百个候选物品,模型相对简单,注重效率。排序阶段则对召回结果进行精细排序,使用更复杂的模型和丰富的特征,以选出最符合用户兴趣的Top-N个物品进行最终推荐。部分场景下还会进行重排序以进一步提升效果。
第一部分:召回模块的发展
上一节我们概述了推荐系统的整体流程,本节中我们来看看召回模块的具体算法是如何演进的。召回的目标是缩小搜索范围,从全量物品中快速筛选出用户可能感兴趣的候选集。
1. 协同过滤(Collaborative Filtering)
协同过滤是推荐系统最经典的算法之一,其核心思想是利用用户或物品之间的相似性进行推荐。它主要分为两类:基于用户的协同过滤和基于物品的协同过滤。
基于用户的协同过滤(UserCF):寻找兴趣相似的用户,将相似用户喜欢的物品推荐给目标用户。它更适用于社交性强、用户兴趣相对稳定的场景,如新闻推荐。
公式:计算用户相似度常用余弦相似度。例如,用户A和用户B的向量分别为 Va 和 Vb,其相似度为:
sim(A, B) = (Va · Vb) / (||Va|| * ||Vb||)
基于物品的协同过滤(ItemCF):寻找物品之间的相似性,将与用户历史喜欢物品相似的物品推荐给用户。它更适用于用户兴趣变化快、物品相对稳定的场景,如电商推荐。
2. 关联规则召回
关联规则召回基于用户的行为序列,挖掘物品之间的共现关系。其核心思想是,在同一行为窗口(如同一购物车、同一浏览会话)内出现的物品具有关联性。
核心概念:关联强度不仅取决于是否共现,还受到共现距离的影响。距离越近的物品,关联性越强。
公式:通常会给关联强度一个基础分(如0.8),并根据共现距离进行衰减。例如,物品i和j的关联分数可定义为:score(i, j) = base_score ^ |pos(i) - pos(j)|,其中 pos 表示物品在序列中的位置。
以下是关联召回的基本步骤:
-
从用户历史行为序列中,滑动窗口提取物品对。
-
根据上述公式计算每对物品的关联分数。
-
对于目标用户,聚合其历史物品的所有关联物品,并按分数排序。
-
剔除用户已交互过的物品,取Top-N作为召回结果。
3. 单向量召回(Single Embedding)
单向量召回的核心思想是为每个用户和物品学习一个稠密的向量表示(Embedding),通过向量相似度(如余弦相似度)进行快速匹配。线上服务时,使用近似最近邻搜索(如Faiss库)加速检索。
经典模型:YouTube DNN
该模型是业界标杆。它将用户观看历史、搜索历史等特征通过Embedding层和池化层(如平均池化)转化为固定长度的向量,再经过多层全连接网络,最终输出用户向量。物品向量则通过Softmax层的权重得到。由于物品数量巨大,训练时会采用负采样技术。
经典模型:双塔模型(DSSM)
双塔模型最初用于语义匹配,后被引入推荐系统。它包含两个独立的“塔”式神经网络,分别处理用户特征(如历史行为、人口属性)和物品特征。两个塔的输出向量进行点积或余弦相似度计算,得到匹配分数。线上服务时,同样预存物品向量,通过向量检索进行召回。
4. 多向量召回(Multi-Embedding)
单向量召回假设用户兴趣是单一的,但实际用户兴趣往往是多元的。用一个向量表示所有兴趣,可能会被高频兴趣主导,导致推荐多样性不足。
经典模型:MIND(Multi-Interest Network with Dynamic Routing)
MIND模型使用胶囊网络(Capsule Network)为用户生成多个兴趣向量。其关键结构是动态路由层,它能够根据当前候选物品,自适应地激活和组合用户的不同兴趣胶囊,从而生成更具针对性的用户表示。这更好地建模了用户的多方面兴趣。
5. 图嵌入召回(Graph Embedding)
图嵌入召回将用户行为序列构建成图结构,利用图算法学习物品的Embedding。它能捕获物品之间复杂、高阶的关联关系。
经典算法:DeepWalk
DeepWalk通过随机游走(Random Walk)在用户-物品交互图上生成物品序列,然后将这些序列视为“句子”,使用Word2Vec中的Skip-gram模型来学习物品的向量表示。游走时可以设置边权(如点击、购买赋予不同权重)来影响游走路径。
经典算法:Node2Vec
Node2Vec是DeepWalk的扩展,它通过调整游走策略,在广度优先搜索(BFS)和深度优先搜索(DFS)之间取得平衡。BFS倾向于学习结构的相似性(同质性),DFS倾向于学习内容的相似性(结构性),从而得到更丰富的节点表示。
6. 增强图嵌入与知识图谱召回
基础的图嵌入仅使用了物品ID信息,对于新品或冷门物品(冷启动问题)效果不佳。
经典模型:EGES(Enhanced Graph Embedding with Side Information)
EGES模型在DeepWalk的基础上,引入了物品的边信息(Side Information),如类别、品牌、价格等。它为每种边信息也学习一个Embedding,然后通过注意力机制加权融合物品ID的Embedding和所有边信息的Embedding,生成最终的物品向量。这有效缓解了冷启动问题。
知识图谱召回
知识图谱召回利用结构化的知识库(包含商品、类别、属性、品牌等实体及它们之间的关系)进行推荐。它可以实现更精准的搭配推荐(如手机配手机壳),并能结合时效性热点(如利用历史爆款信息预测新品潜力)。通过在图谱上推理,可以挖掘用户深层的兴趣概念,而不仅仅是具体的商品ID。
第二部分:排序模块的发展
上一节我们介绍了召回模块如何从海量数据中快速筛选候选集,本节中我们来看看排序模块如何对这些候选进行精细打分与排序。排序阶段是推荐系统的“精加工”环节,模型复杂,特征工程至关重要。
1. 人工特征与线性模型时代(2010年前)
这个阶段的核心是特征工程。模型本身(如逻辑回归LR)相对简单,效果严重依赖于人工构建的特征质量。
特征处理方式:
-
类别特征:先进行Label Encoding(转换为0,1,2,…),再进行One-Hot Encoding,转化为稀疏向量。
-
连续特征:进行归一化(如Min-Max Scaling),以消除量纲影响。也可进行分桶(Binning),将其转化为类别特征,便于后续交叉。
-
特征交叉:人工构造二阶、三阶特征组合(如“性别_年龄_职业”),以捕捉特征间的交互作用。
-
专家特征:基于业务理解构造的特征(如复购周期、购买力)。
模型通常采用逻辑回归(LR),其输出是一个0到1之间的概率值,表示用户点击或转化的可能性。
公式:P(y=1|x) = 1 / (1 + exp(-(w0 + Σ wi*xi))),其中 xi 是特征,wi 是权重。
2. 自动特征交叉与非线性模型发展期(2010-2015)
此阶段,模型开始具备自动学习特征交叉的能力,减轻了对人工特征工程的依赖。
因子分解机(FM)
FM在LR的基础上,增加了自动学习二阶特征交叉的能力。它通过为每个特征学习一个隐向量,通过隐向量的内积来建模特征交叉的权重。
公式:y(x) = w0 + Σ wi*xi + Σ Σ <vi, vj> * xi * xj。FM的参数复杂度是线性的,计算高效。
场感知因子分解机(FFM)
FFM是FM的改进,引入了“场”的概念。同一个特征在与不同特征域的特征进行交叉时,会使用不同的隐向量,建模更加精细。
梯度提升树(GBDT)+ LR
Facebook提出的经典模型。先用GBDT对原始特征进行自动组合与筛选,GBDT每棵树的叶子节点对应一种特征组合。然后将样本落入的叶子节点进行One-Hot编码,生成新的高维稀疏特征向量,再输入给LR进行训练。GBDT负责进行高阶特征交叉,LR负责最终拟合。
3. 深度学习时代(2015年至今)
深度学习模型通过多层神经网络自动学习高阶、非线性的特征交互,成为当前的主流。
模型演进的核心方向:
-
离散特征Embedding化:将高维稀疏的类别特征映射为低维稠密向量,作为模型输入。
-
显式与隐式特征交叉:
-
显式交叉:如PNN(Product-based Neural Network)在Embedding层后显式地引入内积/外积操作来捕获二阶交互。
-
隐式交叉:通过多层全连接网络(DNN)自动学习高阶特征交互。
-
-
记忆与泛化结合:
-
记忆:通过线性模型(Wide部分)记忆历史数据中频繁出现的特征模式。
-
泛化:通过深度网络(Deep部分)泛化到未曾出现过的特征组合。
-
-
引入注意力机制:对用户历史行为序列中的不同物品赋予不同的权重,动态响应当前候选物品。
经典模型:Wide & Deep
谷歌提出的模型,结构简单有效。Wide部分是线性模型(如LR),用于记忆;Deep部分是DNN,用于泛化。两部分联合训练。
# 伪代码概念
final_logits = linear_layer(wide_features) + dnn_layer(deep_features)
output = sigmoid(final_logits)
经典模型:DeepFM
DeepFM用FM替换了Wide & Deep中的Wide部分。FM负责显式地学习二阶特征交叉,DNN负责学习高阶隐式交叉。两者共享Embedding层输入,端到端训练。
经典模型:DIN(Deep Interest Network)
DIN针对用户历史行为序列设计。传统方法(如平均池化)平等对待所有历史行为。DIN引入了注意力机制,根据当前候选物品,动态计算用户历史行为中每个物品的权重,从而生成与当前候选相关的用户兴趣表示。
核心思想:用户兴趣是多样的,且针对不同的候选物品,其兴趣的侧重点应不同。
多任务学习
在实际业务中,我们往往需要同时优化多个目标,如点击率(CTR)和转化率(CVR)。多任务学习模型通过共享底层特征和网络参数,同时学习多个相关任务,能有效利用数据,缓解数据稀疏问题,并防止模型在单一任务上过拟合。
第三部分:总结与展望
本节课中我们一起学习了推荐系统召回与排序两大核心模块的技术演进史。
召回模块的发展从基于规则的协同过滤和关联召回,发展到基于表示学习的单向量/多向量召回、图嵌入召回,再到融合丰富信息的增强图嵌入与知识图谱召回。其趋势是:从统计规则走向表示学习,从单一兴趣建模走向多元兴趣与复杂关系建模,并不断融合更多辅助信息以解决冷启动等问题。
排序模块的发展从依赖人工特征工程的线性模型,演进到具备自动特征交叉能力的因子分解机和树模型,最终进入以深度学习为主导的时期。深度学习模型通过Embedding、复杂网络结构(如注意力机制、序列建模)、以及多任务学习等技术,极大地提升了模型的表达能力和效果。
未来趋势包括但不限于:强化学习与推荐的结合以实现更优的长期收益;更强大的序列建模(如Transformer)在推荐中的应用;以及多模态信息(图像、文本、视频)的深度融合。
总而言之,推荐系统算法的发展是一个不断吸收机器学习、深度学习、自然语言处理、图计算等领域最新成果的过程,其核心目标始终是更精准、更高效、更个性化地连接用户与内容。
人工智能—推荐系统公开课(七月在线出品) - P9:推荐系统导论:从推荐算法到案例应用
概述
在本节课中,我们将要学习推荐系统的基本概念、核心算法及其评估方法。课程将从推荐系统的存在意义讲起,介绍其基本结构和评估准则,然后深入讲解一系列在工业界非常实用的推荐算法,包括内容推荐、协同过滤、矩阵分解以及基于用户行为序列的Word2Vec应用。最后,我们会通过简单的代码案例来理解部分算法的实现。
为什么需要推荐系统?
互联网数据量爆炸式增长带来了信息过载问题。一个人每天接触到的文字、声音和图像信息量巨大,各类平台每天新增的内容也远超个人的处理能力。为了解决用户在海量信息中快速找到所需内容的问题,推荐系统应运而生。
早期的解决方案是分类导航(如雅虎)和搜索引擎,它们需要用户主动提供关键词。然而,人们越来越希望系统能主动发现其兴趣和需求,甚至带来惊喜(Surprise)。推荐系统正是为了满足这种“被动获取个性化信息”的需求而存在。
对于用户而言,推荐系统能帮助发现新鲜事物、辅助决策、节省时间。对于商家而言,它能提供更个性化的服务,提高用户粘性和信任度,并直接带来显著的营收增长。例如,Netflix三分之二的电影观看源于推荐,亚马逊35%的营业额来自推荐,今日头条半数以上的点击也来源于推荐。
推荐系统是什么?
通俗理解
推荐系统会根据用户的历史行为、社交关系、兴趣点以及当前所处的上下文环境,来判断用户的当前需求和兴趣点,并将合适的商品或内容推荐给用户。
-
历史行为:是判断用户兴趣的主要数据来源,例如阅读过的新闻、购买过的商品。
-
社交关系:当用户历史行为数据不足(冷启动问题)时,可以通过其社交关系来推测其可能喜好。
-
兴趣点:可通过用户注册信息或历史行为挖掘获得。
-
上下文环境:指用户当前的情境或浏览内容,对于提升推荐精准度至关重要。例如,即使用户历史喜欢衬衫,但若当前一直在浏览牛仔裤,则推荐牛仔裤可能更有效。
数学定义
用数学语言更精确地描述,推荐系统要做的是:
给定全体用户集合 C 和全体商品(或内容)集合 S,以及一个评估函数 U。对于任意一个用户 c ∈ C,推荐系统需要遍历所有商品 s ∈ S,计算评估函数 U(c, s) 的值,然后选择使该函数值最大的商品 s 推荐给用户 c。
用公式表示核心决策过程为:
s' = argmax_{s ∈ S} U(c, s)
其中,U(c, s) 衡量了将商品 s 推荐给用户 c 的效用或得分。
推荐系统的基本结构
一个典型的推荐系统结构包含线下(Offline)和线上(Online)两部分。
-
线下部分(Offline):
-
数据处理:包括数据清洗、特征提取等,为模型准备干净、有效的输入数据。
-
模型训练:使用处理后的数据训练推荐模型,目标是优化准确度等指标。
-
-
线上部分(Online):
-
模型加载:将训练好的模型部署到线上环境。
-
上下文感知:结合用户当前的实时行为和环境信息。
-
生成推荐:利用模型和上下文信息,实时生成推荐结果并返回给用户。
-
线下部分的核心是模型准确度,线上部分则对速度和实时性有极高要求。
如何评估推荐系统?
评估推荐系统好坏需要多方面的标准,而不仅仅是准确度。
1. 准确度(针对打分系统)
对于允许用户显式评分(如5星评分)的系统,常用均方根误差(RMSE)和平均绝对误差(MAE)来衡量预测评分与实际评分的差距。
-
RMSE(均方根误差):
RMSE = sqrt( (1/|T|) * Σ_{(u,i)∈T} (r_{ui} - r̂_{ui})^2 )其中,
r_{ui}是用户 u 对商品 i 的实际评分,r̂_{ui}是预测评分,T 是测试集。 -
MAE(平均绝对误差):
MAE = (1/|T|) * Σ_{(u,i)∈T} |r_{ui} - r̂_{ui}|
2. 准确率与召回率(针对Top-N推荐)
对于隐式反馈(如点击/购买)系统,用户只有“感兴趣”或“不感兴趣”的行为。常用准确率(Precision)和召回率(Recall)来评估。
-
准确率:推荐的商品中,用户真正感兴趣的比例。
Precision = |推荐集 ∩ 用户真实感兴趣集| / |推荐集| -
召回率:用户真正感兴趣的商品中,被系统推荐出来的比例。
Recall = |推荐集 ∩ 用户真实感兴趣集| / |用户真实感兴趣集|
3. 覆盖率
覆盖率衡量推荐系统能够发掘长尾商品、避免马太效应(热门商品越来越热)的能力。
-
简单覆盖率:被推荐过的商品种类数占总商品种类数的比例。
Coverage = |被推荐过的商品集合| / |总商品集合| -
信息熵覆盖率:考虑商品被推荐次数的分布均匀性,分布越均匀,覆盖率质量越高。
H = -Σ_{i=1}^{n} p_i log p_i其中,
p_i是商品 i 被推荐的概率(次数占比)。
4. 多样性
多样性指推荐列表内商品之间的不相似性。高的多样性可以增加用户的选择空间,可能提升购买转化率。
Diversity = 1 - ( Σ_{i∈R, j∈R, i≠j} sim(i, j) ) / (0.5 * |R| * (|R|-1) )
其中,sim(i, j) 是商品 i 和 j 的相似度,R 是推荐列表。需要对所有用户的多样性求平均。
5. 其他指标
-
惊喜度:推荐用户不知道但会很喜欢的内容的能力,能极大提高用户粘性。
-
新颖度:推荐结果的新鲜程度,避免重复推荐。
-
信任度:提供推荐理由(如“你的朋友也喜欢”),能增加用户对推荐结果的接受度。
-
实时性:对于新闻等场景尤为重要。
经典推荐算法
本节我们将介绍一系列经典的推荐算法,这些算法在Netflix推荐大赛中获奖团队均有使用,在工业界非常实用。
1. 基于内容的推荐
该方法基于用户过去喜欢的商品(Item)的属性,推荐与之内容相似的其他商品。
核心思想:
-
为每个待推荐的商品建立一份内容资料(Profile),通常使用TF-IDF等方法将文本内容转化为特征向量。
-
为用户建立一份资料,基于其历史喜欢商品的内容特征向量聚合(如平均)而成。
-
计算待推荐商品与用户资料向量的相似度(如余弦相似度),按相似度高低进行推荐。
优点:不需要其他用户的行为数据,能解决新商品的冷启动问题。
缺点:依赖内容特征挖掘,推荐结果多样性可能受限,难以产生惊喜。
2. 协同过滤
协同过滤是应用最广泛的推荐算法之一,它仅使用用户-商品的交互数据(评分、点击等),而不需要商品内容信息。
User-Based 协同过滤
核心思想:找到与目标用户兴趣相似的用户群体(邻居),然后将邻居喜欢的商品推荐给目标用户。
-
计算用户相似度:利用用户-商品评分矩阵,计算目标用户与其他用户的相似度(如余弦相似度、皮尔逊相关系数)。皮尔逊相关系数通过减去用户平均分来消除用户打分严格度差异的影响。
-
生成推荐:根据相似用户的评分,加权预测目标用户对未评分商品的兴趣。
Item-Based 协同过滤
核心思想:找到与目标商品相似的商品集合,然后将这些相似商品推荐给喜欢目标商品的用户。
-
计算商品相似度:利用用户-商品评分矩阵,计算商品之间的相似度。
-
生成推荐:根据用户历史喜欢的商品,找出其相似商品进行推荐。
工业界更常用Item-Based CF的原因:
-
商品数量通常远小于用户数量,计算和存储相似度矩阵更高效。
-
商品相似度相对稳定,而用户兴趣可能随时间变化。
协同过滤的优缺点:
-
优点:不需要领域知识,仅凭用户行为就能产生推荐;在用户行为丰富时准确度高。
-
缺点:
-
冷启动问题:新用户或新商品缺少足够交互数据。
-
稀疏性问题:用户-商品矩阵非常稀疏时,难以找到可靠关联。
-
同款问题:无法自动关联不同ID的同款商品。
-
3. 隐语义模型(矩阵分解)
为了克服协同过滤的稀疏性问题,隐语义模型被提出。它通过降维技术来发现用户和商品背后隐藏的“因子”。
核心思想:将用户-商品评分矩阵 R (m×n) 分解为两个低维矩阵的乘积:
R ≈ P * Q^T
其中,P (m×k) 是用户-隐因子矩阵,表示用户对各个隐因子的兴趣程度;Q (n×k) 是商品-隐因子矩阵,表示商品在各个隐因子上的强度。k 是隐因子的数量,远小于 m 和 n。
优化目标:最小化预测评分与实际评分的差异,并加入正则化项防止过拟合。
min_{P,Q} Σ_{(u,i)∈已知评分} (r_{ui} - p_u · q_i^T)^2 + λ(||p_u||^2 + ||q_i||^2)
通常使用随机梯度下降来求解 P 和 Q。
进阶:引入偏置项,考虑全局平均分、用户偏置、商品偏置,使模型更精准:
预测评分 = μ + b_u + b_i + p_u · q_i^T
其中,μ 是全局平均分,b_u 是用户偏置,b_i 是商品偏置。
4. 基于用户行为序列的建模(Word2Vec思想的应用)
将用户在会话中的商品点击序列类比为自然语言中的句子,将每个商品视为一个“词”。应用 Word2Vec 中的 Skip-gram 等模型进行训练,可以得到每个商品的向量表示(Embedding)。
核心思想:在序列中相邻的商品,其向量在嵌入空间中也应该接近。这捕捉了商品之间的“上下文”关联,这种关联基于用户的实际行为模式,而非商品本身的属性。
作用:这种方法能有效挖掘商品间的深层关联,补充协同过滤在覆盖率上的不足,尤其擅长发现行为上的搭配关系。
案例与代码示例
上一节我们介绍了多种推荐算法的原理,本节中我们来看看简单的代码实现,以加深理解。
以下是两个简化示例:
示例1:User-Based 协同过滤(Python手写示例)
这个示例演示了如何计算用户相似度并做出推荐。
# 计算用户相似度(以欧氏距离为例)
def euclidean_distance(rating1, rating2):
distance = 0
for key in rating1:
if key in rating2:
distance += (rating1[key] - rating2[key]) ** 2
return distance ** 0.5
<https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/julyedu/img/460d2baf695d4ca0cb3814830da81f59_8.png>
<https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/julyedu/img/460d2baf695d4ca0cb3814830da81f59_9.png>
<https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/julyedu/img/460d2baf695d4ca0cb3814830da81f59_11.png>
<https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/julyedu/img/460d2baf695d4ca0cb3814830da81f59_13.png>
<https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/julyedu/img/460d2baf695d4ca0cb3814830da81f59_15.png>
# 寻找最近邻用户
def find_nearest_neighbor(username, users):
distances = []
for user in users:
if user != username:
distance = euclidean_distance(users[user], users[username])
distances.append((distance, user))
distances.sort() # 按距离排序
return distances
# 生成推荐
def recommend(username, users):
nearest = find_nearest_neighbor(username, users)[0][1] # 取最近邻
recommendations = []
neighbor_ratings = users[nearest]
user_ratings = users[username]
for item in neighbor_ratings:
if item not in user_ratings:
recommendations.append((item, neighbor_ratings[item]))
return sorted(recommendations, key=lambda x: x[1], reverse=True) # 按评分排序
# 示例数据
users = {
"小明": {"电影A": 5, "电影B": 3, "电影C": 4},
"小红": {"电影A": 3, "电影B": 4, "电影D": 5},
"小刚": {"电影B": 2, "电影C": 5, "电影D": 3},
}
print(recommend("小明", users))
示例2:矩阵分解(Python手写SGD示例)
这个示例演示了如何使用梯度下降进行简单的矩阵分解。
import numpy as np
def matrix_factorization(R, P, Q, K, steps=5000, alpha=0.0002, beta=0.02):
Q = Q.T
for step in range(steps):
for i in range(len(R)):
for j in range(len(R[i])):
if R[i][j] > 0: # 只对已知评分进行训练
eij = R[i][j] - np.dot(P[i,:], Q[:,j])
for k in range(K):
P[i][k] = P[i][k] + alpha * (2 * eij * Q[k][j] - beta * P[i][k])
Q[k][j] = Q[k][j] + alpha * (2 * eij * P[i][k] - beta * Q[k][j])
# 计算总误差
e = 0
for i in range(len(R)):
for j in range(len(R[i])):
if R[i][j] > 0:
e = e + (R[i][j] - np.dot(P[i,:], Q[:,j])) ** 2
for k in range(K):
e = e + (beta/2) * (P[i][k]**2 + Q[k][j]**2)
if e < 0.001:
break
return P, Q.T
# 示例:一个4x4的评分矩阵,0表示未评分
R = np.array([
[5, 3, 0, 1],
[4, 0, 0, 1],
[1, 1, 0, 5],
[1, 0, 0, 4],
[0, 1, 5, 4],
])
N, M = R.shape
K = 2 # 隐因子数量
P = np.random.rand(N, K)
Q = np.random.rand(M, K)
P_new, Q_new = matrix_factorization(R, P, Q, K)
# 重构的评分矩阵
R_pred = np.dot(P_new, Q_new.T)
print(R_pred)
运行后,R_pred矩阵中原本为0的位置会被填上预测的分数。
总结
本节课中我们一起学习了推荐系统的核心知识。我们从推荐系统存在的必要性讲起,理解了其数学定义和基本架构。重点探讨了如何从准确度、召回率、覆盖率、多样性等多维度评估一个推荐系统。
随后,我们深入讲解了四大类经典且实用的推荐算法:基于内容的推荐、协同过滤(User-Based与Item-Based)、隐语义模型(矩阵分解)以及基于Word2Vec思想的用户行为序列建模。我们分析了它们的原理、优缺点及适用场景,并通过简单的代码示例演示了协同过滤和矩阵分解的基本实现。
推荐系统是一个复杂的工程系统,在实际应用中通常需要融合多种算法,并结合产品设计、实时计算、A/B测试等,才能达到最佳效果。希望本课程为你打开了推荐系统的大门。
人工智能—机器学习中的数学(七月在线出品) - P1:Taylor展式与拟牛顿 🧮
在本节课中,我们将要学习泰勒展式(Taylor Expansion)及其在机器学习中的重要应用,特别是拟牛顿法(Quasi-Newton Method)。我们将从泰勒展式的定义出发,探讨其在函数近似计算、基尼系数解释以及牛顿法中的应用,并最终理解如何利用泰勒展式推导出高效的优化算法。
泰勒展式的定义与公式 📐
上一节我们介绍了课程概述,本节中我们来看看泰勒展式的核心定义。
如果给定一个函数 ( f(x) ),它在某一点 ( x_0 ) 处具有直到 ( n ) 阶的导数,那么 ( f(x) ) 就可以在 ( x_0 ) 处进行 ( n ) 阶泰勒展开,得到如下公式:
[
f(x) = f(x_0) + f’(x_0)(x - x_0) + \frac{f’'(x_0)}{2!}(x - x_0)^2 + \cdots + \frac{f^{(n)}(x_0)}{n!}(x - x_0)^n + R_n(x)
]
这个公式的含义是:函数值 ( f(x_0) ) 加上一阶导数乘以差值 ( (x - x_0) ),再加上二阶导数乘以差值平方并除以 ( 2! ),以此类推。( R_n(x) ) 是余项。
如果我们令 ( x_0 = 0 ),在原点处进行泰勒展开,得到的式子就是麦克劳林公式(Maclaurin Series)。因此,麦克劳林公式是泰勒展式在原点展开的特例。
泰勒展式的应用:函数近似计算 🔢
理解了泰勒展式的定义后,本节中我们来看看如何利用它进行函数近似计算。
利用泰勒展式,我们可以方便地计算一些初等函数的值。例如,对 ( \sin(x) ) 在原点展开,由于其导数的周期性,我们可以得到其展开式。取前若干项的和,就可以作为 ( \sin(x) ) 在某个弧度值下的近似。
另一个例子是计算 ( e^x )。在原点处展开 ( e^x ) 得到:
[
e^x = 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \cdots
]
令 ( x = 1 ),则可以得到自然常数 ( e ) 的定义:
[
e = \sum_{i=0}^{\infty} \frac{1}{i!}
]
在实践中,为了计算如 ( e^{100} ) 这样的大数,直接使用原点处的泰勒展开误差较大。一种改进思路是将指数 ( x ) 分解为 ( x = k \cdot \ln(2) + r ),其中 ( k ) 是整数,( r ) 是小数。这样,( e^x = 2^k \cdot e^r )。由于 ( 2^k ) 易算,而 ( r ) 是一个接近0的小数,我们可以用泰勒展开精确计算 ( e^r )。一些编程语言正是利用这种机制来计算指数运算。
泰勒展式的应用:解释基尼系数 📊
上一节我们看到了泰勒展式在数值计算中的应用,本节中我们来看看它在解释机器学习概念——基尼系数(Gini Index)中的作用。
基尼系数在决策树和随机森林中用于衡量数据的不纯度,其定义如下(对于分类问题):
[
\text{Gini} = \sum_{k} p_k (1 - p_k)
]
其中 ( p_k ) 是样本属于第 ( k ) 类的概率。
这个定义看似奇怪,但可以用泰勒展式来解释。考虑函数 ( f(x) = -\ln(x) ),我们在 ( x = 1 ) 处对其进行一阶泰勒展开(忽略高阶项):
[
f(x) \approx 1 - x
]
信息熵(Entropy)的定义是 ( -\sum p_k \ln(p_k) ),它衡量不确定性。如果我们用 ( 1 - p_k ) 来近似 ( -\ln(p_k) ),那么熵的近似就变成了:
[
\text{Entropy} \approx \sum p_k (1 - p_k)
]
这正是基尼系数的形式(可能相差一个常数因子)。因此,基尼系数可以看作是熵在 ( p=1 ) 处的一阶泰勒近似。这使得它在实践中可以作为分类误差率的一个有效近似,用于决策树中特征选择和分割点的计算。
从泰勒展式到牛顿法 ⚙️
了解了基尼系数的解释后,我们进入本节课的核心部分:如何从泰勒展式推导出强大的优化算法。
首先,我们看一个具体问题:如何计算一个正数 ( a ) 的平方根?定义函数 ( f(x) = x^2 - a ),求根问题转化为求 ( f(x)=0 ) 的解。
我们在当前估计值 ( x_0 ) 处对 ( f(x) ) 进行一阶泰勒展开(忽略高阶项):
[
f(x) \approx f(x_0) + f’(x_0)(x - x_0)
]
令近似值等于0(( f(x)=0 )),并假设 ( f’(x_0) \neq 0 ),可以解出 ( x ):
[
x \approx x_0 - \frac{f(x_0)}{f’(x_0)}
]
对于 ( f(x) = x^2 - a ),有 ( f’(x) = 2x )。代入上式得到迭代公式:
[
x_{n+1} = x_n - \frac{x_n^2 - a}{2x_n} = \frac{1}{2}(x_n + \frac{a}{x_n})
]
这就是计算平方根的牛顿迭代法。通过不断迭代,当 ( x_n ) 与 ( x_{n-1} ) 的差距足够小时,我们就得到了 ( \sqrt{a} ) 的近似值。
以下是该算法的核心Python代码示例:
def sqrt_newton(a):
x = a / 2.0 # 初始估计值
while True:
x_next = 0.5 * (x + a / x)
if abs(x_next - x) < 1e-10: # 收敛条件
break
x = x_next
return x
这个算法通常只需很少的迭代次数(如5-6次)就能得到高精度的结果。
梯度下降算法 📉
在深入牛顿法之前,我们需要先理解机器学习中更基础的优化算法:梯度下降(Gradient Descent)。
假设我们有一个关于参数 ( \theta ) 的目标函数(损失函数)( J(\theta) ),例如线性回归中的最小二乘损失。我们的目标是找到使 ( J(\theta) ) 最小化的 ( \theta^* )。
梯度下降算法的思想是:从一个初始估计 ( \theta_0 ) 开始,沿着目标函数负梯度的方向(即下降最快的方向)不断更新参数:
[
\theta_{t+1} = \theta_t - \alpha \cdot \nabla J(\theta_t)
]
其中,( \alpha ) 是学习率(步长),( \nabla J(\theta_t) ) 是 ( \theta_t ) 处的梯度。通过反复迭代,参数会(期望)收敛到一个局部极小值。取正梯度方向则是梯度上升算法,用于寻找最大值。
牛顿法 🚀
上一节我们介绍了梯度下降,它只用了一阶导数信息。本节中我们利用泰勒展式引入使用二阶导数的牛顿法,以期获得更快的收敛速度。
对目标函数 ( f(x) ) 在点 ( x_k ) 处进行二阶泰勒展开:
[
f(x) \approx f(x_k) + f’(x_k)(x - x_k) + \frac{1}{2} f’'(x_k)(x - x_k)^2
]
我们将右边记作 ( s(x) )。为了找到 ( f(x) ) 的极值点(驻点),我们令 ( s’(x) = 0 ):
[
s’(x) = f’(x_k) + f’'(x_k)(x - x_k) = 0
]
假设 ( f’'(x_k) \neq 0 ),可以解出 ( x ):
[
x = x_k - \frac{f’(x_k)}{f’'(x_k)}
]
这就得到了牛顿法的迭代公式。与梯度下降用一次函数(切线)近似不同,牛顿法用一个二次函数(抛物线)去近似原函数,并直接跳到该二次函数的极值点。因此,在目标函数性质较好(如接近二次)且初始点合适时,牛顿法具有二阶收敛性,速度更快。
将一维情况推广到多维(参数为向量 ( \theta )),一阶导数 ( f’ ) 变为梯度向量 ( g ),二阶导数 ( f’’ ) 变为海森矩阵(Hessian Matrix)( H )。牛顿法的迭代公式变为:
[
\theta_{t+1} = \theta_t - H^{-1}(\theta_t) \cdot g(\theta_t)
]
拟牛顿法 🤖
虽然牛顿法收敛快,但它存在几个问题:
-
需要计算海森矩阵 ( H ) 及其逆矩阵 ( H^{-1} ),计算成本高。
-
要求海森矩阵正定,否则搜索方向可能错误(甚至指向上升方向)。
-
对初始点要求较高。
为了解决这些问题,拟牛顿法(Quasi-Newton Method)被提出。其核心思想是:不直接计算海森矩阵,而是用一个正定矩阵 ( B_t ) 来近似 ( H ),或用 ( C_t ) 近似 ( H^{-1} ),并通过迭代不断更新这个近似矩阵。
拟牛顿法需要满足“拟牛顿条件”(或“割线条件”)。在点 ( \theta_{t+1} ) 处,我们期望近似矩阵满足:
[
C_{t+1} (g_{t+1} - g_t) \approx \theta_{t+1} - \theta_t
]
令 ( \delta = \theta_{t+1} - \theta_t ), ( \gamma = g_{t+1} - g_t ),则条件简化为:
[
C_{t+1} \gamma = \delta
]
不同的拟牛顿算法在于如何更新 ( C_t ) 以满足这个条件。以下是两个著名的方案:
DFP算法 (Davidon–Fletcher–Powell):
通过低秩矩阵更新来迭代 ( C_t ),其更新公式具有特定形式,并通过待定系数法确定参数,最终得到迭代式。
BFGS算法 (Broyden–Fletcher–Goldfarb–Shanno):
这是目前最流行、效果最好的拟牛顿算法之一。它直接对海森矩阵的逆 ( H^{-1} ) 进行更新,公式略有不同但思想类似。BFGS通常比DFP性能更稳定。
在BFGS算法中,我们用 ( B_t ) 近似海森矩阵 ( H_t ),其更新公式为:
[
B_{t+1} = B_t + \frac{\gamma_t \gamma_tT}{\gamma_tT \delta_t} - \frac{B_t \delta_t \delta_t^T B_t}{\delta_t^T B_t \delta_t}
]
对应的,用于迭代的参数更新公式为 ( \theta_{t+1} = \theta_t - B_t^{-1} g_t ),但实践中我们通过数学变换避免直接求逆,而是维护 ( C_t \approx H_t^{-1} ) 并进行更新。
拟牛顿法结合了梯度下降的简单和牛顿法的快速收敛性。在实际的机器学习模型(如逻辑回归)训练中,采用BFGS等拟牛顿法往往比标准梯度下降收敛所需迭代次数少一个数量级。
对于特征维度 ( n ) 非常大的问题,存储和更新 ( n \times n ) 的矩阵 ( C_t ) 开销巨大。此时可以使用L-BFGS算法(Limited-memory BFGS),它只保存最近 ( m ) 次(( m ) 通常很小,如10)的 ( \delta ) 和 ( \gamma ) 向量来近似计算更新方向,大大节省了内存。
总结与展望 🎯
本节课中我们一起学习了泰勒展式及其在机器学习中的一系列深刻应用。
我们首先学习了泰勒展式的定义,它是用多项式逼近复杂函数的强大工具。接着,我们看到了它在数值计算(如指数函数、平方根计算)中的直接应用。然后,我们探讨了如何用一阶泰勒展式来解释决策树中使用的基尼系数,将其与信息熵联系起来。
课程的核心部分是从泰勒展式推导出优化算法。我们从一阶展开得到了梯度下降法的基础思想,从二阶展开推导出了收敛更快的牛顿法。为了克服牛顿法计算成本高和对海森矩阵正定要求的缺点,我们深入介绍了拟牛顿法(特别是DFP和BFGS算法),它们通过迭代近似海森矩阵或其逆矩阵,在保证较快收敛的同时,更适用于实际的机器学习优化问题。
泰勒展式是连接数学分析与机器学习算法的桥梁。理解它不仅能帮助我们掌握这些算法的来源,也为改进和发明新算法提供了思路。在后续的机器学习课程中,我们还会遇到更多基于泰勒展式或其思想的技术,例如自适应学习率方法、以及更深入的经济学与社会学中基尼系数的计算等。
注:本教程根据提供的视频内容整理,力求准确传达原意。更深入的实践与理论细节可在七月在线平台(julyedu.com)的社区中进一步探讨。
人工智能—机器学习中的数学(七月在线出品) - P10:四个基本的子空间 🧮
在本节课中,我们将要学习线性代数中一个核心且美妙的概念:矩阵的四个基本子空间。理解这四个子空间及其相互关系,是掌握线性方程组、矩阵分解等高级主题的基石。我们将通过直观的几何图像和简单的例子,让初学者也能轻松理解这些抽象概念。
列空间(Column Space)🚀
上一节我们介绍了线性组合的概念,本节中我们来看看由矩阵的列向量所张成的空间。
列空间,顾名思义,是由矩阵所有列向量的线性组合构成的空间。对于一个矩阵 A,其列空间是所有形如 Y = AX 的向量 Y 的集合,其中 X 可以取任意实数值。这本质上就是矩阵 A 的列向量张成(span)的空间。
如果矩阵 A 的列向量线性无关,那么这些列向量本身就是其列空间的一组“基”。基是一组“恰到好处”的向量:它们线性无关,并且能够张满整个子空间。多一个向量就会线性相关,少一个向量则无法张满该空间。
以下是关于基和列空间的关键点:
-
基是子空间中最大的线性无关向量组。
-
一个子空间可以有不同的基,但所有基包含的向量数量(即空间的维数)是相同的。
-
列空间是 R^m 的一个子空间(假设 A 是 m×n 矩阵)。
为了更直观地理解,考虑一个例子:假设矩阵 A 有两列,分别是向量 (0,3,3) 和 (1,4,2)。这两个向量的所有线性组合构成了一个平面。这个平面是三维空间 R^3 的一个子集,因此被称为 R^3 的一个子空间。子空间必须包含零点(当线性组合系数全为0时)。
零空间(Null Space)🎯
接下来,我们探讨与列空间紧密相关的另一个子空间:零空间。
零空间是满足方程 AX = 0 的所有解向量 X 的集合。注意,零空间是 R^n 的一个子空间(A 是 m×n 矩阵),而不是 R^m 的子空间。
让我们通过一个具体例子来理解。假设有一个2×4的矩阵 A,其零空间的解由两个线性无关的向量构成。这两个向量就是零空间的一组基。零空间中的所有向量(即 AX=0 的所有解),都可以表示为这两个基向量的线性组合,这个组合本身也构成了 R^4 的一个子空间。
简单来说,零空间就是齐次线性方程组 AX=0 的所有解构成的空间。
行空间(Row Space)与左零空间(Left Null Space)🔀
除了列空间和零空间,还有两个重要的子空间:行空间和左零空间。它们让线性代数的理论结构变得更加完整和对称。
行空间是所有行向量的线性组合构成的空间。我们可以通过矩阵转置来理解:行空间就是 A^T 的列空间。
左零空间则定义为满足 A^T Y = 0 的所有向量 Y 的集合。将其转置,得到 Y^T A = 0,这意味着向量 Y(在左边)与 A 的每一个列向量都垂直(内积为0),因此得名“左”零空间。左零空间是 R^m 的一个子空间。
四大子空间的关系图 🗺️
理解了每个子空间的定义后,最关键的是掌握它们之间的美妙关系。这是线性代数中最核心的一幅图景。
以下是四个基本子空间的关系总结:
-
列空间 C(A): A 的列向量生成的空间,是 R^m 的子空间,维数等于矩阵 A 的秩 r。
-
零空间 N(A): AX=0 的解空间,是 R^n 的子空间,维数等于 n - r。
-
行空间 C(A^T): A 的行向量生成的空间,是 R^n 的子空间,维数也等于秩 r。(这解释了“行秩=列秩”)
-
左零空间 N(A^T): A^T Y=0 的解空间,是 R^m 的子空间,维数等于 m - r。
它们之间存在两对正交补关系:
-
在 R^n 中: 行空间 C(A^T) 与零空间 N(A) 互为正交补。这意味着行空间中的任何一个向量都与零空间中的任何一个向量垂直,并且它们的直和构成了整个 R^n 空间。
-
在 R^m 中: 列空间 C(A) 与左零空间 N(A^T) 互为正交补。这意味着列空间中的任何一个向量都与左零空间中的任何一个向量垂直,并且它们的直和构成了整个 R^m 空间。
“正交补”不仅要求垂直,还要求两个子空间唯一的交集是零向量。例如,三维空间中,一个过原点的平面(列空间)和一条过原点且垂直于该平面的直线(左零空间)就互为正交补,它们共同填满了整个三维空间。
子空间视角下的方程解 🧩
最后,我们利用子空间的观点,重新审视线性方程组 AX = B 的解。
AX = B 有解,当且仅当向量 B 位于矩阵 A 的列空间之内。如果 B 不在列空间中,则方程无解。
当方程有解时,解的结构可以清晰地用子空间表示:
-
特解: 找到任意一个满足 AX_p = B 的特解 X_p。
-
通解: 方程的所有解 X 可以表示为:X = X_p + X_n,其中 X_n 是零空间 N(A) 中的任意向量。
这是因为 A(X_p + X_n) = AX_p + AX_n = B + 0 = B。零空间的存在决定了方程解的个数:如果零空间维数为0(即只有零向量),则方程有唯一解;如果零空间维数大于0,则方程有无穷多解。
本节课中我们一起学习了矩阵的四个基本子空间:列空间、零空间、行空间和左零空间。我们不仅了解了它们的定义,更重要的是掌握了它们之间互为正交补的优美关系,以及如何用子空间的观点来理解线性方程组解的存在性和结构。这幅“四大子空间”的图景是贯穿线性代数许多核心概念的线索,请务必仔细体会。
人工智能—机器学习中的数学(七月在线出品) - P11:随机梯度下降算法综述 📚
概述
在本节课中,我们将学习随机梯度下降算法的核心原理、其面临的主要挑战,以及一系列旨在解决这些挑战的改进算法。我们将从基础的梯度下降法出发,逐步深入到各种变体,并理解它们的设计思想和适用场景。
第一节:梯度下降法简介 📉
梯度下降法是机器学习中用于优化模型参数的核心方法。其基本思想是:通过计算目标函数在当前参数点处的梯度(即函数值上升最快的方向),然后沿着梯度的反方向更新参数,以期望找到函数的极小值点。
具体更新公式如下:
[
\theta_{t+1} = \theta_t - \eta \cdot \nabla J(\theta_t)
]
其中,(\theta) 是模型参数,(\eta) 是学习率,(\nabla J(\theta_t)) 是目标函数 (J) 在点 (\theta_t) 处的梯度。
该方法包含两个核心步骤:
-
计算梯度:对目标函数求导,得到下降方向。
-
选择学习率:决定沿着该方向前进的步长。
然而,这种方法在实践中面临两大主要困难:
-
梯度计算开销大:当训练样本数量巨大时,计算所有样本的梯度之和非常耗时。
-
学习率难以选择:学习率过大可能导致震荡不收敛,过小则收敛缓慢,且通常需要针对具体问题手动调整。
第二节:从梯度下降到随机梯度下降 🔄
上一节我们介绍了梯度下降法及其挑战,本节中我们来看看如何通过引入“随机性”来应对第一个挑战——梯度计算开销过大。
随机梯度下降(SGD)
为了解决全量梯度计算慢的问题,随机梯度下降法在每次参数更新时,只随机使用一个训练样本来计算梯度。其更新公式为:
[
\theta_{t+1} = \theta_t - \eta \cdot \nabla J(\theta_t; x_i, y_i)
]
其中,((x_i, y_i)) 是随机选取的单个样本。
优点:
-
计算高效:避免了冗余计算,大大加快了每次迭代的速度。
-
可能跳出局部极小值:由于梯度的随机性,算法有机会跳出较差的局部最优点。
缺点:
- 更新方向震荡大:单个样本的梯度不能代表整体数据的梯度方向,导致参数更新路径不稳定,收敛过程波动剧烈。
小批量随机梯度下降(Mini-batch SGD)
为了在计算效率和稳定性之间取得平衡,最常用的方法是小批量随机梯度下降。它每次随机选取一小批(例如32、64、128个)样本计算梯度。
[
\theta_{t+1} = \theta_t - \eta \cdot \frac{1}{m} \sum_{i=1}^{m} \nabla J(\theta_t; x_i, y_i)
]
其中,(m) 是小批量的大小。
优点:
-
计算仍高效:可以利用现代计算库(如NumPy)的向量化操作,并行计算小批量梯度。
-
更新更稳定:小批量梯度的方差比单样本小,收敛路径更平滑。
-
成为实际标准:在深度学习领域,通常所说的“SGD”默认指的就是Mini-batch SGD。
实现细节:
以下是关于小批量处理的一些常见做法:
-
将整个训练集划分为若干个小批量。
-
遍历所有小批量完成一次训练称为一个“epoch”。
-
在每个epoch开始前,对训练数据进行洗牌(Shuffle),然后重新划分小批量,这有助于避免数据顺序对训练结果产生潜在影响。
第三节:随机梯度下降面临的挑战 ⚠️
虽然随机梯度下降法解决了计算效率问题,但它(以及所有梯度下降类方法)仍然面临一系列核心挑战,这些挑战催生了后续的各种改进算法。
-
病态曲率与震荡:在高维非凸优化中,损失函数的曲面可能在某些方向非常陡峭,而在另一些方向相对平坦(如峡谷地形)。标准的SGD会在陡峭方向来回震荡,导致在平坦的主下降方向上进展缓慢。
-
学习率调度困难:虽然可以通过预先设定规则(如随时间衰减)来降低学习率以促进收敛,但如何为不同数据集自动设计合适的衰减策略仍是一个难题。
-
参数更新频率不均:对于稀疏数据,某些特征很少出现。如果对所有参数使用相同的、且逐渐衰减的学习率,这些稀疏特征对应的参数可能得不到充分更新。
-
陷入鞍点:在高维空间中,鞍点(某些方向是极小值,某些方向是极大值)比局部极小值更常见。在鞍点附近梯度很小,SGD容易停滞不前。
第四节:应对挑战的改进算法 🛠️
上一节我们总结了SGD的主要挑战,本节中我们将逐一介绍为解决这些挑战而设计的经典改进算法。每种算法都针对特定问题提供了直观的解决方案。
1. 动量法(Momentum)—— 缓解震荡
动量法受物理学启发,旨在解决在病态曲率区域(如峡谷地形)的震荡问题。它引入了“速度”变量,让参数更新不仅考虑当前梯度,还积累之前更新的方向,从而在主要下降方向上获得加速,并抑制垂直方向的摆动。
核心公式:
[
\begin{aligned}
v_t &= \gamma v_{t-1} + \eta \nabla J(\theta_t) \
\theta_{t+1} &= \theta_t - v_t
\end{aligned}
]
其中,(v_t) 是当前速度,(\gamma) 是动量系数(通常取0.9),用于衰减历史速度。
物理类比:想象推一个重球下山。它有惯性(动量),不会因为路面的小坑洼而剧烈转向,能更平稳地沿着山谷向下滚动。
2. Nesterov 加速梯度(NAG)—— 更聪明的动量
动量法的一个问题是,当球滚到谷底时,积累的动量可能让它冲上对面的山坡。NAG对此做了“前瞻性”改进:它先根据累积动量向前看一步,在那个“未来”的位置计算梯度,然后用这个梯度来修正当前的更新方向。
核心公式:
[
\begin{aligned}
v_t &= \gamma v_{t-1} + \eta \nabla J(\theta_t - \gamma v_{t-1}) \
\theta_{t+1} &= \theta_t - v_t
\end{aligned}
]
直观理解:这好比在滚球时,先看看如果按当前动量滚下去,前面路况如何(坡度怎样),然后提前调整发力,起到“刹车”或“转向”的作用,使收敛更稳定。
3. Adagrad —— 自适应学习率(针对稀疏特征)
Adagrad 旨在为每个参数自动适应不同的学习率,特别适合处理稀疏数据。它为每个参数维护一个历史梯度平方的累积和。更新频繁的参数,累积和大,学习率会自动减小;更新稀少的参数,累积和小,学习率相对较大。
核心公式:
[
\begin{aligned}
G_{t, ii} &= G_{t-1, ii} + (\nabla J(\theta_t)_i)^2 \
\theta_{t+1, i} &= \theta_{t, i} - \frac{\eta}{\sqrt{G_{t, ii} + \epsilon}} \cdot \nabla J(\theta_t)_i
\end{aligned}
]
其中,(G_t) 是一个对角矩阵,其元素 (G_{t, ii}) 是参数 (\theta_i) 历史梯度平方的累积。
优点:无需手动调整学习率衰减,且对稀疏特征友好。
缺点:随着训练进行,分母中的累积和会单调递增,导致学习率过早、过度衰减,可能使训练提前终止。
4. RMSprop —— 解决 Adagrad 学习率急剧衰减
RMSprop 改进了 Adagrad,将历史梯度平方的累积和改为指数移动平均,从而解决了学习率单调下降过快的问题。它更关注近期梯度的变化。
核心公式:
[
\begin{aligned}
E[g^2]t &= \beta E[g^2]{t-1} + (1-\beta)(\nabla J(\theta_t))^2 \
\theta_{t+1} &= \theta_t - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} \cdot \nabla J(\theta_t)
\end{aligned}
]
其中,(E[g^2]_t) 是梯度平方的指数移动平均,(\beta) 是衰减率(通常为0.9)。
5. Adam —— 结合动量与自适应学习率
Adam(Adaptive Moment Estimation)可以说是当前最流行、默认推荐的优化器。它同时结合了动量法(一阶矩估计)和RMSprop(二阶矩估计)的优点,即同时考虑梯度方向的历史信息和梯度大小的历史信息。
核心公式:
[
\begin{aligned}
m_t &= \beta_1 m_{t-1} + (1-\beta_1) \nabla J(\theta_t) \quad &\text{(一阶矩,有偏估计)} \
v_t &= \beta_2 v_{t-1} + (1-\beta_2) (\nabla J(\theta_t))^2 \quad &\text{(二阶矩,有偏估计)} \
\hat{m}_t &= \frac{m_t}{1 - \beta_1^t} \quad &\text{(修正一阶矩)} \
\hat{v}_t &= \frac{v_t}{1 - \beta_2^t} \quad &\text{(修正二阶矩)} \
\theta_{t+1} &= \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t
\end{aligned}
]
其中,(\beta_1, \beta_2) 通常取0.9和0.999。对 (m_t) 和 (v_t) 进行偏差修正是为了在训练初期使其估计更准确。
优点:通常收敛速度快,对超参数选择相对鲁棒,是许多场景下的“默认”选择。
第五节:其他优化技巧 💡
除了修改参数更新规则的核心算法外,还有一些重要的技巧可以提升SGD的训练效果。
以下是几种常用的辅助优化技巧:
-
数据洗牌(Shuffling):在每个训练周期(epoch)开始前,随机打乱训练数据顺序,有助于模型学习更通用的模式,避免因数据顺序带来的偏差。
-
批规范化(Batch Normalization):对每一层神经网络的输入进行标准化处理(减均值、除标准差),可以稳定网络的训练过程,允许使用更高的学习率,并具有一定的正则化效果。
-
早停(Early Stopping):在训练过程中持续监控模型在验证集上的性能。当验证集误差不再下降甚至开始上升时,即使训练误差还在下降,也停止训练,以防止过拟合。
-
梯度噪声(Gradient Noise):在梯度中加入少量随机噪声。这有助于模型跳出较差的局部极小值或鞍点,增加找到更好解的可能性。噪声的幅度通常随训练进行而衰减。
第六节:如何选择优化算法? 🤔
面对众多优化算法,初学者可能会感到困惑。以下是一些指导原则:
-
理解问题特性:如果你的数据稀疏,考虑自适应学习率算法(Adagrad, Adadelta, RMSprop, Adam)。如果你的优化地形非常复杂(崎岖),考虑使用带动量的方法(Momentum, NAG, Adam)。
-
Adam 作为强力的默认选择:在大多数情况下,Adam 优化器因其结合了动量和自适应学习率的优点,往往能提供快速且稳定的收敛,是一个非常好的起点。
-
经典的 SGD + Momentum 仍有价值:虽然 Adam 很流行,但一些研究表明,精心调参的 SGD with Momentum 有时能达到更好的最终精度,尽管其收敛可能需要更长时间。
-
实践是检验真理的唯一标准:对于你的特定任务和数据集,最好的方法是通过实验(例如,在验证集上比较收敛速度和最终性能)来选择优化器。可以先用 Adam 快速得到一个基准,再尝试其他算法看是否有提升。
总结
本节课中,我们一起学习了随机梯度下降算法的演进之路。
我们从最基础的梯度下降法出发,认识了其计算瓶颈。
随后引入了随机性,诞生了随机梯度下降(SGD)及其更实用的变体小批量SGD,解决了效率问题。
接着,我们探讨了SGD面临的四大核心挑战:病态曲率震荡、学习率调度难、稀疏参数更新不均以及鞍点问题。
针对这些挑战,我们深入讲解了一系列改进算法:用动量法(Momentum) 抑制震荡,用Nesterov加速梯度实现更智能的动量,用Adagrad为稀疏特征自适应学习率,用RMSprop改进其衰减过程,最终学习了集大成的Adam算法。
此外,我们还了解了一些重要的辅助技巧,如数据洗牌、批规范化和早停。
最后,我们讨论了算法选择的策略,建议将Adam作为默认的强力选择,并根据具体问题特性进行调整和实验。
通过本教程,希望你不仅掌握了这些算法的公式,更理解了它们背后要解决的实际问题,从而能在实践中做出更明智的选择。
人工智能—机器学习中的数学(七月在线出品) - P12:微积分和梯度 🧮
概述
在本节课中,我们将学习微积分和梯度在机器学习中的核心作用。课程将从极限、导数、微分等基础概念出发,逐步深入到梯度、凸函数以及重要的不等式,并展示它们如何应用于机器学习问题的分析与求解。
极限与重要极限
上一节我们介绍了课程的整体框架,本节中我们来看看微积分的基础——极限。
我们从一个简单的级数问题开始:零的阶乘分之一加上一的阶乘分之一,一直加到N的阶乘分之一,当N趋向无穷大时,这个和S是收敛的。S的值是多少呢?我们将通过微积分的方法来求解。
首先,我们给出一个直观的定理:两边夹定理。如果在点X0的某个邻域内,函数F(X)有定义,并且满足 G(X) ≤ F(X) ≤ H(X)。同时,已知G(X)和H(X)在X趋向于X0时的极限都是A。那么,F(X)的极限也是A。
我们直接应用两边夹定理来解决一个问题。例如,给定一个单位圆,圆心为O,半径OA长度为1。取任意角度X,线段CB的长度是sin X,弧AB的长度是X,线段AD的长度是tan X。显然,CB < AB,而直线段AB小于弧AB,因此有 sin X < X。同样,通过比较三角形OAD的面积和扇形OAB的面积,可以推导出 X < tan X。这在X的邻域内是正确的。
我们在不等式两边同时除以 sin X,得到:
1 < X / sin X < 1 / cos X
稍作整理,得到:
cos X < sin X / X < 1
当X趋近于0时,cos X的极限是1,右边的极限也是1。因此,根据两边夹定理,sin X / X 在X趋近于0时的极限就是1。这是一个利用两边夹定理的简单结论。
这个公式揭示了三角函数与多项式之间的极限关系,我们可以利用它解决许多问题。
自然底数 e 的引入
上一节我们利用极限解决了一个三角问题,本节中我们来看看另一个重要的极限,它引出了自然底数e。
考虑函数 Y = logₐ X。当底数a取不同值(如2, 3, 1.5)时,可以画出对应的对数曲线。所有曲线都经过点(1, 0)。在这一点,不同函数的斜率不同。我们能否找到一个底数a,使得函数在X=1处的斜率恰好为1呢?
我们来看如何解决这个问题。假设要找的底数是a,记函数为 F(X) = logₐ X。在X=1处,割线的斜率公式为 (F(1+ΔX) - F(1)) / ΔX。当ΔX趋近于0时,这就是导数。代入函数得到:
[logₐ (1+ΔX) - logₐ 1] / ΔX = logₐ (1+ΔX) / ΔX
根据对数运算法则,两个对数的差等于其商的对数。我们想让这个导数等于1,即:
logₐ (1+ΔX) / ΔX = 1
这意味着 (1+ΔX)^(1/ΔX) = a。
因此,我们想探讨的是当ΔX趋近于0时,(1+ΔX)^(1/ΔX) 的极限是什么。事实上,这个极限就是自然底数e。
我们构造一个数列:X_N = (1 + 1/N)^N。利用牛顿二项式定理将其展开:
X_N = Σ_{k=0}^{N} C_N^k * (1/N)^k
其中 C_N^k = N! / (k! (N-k)!)。展开并化简后,可以证明这个数列是单调递增且有上界(例如小于3)的。根据单调有界数列必有极限的定理,该数列的极限存在,我们将其记为e。
我们证明了当N是自然数时极限存在。对于任意实数x,我们总可以找到整数N,使得 N ≤ x ≤ N+1。利用类似的两边夹定理,可以证明当x趋向无穷大时,(1+1/x)^x 的极限也是e。
因此,e可以看作是无穷级数的和:
e = 1/0! + 1/1! + 1/2! + ... + 1/n! + ... (当 n → ∞)
导数与微分
上一节我们引入了自然底数e,本节中我们正式学习导数和微分。
导数可以直观地理解为曲线的斜率,它表征了函数值变化的快慢。导数本身也可以求导,得到二阶导数。二阶导数反映了斜率变化的快慢,即函数的凹凸性。在物理中,对于运动轨迹,加速度方向总指向轨迹凹的一侧。二阶导连续的函数通常被称为“光顺”的,这在凸优化中是一个重要概念。
根据前面关于e的极限,我们可以得到函数 F(X) = ln X(即以e为底的对数)在X=1处的导数恰好为1。进而推导出 (ln X)' = 1/X。结合换底公式、反函数求导等工具,可以得到其他基本初等函数的导数公式。
以下是基本导数公式:
-
(C)' = 0(C为常数) -
(x^a)' = a * x^(a-1) -
(a^x)' = a^x * ln a -
(e^x)' = e^x -
(log_a x)' = 1/(x ln a) -
(ln x)' = 1/x -
(sin x)' = cos x -
(cos x)' = -sin x -
(tan x)' = sec^2 x
导数的运算法则包括:
-
加法法则:
(u + v)' = u' + v' -
乘法法则:
(u * v)' = u' * v + u * v'
我们重点关注乘法法则。对 (u * v)' = u' * v + u * v' 两边同时积分,得到:
∫ u * v' dx = u * v - ∫ u' * v dx
这就是分部积分法。例如,求 ∫ ln x dx,可以令 u = ln x, v' = 1, 则 u' = 1/x, v = x。代入公式:
∫ ln x dx = x * ln x - ∫ x * (1/x) dx = x ln x - x + C
微分的应用:幂指函数与阶乘估计
上一节我们学习了导数和微分的基本法则,本节中我们看看微分的一些具体应用。
1. 幂指函数求极值
考虑函数 F(X) = X^X (X > 0)。这是一个底数和指数都包含变量的幂指函数。我们想求其最小值。
解决思路是两边取对数:令 t = X^X,则 ln t = X ln X。两边对X求导:
(1/t) * t' = ln X + 1
因此,t' = t * (ln X + 1) = X^X * (ln X + 1)。
令导数 t' = 0 求驻点。由于 X^X > 0,只需 ln X + 1 = 0,解得 X = e^(-1)。
分析函数性质可知,该函数先减后增,因此在 X = 1/e 处取得全局最小值。代入原函数得最小值为 e^(-1/e)。
2. 阶乘的对数规模估计
N! 在N很大时增长极快。对其取对数 ln(N!),它的增长规模如何呢?
ln(N!) = ln1 + ln2 + ... + lnN。
这个和可以近似看作函数 y = ln x 从1到N的积分。
ln(N!) ≈ ∫_1^N ln x dx
利用分部积分法求解该积分:
∫ ln x dx = x ln x - x
因此,ln(N!) ≈ N ln N - N + 1。当N很大时,主要增长项为 N ln N。所以我们说 ln(N!) 的增长规模是 O(N log N)。
多元函数与梯度
上一节我们讨论了一元函数的应用,本节中我们将概念扩展到多元函数。
对于二元函数 Z = F(X, Y), 在点 P(X0, Y0) 处可微。我们不仅可以求偏导数,还可以求沿某一方向L的方向导数。假设方向L与X轴正方向的夹角为 φ,则方向导数为:
∂F/∂L = (∂F/∂X) * cosφ + (∂F/∂Y) * sinφ
这可以写成向量点乘的形式:[∂F/∂X, ∂F/∂Y] · [cosφ, sinφ]^T。
左边向量只与函数F在点P的性质有关,右边向量只与方向L有关。当方向向量 [cosφ, sinφ] 与梯度向量 [∂F/∂X, ∂F/∂Y] 方向一致时,点乘值(即方向导数)最大。这意味着函数在该点沿梯度方向变化最快。
梯度记作 ∇F 或 grad F:
∇F = (∂F/∂X, ∂F/∂Y)
在机器学习中,我们常沿着梯度的反方向(负梯度方向)更新参数,以寻找损失函数的最小值,这就是梯度下降法的基本原理。
凸函数与 Jensen 不等式
上一节我们介绍了梯度,本节中我们学习机器学习优化中另一个核心概念:凸函数。
凸函数定义:函数F的定义域是凸集,对于定义域内任意两点X, Y和任意常数 θ ∈ [0, 1], 满足:
F(θX + (1-θ)Y) ≤ θF(X) + (1-θ)F(Y)
几何意义是:函数图像上任意两点的连线(割线)总在函数图像的上方。
在机器学习领域,像 Y = X^2 这样的函数被称为凸函数(开口向上),而 Y = -X^2 被称为凹函数。这与某些数学教材的称呼可能相反。
一阶条件:如果F是一阶可微的,则F是凸函数等价于:
F(Y) ≥ F(X) + ∇F(X)^T (Y - X), 对所有X, Y在定义域内成立。
几何意义是:函数图像在任何一点处的切线都在图像的下方。这可以看作函数的一个全局下界估计。
二阶条件:如果F是二阶可微的,则F是凸函数等价于其海森矩阵(二阶导矩阵)是半正定的(对于一元函数,即二阶导 ≥ 0)。例如,Y = X^2 的二阶导为2 > 0,所以它是凸函数。
常见的凸函数有:
-
指数函数:
e^(aX)(a为任意实数) -
幂函数:
X^a(当 a ≥ 1 或 a ≤ 0) -
负对数函数:
-log X -
仿射函数:
AX + b
Jensen不等式:凸函数定义的一个直接推广。对于凸函数F,有:
F(Σ θ_i X_i) ≤ Σ θ_i F(X_i), 其中 θ_i ≥ 0 且 Σ θ_i = 1。
如果我们将 θ_i 视为概率,X_i 视为随机变量取值,那么不等式可以写成期望的形式:
F(E[X]) ≤ E[F(X)]
其中E表示数学期望。这对于连续型随机变量同样成立。
Jensen不等式非常强大,许多经典不等式都可以视为它的特例。
以下是两个应用示例:
-
算术-几何平均不等式:对于正数a, b, 有
(a+b)/2 ≥ √(ab)。证明:取凸函数
F(X) = -ln X, 并令θ = 1/2,X1 = a,X2 = b, 代入Jensen不等式即可得证。 -
KL散度的非负性:KL散度(相对熵)用于衡量两个概率分布P和Q的差异,定义为:
D_KL(P||Q) = Σ P(x) ln (P(x)/Q(x))可以证明
D_KL(P||Q) ≥ 0。证明:将
-ln x视为凸函数,将Q(x)/P(x)视为随机变量(在分布P下),应用Jensen不等式:D_KL(P||Q) = E_P[-ln (Q(x)/P(x))] ≥ -ln (E_P[Q(x)/P(x)]) = -ln(1) = 0
总结
本节课我们一起学习了微积分和梯度在机器学习中的核心知识。
我们首先回顾了极限和两边夹定理,并由此引出了重要的自然底数e。接着,我们学习了导数与微分的概念、公式及其运算法则,并通过幂指函数求极值和阶乘规模估计展示了微分的应用。然后,我们将概念扩展到多元函数,引入了方向导数和梯度的概念,并解释了梯度方向是函数值变化最快的方向。最后,我们深入探讨了凸函数的定义、性质以及至关重要的Jensen不等式,并展示了其在证明算术-几何平均不等式和KL散度非负性中的应用。
以机器学习应用为目的来学习这些数学知识,会发现它们并非难以掌握。许多复杂的结论都可以通过基本的定义和定理一步步推导出来。理解这些概念背后的几何直观和物理意义,对于构建机器学习模型和设计优化算法至关重要。关于凸优化更深入的内容,我们将在后续课程中详细探讨。
人工智能—机器学习中的数学(七月在线出品) - P13:协方差 📊
在本节课中,我们将要学习概率论与统计学中的一个核心概念——协方差。协方差是衡量两个随机变量之间线性关系强度和方向的重要工具,也是理解后续更复杂概念(如相关系数、协方差矩阵)的基础。
协方差的定义与计算
上一节我们介绍了随机变量的期望,本节中我们来看看如何衡量两个变量之间的联动关系。
两个随机变量X和Y的协方差定义为:它们各自与其期望的偏差的乘积的期望。用公式表示如下:
Cov(X, Y) = E[(X - E[X])(Y - E[Y])]
根据定义,协方差具有对称性,即 Cov(X, Y) = Cov(Y, X)。
此外,协方差还有一个更常用的计算公式,它等于两个变量乘积的期望减去它们各自期望的乘积:
Cov(X, Y) = E[XY] - E[X]E[Y]
独立、不相关与协方差的关系
以下是关于独立与不相关性的重要结论:
-
独立性与协方差:如果随机变量X和Y相互独立,那么
E[XY] = E[X]E[Y]。根据协方差的计算公式,可以立即得出Cov(X, Y) = 0。 -
不相关的定义:如果两个随机变量的协方差为零,即
Cov(X, Y) = 0,我们称X和Y“不相关”。 -
两者的关系:独立性是一个更强的条件,它必然导致不相关(协方差为零)。但反之不成立,协方差为零(不相关)不能推出两个变量相互独立。不相关仅仅意味着变量之间没有线性关系,但它们可能存在其他非线性关系(如二次方、三角函数关系等)。
协方差的意义与上界
协方差度量了两个随机变量变化趋势的一致性。
-
Cov(X, Y) > 0:表示X和Y的变化趋势相同,即一个变量增大时,另一个也倾向于增大。
-
Cov(X, Y) < 0:表示X和Y的变化趋势相反,即一个变量增大时,另一个倾向于减小。
-
Cov(X, Y) = 0:表示X和Y之间没有线性趋势关系。
那么,协方差的大小是否有上限呢?答案是肯定的。对于方差分别为 σ₁² 和 σ₂² 的随机变量X和Y,其协方差满足柯西-施瓦茨不等式:
|Cov(X, Y)| ≤ σ₁σ₂
当且仅当X和Y之间存在严格的线性关系(即 X = aY + b)时,等号成立。这个上界定理引出了一个更标准化的度量——相关系数。
相关系数:标准化的协方差
为了消除量纲影响,更纯粹地衡量线性相关程度,我们定义相关系数 ρ(也称为皮尔逊相关系数):
ρ = Cov(X, Y) / (σ₁σ₂)
根据协方差的上界定理,相关系数满足 -1 ≤ ρ ≤ 1。
-
ρ = 1:完全正相关,X和Y存在严格的递增线性关系。
-
ρ = -1:完全负相关,X和Y存在严格的递减线性关系。
-
ρ = 0:不相关,无线性关系。
因此,相关系数可以看作是“标准化”后的协方差。关于协方差为零(不相关)的结论,同样适用于相关系数为零的情况。
一个特例:对于服从二维正态分布的随机变量(X, Y),“不相关”与“独立”是等价的。这是因为二维正态分布的概率密度函数中的参数ρ就是它们的相关系数,当ρ=0时,联合密度函数恰好等于两个边缘密度函数的乘积。
从两个变量到多个变量:协方差矩阵
上一节我们讨论了两个随机变量的情况,本节中我们来看看如何将其推广到多个随机变量。
假设有n个随机变量 X₁, X₂, ..., Xₙ,构成一个随机向量。我们可以计算任意两个变量 Xᵢ 和 Xⱼ 之间的协方差 Cov(Xᵢ, Xⱼ)。将这些协方差按顺序排列,就构成了一个 n × n 的协方差矩阵 C:
C = [Cov(Xᵢ, Xⱼ)], 其中 i, j = 1, 2, …, n
由于 Cov(Xᵢ, Xⱼ) = Cov(Xⱼ, Xᵢ),协方差矩阵 C 是一个对称矩阵。
协方差矩阵有直观的矩阵运算表示形式。假设我们对每个随机变量进行了m次采样,并将去均值后的数据排列成矩阵 X(每列代表一个变量,每行代表一次观测),那么协方差矩阵可以近似计算为:
C ≈ (1/m) * XᵀX
这个形式在后续的主成分分析(PCA)等算法中非常有用。
思考:协方差矩阵是对称阵,对称阵的特征向量是正交的。这个性质将对称阵与正交变换联系起来,为数据降维(如PCA)提供了数学基础。
总结
本节课中我们一起学习了协方差及其相关概念。
-
我们首先学习了协方差的定义和两种计算公式,它衡量了两个随机变量变化的协同趋势。
-
我们明确了独立与不相关的区别与联系:独立必不相关,但不相关不一定独立。不相关特指没有线性关系。
-
我们了解了协方差存在上界,并由此引出了标准化的相关系数,其取值范围在[-1, 1]之间,能更好地度量线性相关的强度和方向。
-
最后,我们将概念从两个变量推广到多个变量,引入了协方差矩阵的概念。协方差矩阵是一个对称矩阵,概括了随机向量中所有变量两两之间的线性关系,是多元统计分析的核心工具之一。
理解协方差是掌握许多机器学习算法(如线性回归、主成分分析、高斯分布)的关键第一步。
人工智能—机器学习中的数学(七月在线出品) - P14:中心极限定理 📊
在本节课中,我们将要学习概率论中两个极其重要的定理:大数定律与中心极限定理。它们为统计学和机器学习中的许多方法提供了坚实的理论基础。
概述
切比雪夫不等式揭示了方差的物理意义:方差越小,随机变量取值集中在期望附近的概率越大。这个不等式是证明大数定律的关键工具。
上一节我们介绍了方差与期望的关系,本节中我们来看看如何从切比雪夫不等式出发,理解随机现象的长期稳定性与分布规律。
大数定律
大数定律描述了当独立重复试验次数足够多时,随机事件发生的频率会稳定地趋近于其概率。
设 X1, X2, ..., Xn 是相互独立且具有相同期望 μ 和方差 σ² 的随机变量。定义 Yn = (X1 + X2 + ... + Xn) / n。
根据切比雪夫不等式,可以证明当 n 趋向于无穷大时,Yn 以概率 1 收敛于期望 μ。公式表示为:
P( lim_{n→∞} Yn = μ ) = 1
这意味着,尽管单个随机变量的方差可能很大,但将大量独立同分布的随机变量取平均后,其结果会稳定在期望值附近。
以下是关于大数定律的几个要点:
-
频率与概率的关系:对于一个事件
A,其发生概率为p。在n次独立重复试验中,事件A发生的次数记为NA,则频率NA/n以概率1收敛于概率p。这几乎为概率提供了操作性的定义,即概率是频率的稳定值。 -
实践应用:大数定律是许多机器学习参数估计方法(如正态分布的参数估计、贝叶斯分类中的先验学习等)的理论依据,它使得我们能够用观测到的数据(频率)去推断未知的参数(概率)。
中心极限定理
中心极限定理则解释了为什么许多自然和社会现象都近似服从正态分布。
设 X1, X2, ..., Xn 是相互独立且具有相同期望 μ 和方差 σ² 的随机变量。考虑它们的和 Sn = X1 + X2 + ... + Xn。
中心极限定理指出,当 n 足够大时,标准化后的和 (Sn - nμ) / (√n * σ) 的分布会趋近于标准正态分布 N(0, 1)。其和 Sn 本身则近似服从正态分布 N(nμ, nσ²)。
以下是中心极限定理的核心思想与应用场景:
-
现象解释:如果一个结果是由大量微小、独立的随机因素共同作用产生的,那么这个结果的分布往往近似于正态分布。
-
实例说明:
-
城市用电量:可以看作是大量用户独立用电量的总和,因此近似服从正态分布。
-
测量误差:由许多无法控制的微小因素(如环境、仪器波动)综合导致,通常服从正态分布。
-
学生成绩:受智力、努力程度、临场状态等多种独立因素影响,一个班级的成绩分布通常也近似正态。如果严重偏离,可能暗示存在异常(如大面积作弊或试题设计不当)。
-
-
实验验证:下图展示了中心极限定理的模拟实验。从一个均匀分布中多次抽样并计算均值,这些均值的分布会呈现出正态分布的形状。
总结
本节课中我们一起学习了概率论的两大基石:大数定律与中心极限定理。
-
大数定律保证了在长期或大量的重复中,随机事件的频率会稳定在其概率附近,这为用样本推断总体提供了理论支持。
-
中心极限定理则揭示了无论原始随机变量服从什么分布,只要独立同分布且数量足够多,其和的标准化形式就会趋近于正态分布。这解释了正态分布在现实世界中的普遍性,并为许多统计推断方法(如线性回归中的最小二乘法)奠定了理论基础。
理解这两个定理,对于深入掌握机器学习和数据分析中的统计思想至关重要。
人工智能—机器学习中的数学(七月在线出品) - P15:重新理解矩阵 🧮
在本节课中,我们将从一个全新的视角重新理解矩阵方程 AX = B。我们将探讨其行视图与列视图的几何意义,并引出线性代数中的核心概念,如线性相关、线性无关、基与子空间。随后,我们将深入探讨矩阵分解,包括特征值分解与奇异值分解,并揭示它们之间的内在联系,最终构建一个完整的知识框架。
线性代数的基本知识
上一节我们概述了课程目标,本节中我们来看看线性代数的一些基本符号和概念,为后续内容打下基础。
以下是本节课将使用的主要数学符号表:
-
R^n:n维实向量空间。
-
R^(m×n):m行n列的实矩阵集合。
-
A^T:矩阵A的转置。
-
det(A):矩阵A的行列式。
-
C(A):矩阵A的列空间。
-
N(A):矩阵A的零空间(核空间)。
-
A^(-1):矩阵A的逆矩阵。
-
diag(v):将向量v转化为对角矩阵。
-
tr(A):矩阵A的迹(对角线元素之和)。
-
**AH**:矩阵A的共轭转置(本节课仅讨论实数,可暂时视同AT)。
-
rank(A):矩阵A的秩。
说明:红色框标注的内容代表最重要的定理或概念,绿色框标注的则是帮助理解的示例。
重新理解 AX = B
我们从一个最基础的矩阵方程开始。考虑方程 AX = B,其中 A 是一个矩阵,X 和 B 是向量。教科书通常从行列式讲起,但我们将从更直观的几何视角——行视图和列视图——来切入。
行视图:方程组的交点
对于方程 AX = B,行视图将其理解为一系列线性方程的交集。
例如,给定矩阵和向量:
A = [[2, -1],
[1, 1]]
X = [x, y]^T
B = [1, 5]^T
方程 AX = B 等价于方程组:
2x - y = 1
x + y = 5
在二维空间中,每个方程代表一条直线。方程有解,意味着这两条直线相交于一点 (x=2, y=3)。
推广到三维,例如一个 3x3 的系统,每个方程代表一个平面。三个平面相交于一点,即该方程组的解。更高维的情况可以类推,每个方程定义一个“超平面”,解就是所有超平面的交点。
这个视角与机器学习中的“超平面”概念紧密相关,例如,约束
A^T X = b就定义了一个超平面。
列视图:向量的线性组合
现在,我们从列的角度审视同一个方程 AX = B。我们可以将矩阵A按列分块:
A = [a1, a2]
那么方程 AX = B 可以重写为:
x * a1 + y * a2 = B
这意味着,结果向量 B 是矩阵 A 各列向量的一个线性组合,组合系数就是向量 X 中的元素。
对于上面的例子:
A的列向量: a1 = [2, 1]^T, a2 = [-1, 1]^T
B = [1, 5]^T
解 X = [2, 3]^T 意味着:
2 * [2, 1]^T + 3 * [-1, 1]^T = [1, 5]^T
从几何上看,我们将向量 a1 拉伸2倍,将向量 a2 拉伸3倍,然后通过向量加法(平行四边形法则),恰好得到了向量 B。
行视图与列视图的联系与区别:
-
行视图关注方程描述的几何对象(直线、平面、超平面)如何相交。
-
列视图关注矩阵的列向量如何通过伸缩与相加来合成目标向量。
-
两者是同一数学事实的两种几何表现,但列视图更贴近线性代数“线性组合”的核心思想。
线性相关与线性无关
从列视图的讨论中,我们自然引出一个问题:是否任意向量 B 都能被一组给定的列向量组合出来?这直接关系到“线性相关”与“线性无关”的概念。
定义
给定一组向量 {v1, v2, ..., vn}:
-
线性相关:存在一组不全为零的标量
c1, c2, ..., cn,使得:c1*v1 + c2*v2 + ... + cn*vn = 0这意味着至少有一个向量可以被其他向量线性表示。
-
线性无关:只有当所有标量
c1, c2, ..., cn全为零时,上式才成立。即,没有任何一个向量可以表示为其他向量的线性组合。
示例与理解
考虑矩阵 A = [[1, 2, 3], [0, 1, 1], [1, 3, 4]] 的列向量:
-
列向量线性相关:因为
-1*[1,0,1]^T + (-1)*[2,1,3]^T + 1*[3,1,4]^T = [0,0,0]^T。我们发现第三列是前两列之和,它是“多余”的。 -
列向量线性无关:对于矩阵
A = [[1, 0, 0], [0, 1, 0], [0, 0, 1]](单位阵),其列向量是线性无关的。你无法找到非零系数使它们的线性组合为零向量。
与方程 AX=0 的联系:
方程 AX = 0 称为齐次方程。将其写作列向量形式:
x1*a1 + x2*a2 + ... + xn*an = 0
-
如果
A的列向量线性无关,那么上式成立当且仅当x1 = x2 = ... = xn = 0。此时AX=0只有零解,矩阵A是可逆的(对于方阵而言)。 -
如果
A的列向量线性相关,那么存在非零向量X使得AX=0。这意味着A的列空间无法充满整个空间,A不可逆。
基与子空间
理解了线性无关,我们就可以定义“基”和“子空间”这两个核心概念。
-
基:向量空间
V中一组线性无关的向量,并且它们能够张成(即通过线性组合表示)整个空间V。空间V的维数等于基中向量的个数。 -
子空间:一个向量空间的子集,如果它自身也满足向量空间的公理(对加法和数乘封闭),则称为子空间。矩阵
A的列空间C(A)(所有列向量的线性组合构成的集合)和零空间N(A)(所有满足AX=0的向量X的集合)是两个最重要的子空间。
矩阵分解:特征值分解 (EVD)
对于方阵,一种重要的分解方式是特征值分解。
定义与公式
若 n×n 方阵 A 有 n 个线性无关的特征向量,则可被分解为:
A = P * Λ * P^(-1)
其中:
-
P是由A的n个线性无关的特征向量组成的矩阵。 -
Λ是由对应的特征值构成的对角矩阵,Λ = diag(λ1, λ2, ..., λn)。
特殊情形:对称矩阵
当 A 是实对称矩阵(A = A^T)时,情况更优美:
-
其特征值都是实数。
-
不同特征值对应的特征向量相互正交。
-
它可以被正交对角化:
A = Q * Λ * Q^T其中
Q是由单位正交特征向量组成的正交矩阵(Q^T * Q = I,即Q^(-1) = Q^T)。
对称矩阵的特征值分解是理解二次型 X^T A X 的基础,在优化问题(如判断凸性)中至关重要。
矩阵分解:奇异值分解 (SVD)
特征值分解只适用于方阵。对于任意 m×n 的矩阵 A,我们有一种“万能”的分解方法——奇异值分解。
定义与公式
任意实矩阵 A (m×n) 都可以分解为:
A = U * Σ * V^T
其中:
-
U是一个m×m的正交矩阵,其列向量称为左奇异向量,构成A * A^T的特征向量基。 -
V是一个n×n的正交矩阵,其列向量称为右奇异向量,构成A^T * A的特征向量基。 -
Σ是一个m×n的矩形对角矩阵,其对角线上的非负元素称为奇异值,通常按降序排列σ1 ≥ σ2 ≥ ... ≥ σr > 0,r = rank(A)。
SVD 与子空间的联系
SVD 完美地揭示了矩阵的四大基本子空间:
U的前r列:张成列空间C(A)。
更多推荐

所有评论(0)