AI summary
type
status
date
slug
summary
category
tags
icon
password
Word2Vec 介绍
文本表示分为离散表示和分布式表示。
离散表示有:
- One-hot,独热向量编码。每个分词的文本表示为“该分词的比特位为 1,其余为 0”的矩阵表示。
- 缺点:无法表示词语之间的相似性。向量维度大。
- Bag-of-word model,词袋模型。文档的向量表示是各词的词向量表示的加和。缺点是词与词之间没有顺序关系。
- TF-IDF,在信息检索和数据挖掘中常用的加权技术。TF 表示词频,IDF 表示逆文本频率指数。缺点是没有词与词之间的顺序关系。
- n-gram 模型。为了保持词的顺序,做了一个滑窗,n 是窗口大小。缺点是随着 n 增大,词表大小呈指数型增大。
分布式表示,用一个词附近的其他词来表示该词,这是现代统计自然语言处理中最有创见的想法之一。
- NNLM,神经网络语言模型,通过训练得到词向量矩阵。通俗来说就是通过窗口中的前 k-1 个词,预测最后一个词出现概率的模型。
- SVD Based Methods,这是一类找到词向量的方法。首先遍历一个很大的数据集,统计词的共现计数矩阵 X,然后对 X 进行 SVD 分解 ,然后使用 U 的行来作为词向量。
- 矩阵 X 的两种选择方式:Word-Document Matrix,当单词 i 出现在文档 j,Xij 加一,规模和文档数量 M 成正比;Windows-based Co-occurrence Matrix,统计单词在特定大小的窗口中出现的次数。
- 观察奇异值(矩阵 S 上对角线上元素),根据期望的捕获方差百分比截断,通过选择前 k 个奇异向量来降低维度。
- 缺点:矩阵的维度会经常发生改变(经常增加新的单词和语料库的大小会改变);矩阵会非常的稀疏,维度很高;基于 SVD 的方法的计算复杂度很高 (m×n 矩阵的计算成本是 ),并且很难合并新单词或文档。
而基于迭代的方法以一种优雅得多的方式解决了大部分上述问题。
Word2vec 是 Google 的 Mikolov 等人提出来的一种文本分布式表示的方法,巧妙地运用层次 softmax(hierarchical softmax)和负采样(Negative sampling)两种技巧,使神经网络语言模型变得容易计算。
Word2vec 的思路是设计一个模型,模型的参数就是词向量。然后根据一个目标函数训练模型,在每次模型的迭代计算误差,并遵循一些更新规则,该规则具有惩罚造成错误的模型参数的作用,从而可以学习到词向量。这个方法可以追溯到 1986年,我们称这个方法为“反向传播”,模型和任务越简单,训练它的速度就越快。
基于迭代的方法一次捕获一个单词的共现情况,而不是像 SVD 方法那样直接捕获所有的共现计数。
Word2vec 概括地说是包含了两种模型和两种加速训练方法:
- 两种模型:CBOW(continuous bag-of-words)和Skip-Gram。CBOW 的目标是通过上下文的词语预测中间的词是什么。而 skip-gram 则相反,由一个特定的词来预测前后可能出现的词。
- 两种优化方法:层次softmax和负采样。层次 softmax 是通过构建一种有效的树结构(哈夫曼树,huffman tree)来加速计算词语的概率分布的方法;而负采样则是通过随机抽取负样本,与正样本一起参加每次迭代,变成一个二分类问题而减少计算量的方法。

Skip-gram 和 cbow 有什么区别和优缺点?
在 cbow 方法中,是用周围词预测中心词,从而利用中心词的预测结果情况,使用梯度下降方法,不断的去调整周围词的向量。
skip-gram 是用中心词来预测周围的词,利用周围的词的预测结果情况,使用梯度下降来不断的调整中心词的词向量。
可以看到,cbow 预测行为的次数跟整个文本的词数几乎是相等的(每次预测行为才会进行一次反向传播, 而往往这也是最耗时的部分),复杂度大概是 O(V);skip-gram 进行预测的次数是要多于 cbow 的:因为每个词在作为中心词时,都要使用周围词进行预测一次。这样相当于比 cbow 的方法多进行了 K 次(假设 K 为窗口大小),因此时间的复杂度为 O(KV),训练时间要比 cbow 要长。
优缺点:简单说,skip-gram 出来的准确率比 cbow 高,但训练时间要比 cbow 要长;在计算时,cbow 会将 context word 加起来,在遇到生僻词时,预测效果将会大大降低。skip-gram 则会预测生僻字的使用环境,预测效果更好。
Word2Vec 的两种加速方法?
在 CBOW 和 Skip-Gram 中,目标函数要计算 V 个 softmax 值,注意对 |V| 的求和计算量是非常大的。任何的更新或者对目标函数的评估都要花费 O(|V|) 的时间复杂度。一个简单的想法是不去直接计算,而是去求近似值。
- 负采样(以 skip-gram 为例)
负采样的核心思想:将多分类转化成一个二分类,利用负采样后的输出分布来模拟真实的输出分布层次。
正样本:中心词+周围词
负样本:中心词+词表中随机选取的词(一般情况下选择5个随机词,不能只选择一个。因为负样本是随机选择的,只选择一个负样本有一定的偏差)
考虑一对中心词和上下文 (w,c),通过 P(D=1|w,c) 表示 (w,c) 来自语料库。
首先,用 sigmoid 函数建模:
现在,我们建立一个新的目标函数,如果中心词和上下文词确实在语料库中,就最大化概率 P(D=1∣w,c),如果中心词和上下文词确实不在语料库中,就最大化概率 P(D=0∣w,c)=1-P(D=1|w,c)。我们对这两个概率采用一个简单的极大似然估计的方法。
- 层次 softmax
根据词频构建哈夫曼树:
叶子节点不参与损失计算,其他的每个节点有 N 个待学习参数,N代表词向量长度;每个节点左边用"0"编码,右边用"1"编码;除叶子节点之外,每一个节点都有一个 sigmoid 激活函数用于二分类,通过二分类的方式,决定走左子树还是走右子树。
hierarchical softmax 利用哈夫曼树将一个多分类问题转化为多个二分类问题。替换的是 hidden layer 到 output layer 的全连层部分。
不是更新每个词的输出向量,而是更新二叉树中从根结点到叶结点的路径上的节点的向量。
- 两种加速方法的区别
层次 softmax 需要输出 logV 个概率,而负采样需要输出 k+1 个概率,k 表示负样本的数量。
Word2vec 存在的问题
- 对每个 local context window 单独训练,没有利用包含在 global co-currence 矩阵中的统计信息。
- 对多义词无法很好的表示和处理,因为使用了唯一的词向量。
- 无法捕获单词的顺序信息。