目标: 给定一组文档, 将其分类成不同的主题
词袋方法尝试直接使用数据集中出现的单词表示数据集中的文档, 但是通常这些单词基于一些底层参数, 这些参数在不同的文档之间有所变化, 例如讨论的主题, 在这一部分将讨论这种隐藏或潜在的变量(Latent Variables), 然后将学习用来估计他们的特定技巧称之为潜在狄利克雷分布(Latent Dirichlet Allocation), 最后使用LDA进行主题建模
Bag Of Words
从图形角度考虑词袋模型的话, 可以发现它表示一组文档对象与一组单词对象之间的关系.

假设有一篇这样的文章, 我们要看看该文章中有哪些单词, 假设我们正确地进行了词干提取和文本处理操作, 只查看重要的单词, 这篇文章有三个单词即Space, vote和explore, 出现的次数分别为2次, 1次, 3次, 要计算每个单词出现在文章中的概率, 我们除以单词总数 得出概率, 这样就获得了三个参数, 文档用表示, 单词或项用
表示, 参数是单词出现在文档中的概率
对于任何给定的文档和所观察的项
, 文档
生成词项
的概率是多少?
如下给出一些文档和一些词, 绘制所有这些概率, 假设有500个文档, 1000个唯一单词, 那么这个模型有多少个参数呢?

通过上面的单个文档含有三个词产生三个参数可知, 那么1000个唯一词对于每篇文档产生1000个参数, 那么对于500个文档就是, 500×1000个参数
因此总的来说,
但是对于我们的这个例子而言, 所计算的参数太多了, 所以需要缩减这一数字并继续保留大部分信息. 为此, 我们将向模型中添加一小组主题或潜在变量(Latent Variable), 这些变量实际上推动了每个文档中单词的生成, 也即每个文档中获得的单词应该是和潜在变量有关系. 在此模型中, 任何文档中都被视为具有一系列潜在相关主题, 同样, 主题被视为由可能会生成的词项组成. 例如下面这个例子中, 我们提到了三个主题, Science和Politics以及sports, 现在我们需要计算两组概率参数分布

第一个是在文档下主题
的概率, 即
第二个是在主题下词项
的概率, 即
在文档下词项
的概率, 可以表示为前两个概率的和, 即如下
思考: 如果由500个文档, 10个主题, 1000个单词, 新模型有多少个参数

通过潜在变量的引入, 我们发现参数由之前的50W减少到1.5W, 此称之为潜在狄利克雷分布, 简称LDA, LDA是一种矩阵分解, 我们将了解如何计算
LDA
原理: 从左侧的词袋模型, 变为右侧的LDA 模型, 左侧的词袋模型表示单词tax由第二个文档生成的概率是下图中白色箭头标签

在右侧的LDA模型中, 这个概率可以通过这些白色箭头计算, 用顶部的乘以底部对应的
然后求和, 这个公式可以采用矩阵乘法
我们可以将左侧的模型中的概率写成大的矩阵, 然后将这个大的词袋矩阵写成, 这个用文档和主题作为索引的高瘦矩阵, 与这个用主题和词项作为索引的宽扁模型的积

在此示例中, 词袋矩阵中第二个文档和词项'tax', 对应的条目等于右侧矩阵的相应行和列的内积

和之前一样 如果这些矩阵很大, 例如有 500 个文档, 10 个主题和 1,000 个词项, 词袋矩阵有 500,000 个条目, 而主题模型中的两个矩阵相结合后有 15,000 个条目

除了更简化之外, LDA还有一个更大的优势, 它具有大量主题 使我们能够根据这些主题拆分文档, 在这里 我们称这些主题为science politics and sports, 在现实生活中, 算法将直接采用一些主题, 并且由我们来查看相关单词 并决定所有这些单词的共同主题是什么
Matrices
构建这个 LDA 模型的原理是, 将左侧的词袋矩阵分解成两个矩阵, 两个矩阵的索引分别为文档和主题, 主题和单词

以下将详细介绍这些矩阵的含义
词袋矩阵
计算词袋矩阵的方式如下, 假设对于文档2(Doc 2), 其中包含单词space 3次, climate和rule给1次, 其他单词已被当作stopwords去除. 通过将这些数字写在相应的行中

要计算概率直接除以行的条目之和, 对于Doc 2, 条目之和为5, 这就是词袋矩阵

文档主题矩阵
现在计算文档主题矩阵, 假设对于Doc 3, 我们能够判断主要讲的是科学, 并且涉及了一些体育和政治, 假设70%关于科学, 10%关于政治, 20%关于体育, 将这些数字记录在相应的行中

主题词项矩阵
主题词项矩阵也相似, 这里有一个主题是政治, 假设我们能够得到这个主题生成一些单词的概率, 这些概率之和应该为1, 将他们放入相应的行

可以看出这两个矩阵的积是词袋矩阵, 并不是完全相等, 而是非常接近, 如果我们能够找到积非常接近词袋矩阵的两个矩阵, 则创建了主题模型

找到这个矩阵的方法
一种是传统的矩阵分解算法
注意: 矩阵的行的和是1
一组文档中, 主题和单词存在很多结构 , 我们采取比矩阵乘法更复杂的方法, 基本原理是两个主题建模矩阵的条目来自特殊的分布图. 我们将根据这一事实利用这些分布得到这两个矩阵
挑选主题
假设有一个派对, 场地是一个三角形房间, 这些黑点表示派对人士, 他们在现场到处走动, 假设某个角落有一些食物, 另一个角落有一些甜点, 还有一个角落有音乐

人们被这些角落吸引, 开始走向这些角落, 有些人喜欢音乐, 有些人则反之, 左侧白色的点代表的人, 不知道是选择食物还是甜点, 因此呆在中间, 但是通常, 他们倾向于走到红色区域并离开蓝色区域

假设我们创造了一个对立事物, 我们在一个角落放一头狮子, 另一个角落防止火源, 还有一个角落放置放射性废弃物, 现在人们将作出相反的行为, 他们将远离角落并被吸引到中心区域并离开蓝色区域, 因此我们有三个情形, 在角落放置吸引人的物品, 什么也不放置以及放置危险物品, 这些示例称之为狄利克雷分布

在这些三角形中, 点在红色区域的概率比在蓝色区域的概率要高.
狄利克雷分布在角落有参数, 如果参数很小例如 0.7, 0.7, 0.7, 则表示左侧情形, 如果全是1则为中间情形, 如果是很大的数字, 例如5, 则为右侧的情形

我们可以将这些参数看作排斥因子, 如果很大, 则促使点离开, 如果很小, 则使点更接近
例如我们的主题模型有三个主题, sports, science, politics

那么上面的三个模型中很显然左边更适合产生我们的主题模型, 在左侧分布中, 我们很有可能选择一个接近角落或边缘的点, 例如接近政治, 表明文章有80%是围绕政治, 10%围绕体育, 10%围绕科学

在中间的分布中, 我们可以选择任何点 概率都相同, 例如这个文档40%关于科学, 40% 政治, 20%关于体育

在右侧的分布中, 我们很有可能选择中间的点, 例如这个文档, 科学, 体育, 政治的概率几乎相等

我们选择的所有文档都会这样, 他们将是这些概率分布中的点, 我们思考下, 如果有大量文章, 文章是更有可能围绕一个主题, 还是同时围绕三个主题? 大部分文章都只围绕某一个事物, 要么是科学, 要么是体育, 要么是政治, 很少有文章围绕两个主题, 几乎没有文章是同时围绕三个主题的, 因此最有可能的主题分布是左侧分布

我们通常做的是, 对于LDA模型, 我们将选择一个参数很小的狄利克雷分布, 例如
为0.7, 0.7, 0.7, 然后我们将选取一些点作为文档, 每个点都给出了混合概率向量
, 描绘的是该文档的主题分布
以下是狄利克雷分布的三维图形, 在三角形上选择一个点的概率取决于该点的概率分布高度

Beta Distributions
我们来讨论下概率分布
假设有一枚硬币, 投掷两次 一次是正面 一次是背面 这个硬币的正反面概率如何? 可能比较公平 也有可能稍微偏向于正面或背面, 数据不足无法判定

假设我们认为它很公平 但是并不是很确定 我们思考下这枚硬币正面朝上的概率 p 保持一定的置信水平的话, p 为 1/2 但是也可能是其他值, 因此 p 的概率分布是这样的图形 1/2 处更高 但是整个区间内比较均匀, 角落 0 和 1 处非常低
假设投掷硬币 20 次 10 次正面 10 次背面 现在更有信心相信硬币很公平, 新值 p 的分布更像这个图形 , 0.5 的峰值更高

假设投掷硬币 4 次 正面 3 次 背面 1 次 p 的概率分布现在以 0.75 为中心, 因为尝试 4 次后有 3 次是正面 但是置信水平不高 因此是这样的图形

但是如果投掷 400 次 正面朝上 300 次 那么我们非常有信心相信 p 的值很接近 0.5 因此 p 的概率分布是这样的, 在 0.75 处有个很高的峰值 其他地方都几乎是扁平的, 称之为 β 分布

适合任何 a 和 b 值, 如果正面朝上 a 次 背面朝上 b 次 图形是这样的

在 处出现峰值 公式是这样的
除以
乘以 x 的 a-1 次幂 乘以 y 的 b-1 次幂
如果你没有见过伽马函数 可以看做阶乘函数的连续版本

在此示例中 如果 a 是整数 则 是 a-1 的阶乘 例如
是 4 的阶乘 结果为 24,
是 5 的阶乘 结果为 120 , 关于伽马函数 比较有趣的一点是 它还可以计算带小数点的值 例如可以计算
结果将在 24 和 120 之间
如果值不是整数会怎样 例如正面为 0.1 背面为 0.4, 这是不合理的, 因为不可能有 0.1 次正面 0.4 次背面, 但是对于 β 分布来说是可以的

我们只需使用伽马函数绘制正确的公式 对于小于 1 的值 例如 0.1 和 0.4 得出这个图形 表明 p 更有可能接近 0 或 1 而不是中间值
Dirichlet Distributions
多项分布是二项分布向多个值的泛化
例如假设有新闻报道和三个主题分别是科学, 政治和体育, 假设每个主题随机分配给这些文章 有三篇科学文章, 六篇政治文章和两篇体育文章, 对于一篇新文章 它是科学, 政治或体育文章的概率是多少?
可以想象它是政治和科学文章的概率高些并且是科学和体育文章的概率也高些, 不确定但是很有可能发生
这些概率位于一个三角形中 如果选择角落中的某个点 则该主题的概率是 1 其他主题的概率是 0 如果选择中间的点 则三个主题的概率相似
因此这三个概率的概率密度分布可能是这样的图形

因为文章更有可能是政治文章 不太可能是体育文章
这个概率密度分布的计算方式是采用如下 β 分布的泛化公式称之为狄利克雷分布
同样 这些数字并非必须是整数 例如 如果是 0.7 0.7 和 0.7 这是狄利克雷分布情况

当我们非常接近三角形的角落时 密度函数变得非常高 虽然不太容易看出这一规律, 表明从这个分布中随机选择的任何点, 非常有可能落入 科学 政治或体育所在角落 至少接近任何一条边, 位于中间某个位置的可能性非常低

这些是具有不同值的狄利克雷分布示例
注意:
如果值很大 则密度函数在中间很高
如果值很小 则在角落很高

如果值各不相同 则更高的部分移向更小的值 并离开更大的值

这是三维图形 如果要创建很好的主题模型, 我们需要选择很小的参数, 例如左侧图形 接下来我们将这么选择主题
Latent Dirichlet Alocation
现在构建 LDA 模型, 介绍下原理
这些是我们的文档

假设有右边的三个文档 然后生成一些虚假文档 例如左边三个文档 我们使用主题模型生成这些文档 然后将生成的文档与实际文档进行比较 这样可以判断使用模型创建真实文档的准确率有多高 和大多数机器学习算法一样 我们从这些错误中汲取经验 从而改善我们的主题模型
做法是在论文中 主题模型是这么绘制的 看起来很复杂

接下来我们会详细分析上图
Sample A Topic
我们首先为文档选择一些主题 从参数 狄利克雷分布开始 参数应该很小 以便分布在某侧出现峰值 意味着如果我们从分布中选择一个点 它最有可能接近角落 至少靠近边缘

假设选择这个接近政治角落的点 生成以下值 科学为 0.1 政治为 0.8 体育为 0.1 这些值表示这个文档的主题混合情况 并且给出了多项分布 我们开始从这个分布中 选择主题 因此所选主题 是科学的概率是 10% 是政治的概率是 80% 是体育的概率是 10% 我们将选择一些主题 例如最右边的政治 科学 政治 体育等等
对多个文档这么操作 每个文档是这个狄利克雷分布中的某个点
假设文档 1 在这里 得出了这个多项分布, 文档 2 在这里 给出了这个分布
算出所有其他文档的分布值

现在 合并所有这些向量 得出第一个矩阵 即用相应主题对文档进行索引标记的矩阵

Sample A Word
现在对主题和单词进行相同的运算
为了方便可视化 假设只有四个单词 space climate vote 和 rule, 现在有一个不同的分布 , 这个分布和之前的相似 但是三维分布 不是三角形 而是单纯形, 同样 红色部分表示很高的概率 蓝色部分表示很低的概率 如果有更多单词 则依然是非常清晰的分布 但是维度更高的单纯形 因此我们选择了 4 个单词 这样可以用三维图形来表示

在这个分布 中 我们选择一个随机的点 它很有可能接近角落或边缘 假设在这里 这个点生成了以下多项分布 space 为 0.4 climate 为 0.4 vote 和 rule 都为 0.1 我们将这个多项分布称为
, 它表示单词和主题之间的关系. 我们从这个分布中 抽取随机单词 单词是 space 的概率为 40% 是 climate 的概率为 40% 是 vote 和 rule 的概率都为 10% 单词可能是最右侧这样的

我们对每个主题执行这一运算 假设主题 1所在位置接近 Space 和 Climate 主题 2所在位置接近 vote 主题 3所在位置 接近 rule
注意 我们不知道它们是什么主题 只知道是主题 1 2 和 3 观察之后 可以推断 接近 Space 和 Climate 的主题 1 肯定是科学 同样 接近 vote 的主题 2 可能是政治 接近 rule 的主题 3 可能是体育 这是在模型最后执行的操作

最后一步 我们将这三个主题合并起来 获得 LDA 模型中的其他矩阵
Combining the Models
现在将这些组合到一起, 研究一下如何根据各自的狄利克雷分布获得 LDA 模型中的这两个矩阵

大致方式就是我们看到的, 第一个矩阵中的条目来自分布 中的点, 第二个矩阵的条目来自分布 β 中的点, 目标是找到这些点的最佳位置以便获得矩阵的最佳分解结果, 这些点的最佳位置将使我们获得所需的主题
我们生成一些文档 以便与原始文档进行比较 我们从主题 的狄利克雷分布开始 然后选择与所有文档对应的一些点 我们先选择其中一个点 这个点将为三个主题分别提供一些值 生成多项分布

这是与文档 1 对应的 主题混合结果, 现在为文档 1 生成一些单词 我们从 中选择一些主题 多少个主题呢? 这超出了这门课程的范畴 原理是根据泊松变量判断选择多少个主题 可以直接看作这个模型中的另一个参数
我们根据这个分布提供的概率 选择一些主题 选择科学的概率是 0.7 政治是 0.2, 体育是 0.1, 现在将单词与这些主题相关联, 如何关联?
使用单词狄利克雷分布 , 在这个分布中 我们确定该主题在某个位置 从每个点中 获得由每个主题生成的单词的分布

例如主题 1 科学 生成单词 space 的概率是 0.4 生成 Climate 的概率是 0.4 生成 vote 的概率是 0.1 生成 rule 的概率是 0.1 这些分布称为
对于所选的每个主题 我们将使用多元分布 选择与其相关的一个单词 例如 第一个主题是science, 我们在
分布中查看science所在行 并从中选择一个单词 例如 space, space 是文档 1 中的第一个单词

我们对每个主题执行这一流程 然后从第一个生成文档(称之为“虚假文档 1”)中 生成单词 重复这一流程

从 分布中选择另一个点 获得另一个多元分布
生成新的主题 并从
中生成新的单词 它是“Fake Doc 2” 一直持续下去 生成很多文档
现在将这些文档与原始文档进行比较, 我们将使用最大似然率找到获得真实文章概率最高的一系列点
总结下具体流程 我们有两个狄利克雷分布 和
我们从分布
中选择一些文档 并从分布
中 选择一些主题 将这两个相结合 创建虚假文章 然后将这些虚假文章与真实文章比较, 当然 获得真实文章的概率非常小, 但是 上方分布中肯定有一些点的组合能够最大化这个概率 我们的目标是找到这个点组合并获得主题就像训练机器学习中的很多算法一样

该过程肯定有错误, 可以告诉我们与生成真实文章的偏差有多大, 该错误将反向传播到分布中 获得一个梯度 可以告诉我们向哪移动点 以便减小这个错误, 我们根据提示移动点 现在获得效果稍微好些的模型 重复这一流程将获得效果不错的点组合
通常 效果好的点组合将为我们提供一些主题 狄利克雷分布 将告诉我们哪些文章与这些主题相关 狄利克雷分布
将告诉我们哪些单词与这些主题相关

我们可以进一步推理并反向传播错误 一直回到 和
不仅获得效果更好的点组合 而且获得更好的分布
和
就这样 这就是潜在狄利克雷分析的原理
如果你想了解论文中的图表 这就是该图表

我们只需知道
是主题分布
是单词分布
和
是从这两个分布中获取的多元分布
是主题
是将这两个相结合后获得的文档