查看全课大纲(第 66 / 82 节)
- 1.函数与数据泛化
- 2.向量:从几何直觉到高维空间
- 3.矩阵与张量
- 4.特征值与特征向量:矩阵变换的不动方向
- 5.凸函数:从向量求导的矩阵记号到好优化的函数形状
- 6.概率与统计:机器学习的数学基础
- 7.独立性与随机变量:贝叶斯公式与二项分布
- 8.期望、方差与协方差:随机变量的数字画像
- 9.联合概率:当一条轴不够用的时候
- 10.概率分布(一):从伯努利到伽马函数
- 11.概率分布(二):贝塔、泊松、正态与两个贝叶斯故事
- 12.机器学习的模型:找输入与输出的关系
- 13.机器学习的应用
- 14.过拟合
- 15.机器学习的分类
- 16.有监督学习:从房价预测说起
- 17.损失函数
- 18.梯度下降(上):更新规则与学习速率
- 19.梯度下降(2)
- 20.牛顿方法
- 21.KNN简介
- 22.距离测算
- 23.朴素贝叶斯
- 24.朴素贝叶斯的实际应用
- 25.信息熵:决策树构建的度量基础
- 26.信息增益与决策树的构建
- 27.ID3算法
- 28.决策树节点的划分
- 29.CART树
- 30.Bagging
- 31.Boosting:自适应提升算法
- 32.Gradient Boosting
- 33.线性模型:回归与分类的同一副骨架
- 34.最小二乘:把最优参数直接解出来
- 35.最小二乘法的几何与概率视角
- 36.极大似然:给最小二乘一个概率出身
- 37.逻辑回归(1):把线性模型接到分类上
- 38.逻辑回归(2):损失函数与多分类
- 39.---- 手造数据: 5 个样本, 2 个特征; x2 几乎 = 2*x1 (偏差手工指定, 无随机) ----
- 40.讲师例: 向量 "23014" -- 三把范数尺子量同一个向量
- 41.优化方法(1):坐标下降与前向选择
- 42.优化方法(2):前向策略与最小角回归
- 43.拉格朗日乘子法(1):从无约束到等式约束
- 44.拉格朗日乘子法(2):等式约束下的平行条件与拉格朗日函数
- 45.拉格朗日乘子法(3):不等式约束与 KKT 条件
- 46.最大间隔:把分类问题变成优化问题
- 47.拉格朗日对偶问题:把 w 和 b 全部换成 α
- 48.支持向量:边界上的少数派
- 49.SVM 计算过程:一笔到底算完,再走进核方法
- 50.贝叶斯公式:概率即信念
- 51.隐含变量和概率模型:给看不见的原因建模
- 52.EM 算法:期望与最大化的迭代
- 53.琴生不等式:EM 的数学钥匙
- 54.三个硬币问题:EM 的复盘与衔接
- 55.高斯混合模型:用隐变量解释双峰数据
- 56.隐马尔可夫模型
- 57.隐马尔可夫模型(2):前向算法与动态混合模型
- 58.隐马尔可夫模型在 NLP 中的运用
- 59.EM 算法:把「为什么收敛」推到底
- 60.HMM 在 NLP 中的运用:从分词到机器翻译
- 61.HMM 参数估计:Baum-Welch 的三块拉格朗日
- 62.高维下的高斯模型
- 63.主题模型:从词袋到隐含主题
- 64.Dirichlet 分布(1)
- 65.Dirichlet 分布(2)
- 66.统计学习内容回顾
- 67.K-means 算法
- 68.PCA 降维
- 69.SVD 降维
- 70.从聚类到流形
- 71.局部线性嵌入
- 72.随机邻域嵌入:SNE 与 t-SNE
- 73.无参模型:让数据自己说话
- 74.高斯过程:函数空间里的正态分布
- 75.高斯过程(2):噪声、正则化与核的线性组合
- 76.神经网络简介:从感知器到自编码器
- 77.反向传播:把误差一层层传回去
- 78.卷积神经网络(CNN):让特征自己学出来
- 79.循环神经网络(RNN):给网络装上记忆
- 80.深度学习回顾:静态一类,动态一类
- 81.增强学习(1):蒙特卡洛、树搜索与 Q-learning
- 82.强化学习(2):从乌鸦吃核桃到井字棋的 value 回传
统计学习内容回顾
约 24 分钟
小象实战讲义 · 机器学习算法精讲
前一段时间我们讲了 statistical learning(统计学习)。这一节先把它作为一整块内容回顾一遍——它到底在机器学习里处在什么位置、多层概率模型的一般形式长什么样;然后把上次课 topic model 没讲完的尾巴补上: 也可以交给狄利克雷分布;最后看 topic model 真正买来的东西——把文本压缩进语义空间,以及怎么衡量两篇文本的语义距离(KL 散度)。这也正是无监督学习这一章的开场。
💡 核心导读
- 统计学习的定位:它严格意义上并不是一种具体的算法,而是一大类机器学习——数据被看作背后完美情况的采样,概率与统计理论因此进入机器学习。
- 多层概率模型的一般形式:——一层隐含变量,就多一层连加。
- 补尾巴: 也交给狄利克雷:topic-词分布不再当参数,而是随机变量 ,由超参 的狄利克雷分布生成——模型从此有 、 两个狄利克雷超参。
- 语义空间:每个 topic 是词分布单纯形上的一个点,每篇文档是 topic 平面上的一个点——一种「语义压缩」的表示方式。
- KL 散度:衡量两个分布之间距离的标准工具,但它非对称——求两个方向的平均,才能当真正的距离用。
统计学习:一大类机器学习
先想清楚统计学习是什么。严格意义上来讲,它并不是完全是一种所谓的算法,它实际上是一个大类的机器学习的东西。处理任何机器学习问题的时候,我们看到的总是一些现实的数据;而 statistical 的方法、统计的方法,一般认为我们看到的这些数据,是背后完美的情况的一个采样。在这样的情况下——处理不确定性的这些数学理论,尤其是概率和统计,就都可以应用到机器学习和数据挖掘里边。
我们建一个模型、看到这些数据的时候,可以把它认为是统计里边的参数估计的问题,因为很多模型都属于参数模型。参数模型常用的形式是 , 是里边的参数。而我们机器学习这边一般都属于贝叶斯学派(还记得第 12 章的两个学派吗)——这种主观概率认为,一般参数来讲也可以是一个随机变量。这样的话一般都写成 这样的概率形式, 可以服从某种不同的分布。
多层概率模型的一般形式
有了「参数也可以是随机变量」这个想法,我们就可以不断地建出不同层数的概率模型:比如观测 由隐含变量 控制, 又由 控制, 也许又由 控制——可以建立稍微复杂一点的、有很多层状结构的概率模型。而整个模型,其实可以看成是一个特别复杂的分布。
这个复杂分布可以一层层推出来。首先, 跟谁相关?跟 相关——那我们就加上一个 的连加。再一个, 又跟谁相关?又跟 相关——写上 ,而 又是一个隐含变量,可以把 再进行相加。最后, 跟谁相关?跟 相关。一步步写下来(这里讲师把中间隐含变量的参数记作 , 泛指各种参数——、、 这样一些形式):
其中 是超参数(super parameter)——它是给定的、需要被估计的,真的是一个最后的参数; 是中间隐含变量的参数,看它有几种可能就往哪儿连加。如果是连续的形式,我们就把整个概率描述成乘积链:。
这就是我们的多层、有隐变量的模型。我们学过的 LDA、topic model,都是想去学一个比较复杂的这种多层模型。
复习:topic model 的结构
上次课我们讲过这个结构,因为只讲了一次比较难,先用点时间复习(下角标的精读见上一节)。观察到的变量是词 ; 由隐含变量 生成;每一个 从 这样的分布里采出来;而 代表任何一个文本里有多少个 topic 的混合程度,由 生成—— 服从给定 的狄利克雷分布, 的维数决定了 的维数。 从 1 到 ( 篇文档),每篇文档内部 从 1 到 (不同文本有不同的词长度)。整个模型里唯一能被观察到的数据,就是词。
还有一部分我们没有仔细讲:给定任何一个 (topic)的时候,具体这些 的分布。以前如果假设 是一个正态分布,一个系数就描述完了;但这里 和 都是离散的,这个分布很长—— 每个词都有概率,是一个离散的列表,可以把它当成一个巨大的系数矩阵。这个矩阵我们管它叫 :一维是 (词),一维是 ( 从 1 到大 个 topic)。
是非常重要的矩阵。你会发现, 是两者共同的作用: 给它的作用是——它是一个整个的大矩阵;而 给它的作用是告诉它,在这个大矩阵里面我取哪一小块。 等于某个具体的值时,就取出它对应的那部分向量——关于 的分布;在这个向量里采样,就得到我们的 。
这就是 Latent Dirichlet Allocation(LDA)。全名拆开看:Latent——它是一个有隐含变量的模型;Dirichlet——因为我们用了 的狄利克雷分布;Allocation——分配。
补上尾巴:把 也交给狄利克雷
后来,包括 Tom Griffiths 在内的研究者,把这个问题解释得更完美了一些。他们看着 想:它本身是一个大矩阵,任何一行向量加在一起总和仍然是 1——给定任何一个 topic,它所有词的分布加起来等于 1。那这种情况下,我们能不能把这个分布,看成是由高阶的狄利克雷分布而产生的呢?
可以。这样一来模型就变成两类狄利克雷分布生成的样子。重新描述:观察到的还是 ;对任何一个 ,它都有一个隐含变量 , 由 确定, 由 从狄利克雷分布里采样出来(这部分有 个文档、每篇 个词)。而现在再取另一个方向:任何一个 topic 的词分布,也是由一个狄利克雷分布产生的。在任何给定一个 的时候,它里边的变量仍然是一个混合变量,我们叫它 。这个 就像 一样—— 代表给定任何一个文档时 topic 的组合是什么, 代表给定其中任何一个 topic 的时候,这里边词的分布是什么。
所以 仍然是一堆分布,这组分布由一个高阶的狄利克雷分布生成。我们把这个矩阵 重新看待:它不再看成是一个参数了,看成也是一个随机变量,由更上层的超参所控制(板书上讲师把这个超参同样记作 )—— 就是一个混合系数,代表给定超参的其中一行的分布, 由以 为参数的狄利克雷分布生成。这样,作为一个普通的 topic model,就有了两个超参:一个 、一个 ,都是对应的狄利克雷参数;最后得到的 ,是通过这两个方向采样得到的。
这里讲师留了一个很好的思考题: 的 cardinality(维数)和 的 cardinality,两者谁的维度高?大家能想象得到吗?——一定是 高。为什么?因为 的混合代表着词的分布,它要跟整个词典的维度一样;而 的维度代表任何一个文本的 topic 混合—— 就等于 ,我们有 个 topic 而已; 应该等于 。注意 代表具体某一个文本的长度, 代表所有字典这些词的长度(讲师板书时先写了个大 ,随即自我纠正:不应该叫大 ,应该叫大 )。
语义空间:词的单纯形、topic 的平面
有了这种表示,我们可以想象一件事:给定的这些词,比如现在有三个词 、、——每一个 topic 就是一些词的分布。把词的分布画出来,类似于我们有一个面(三个分量的单纯形):这个面里边的任何一个点,就是其中的一个 topic。比如我们选一个点叫 ,它就是某一个 topic,服从某种关于 的分布;再取一个 、——任何的 topic 都是这些词的分布。
那一个文本又是什么呢?任何一个文本 ,实际上是关于 topic 的一个分布。假设有三个 topic,把它们混合到一起:在三个 topic 所构成的平面里边取一个点(讲师画了个星号),这个点就是我们其中的一个文档。给定这个文本 ,它可以描述成 topic 的一个分布——比如 占 0.3、 占 0.5、 占 0.2。而 又是词的分布: 概率 0.4、 也是 0.4、 变成 0.2; 取另外一种分布: 为 0、 为 0.8、 等于 0.2; 的分布是 等于 0.8、 等于 0.1、 等于 0.1。用代码把这三个数落下来:
# GT 数字例:3 个词 W1/W2/W3,3 个 topic T1/T2/T3
# 每个 topic 是词上的一个分布——词的单纯形面上的一个点
T1 = [0.4, 0.4, 0.2] # topic 1 的词分布
T2 = [0.0, 0.8, 0.2] # topic 2 的词分布
T3 = [0.8, 0.1, 0.1] # topic 3 的词分布
# 一篇文档:topic 平面上的一个点(三个 topic 的混合权重)
d = [0.3, 0.5, 0.2]
# 文档的词分布 = 三个 topic 词分布的加权和
doc = [d[0]*T1[i] + d[1]*T2[i] + d[2]*T3[i] for i in range(3)]
print('topic 的词分布(词单纯形上的三个点):')
for name, t in zip(['T1', 'T2', 'T3'], [T1, T2, T3]):
print(f' {name}: W1={t[0]:.1f} W2={t[1]:.1f} W3={t[2]:.1f}')
print(f'文档 d 的 topic 权重: T1={d[0]:.1f} T2={d[1]:.1f} T3={d[2]:.1f}')
print('文档 d 合成出的词分布:')
print(f' W1={doc[0]:.2f} W2={doc[1]:.2f} W3={doc[2]:.2f}')
print(f' 概率总和检查: {sum(doc):.2f}')
print(f'生成走查: 按 d 最可能采到 T2(概率 {d[1]:.1f}),T2 里最可能采出 W2(概率 {T2[1]:.1f})')topic 的词分布(词单纯形上的三个点):
T1: W1=0.4 W2=0.4 W3=0.2
T2: W1=0.0 W2=0.8 W3=0.2
T3: W1=0.8 W2=0.1 W3=0.1
文档 d 的 topic 权重: T1=0.3 T2=0.5 T3=0.2
文档 d 合成出的词分布:
W1=0.28 W2=0.54 W3=0.18
概率总和检查: 1.00
生成走查: 按 d 最可能采到 T2(概率 0.5),T2 里最可能采出 W2(概率 0.8)现在给定一个文本,里边不有好多个词吗——、、……这里边的词是怎么生成的呢?首先根据给定文本的概率分布,选择是哪一个 topic:比如我们选到了 ; 这个 topic 里边,词有这样的分布——一选,哦,又把 采样出来了。第一个词,就是 。
所以大家可以明白,topic model 所想做的事情,就是一种全新的、不同的表示方式和方法:我们把隐含变量的 topic 作为词的概率分布的形式,实际所做的事情,是把任何一个文本压缩到以 topic 为主的、以 topic 为基线(baseline)的空间里边。在这个空间里边,任何文本都可以作为 topic 的组合。所以某种程度来讲,它起到的是一种语义空间上的压缩——真实场景里词表 是两万维,而 topic 只有 个(比如 20 个),一篇文档从两万维的词袋子,压缩成了 个数的主题配比。
语义距离:KL 散度
压缩进语义空间之后,就能做一件新事情:衡量文本之间的距离。假设有三个文本 、、——比如 讲 Harry Potter 的第一部《Philosopher’s Stone(魔法石)》, 还是 Harry Potter(《Order of Phoenix,凤凰社》),但 完全不一样了,它是夏洛克·福尔摩斯。直观上, 和 在用语、词的分布上更相近, 和 肯定离得更远(讲师口播时把两处大小关系说反了,这里按语义直觉与正确方向写: 更小)。
这个距离怎么衡量?别忘了 、 都是概率分布,所以可以用两个分布之间的距离——KL divergence(KL 散度)。对分布 和 ,它定义为:
讲师板书时先写成了「 乘上 这样 比 」,马上自我纠正——正确的是 乘上 ,再连加。
但 KL 散度是非对称的:。所以一般来讲,要用真正的 distance measure 的话,我们用它两个方向的 average:
把两个方向所有的 KL 散度求加和、除以二。用代码把非对称和平均都算出来:
import math
def kl(p, q):
"""离散分布 P、Q 的 KL 散度(本例数据无零概率,直接求和)"""
return sum(pi * math.log(pi / qi) for pi, qi in zip(p, q))
def avg_kl(p, q):
"""两个方向求平均,得到对称的距离"""
return 0.5 * (kl(p, q) + kl(q, p))
# 第一部分:非对称性——同一对分布,两个方向不一样
P = [0.8, 0.2]
Q = [0.5, 0.5]
print(f'KL(P||Q) = {kl(P, Q):.4f} KL(Q||P) = {kl(Q, P):.4f} (同一对分布,两个方向的值不相等)')
# 第二部分:三个文档的语义距离(K=3:魔法 / 冒险 / 侦探)
D1 = [0.5, 0.4, 0.1] # 哈利波特与魔法石
D2 = [0.4, 0.5, 0.1] # 哈利波特与凤凰社
D3 = [0.1, 0.2, 0.7] # 福尔摩斯探案集
print(f'KL(D1||D3) = {kl(D1, D3):.4f} KL(D3||D1) = {kl(D3, D1):.4f} (换方向,值又不同)')
print(f'平均KL(D1, D2) = {avg_kl(D1, D2):.4f} (同属哈利波特系列,距离小)')
print(f'平均KL(D1, D3) = {avg_kl(D1, D3):.4f} (换到福尔摩斯,距离大)')KL(P||Q) = 0.1927 KL(Q||P) = 0.2231 (同一对分布,两个方向的值不相等)
KL(D1||D3) = 0.8874 KL(D3||D1) = 1.0626 (换方向,值又不同)
平均KL(D1, D2) = 0.0223 (同属哈利波特系列,距离小)
平均KL(D1, D3) = 0.9750 (换到福尔摩斯,距离大)三件事都看见了:同一对分布换个方向,KL 值就不一样(0.1927 vs 0.2231);Harry Potter 系列内部的两本书,平均 KL 只有 0.0223——几乎贴在一起;换成福尔摩斯,跳到 0.9750,差出四十多倍。topic model 就可以这样衡量、计算语义之间不同的距离。
📝 动手练一练
- 概念辨析:LDA 的全名 Latent Dirichlet Allocation 三个词各对应模型的哪个部分?补上「 也交给狄利克雷」这一层之后,模型有哪两个狄利克雷超参、各控制什么?两者谁的维度高,为什么?
👉 点击查看参考答案
- Latent:模型有隐含变量(,还有 、 这些被当成随机变量的参数层);
- Dirichlet:用了狄利克雷分布做先验;
- Allocation:分配——把词分配给主题、把主题按权重分配给文档。
- 两个超参: 控制每篇文档的主题分布 ; 控制每个主题的词分布 。
- 的维度高: 的维数等于词典大小 (两万量级), 的维数等于主题数 (几十量级)。因为 的混合代表词的分布,要跟整个词典的维度一样; 只代表一个文本里 topic 的混合,有 个 topic 而已。
- 手算验证:给定 、,手算 与 ,再算平均距离。两个方向的值相等吗?这说明了什么?
👉 点击查看参考答案
- 平均距离
两个方向不相等(0.1927 vs 0.2231)——KL 散度是非对称的:它衡量的是「用 去近似 」的代价,方向一换,代价就不同。所以要把它当真正的距离(distance measure)用,需要像本节那样把两个方向求平均。
本章小结
这节我们最后强调一遍:topic model 所做的事情,是把一个文本表示成主题(topic)的分布,任何一个主题又是词的分布。LDA 里的 给定每个 topic 的词分布,而且 还可以当成一个随机变量,由上面一层的狄利克雷分布控制——这样普通的 topic model 就有两个超参 和 ,最后得到的 通过这两个方向的采样得到。而多层概率模型的一般形式 ,把「参数也可以是随机变量」这个贝叶斯想法推到了任意层数。记住「一个文本是主题的分布,主题是词的分布」这一点,就可以比较形象地理解整个模型。到这里,上次课的尾巴也讲完了。
📋 行动清单
- 默写全名拆解:不借助资料说出 Latent Dirichlet Allocation 三个词各自对应模型的哪个部分。
- 画出两层结构:从两个超参 (控制 )和 (控制 )出发,画出「超参 → 隐变量分布 → 隐变量 → 词」的两条采样链,并说出 与 谁的维度高、为什么。
- 手算 KL:对 、 手算 、 和平均值,验证两个方向不相等。
- 体会压缩:想一篇你熟悉的文章,把它从「两万维词袋」压到「三个主题配比」之后,丢掉了什么、保住了什么。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。
- 下载第16章课件:无监督学习(k-means/PCA/SVD/Isomap)