1. 概述
????????word2vec源于Mikolov于2013年发布的一篇文章,主要包括skip-gram和cbow两个模型。分别为基于中心词预测上下文,和基于上下文预测中心词。接下来将从训练过程来比较skip-gram和cbow的区别。并于最后介绍word2vec经典的两个训练技巧。
2. 训练过程
1.skip-gram
? ? ? ? skip-gram的中心思想是根据中心词来预测上下文信息。假设滑动窗口大小为k,则对于每个中心词center,模型会训练(k-1)轮,来预测k-1个不同的上下文的词。总的时间复杂度为O(kv)。
????????但也正是由于这k轮的预测,每个中心单词会得到充分的训练,因此,即使是一些低频的词,skip-gram模型也能训练出较好的效果。
2. CBOW
? ? ? ? CBOW的中心思想是通过窗口的上下文来预测每一个中心单词。总的时间复杂度为O(v)。除此之外,由于输入的是这k-1个单词的平均,所以对于高频单词会有较好的一种表示,但是低频单词可能就得不到充分的训练了。
????????by the way:bert借鉴的就是CBOW的思想,但由于bert训练预料的庞大,消除了CBOW训练不充分的问题。
3. 重要结果
? ? ? ? 结果:通过word2vec可以训练出较好的word embedding。即是输入时的look up table。
? ? ? ? 一个问题:为什么不是输出时的w?
? ? ? ? 1. 在transformers中输出时的look up table一般设置为和输入相同。但是在这里,由于这两恶搞都是可训练的,因此设置为不同。而一般用输入的w的原因在于(个人理解):
????????1.输入的场景更符合embedding的场景;
????????2.输出时一般采用了层次softmax来加速计算,所以embedding的维度和词表大小是不对应的。
4. 加速训练的技巧
1. 层次softmax
? ? ? ? 通过构建哈夫曼树(哈夫曼树的有效路径最短,模型的计算量最少),使得计算softmax时,不需要对词表大小的矩阵进行softmax,每一层只需要计算少量的softmax,最终将时间复杂度由O(v)降低到了O(log v)。
2. 负采样
? ? ? ? 在梯度反向更新的时候,通常我们要计算词表中每个词的loss,然后进行更新。而负采样的思想在于,我们每次只采样loss最大的几个单词进行梯度的bp传播。这样也能大大地降低模型的计算量。
|