查看全课大纲(第 65 / 82 节)
  1. 1.函数与数据泛化
  2. 2.向量:从几何直觉到高维空间
  3. 3.矩阵与张量
  4. 4.特征值与特征向量:矩阵变换的不动方向
  5. 5.凸函数:从向量求导的矩阵记号到好优化的函数形状
  6. 6.概率与统计:机器学习的数学基础
  7. 7.独立性与随机变量:贝叶斯公式与二项分布
  8. 8.期望、方差与协方差:随机变量的数字画像
  9. 9.联合概率:当一条轴不够用的时候
  10. 10.概率分布(一):从伯努利到伽马函数
  11. 11.概率分布(二):贝塔、泊松、正态与两个贝叶斯故事
  12. 12.机器学习的模型:找输入与输出的关系
  13. 13.机器学习的应用
  14. 14.过拟合
  15. 15.机器学习的分类
  16. 16.有监督学习:从房价预测说起
  17. 17.损失函数
  18. 18.梯度下降(上):更新规则与学习速率
  19. 19.梯度下降(2)
  20. 20.牛顿方法
  21. 21.KNN简介
  22. 22.距离测算
  23. 23.朴素贝叶斯
  24. 24.朴素贝叶斯的实际应用
  25. 25.信息熵:决策树构建的度量基础
  26. 26.信息增益与决策树的构建
  27. 27.ID3算法
  28. 28.决策树节点的划分
  29. 29.CART树
  30. 30.Bagging
  31. 31.Boosting:自适应提升算法
  32. 32.Gradient Boosting
  33. 33.线性模型:回归与分类的同一副骨架
  34. 34.最小二乘:把最优参数直接解出来
  35. 35.最小二乘法的几何与概率视角
  36. 36.极大似然:给最小二乘一个概率出身
  37. 37.逻辑回归(1):把线性模型接到分类上
  38. 38.逻辑回归(2):损失函数与多分类
  39. 39.---- 手造数据: 5 个样本, 2 个特征; x2 几乎 = 2*x1 (偏差手工指定, 无随机) ----
  40. 40.讲师例: 向量 "23014" -- 三把范数尺子量同一个向量
  41. 41.优化方法(1):坐标下降与前向选择
  42. 42.优化方法(2):前向策略与最小角回归
  43. 43.拉格朗日乘子法(1):从无约束到等式约束
  44. 44.拉格朗日乘子法(2):等式约束下的平行条件与拉格朗日函数
  45. 45.拉格朗日乘子法(3):不等式约束与 KKT 条件
  46. 46.最大间隔:把分类问题变成优化问题
  47. 47.拉格朗日对偶问题:把 w 和 b 全部换成 α
  48. 48.支持向量:边界上的少数派
  49. 49.SVM 计算过程:一笔到底算完,再走进核方法
  50. 50.贝叶斯公式:概率即信念
  51. 51.隐含变量和概率模型:给看不见的原因建模
  52. 52.EM 算法:期望与最大化的迭代
  53. 53.琴生不等式:EM 的数学钥匙
  54. 54.三个硬币问题:EM 的复盘与衔接
  55. 55.高斯混合模型:用隐变量解释双峰数据
  56. 56.隐马尔可夫模型
  57. 57.隐马尔可夫模型(2):前向算法与动态混合模型
  58. 58.隐马尔可夫模型在 NLP 中的运用
  59. 59.EM 算法:把「为什么收敛」推到底
  60. 60.HMM 在 NLP 中的运用:从分词到机器翻译
  61. 61.HMM 参数估计:Baum-Welch 的三块拉格朗日
  62. 62.高维下的高斯模型
  63. 63.主题模型:从词袋到隐含主题
  64. 64.Dirichlet 分布(1)
  65. 65.Dirichlet 分布(2)
  66. 66.统计学习内容回顾
  67. 67.K-means 算法
  68. 68.PCA 降维
  69. 69.SVD 降维
  70. 70.从聚类到流形
  71. 71.局部线性嵌入
  72. 72.随机邻域嵌入:SNE 与 t-SNE
  73. 73.无参模型:让数据自己说话
  74. 74.高斯过程:函数空间里的正态分布
  75. 75.高斯过程(2):噪声、正则化与核的线性组合
  76. 76.神经网络简介:从感知器到自编码器
  77. 77.反向传播:把误差一层层传回去
  78. 78.卷积神经网络(CNN):让特征自己学出来
  79. 79.循环神经网络(RNN):给网络装上记忆
  80. 80.深度学习回顾:静态一类,动态一类
  81. 81.增强学习(1):蒙特卡洛、树搜索与 Q-learning
  82. 82.强化学习(2):从乌鸦吃核桃到井字棋的 value 回传

Dirichlet 分布(2)

约 28 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · 机器学习算法精讲

上一节我们搭好了 LDA 的雏形:超参数 α\boldsymbol{\alpha} 生成文档的主题混合 θ\theta,θ\theta 为每个词选主题 zz,主题 zz 再按主题-词分布 β\boldsymbol{\beta} 生成具体的词。这一节模型图已经画完,我们把它完整地讲一遍:下角标一个个读清楚,生成过程一步步走查,数一数模型里到底有多少参数,最后回答一个更重要的问题——为什么要把不确定性再往上提一层。

💡 核心导读

  • 下角标精读:NdN_d、θd,k\theta_{d,k}、βk,i\beta_{k,i} 各代表什么,为什么每篇文档要带一个 dd。
  • 生成过程走查:从 α\alpha 采 θ\theta、从 θ\theta 采颜色(主题)、再按 β\boldsymbol{\beta} 采词——普通分布一步采样,LDA 采了三次。
  • 参数量级:2 万个词、20 个 topic,β\boldsymbol{\beta} 就有 40 万个值——远超隐马尔可夫模型的几十个参数。
  • 模型谱系:普通概率模型 → 隐含变量 → 隐马尔可夫 → 混合模型(PLSA)→ LDA,每往上一级多出的是哪一层。
  • 往上提一层的好处:点估计稍一变结果就变;把 θ\theta 交给 α\alpha 控制,等于用 α\alpha 掌控一整片「附近的好模型」——层数越高,容量(capacity)越大。

把模型的下角标读清楚

讲师开场先把话说明白:「大家不用关心这里边的下角标的情况,如果需要,我给大家去解释一下。」——这一节模型的下角标比以前多,值得花几分钟逐个读。

小 nn 与 NdN_d:nn 代表具体的词的数量。为什么角标变成了 d nd\,n?因为 dd 代表每一个不同的文档:第一篇文章里边的词从 1 数到 N1N_1,第二篇文章里词的总数量是 N2N_2,第三篇是 N3N_3……因为每一篇文章里边词的数目不一样,所以要多加一个 dd 的角标,记作 NdN_d。

θd,k\theta_{d,k}:dd 是文档序号,从 1 到 MM;kk 对应主题维度——KK 就是我们目前有多少个 topic 的混合。给定第八个文本(d=8d=8),θ\theta 就是一个概率分布;假设 K=4K=4,它就是四维的:θ8,1\theta_{8,1}、θ8,2\theta_{8,2}、θ8,3\theta_{8,3}、θ8,4\theta_{8,4}。θ8,4\theta_{8,4} 代表的,就是第八个文档里边的第四个维度上的值——第八篇文档里第四个主题占多大权重。

βk,i\beta_{k,i}:β\boldsymbol{\beta} 是一个矩阵,给定第几个 topic,它这些词的分布是什么样。因为有 KK 个 topic、词表里有 ii 个词,所以 β\boldsymbol{\beta} 实际上是 βk,i\beta_{k,i} 这样的 K×iK \times i 矩阵。讲师特别说明:板书上画的 β\boldsymbol{\beta} 和矩阵写法是一个转置关系,「这个大家不用关心,这个不是不重要——你可以这样去看,也可以取它的转置,都是 OK 的」。

符号含义
MM文档总数(dd 从 1 到 MM)
NdN_d第 dd 篇文档的词数(每篇不一样)
KK主题数(θ\theta 的维数,人为选定)
θd,k\theta_{d,k}第 dd 篇文档里主题 kk 的权重
βk,i\beta_{k,i}主题 kk 里词 ii 的概率(β\boldsymbol{\beta} 是 K×VK \times V 矩阵,VV 为词表大小)
α\boldsymbol{\alpha}超参数,控制每篇文档的 θd∼Dir(α)\theta_d \sim \text{Dir}(\boldsymbol{\alpha})
zd,nz_{d,n}第 dd 篇文档第 nn 个词的主题
wd,nw_{d,n}第 dd 篇文档第 nn 个观测到的词

生成过程:一步、两步、三步

下角标读清楚之后,整个生成过程可以这样描述。

第一步,给定一个 α\alpha。α\alpha 是我们要学习的,实际上就是一个超参数。有了这个超参数,接着学习它能生成的混合程度——说白了就是 θ\theta 的值:θ\theta 从 α\alpha 取,θ∼Dir(α)\theta \sim \text{Dir}(\boldsymbol{\alpha}),一个狄利克雷分布。θ\theta 一定是一个组合的概率值:假设有三个分量 Z1Z_1、Z2Z_2、Z3Z_3,θ\theta 就是类似 (0.8,0.1,0.1)(0.8, 0.1, 0.1) 这样各分量和为 1 的组合。

第二步,β\boldsymbol{\beta} 是每种颜色的词分布。β\beta 代表:红色的 topic 里边,所有对词的概率分布——也就是 W∣ZW \mid Z,Z=1Z=1 时 WW 的分布是什么样。假设参数给定了红色 topic:第一个词 life 的概率最大,其次是 involve。我们在这个分布上采样,一下采到了一个 life,就把第一个词 life 放到了文本里——文本的词就是这样生成的。

第三步,回到 θ\theta 再采颜色。第二次还是从 θ\theta 开始——因为我们已经采到了一个 θ\theta,从它再选取一个,选了黄色;看黄色 topic 所对应的词的分布,又生成了一个词,比如「基因」或者 DNA。再去采,采出一个红色,再采黄色、再采蓝色……每次采到什么颜色,就去 β\boldsymbol{\beta} 里相应颜色的那一行,选取哪个词的概率大,根据它的概率分布采一个词放到文本里。这就是一个完整的采样过程。

这里值得停下来对照一下。所有概率模型所做的事情是这样子的:给定一个正态分布,我们看到好多数据,就假设这些数据都是这个概率分布生成的、都是它的采样;回过头来再利用这些值解释——它里边的参数 μ\mu 和方差都该是什么。这个采样就一步:给定分布,直接在上面采一个数据出来。但我们刚才描述的系统,是一个 hierarchical(层级)结构——它的采样不是一下就采出来的,采了三次才采出来。不过无论采了几次,它总之是一个复杂的概率模型和系统。我们现在实际观察到的,是文本里边好多好多的词:能不能用这些词,反过来预测出它们所对应的这些参数?

LDA:高级一层的扔硬币生成器

这个问题我们其实早就见过答案。还记得最早研究的硬币问题吗?我们并不知道硬币是怎么来的,就假设它也是采样出来的:A 生成一个 π\pi,π\pi 来决定由 B 还是 C 掷出,才看到正面和反面;我们实际观察到的是好多正面反面,回过头来预测生成过程里面的参数。

LDA 也是一个扔硬币的生成器,但比硬币高级了一层:它假设 π\pi(在这里就是 θ\theta)最开始的这个情况,是由更高级的狄利克雷分布所生成的。所以做文本问题时,我们看到了好多好多词,就来假设、估计这里边的参数——看到的这些单词,就像掷硬币看到的正面反面一样。上一节我们叫它们宗教硬币、计算机硬币,这一节讲师的清单更长:法律硬币、美学硬币,它们制出来不同的词和不同的面,回过头来预测这些硬币的参数。第一个参数就是 β\boldsymbol{\beta}:关于每一个硬币掷出来不同面的概率多大——它就是我们三硬币模型里最开始的那个 pp 的多词版。

zz 代表用哪种类型的硬币。那这个硬币是由哪采出来的?是由硬币组合的先验、这个混合概率采出来的。讲师给了一个很好记的画面——每一个同学有自己的偏好:这个同学手揣着的,基本是数学硬币、物理硬币、计算机硬币;那个同学揣的是法学硬币、社会学硬币;还有一个揣的是美学硬币、唱歌硬币。你会发现,每个同学代表着不同的 topic 和硬币的组合。而硬币的组合是哪来的?——这里没有再假设更高级的随机变量了,这个组合就是由 α\alpha 这个超参生成的。

所以这个模型最后要学的东西,一共四样:α\alpha 应该等于多少?θ\theta 应该等于多少?每一个 zz 等于多少?以及 zz 所对应的 β\boldsymbol{\beta} 又应该是多少?

参数量级:从几十个到几十万个

数一数这些参数。正常来讲,取 20 个 topic 不算多,词表起码有两万个单词——这一乘,大概就是 40 万个 β\beta 的值。θ\theta 反而就不算多了:1000 篇文档、每篇 20 个主题分量,就是 2 万个 θ\theta。2 万个 θ\theta 加上 40 万个 β\beta,远远超过了以前我们对普通概率模型的理解——就像隐马尔可夫链,估计的参数也就是几十个;当参数从几十个变成几十万,这个问题就变得更难了。

也许这个时候可以试着用 EM 算法去解,会发现也不太容易。后来大家有了变分法(后来的文献多称变分推断,variational inference),或者通过 MCMC 采样,直接逼近背后的这种条件概率——这些推断方法本课不展开,但要知道它们是为什么被发明的:参数实在太多,直接极大似然算不动了。

再抽象一遍:概率模型的谱系

如果回过头来还是觉得难,可以像讲师那样把问题再抽象一遍——从最普通的模型一级一级加层,看每一级多出了什么。

第一级:普通的概率模型。看到一个普通的硬币、一个 XX:假设 XX 服从某种分布,参数是 θ\theta——给定它所有的值,估计参数是什么,做极大似然估计。讲师的原话是「这是我们一直做做的事情,我们没有任何的事情所做」:随机变量、参数、极大似然。这是大一一直所学的。

第二级:引入隐含变量。再复杂一点,认为 XiX_i 是由一个随机变量 ZiZ_i 所生成的,回过头来由 ZiZ_i 控制——引入了隐含变量之后,里边的概率就不再是简单的直接估计,结果会变成 XiX_i 和 ZiZ_i 之间的关系(三硬币、EM 都住在这里)。

第三级:时间序列。假设 ii 跟时间序列有关系,就变成了 Zi+1Z_{i+1}、Xi+1X_{i+1},一路点点点——XX 不叫 XnX_n 了,叫 XtX_t,这里对应 ZtZ_t:隐马尔可夫链。给定的最早参数变成 π\pi(最初始的状态分布),每一个不同的状态观察到不同的值,状态之间是一条隐马尔可夫链。

第四级:混合模型(mixture model)。由 θ\theta 来混合:θ1⋅p(xi∣z1)+θ2⋅p(xi∣z2)+⋯+θK⋅p(xi∣zK)\theta_1 \cdot p(x_i \mid z_1) + \theta_2 \cdot p(x_i \mid z_2) + \cdots + \theta_K \cdot p(x_i \mid z_K)。把「ZiZ_i 生成 XiX_i」这一对管它叫一个绿色框:θ\theta 控制第一个绿色的框、第二个绿色的框……真正的概率混合是——无论绿色方块里面的概率是什么,前面都加一个 θ\theta 所对应的权重:

  • 每个绿色方块是一个高斯分布 → 混合高斯(GMM),每个方块 2 个参数(μ\mu、σ\sigma);
  • 每个绿色方块是一个伯努利分布 → 混合伯努利(三硬币),每个方块 1 个参数(pp);
  • 每个绿色方块是给定 topic 时词的概率分布 → β1,β2,…,βK\beta_1, \beta_2, \ldots, \beta_K——每个方块 2 万个参数。

β\boldsymbol{\beta} 是一个 2 万维的向量,合在一起是一个「2 万 × K」的矩阵——但它仍然是一个混合分布,形式上跟混合高斯没有任何区别。

第五级:LDA。到混合模型这一步(θ\theta 控制这些绿色框),就是 PLSA 做到的地方——本章开头讲 PLSA 时我们画过它的概率图。LDA 在它基础之上又引入了一件事:这种混合我认为是由 α\alpha 生成的——给定 α\alpha 超参的狄利克雷分布,每次都可以采出来一种 θ\theta,而每一种 θ\theta,就代表了一种权重的组合。

为什么要往上提一层

那么,把 θ\theta 从「待估参数」升级成「由 α\alpha 生成的随机变量」,好处到底在哪?

先看 α\alpha 的作用。α\alpha 不同的时候,如果还记得上一节狄利克雷分布的采样图,有一种情况是分布非常集中于某一个点:这个地方特别「重」,别的地方比较轻——那么采样就会有很大概率取到这个点附近。踩到这个点,θ\theta 基本就是 (0.9,0.05,0.05)(0.9, 0.05, 0.05);再采一次,可能是 (0.8,0.1,0.1)(0.8, 0.1, 0.1)——中间这个分量总是很大。这代表着 α\alpha 生成的 θ\theta 是有偏好的:θ1\theta_1 都比较大,其他的 θ\theta 都比较小。

再看核心动机。讲师的原话值得整段体会:因为我们整个的生活里面有很多的不确定性,所以即使想学 θ\theta 这个分布,也把这个不确定性往上考虑到了一层。也许固定学出的 θ\theta 就是趋近 (0.8,0.1,0.1)(0.8, 0.1, 0.1)——这是我们最完美的情况,但这完美的情况,其实我们也不知道是什么。有一个很好的 α\alpha 控制的时候,可以把以 (0.8,0.1,0.1)(0.8, 0.1, 0.1) 为中心的、附近的这些模型,都用 α\alpha 进行建模。「我不知道大家——我描述的这个意思有没有?」

以前我们在很多情况下,都认为参数是估计一个点:但这个点稍稍一变,最后的结果也都变了。往上一层就不一样了:α\alpha 稍稍一变的时候,影响会小一些——α\alpha 的值可以控制到一大块区域,这一块大的区域里有很多不确定性,但基本都生成类似的 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,跟自身内积(4×0.242+8×0.0052=0.23064 \times 0.24^2 + 8 \times 0.005^2 = 0.2306)相比差了二十多倍,cos 相似度 0.042——接近垂直;而那个跟 art 重叠的近亲主题,cos 相似度高达 0.997,几乎平行——两个主题分不开,等于一个基向量被数了两遍。这也正好解释了 topic 数 KK 怎么选:在整个文本所表示的高维空间里边,可以用一个 20 维空间的基向量表述,还是 10 维空间的基向量——这个 10 和 20 就是 topic 的个数 KK,由你来决定。太小了之后没有意义,没有办法去区分它们之间的差别;太大之后意义也不大,区分得太细了。合适的 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 也有。用代码算一算这三种文档的词分布——两套 β\boldsymbol{\beta} 各管一个主题,θ\boldsymbol{\theta} 是文档的主题权重,文档的词分布就是两者的加权混合:

# 词表 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

三个观察:

  • 纯金融文档的词分布就是 β\boldsymbol{\beta} 的第一行,纯河流就是第二行——这就是「100% 从某个 topic 生成」的含义;
  • 混合文档(θ=(0.6,0.4)\theta = (0.6, 0.4))里 money 有、bank 有、river 也有——正是讲师说的混合状态,各自按权重缩放(money =0.6×0.30+0.4×0.02=0.188= 0.6 \times 0.30 + 0.4 \times 0.02 = 0.188);
  • bank 在三种文档里都是 0.250,一动不动——因为两个主题里 bank 的概率恰好相等。bank 在金融主题和河流主题里都是高频词,这正是它一词多义的数学表达:无论文档偏哪个主题,它都排在前面。反过来说,只看 bank 这一个词,永远分不清这篇文档在讲金融还是河岸;money 和 river 这一对词,才是区分两个主题的钥匙。

现在把问题倒过来——这就是 LDA 要解的推断问题:告诉你观察到了第一个、第二个、第三个文本,想知道每个 topic 里边该是什么(主要就是 β\boldsymbol{\beta}:给定每个 topic 的时候,词的分布是什么),以及每一个文档里主题组合的权重应该是多少——θ1,1,θ1,2,θ1,3\theta_{1,1}, \theta_{1,2}, \theta_{1,3} 是第一篇文档的三个主题权重,θ2,1,θ2,2,θ2,3\theta_{2,1}, \theta_{2,2}, \theta_{2,3} 是第二篇的(讲师板书上有时按 topic 在前画,就像 β\boldsymbol{\beta} 的转置注一样,含义相同)。这个层面上你会发现,它好像还真有点像我们的一个神经网络——但实际上它们表述的是一种概率生成的关系,这一点可以区分一下。(今天的课,就给大家讲到这里。)

📝 动手练一练

  1. 概念辨析:为什么不直接为每篇文档估计一个固定的 θ\theta,而要往上加一层、让 θ\theta 从 Dir(α)\text{Dir}(\boldsymbol{\alpha}) 中生成?请从「点估计稍一变会怎样」「α\alpha 控制的范围」「模型层数与 capacity」三个角度回答。
👉 点击查看参考答案

按本节讲师的口径:以前我们估计的都是一个点的参数,但这个点稍稍一变,最后的结果也都变了;而 α\alpha 稍稍一变,影响会小一些,因为 α\alpha 的值控制到的是一大块区域——这块区域里虽然有很多不确定性,但基本都生成类似的 topic 混合,而这种混合能达成对每个数据观察最好的逼近。另一方面,概率模型的层数越高,模型的 capacity(自由度)越大,可以模拟或逼近更复杂的关系——有大量数据的时候,这样的模型非常好用。

  1. 手算验证:沿用「bank:一个词,两个 topic」一节的 β\boldsymbol{\beta},把文档权重换成 θ=(0.7,0.3)\theta = (0.7, 0.3),手算这篇混合文档中 money、bank、river 三个词的概率。哪个词的概率与上节混合文档(θ=(0.6,0.4)\theta = (0.6, 0.4))完全相同?为什么?
👉 点击查看参考答案
  • money =0.7×0.30+0.3×0.02=0.216= 0.7 \times 0.30 + 0.3 \times 0.02 = 0.216
  • bank =0.7×0.25+0.3×0.25=0.250= 0.7 \times 0.25 + 0.3 \times 0.25 = 0.250
  • river =0.7×0.02+0.3×0.30=0.104= 0.7 \times 0.02 + 0.3 \times 0.30 = 0.104

bank 仍然是 0.250,与 θ=(0.6,0.4)\theta=(0.6, 0.4) 时完全相同——因为两个主题里 bank 的概率都是 0.25,加权之后 0.25×(θ1+θ2)=0.25×1=0.250.25 \times (\theta_1 + \theta_2) = 0.25 \times 1 = 0.25,与 θ\theta 的取值无关。这也再次说明:bank 是两个主题共享的高频词,单看它区分不了主题;money 与 river 随 θ\theta 一增一减,才是分辨文档偏向的指示词。

本章小结

本节把 LDA 讲完整了。我们把模型的下角标读清楚(NdN_d、θd,k\theta_{d,k}、βk,i\beta_{k,i}),跟着讲师把生成过程走了三步采样(α\alpha 采 θ\theta、θ\theta 采颜色、颜色按 β\boldsymbol{\beta} 采词),数出了它的参数量级(2 万个 θ\theta 加 40 万个 β\beta,难怪 EM 也吃力、要请变分法和 MCMC 出场),并用五级谱系(普通概率模型 → 隐含变量 → 隐马尔可夫 → 混合模型 → LDA)给它定了位。更重要的是「为什么」:点估计稍一变结果就变,把不确定性交给 α\alpha 往上提一层,等于用 α\alpha 掌控一整片「附近的好模型」——层数越高,容量越大。最后两个直观:topic 是整个词表上的分布(top 词只是画出来的部分),彼此接近垂直、像一组基向量;bank 一词多义,正因为它在两个主题里都是高频词——单看它永远分不清主题,money 和 river 才是钥匙。

📋 行动清单

  • 口述生成过程:不借助资料,把 LDA 为一篇文档生成词的完整步骤(α→θd→z→w\alpha \rightarrow \theta_d \rightarrow z \rightarrow w)一步步讲出来,数清楚一共采了几次样。
  • 画出五级谱系:在笔记本上把普通概率模型 → 隐含变量 → 隐马尔可夫 → 混合模型 → LDA 画成一条升级链,标出每一级多出来的那一层。
  • 运行并改动代码:修改 bank 一节代码里的 θ\theta(如 (0.5,0.5)(0.5, 0.5)、(0.9,0.1)(0.9, 0.1)),观察各词概率怎么变、bank 为什么不变;再给基向量一节的代码增加第 4 个主题,验证新的两两内积仍然很小。
  • 思考 K 的选取:如果要给一个词表 2 万词的新闻语料建 LDA,你会先试多大的 K?K 太小和太大分别会丢掉什么?

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第15章课件:统计学习(高维高斯/主题模型/Dirichlet)
    下载
  • 第15章笔记:高斯混合模型(GMM)
    下载
  • 第15章代码包(LDA 主题模型实验)
    下载