查看全课大纲(第 65 / 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 回传
Dirichlet 分布(2)
约 28 分钟
小象实战讲义 · 机器学习算法精讲
上一节我们搭好了 LDA 的雏形:超参数 生成文档的主题混合 , 为每个词选主题 ,主题 再按主题-词分布 生成具体的词。这一节模型图已经画完,我们把它完整地讲一遍:下角标一个个读清楚,生成过程一步步走查,数一数模型里到底有多少参数,最后回答一个更重要的问题——为什么要把不确定性再往上提一层。
💡 核心导读
- 下角标精读:、、 各代表什么,为什么每篇文档要带一个 。
- 生成过程走查:从 采 、从 采颜色(主题)、再按 采词——普通分布一步采样,LDA 采了三次。
- 参数量级:2 万个词、20 个 topic, 就有 40 万个值——远超隐马尔可夫模型的几十个参数。
- 模型谱系:普通概率模型 → 隐含变量 → 隐马尔可夫 → 混合模型(PLSA)→ LDA,每往上一级多出的是哪一层。
- 往上提一层的好处:点估计稍一变结果就变;把 交给 控制,等于用 掌控一整片「附近的好模型」——层数越高,容量(capacity)越大。
把模型的下角标读清楚
讲师开场先把话说明白:「大家不用关心这里边的下角标的情况,如果需要,我给大家去解释一下。」——这一节模型的下角标比以前多,值得花几分钟逐个读。
小 与 : 代表具体的词的数量。为什么角标变成了 ?因为 代表每一个不同的文档:第一篇文章里边的词从 1 数到 ,第二篇文章里词的总数量是 ,第三篇是 ……因为每一篇文章里边词的数目不一样,所以要多加一个 的角标,记作 。
: 是文档序号,从 1 到 ; 对应主题维度—— 就是我们目前有多少个 topic 的混合。给定第八个文本(), 就是一个概率分布;假设 ,它就是四维的:、、、。 代表的,就是第八个文档里边的第四个维度上的值——第八篇文档里第四个主题占多大权重。
: 是一个矩阵,给定第几个 topic,它这些词的分布是什么样。因为有 个 topic、词表里有 个词,所以 实际上是 这样的 矩阵。讲师特别说明:板书上画的 和矩阵写法是一个转置关系,「这个大家不用关心,这个不是不重要——你可以这样去看,也可以取它的转置,都是 OK 的」。
| 符号 | 含义 |
|---|---|
| 文档总数( 从 1 到 ) | |
| 第 篇文档的词数(每篇不一样) | |
| 主题数( 的维数,人为选定) | |
| 第 篇文档里主题 的权重 | |
| 主题 里词 的概率( 是 矩阵, 为词表大小) | |
| 超参数,控制每篇文档的 | |
| 第 篇文档第 个词的主题 | |
| 第 篇文档第 个观测到的词 |
生成过程:一步、两步、三步
下角标读清楚之后,整个生成过程可以这样描述。
第一步,给定一个 。 是我们要学习的,实际上就是一个超参数。有了这个超参数,接着学习它能生成的混合程度——说白了就是 的值: 从 取,,一个狄利克雷分布。 一定是一个组合的概率值:假设有三个分量 、、, 就是类似 这样各分量和为 1 的组合。
第二步, 是每种颜色的词分布。 代表:红色的 topic 里边,所有对词的概率分布——也就是 , 时 的分布是什么样。假设参数给定了红色 topic:第一个词 life 的概率最大,其次是 involve。我们在这个分布上采样,一下采到了一个 life,就把第一个词 life 放到了文本里——文本的词就是这样生成的。
第三步,回到 再采颜色。第二次还是从 开始——因为我们已经采到了一个 ,从它再选取一个,选了黄色;看黄色 topic 所对应的词的分布,又生成了一个词,比如「基因」或者 DNA。再去采,采出一个红色,再采黄色、再采蓝色……每次采到什么颜色,就去 里相应颜色的那一行,选取哪个词的概率大,根据它的概率分布采一个词放到文本里。这就是一个完整的采样过程。
这里值得停下来对照一下。所有概率模型所做的事情是这样子的:给定一个正态分布,我们看到好多数据,就假设这些数据都是这个概率分布生成的、都是它的采样;回过头来再利用这些值解释——它里边的参数 和方差都该是什么。这个采样就一步:给定分布,直接在上面采一个数据出来。但我们刚才描述的系统,是一个 hierarchical(层级)结构——它的采样不是一下就采出来的,采了三次才采出来。不过无论采了几次,它总之是一个复杂的概率模型和系统。我们现在实际观察到的,是文本里边好多好多的词:能不能用这些词,反过来预测出它们所对应的这些参数?
LDA:高级一层的扔硬币生成器
这个问题我们其实早就见过答案。还记得最早研究的硬币问题吗?我们并不知道硬币是怎么来的,就假设它也是采样出来的:A 生成一个 , 来决定由 B 还是 C 掷出,才看到正面和反面;我们实际观察到的是好多正面反面,回过头来预测生成过程里面的参数。
LDA 也是一个扔硬币的生成器,但比硬币高级了一层:它假设 (在这里就是 )最开始的这个情况,是由更高级的狄利克雷分布所生成的。所以做文本问题时,我们看到了好多好多词,就来假设、估计这里边的参数——看到的这些单词,就像掷硬币看到的正面反面一样。上一节我们叫它们宗教硬币、计算机硬币,这一节讲师的清单更长:法律硬币、美学硬币,它们制出来不同的词和不同的面,回过头来预测这些硬币的参数。第一个参数就是 :关于每一个硬币掷出来不同面的概率多大——它就是我们三硬币模型里最开始的那个 的多词版。
代表用哪种类型的硬币。那这个硬币是由哪采出来的?是由硬币组合的先验、这个混合概率采出来的。讲师给了一个很好记的画面——每一个同学有自己的偏好:这个同学手揣着的,基本是数学硬币、物理硬币、计算机硬币;那个同学揣的是法学硬币、社会学硬币;还有一个揣的是美学硬币、唱歌硬币。你会发现,每个同学代表着不同的 topic 和硬币的组合。而硬币的组合是哪来的?——这里没有再假设更高级的随机变量了,这个组合就是由 这个超参生成的。
所以这个模型最后要学的东西,一共四样: 应该等于多少? 应该等于多少?每一个 等于多少?以及 所对应的 又应该是多少?
参数量级:从几十个到几十万个
数一数这些参数。正常来讲,取 20 个 topic 不算多,词表起码有两万个单词——这一乘,大概就是 40 万个 的值。 反而就不算多了:1000 篇文档、每篇 20 个主题分量,就是 2 万个 。2 万个 加上 40 万个 ,远远超过了以前我们对普通概率模型的理解——就像隐马尔可夫链,估计的参数也就是几十个;当参数从几十个变成几十万,这个问题就变得更难了。
也许这个时候可以试着用 EM 算法去解,会发现也不太容易。后来大家有了变分法(后来的文献多称变分推断,variational inference),或者通过 MCMC 采样,直接逼近背后的这种条件概率——这些推断方法本课不展开,但要知道它们是为什么被发明的:参数实在太多,直接极大似然算不动了。
再抽象一遍:概率模型的谱系
如果回过头来还是觉得难,可以像讲师那样把问题再抽象一遍——从最普通的模型一级一级加层,看每一级多出了什么。
第一级:普通的概率模型。看到一个普通的硬币、一个 :假设 服从某种分布,参数是 ——给定它所有的值,估计参数是什么,做极大似然估计。讲师的原话是「这是我们一直做做的事情,我们没有任何的事情所做」:随机变量、参数、极大似然。这是大一一直所学的。
第二级:引入隐含变量。再复杂一点,认为 是由一个随机变量 所生成的,回过头来由 控制——引入了隐含变量之后,里边的概率就不再是简单的直接估计,结果会变成 和 之间的关系(三硬币、EM 都住在这里)。
第三级:时间序列。假设 跟时间序列有关系,就变成了 、,一路点点点—— 不叫 了,叫 ,这里对应 :隐马尔可夫链。给定的最早参数变成 (最初始的状态分布),每一个不同的状态观察到不同的值,状态之间是一条隐马尔可夫链。
第四级:混合模型(mixture model)。由 来混合:。把「 生成 」这一对管它叫一个绿色框: 控制第一个绿色的框、第二个绿色的框……真正的概率混合是——无论绿色方块里面的概率是什么,前面都加一个 所对应的权重:
- 每个绿色方块是一个高斯分布 → 混合高斯(GMM),每个方块 2 个参数(、);
- 每个绿色方块是一个伯努利分布 → 混合伯努利(三硬币),每个方块 1 个参数();
- 每个绿色方块是给定 topic 时词的概率分布 → ——每个方块 2 万个参数。
是一个 2 万维的向量,合在一起是一个「2 万 × K」的矩阵——但它仍然是一个混合分布,形式上跟混合高斯没有任何区别。
第五级:LDA。到混合模型这一步( 控制这些绿色框),就是 PLSA 做到的地方——本章开头讲 PLSA 时我们画过它的概率图。LDA 在它基础之上又引入了一件事:这种混合我认为是由 生成的——给定 超参的狄利克雷分布,每次都可以采出来一种 ,而每一种 ,就代表了一种权重的组合。
为什么要往上提一层
那么,把 从「待估参数」升级成「由 生成的随机变量」,好处到底在哪?
先看 的作用。 不同的时候,如果还记得上一节狄利克雷分布的采样图,有一种情况是分布非常集中于某一个点:这个地方特别「重」,别的地方比较轻——那么采样就会有很大概率取到这个点附近。踩到这个点, 基本就是 ;再采一次,可能是 ——中间这个分量总是很大。这代表着 生成的 是有偏好的: 都比较大,其他的 都比较小。
再看核心动机。讲师的原话值得整段体会:因为我们整个的生活里面有很多的不确定性,所以即使想学 这个分布,也把这个不确定性往上考虑到了一层。也许固定学出的 就是趋近 ——这是我们最完美的情况,但这完美的情况,其实我们也不知道是什么。有一个很好的 控制的时候,可以把以 为中心的、附近的这些模型,都用 进行建模。「我不知道大家——我描述的这个意思有没有?」
以前我们在很多情况下,都认为参数是估计一个点:但这个点稍稍一变,最后的结果也都变了。往上一层就不一样了: 稍稍一变的时候,影响会小一些—— 的值可以控制到一大块区域,这一块大的区域里有很多不确定性,但基本都生成类似的 topic 的混合,而这种混合,基本可以达成对每个数据观察最好的逼近。往上提高一层,实际上是有这样的一个优点在里边。
层数越高,容量越大
再往大里说:可以广泛地认为,概率模型的层数越高,模型的 capacity——它所谓的自由度——越大,可以模拟或者逼近更复杂的关系。
这跟后来的深度网络是有关联、有类似想法的,但它们所描述的模型完全不一样:
- 深度网络:通过线性和非线性的组合、一步步地递归,是一个比较完整的可导函数;
- 这里:是概率的关系。这些概率关系都是特别优美、连续的概率时,有些后验概率求极大似然值还是能被计算出来;在很多情况下没法计算,就需要做一些数值上的逼近——深度网络那边也有类似的处境。
无论这些模型长什么样,做的事情都是把整个模型的自由度变大——可以考虑到更多的情况和更复杂的情况。在这个时候,如果你有大量的数据,你会发现这个模型非常地好用。
训练出来的 topic 长什么样
LDA 有很多现成的代码可以尝试,训练之后你会发现,它生成的 topic 非常地 make sense:不同的这些词之间,它们之间的概率分布会相差得非常大。也就是说,每一个 topic 其实并没有很清晰地告诉我们这个 topic 是什么,但它生成的词的区别是非常大的。
这里有一个最重要的澄清,讲师怕大家误解,专门停下来讲:topic 是关于词的概率,不是说只有这些词。每一个 topic(比如 art)所蕴含的词,是所有的词——词表有两万个,它里边的分布就是两万个词;budget 里边也是两万个。我们画图时只画了前边的(比如 top 15,把里边概率最大的 10 个画出来),不代表说后边没有词——后边还有很多很多的词,而且每一个词在每个 topic 里都有概率,只是排序不一样。所以有人会误解说 art 这个 topic 就是这几个词——不是这样子的:art 所代表的东西,是在整个词上的分布。
把概率最大的词画出来,区别立刻就看得见:
- art:show、music、play、musical、actor
- children:years、family、parents
- budget:budget、federal、year
- education:school、high、public、teacher
你会发现,每个 topic 里边这些词的组合,非常具有语义上的相关性。
基向量视角与 topic 数 K
我们所做的事情,仔细想一下其实就是:给定了好多这种文本,需要有一些基向量——这个基向量是用一个概率分布、一个离散的概率分布所描述的,这就是所谓的 topic。任何一篇文本,就像一个具体的矩阵一样,是由很多基向量的线性组合所决定的。
基向量怎么学?一定要学到这些基向量之间互相垂直——也就是这些 topic 之间,对词的分布尽量相差得非常大:art 乘上 budget 这个向量,应该趋于 0;budget 乘 children,应该趋于 0;我们所有学出来的 topic 的分布互相相乘,都应该趋于 0——它们就变成了一个空间里互相垂直的基向量。我们要学习到最好的基向量,来表示不同维度的关系,topic 在某种程度上正是起到了这个作用。
我们用代码把这个「垂直」数值化地看一眼。构造三个主题,每个主题在自己的词簇上集中,但按上面的澄清,对词表里所有词都保留一点概率(长尾 0.005);再构造一个与 art 高度重叠的「近亲主题」做病态对照:
import math
# 词表 12 个词,分属三个语义簇
vocab = ['show', 'music', 'play', 'actor', # 艺术簇
'budget', 'federal', 'spending', 'year', # 预算簇
'school', 'teacher', 'public', 'high'] # 教育簇
def topic(cluster):
"""构造一个主题:在 cluster 起始的 4 个词上集中(各 0.24),
其余 8 个词各留 0.005 的长尾——topic 是整个词表上的分布,不是只有高频词"""
probs = [0.005] * len(vocab)
for i in range(cluster, cluster + 4):
probs[i] = 0.24
return probs
def dot(a, b):
return sum(x * y for x, y in zip(a, b))
def cos(a, b):
return dot(a, b) / math.sqrt(dot(a, a) * dot(b, b))
beta_art, beta_budget, beta_edu = topic(0), topic(4), topic(8)
print(f'art 与 budget: 内积 {dot(beta_art, beta_budget):.4f},cos 相似度 {cos(beta_art, beta_budget):.3f}')
print(f'art 与 education: 内积 {dot(beta_art, beta_edu):.4f},cos 相似度 {cos(beta_art, beta_edu):.3f}')
# 病态对照:一个与 art 高度重叠的「近亲主题」(0.22*4 + 0.01*4 + 0.02*4 = 1.00)
beta_twin = [0.22, 0.22, 0.22, 0.22] + [0.01] * 4 + [0.02] * 4
print(f'art 与 art 近亲: 内积 {dot(beta_art, beta_twin):.4f},cos 相似度 {cos(beta_art, beta_twin):.3f}')art 与 budget: 内积 0.0097,cos 相似度 0.042
art 与 education: 内积 0.0097,cos 相似度 0.042
art 与 art 近亲: 内积 0.2118,cos 相似度 0.997三个各管一簇的主题,两两内积只有 0.0097,跟自身内积()相比差了二十多倍,cos 相似度 0.042——接近垂直;而那个跟 art 重叠的近亲主题,cos 相似度高达 0.997,几乎平行——两个主题分不开,等于一个基向量被数了两遍。这也正好解释了 topic 数 怎么选:在整个文本所表示的高维空间里边,可以用一个 20 维空间的基向量表述,还是 10 维空间的基向量——这个 10 和 20 就是 topic 的个数 ,由你来决定。太小了之后没有意义,没有办法去区分它们之间的差别;太大之后意义也不大,区分得太细了。合适的 topic number,会使你的效果比较好一些。
bank:一个词,两个 topic
最后剩下一小块,从 probabilistic generative process(生成过程)的角度再看一个例子。一个 topic 是 bank、money——这里的 bank 指 financial bank(银行);bank 还有一个河岸的意思——那代表第二个 topic。在这种程度上,其实我们就可以通过 topic 的不同,来区分它不同的语义和词性(一词多义,ambiguity)。
100% 从 financial 这个 topic 生成的时候,文字基本是 money、bank、loan;100% 从 river 生成,就是 river、bank、bank、river。但你会发现,经常出现的是一种混合的状态:money 有、bank 有、river 也有。用代码算一算这三种文档的词分布——两套 各管一个主题, 是文档的主题权重,文档的词分布就是两者的加权混合:
# 词表 6 个词。两套主题-词分布 beta(每行和为 1,手工设定)
vocab = ['money', 'bank', 'loan', 'river', 'water', 'stock']
beta_financial = [0.30, 0.25, 0.25, 0.02, 0.03, 0.15] # 金融主题
beta_river = [0.02, 0.25, 0.01, 0.30, 0.37, 0.05] # 河流主题
def doc_dist(t1, t2):
"""给定文档主题权重 (t1, t2),合成词分布 P(w) = t1*beta1[w] + t2*beta2[w]"""
return [t1 * b1 + t2 * b2 for b1, b2 in zip(beta_financial, beta_river)]
for name, t1, t2 in [('纯金融 theta=(1.0, 0.0)', 1.0, 0.0),
('纯河流 theta=(0.0, 1.0)', 0.0, 1.0),
('混合 theta=(0.6, 0.4)', 0.6, 0.4)]:
dist = doc_dist(t1, t2)
print(name + ':')
print(' ' + ' '.join(f'{w}={p:.3f}' for w, p in zip(vocab, dist)))
print(f' 概率总和检查: {sum(dist):.4f}')纯金融 theta=(1.0, 0.0):
money=0.300 bank=0.250 loan=0.250 river=0.020 water=0.030 stock=0.150
概率总和检查: 1.0000
纯河流 theta=(0.0, 1.0):
money=0.020 bank=0.250 loan=0.010 river=0.300 water=0.370 stock=0.050
概率总和检查: 1.0000
混合 theta=(0.6, 0.4):
money=0.188 bank=0.250 loan=0.154 river=0.132 water=0.166 stock=0.110
概率总和检查: 1.0000三个观察:
- 纯金融文档的词分布就是 的第一行,纯河流就是第二行——这就是「100% 从某个 topic 生成」的含义;
- 混合文档()里 money 有、bank 有、river 也有——正是讲师说的混合状态,各自按权重缩放(money );
- bank 在三种文档里都是 0.250,一动不动——因为两个主题里 bank 的概率恰好相等。bank 在金融主题和河流主题里都是高频词,这正是它一词多义的数学表达:无论文档偏哪个主题,它都排在前面。反过来说,只看 bank 这一个词,永远分不清这篇文档在讲金融还是河岸;money 和 river 这一对词,才是区分两个主题的钥匙。
现在把问题倒过来——这就是 LDA 要解的推断问题:告诉你观察到了第一个、第二个、第三个文本,想知道每个 topic 里边该是什么(主要就是 :给定每个 topic 的时候,词的分布是什么),以及每一个文档里主题组合的权重应该是多少—— 是第一篇文档的三个主题权重, 是第二篇的(讲师板书上有时按 topic 在前画,就像 的转置注一样,含义相同)。这个层面上你会发现,它好像还真有点像我们的一个神经网络——但实际上它们表述的是一种概率生成的关系,这一点可以区分一下。(今天的课,就给大家讲到这里。)
📝 动手练一练
- 概念辨析:为什么不直接为每篇文档估计一个固定的 ,而要往上加一层、让 从 中生成?请从「点估计稍一变会怎样」「 控制的范围」「模型层数与 capacity」三个角度回答。
👉 点击查看参考答案
按本节讲师的口径:以前我们估计的都是一个点的参数,但这个点稍稍一变,最后的结果也都变了;而 稍稍一变,影响会小一些,因为 的值控制到的是一大块区域——这块区域里虽然有很多不确定性,但基本都生成类似的 topic 混合,而这种混合能达成对每个数据观察最好的逼近。另一方面,概率模型的层数越高,模型的 capacity(自由度)越大,可以模拟或逼近更复杂的关系——有大量数据的时候,这样的模型非常好用。
- 手算验证:沿用「bank:一个词,两个 topic」一节的 ,把文档权重换成 ,手算这篇混合文档中 money、bank、river 三个词的概率。哪个词的概率与上节混合文档()完全相同?为什么?
👉 点击查看参考答案
- money
- bank
- river
bank 仍然是 0.250,与 时完全相同——因为两个主题里 bank 的概率都是 0.25,加权之后 ,与 的取值无关。这也再次说明:bank 是两个主题共享的高频词,单看它区分不了主题;money 与 river 随 一增一减,才是分辨文档偏向的指示词。
本章小结
本节把 LDA 讲完整了。我们把模型的下角标读清楚(、、),跟着讲师把生成过程走了三步采样( 采 、 采颜色、颜色按 采词),数出了它的参数量级(2 万个 加 40 万个 ,难怪 EM 也吃力、要请变分法和 MCMC 出场),并用五级谱系(普通概率模型 → 隐含变量 → 隐马尔可夫 → 混合模型 → LDA)给它定了位。更重要的是「为什么」:点估计稍一变结果就变,把不确定性交给 往上提一层,等于用 掌控一整片「附近的好模型」——层数越高,容量越大。最后两个直观:topic 是整个词表上的分布(top 词只是画出来的部分),彼此接近垂直、像一组基向量;bank 一词多义,正因为它在两个主题里都是高频词——单看它永远分不清主题,money 和 river 才是钥匙。
📋 行动清单
- 口述生成过程:不借助资料,把 LDA 为一篇文档生成词的完整步骤()一步步讲出来,数清楚一共采了几次样。
- 画出五级谱系:在笔记本上把普通概率模型 → 隐含变量 → 隐马尔可夫 → 混合模型 → LDA 画成一条升级链,标出每一级多出来的那一层。
- 运行并改动代码:修改 bank 一节代码里的 (如 、),观察各词概率怎么变、bank 为什么不变;再给基向量一节的代码增加第 4 个主题,验证新的两两内积仍然很小。
- 思考 K 的选取:如果要给一个词表 2 万词的新闻语料建 LDA,你会先试多大的 K?K 太小和太大分别会丢掉什么?
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。