词袋模型与 Word2Vec
机器学习模型处理文本时,需要把词语和文章转换成数值。词袋模型、主题模型和 Word2Vec 使用不同的方法,保留的信息也不同。
下面从词频表示谈起,介绍 TF-IDF、N-gram、LDA 和词嵌入,再讨论 Word2Vec 的结构、训练方法及其与 LDA 的联系。文中的交互演示可以直接调整参数。
一、文本为什么需要数值表示?
考虑一个电影推荐系统。电影 A 的简介是“人工智能研究者学习神经网络”,电影 B 是“科学家研究机器学习算法”,电影 C 是“一段关于爱情与家庭的故事”。
如果希望利用内容推荐电影,就需要衡量简介之间的相似程度。机器学习模型通常把一个样本表示成向量:
这里的 是数值特征, 是向量维度。文本表示(Text Representation)就是建立从文字到数值的映射。不同方法保留的信息不同:有的保留词语出现次数,有的保留相邻词语关系,有的学习主题分布,还有的学习词语之间的语义关系。
二、词袋模型:怎样把文章变成向量?
2.1 词汇表与词频向量
词袋模型(Bag of Words,BoW)为语料中的每个不同词语分配一个向量位置。向量上的数值表示该词在当前文章中出现多少次。
假设有三篇短文:
- 文档 A:我 喜欢 机器 学习
- 文档 B:我 喜欢 自然 语言
- 文档 C:自然 语言 处理
全部词语形成词汇表:
词汇表包含 7 个词,因此每篇文档都对应一个 7 维向量:
这种方法容易计算,结果可以直接用于逻辑回归、朴素贝叶斯或文档相似度计算。由于每篇文章只包含词汇表中的少数词,向量一般十分稀疏,可以使用稀疏矩阵节省存储空间。
2.2 为什么词袋模型难以表达语序和语义?
考虑“我喜欢你”和“你喜欢我”。两句话的词汇完全相同,每个词的出现次数也相同。词袋模型会得到相同向量,因此仅靠词袋特征无法区分二者的语序。
再考虑“我喜欢电影”和“我喜爱影片”。“喜欢”与“喜爱”、“电影”与“影片”具有相近的含义,但它们在词袋模型中占据不同位置。词袋模型不会自动让近义词的向量接近。
还有一个问题是维度:词汇表如果有 50,000 个词,每篇文章就具有 50,000 个位置。较高的维度会影响部分算法的训练、存储与泛化表现。
三、TF-IDF:词频与文档频率
3.1 TF 衡量词语在当前文章中的出现情况
词频(Term Frequency,TF)的一种常见定义是:
其中, 表示词语 在文档 中出现的次数,分母为文档总词数。
例如,100 个词的文章中,“机器学习”出现 5 次,那么 。
TF 也可以直接定义为出现次数。使用哪种形式,应在整个计算过程中保持一致。
3.2 IDF 衡量词语在语料库中的常见程度
假设语料库共有 1,000 篇文章。“的”出现在 900 篇文章中,“机器学习”只出现在 10 篇文章中。
这两个词在不同文章中的区分能力可能差异很大。逆文档频率(Inverse Document Frequency,IDF)采用:
这里 是全部文档数量, 是包含该词的文档数量。
对于“的”:
对于“机器学习”:
“机器学习”的 IDF 更高,说明它在这个语料库中具有更强的区分能力。稀有程度并不能直接保证词语有用,因为拼写错误或随机编号也可能很少出现。
3.3 TF-IDF 的计算例子
词频-逆文档频率(TF-IDF)把两个指标相乘:
例如,两种词语都出现在一篇包含 100 个词的文章中:
- “人工智能”出现 10 次,并且出现在 1,000 篇文章中的 500 篇。
- “机器学习”出现 5 次,并且只出现在 10 篇文章中。
逐项计算:
尽管“机器学习”在当前文章中的出现次数更少,其 TF-IDF 仍然更高。这里使用自然对数和未经平滑的基本公式。实际工具可能加入平滑、对数词频或向量归一化,因此具体数值会有所不同。
3.4 交互演示:词频和文章数量如何改变权重?
滑动两个控件,观察 TF、IDF 与最终权重。参考词语的权重保持为 0.0693,可以直观比较“当前文章中经常出现”与“在整个语料库中很少出现”这两个因素。
四、N-gram:如何保留相邻词语的顺序?
N-gram 是由连续 个词语组成的序列。若句子是“我 喜欢 学习 机器 学习”,那么:
- Unigram(1-gram)包含“我”“喜欢”“学习”“机器”“学习”。
- Bigram(2-gram)包含“我·喜欢”“喜欢·学习”“学习·机器”“机器·学习”。
- Trigram(3-gram)包含“我·喜欢·学习”“喜欢·学习·机器”“学习·机器·学习”。
这使“机器学习”“自然语言处理”等完整词组能够作为特征出现,也使“我喜欢你”和“你喜欢我”具有不同的相邻词组。
单独打开N-gram 语序实验:切换 Unigram、Bigram 和 Trigram,观察两句话的特征与余弦相似度变化。支持单独打开。
N-gram 仍然存在限制。假设词汇表大小为 ,理论上长度为 的词序列最多有 种。随着 增加,潜在特征数量增长很快。实际出现的组合会少得多,但稀疏问题仍然存在。
另外,固定长度的 N-gram 主要捕捉局部关系。句子中距离较远的词语,仍然很难通过较小的 N-gram 建立联系。
五、主题模型与 LDA
主题模型(Topic Model)尝试从文档集合中学习若干潜在主题。每个主题对应一个词语概率分布,每篇文章也对应一个主题概率分布。
例如,一个主题经常包含“算法、模型、人工智能”,可以理解为科技主题;另一个主题经常包含“球队、冠军、比赛”,可以理解为体育主题。
一篇讨论“人工智能分析体育比赛数据”的文章,可以同时包含科技与体育主题。例如:
那么整篇文章就可以用主题向量 表示。主题概率之和为 1。
5.1 LDA 如何描述文章的生成过程?
隐狄利克雷分配(Latent Dirichlet Allocation,LDA)是一种经典概率主题模型。假设共有 个主题。它为文章 设置主题分布:
并为每个主题 设置词语分布:
对于文章中的每一个词语位置,模型按照文章主题分布选择主题,再按照对应主题的词语分布选择词语:
因此,给定主题分布与主题词语分布时,某个词语在文章中出现的概率可以写成:
例如,如果“算法”在科技主题中的概率为 0.20,在体育主题中的概率为 0.01,而文章科技主题比例为 0.7,那么:
5.2 交互演示:主题比例如何决定词语概率?
通过滑块调节科技主题的比例,体育主题自动补足到 100%。演示用全概率公式实时计算“算法”“球队”“数据”三个词的出现概率。
主题模型的一个优势是具有一定可解释性:通过一个主题概率较高的词语,人们有机会理解主题内容。不过,模型自动发现的主题未必总有清晰含义。
六、词嵌入:为什么需要低维向量?
6.1 独热编码为何无法直接体现相似词?
考虑词汇表 。独热编码(One-hot Encoding)给每个词分配独立位置:
尽管“猫”和“狗”在语义上相近,它们的点积仍然等于 0。任意两个不同词的独热向量也有相同现象。
6.2 词嵌入怎样建立连续空间?
词嵌入(Word Embedding)为每个词学习一个 维稠密向量:
例如,可以用以下二维向量说明相似关系:
这组二维向量中,猫与狗彼此接近,汽车与飞机也彼此接近。真实的词向量通常有几十到几百个维度,其数值由训练得到。
一篇包含 个词的文章,可以按照词语顺序形成 的矩阵:
之后可以采用平均池化、卷积神经网络、循环神经网络或其他序列模型形成文章表示。平均词向量计算方便,但可能忽略语序和否定词等重要信息。
七、Word2Vec 为什么能从文本中学到词向量?
Word2Vec 是 2013 年提出的一类词嵌入学习方法。其核心思想是利用一个词与周围词语之间的关系,构造能够从文本本身得到训练目标的预测任务。
例如:
- 我喜欢吃苹果。
- 我喜欢吃香蕉。
- 我喜欢吃橙子。
“苹果”“香蕉”“橙子”反复出现在相似上下文中。模型为了预测这些上下文,需要为不同词学习合适的向量。训练后,出现在类似上下文中的词向量可能比较接近。
Word2Vec 常见的两种结构是 CBOW 和 Skip-gram。
7.1 CBOW:根据上下文预测中心词
CBOW(Continuous Bag of Words,连续词袋模型)把周围的词作为输入,预测中间的词。以“我 非常 喜欢 机器 学习 课程”为例,中心词为“机器”,左右窗口大小都为 2。
输入为“非常、喜欢、学习、课程”,训练目标是“机器”:
设上下文中有 个词,其词向量为 。一种常见实现会取平均向量:
随后输出层预测中心词。另一些实现使用向量求和,二者的输入数值尺度不同。
7.2 Skip-gram:根据中心词预测上下文
Skip-gram 将中心词作为输入,分别预测附近词语。对于同一句话,中心词仍然是“机器”。
训练词语对包括:“机器→非常”“机器→喜欢”“机器→学习”“机器→课程”。
设中心词为 ,某个上下文目标词为 。Skip-gram 学习:
CBOW 在一个训练样本中汇总多个上下文词;Skip-gram 可以由一个中心词产生多个词语对。这也解释了两种结构在计算与训练样本组织上的差异。
7.3 交互演示:窗口、预测方向和梯度下降
下面的演示使用 6 个词、二维词向量与完整 Softmax。选择 CBOW 或 Skip-gram,调节窗口大小,查看当前训练目标以及前向计算产生的概率。点击“梯度下降一次”,将按照交叉熵梯度更新输出矩阵。
单独打开Word2Vec 交互训练:选择 CBOW 或 Skip-gram,调整中心词和窗口,并执行真实的输出层梯度更新。支持单独打开。
八、Word2Vec 的三个计算层
8.1 输入层:One-hot 如何取出词向量?
设词汇表大小为 ,希望学习的词向量维度为 。输入权重矩阵为:
假设词汇表依次是“我、喜欢、机器、学习”。输入“喜欢”时,其独热向量为:
矩阵乘法得到:
独热向量只有一个位置为 1,因此乘法的效果是选取输入权重矩阵中的对应行。这个权重矩阵就构成了 Embedding(嵌入)查找表。
8.2 映射层和输出层
对于 Skip-gram,映射层输出中心词向量 。再引入输出权重矩阵:
计算:
其中 是第 个词的输出分数。通过 Softmax 函数转换为概率:
对全部词求和可得 1。假设输出分数是 ,那么:
这说明第二个词在当前输出分布中获得约 53.4% 的预测概率。
8.3 为什么训练完成后能获得词向量?
两个权重矩阵开始时通常经过随机初始化。模型通过大量中心词与上下文词的预测任务,不断降低损失函数。
对于一个中心词-目标词训练对,Skip-gram 的条件概率可以写为:
这里 来自输入权重矩阵, 来自输出权重矩阵。
对于 个训练词语对,最小化负对数似然损失:
如果真实目标词当前概率为 ,那么单次损失是:
概率提高到 时,损失降低到:
Softmax 与交叉熵配合时,对输出分数的梯度尤其简单:
其中 是预测概率向量, 是真实目标词的独热向量。经过反向传播,输入与输出权重矩阵都可以按照梯度进行更新:
训练完成后,通常把 的每一行作为对应词的向量表示。输出权重矩阵同样包含有用信息,也可以单独使用或与输入向量结合。
九、Word2Vec 为什么使用负采样?
9.1 完整 Softmax 的代价
如果词汇表包含 100,000 个词,完整 Softmax 的分母就包含 100,000 项。每次训练都要处理大量词语分数,大规模训练的计算代价较高。
Word2Vec 可以使用 Hierarchical Softmax(层次 Softmax)或 Negative Sampling(负采样)提高训练效率。
层次 Softmax 利用二叉树中的一条路径表示一个词。在平衡树中,所需分支概率计算数量通常随 增长。
9.2 负采样怎样构造目标?
假设语料中的真实词语对是“机器→学习”。这是正样本。训练时再从噪声分布中抽取若干词语,形成其他词语对,例如“机器→蛋糕”和“机器→天气”。
我们希望正样本点积较高,而抽取的负样本点积较低。
定义 Sigmoid:
对于一个正样本和 个负样本,最大化:
这个目标可以用“提高正样本分数、降低负样本分数”理解。负采样使用了不同于完整 Softmax 的训练目标,因此它给出的分数不能直接当作整个词汇表上的 Softmax 概率。
9.3 交互演示:Softmax 和负采样损失
在下面的演示中,可以分别调整四个输出分数,观察 Softmax 概率与交叉熵梯度;也可以调整正负样本点积,查看负采样损失如何变化。
单独打开Softmax 与 Negative Sampling 交互实验:输出分数、目标词、交叉熵梯度及负采样损失均可实时调整。支持单独打开。
十、Word2Vec 为什么能表示词语相似性?
假设“苹果”“香蕉”“橙子”经常与“吃”“买”“水果”共同出现。
在 Skip-gram 中,输入这些词时,模型需要预测相似的上下文词语。为了完成预测任务,模型可能学到相近的词向量。
可以使用余弦相似度衡量词向量的接近程度:
这种接近反映词语使用环境的统计规律,并不保证语义完全相同。近义词可能接近;“热”和“冷”等经常出现在类似句式中的反义词,也可能具有较高的向量相似度。
标准 Word2Vec 还有两项局限:
- 多义词:例如“苹果”可以表示水果,也可以表示公司。经典 Word2Vec 通常为该词学习一个固定向量。
- 未登录词:没有进入训练词汇表的新词,通常没有对应的已学习向量。利用字符或子词信息的 FastText 等方法可以缓解这一问题。
此外,Word2Vec 学到的是词语向量。要理解整句话的否定、顺序及较远距离的关系,通常还需要其他文本模型进行加工。
十一、LDA 与 Word2Vec 的区别和联系
LDA 与 Word2Vec 都从词语的共同出现关系中学习潜在结构。但两种模型处理的对象与结果不同。
| 比较项目 | LDA | Word2Vec |
|---|---|---|
| 主要任务 | 主题发现与文档主题分布 | 词语向量学习 |
| 主要依据 | 文档中的词语共现 | 局部上下文中的词语共现 |
| 基本形式 | 概率生成式模型 | 浅层神经网络词嵌入模型 |
| 输出 | 文档-主题、主题-词语分布 | 连续数值形式的词向量 |
| 可解释性 | 主题常可以通过高概率词解释 | 词向量各维通常难以直接解释 |
11.1 从矩阵表示理解
假设共有 篇文章、 个主题、 个词。LDA 学习文档-主题矩阵和主题-词语矩阵:
其中,矩阵的行用于表示概率分布。
Word2Vec 学习输入与输出权重矩阵:
LDA 的中间变量具有“主题”的概率解释;Word2Vec 的中间变量是由预测目标学习的连续向量。主题模型也可以修改为利用局部上下文,词嵌入方法也可以利用文档级共现信息。因此,最终仍需要结合概率假设、目标函数和模型结构理解两者的联系。
11.2 用于电影推荐时如何选择?
假设电影 A 是“人工智能研究者探索机器学习”,电影 B 是“神经网络科学家研究算法”,电影 C 是“年轻情侣的爱情故事”。
词袋模型可以依据共同词语计算相似程度;TF-IDF 可以提高具有区分能力词语的权重;N-gram 能保留局部词序;LDA 可以将电影简介表示为科技、爱情等主题的分布;Word2Vec 则可以利用相似上下文,让“机器学习”和“神经网络”等相关词语具有相近的向量表示。
对于 Word2Vec,可以通过平均词向量形成一个简单的电影简介向量:
然后利用余弦相似度比较电影简介。这种方法便于计算,具体推荐效果需要在真实数据上评估。
十二、几个常见问题
12.1 为什么高频词的 TF-IDF 权重有时很低?
高频词只说明它在当前文章中反复出现。如果这个词也出现在大量其他文章中,IDF 就会较低。两个因素相乘后,最终权重可能仍然很小。
12.2 为什么 Word2Vec 的输入权重可以作为词向量?
因为 One-hot 乘以输入权重矩阵等价于选择对应的一行。训练过程中,这一行参数会参与上下文预测,并受到损失函数梯度更新,因此逐渐形成能够反映词语使用关系的向量。
12.3 为什么 CBOW 能使用多个输入词?
它将上下文词向量求和或取平均,形成固定维度的隐藏向量。这样,不同数量的上下文词可以进入相同维度的输出层。
12.4 为什么负采样能够提高训练效率?
每次训练仅计算正样本和少量抽取的负样本词语对,减少了对整个词汇表进行完整概率归一化的计算。负样本抽取方式和抽取数量也会影响训练结果。
12.5 为什么主题相近的文章仍然可能使用完全不同的词语?
同一主题可以包含多个相关词语。文章在主题上的分布相近,并不要求文章中的词语完全相同。这也是主题模型和词向量方法能够补充词频表示的重要原因。
评论由 GitHub Giscus 提供。若当前网络无法加载,可 前往 GitHub Discussions 查看或参与讨论。