Word2vec简介
当然,传统的one-hot 编码仅仅只是将词符号化,不包含任何语义信息。而且词的独热表示(one-hot representation)是高维的,且在高维向量中只有一个维度描述了词的语义。多高?词典有多大就有多少维,一般至少上万的维度。所以我们需要解决两个问题:1 需要赋予词语义信息,2 降低维度。
这就轮到Word2Vec出场了。
word2vec是Google研究团队里的Tomas Mikolov等人于2013年的《Distributed Representations ofWords and Phrases and their Compositionality》以及后续的《Efficient Estimation of Word Representations in Vector Space》两篇文章中提出的一种高效训练词向量的模型,基本出发点是上下文相似的两个词,它们的词向量也应该相似,比如香蕉和梨在句子中可能经常出现在相同的上下文中,因此这两个词的表示向量应该就比较相似。
实际上,大部分的有监督机器学习模型,都可以归结为:f(x)->y。
在有些NLP问题中,把 x 看做一个句子里的一个词语,y 是这个词语的上下文词语,那么这里的 f 便是上文中所谓的『语言模型』(language model),这个语言模型的目的就是判断 (x,y) 这个样本是否符合自然语言的法则,更通俗点说就是:有了语言模型之后,我们便可以判断出:词语x和词语y放在一起,是不是人话。
当然,前面也说了,这个语言模型还得到了一个副产品:词向量矩阵。
而对于Word2vec 而言,词向量矩阵的意义就不一样了,因为Word2Vec的最终目的不是为了得到一个语言模型,也不是要把 f 训练得多么完美,而是只关心模型训练完后的副产物:词向量矩阵。
我们来看个例子,如何用 Word2vec 寻找相似词:
对于一句话:
1.她们 夸 吴彦祖 帅 到 没朋友,如果输入 x 是吴彦祖,那么 y 可以是:“她们、夸、帅、没朋友”这些词
现有另一句话:
2.她们 夸 我 帅 到 没朋友,如果输入 x 是:我,那么不难发现,这里的上下文 y 跟上面一句话一样
从而 f(吴彦祖) = f(我) = y,所以大数据告诉我们:我 = 吴彦祖(完美的结论)。所以说,word2vec模型中比较重要的概念是词汇的上下文,说白了就是一个词周围的词,比如 w t w_t wt的范围为1的上下文就是 w t − 1 w_{t−1} wt−1和 w t + 1 w_{t+1} wt+1。
one-hot和SVD
如上图,like和enjoy跟i共同出现过。然后我们可以发现这个矩阵太稀疏了,于是我们要进行降维。
如上图,SVD分解可将X分解为三个V*V的矩阵,中间那个矩阵只有对角线上有值,且从小到大,对角线上的值就是第一个U矩阵里各个向量的特征值。我们可以只取前k个向量,这样就降维了。
N-gram可以用于大规模的数据集上。但是它在语音识别上表现不好,因为它取决于高质量的语音数据,但是高质量的语音数据规模较小。
储备知识
语言模型的概念
概率高的必须同时满足语义和语法。上图给0.01是因为训练的数据集对课程评价的样本几乎都是好,很少有一般,所以认为不符合语义。
基于专家语法规则的语言模型
上图表示语言千变万化,不要试图找到一套规则。
统计语言模型
如上图,第一种情况是这个句子再语料中,第二种为零是因为语料中没有叫张很帅的人,所以导致概率为零,但是就因为语料中没有叫张很帅的人就判定这不是一个句子,显然不合理;第三句话是预料中存在这些词,如张三的表哥的堂弟的媳妇很漂亮,那么模型可能会预测出这是个句子的概率为0,因为太长了。
平滑操作
上图计算参考下图的公式:
假设语料中只有张三很美,那么第一种情况的概率为0,第二种情况的概率也为零,经过拉普拉斯平滑后,二者的概率相同,但是张三很帅的概率明显是大于张三很桌子的。
Skip-gram
W
W
W是中心词向量,
W
∗
W^*
W∗是周围词向量。对于最终结果1xV的这个矩阵,我们找到
W
i
−
1
W_{i-1}
Wi−1这个词对应的索引(下标),然后将这个下标所对应的概率通过反向传播,然后使其越大越好。
CBOW
注意上图是sum,并且该模型只有一个训练样本。
讨论复杂度
我们思考一下,如果用softmax,那么分子要做V次指数运算,而且求导数也不好求。下面介绍两种将softmax多分类简化sidmoid二分类问题:
层序softmax
我们要将softmax转换为若干sigmoid函数。
我们可以从上图看到,满二叉树就是
l
o
g
2
V
log_2V
log2V次了。如果我们搞成下图的哈夫曼树,速度就更快了
下图中,公式3的里的中括号表示,第
j
+
1
j+1
j+1个节点是不是第
j
j
j个节点的右孩子。
负采样
skip-gram的负采样
我们在窗口中先择一个词与中心词组成正样本,然后选择窗口外的一个词与中心词组成负样本(当然这里负样本也有可能选择窗口内的词与中心词组成)。思想就是让正样本的概率尽可能大,负样本的概率尽可能小,这里负样本要取多个,因为正样本是真实的,负样本是采样的,有偏差。
CBOW的负采样
重采样
上图表示青蛙在文中出现的次数少,而什么是这三个字次数多,我们将青蛙的权重设高一些。