Google 著名论文提到的 word2vec 是一种著名的 Embedding 方法。今天,我们从Embedding谈起...

近日,阅读了王喆老师的深度学习推荐系统实战,其中 Embedding 解释我认为很通透,所以做个总结和整理,并且加入自己的拓展。

Embedding 是用一个数值向量“表示”一个对象(Object)的方法,一个物品能被向量表示,意味着这个向量跟其他物品向量之间的距离反映了这些物品的相似性。换言之,Embedding 是一种特征抽取的方法。

首先,谈谈 Embedding 方法。

1. Embedding 在特征工程的作用

首先,Embedding 是处理稀疏特征的利器。以推荐场景为例,One-hot 编码时,类别、ID 型特征非常多,大量使用 One-hot 编码会导致样本特征向量极度稀疏,而深度学习的结构特点又不利于稀疏特征向量的处理(反向传播时,特征过于稀疏时,每一个样本的学习只有极少数的权重会得到更新,梯度难以更新,模型不收敛),因此几乎所有深度学习推荐模型都会由 Embedding 层负责将稀疏高维特征向量转换成稠密低维特征向量。

其次,Embedding 可以融合大量有价值信息。 相比由原始信息直接处理得来的特征向量,本身就是极其重要的特征向量,Embedding 的表达能力更强。

Embedding 技术从自然语言处理领域推广到广告、搜索、图像、推荐等几乎所有深度学习的领域,成了深度学习知识框架中不可或缺的技术点。word2vec 更是经典。

2. 何为 word2vec

Word2vec 模型将单词映射在高维空间中。每个单词在这个高维空间中的位置值得关注,如下图从 king 到 queen 的向量和从 man 到 woman 的向量。它们从方向还是尺度都异常接近。这说明词 Embedding 向量间的运算能够揭示词之间的性别关系。

图1 - 词向量例子

同时,由于使用 one-hot 编码单词,产生的词向量会占据很大的内存占用和很高的计算时间。

所以 Word2vector 其实就是旨在通过网络的模式把每个单词转化为词向量,同时,词向量还能表示上下文信息。Word2vector有两种方式:CBOX 和 Sikp-gram。

完形填空大家都做过,CBOX 思路类似于此:通过一个缺少一个成分的句子,来预测这个需要填入的词语。

而相反,我们可以通过该单词预测上下文,这就是Sikp-gram的形式。

CBOW 模型假设句子中每个词的选取都由相邻的词决定,因此我们就看到 CBOW 模型的输入是 wt 周边的词,预测的输出是 wt 。Skip-gram 假设句子中的每个词都决定了相邻词的选取,所以你可以看到 Skip-gram 模型的输入是 wt,预测的输出是 wt周边的词。从模型的输入的角度,看看模型的图示。

图2 - CBOX 和 Sikp-gram 图示

按照一般的经验,Skip-gram 模型的效果会更好,所以接下来以 Skip-gram 作为框架,来给你讲讲 Word2vec 的模型细节。

3. Word2vec 的训练样本从何而来

训练 Word2vec 的样本是怎么生成的。作为一个NLP的模型,训练 Word2vec 的样本来自于语料库,比如我们想训练一个网购平台中关键词的 Embedding 模型,那么平台系统中所有物品的描述文字是合适的语料库。

我们从语料库中抽取一个句子,对它进行分词、去除停用词的过程,生成词序列。选取一个长度为 2c+1(目标词前后各选 c 个词)的滑动窗口,将滑动窗口由左至右滑动,每移动一次,窗口中的词组就形成了一个训练样本。

4. Word2vec 模型的结构

结构本质上就是一个三层的神经网络。下图展示了CBOX 模型的内部结构。它的输入层和输出层的维度都是 V,这个 V 其实就是语料库词典的大小。

图3 - CBOX 例子

Sikp-gram 模型的内部结构如下图。

图4 - Sikp-gram 例子

隐层的维度是 N。N 的选择就需要一定的调参能力,我们需要对模型的效果和模型的复杂度进行权衡,来决定最后 N 的取值,并且最终每个词的 Embedding 向量维度也由 N 来决定。

激活函数 最后是激活函数的问题,这里我们需要注意的是,隐层神经元是没有激活函数的,或者说采用了输入即输出的恒等函数作为激活函数;输出层神经元采用了 softmax 作为激活函数。

为什么要这样设置 Word2vec 的神经网络,以及这样选择激活函数呢?因为这个神经网络其实是为了表达从输入向量到输出向量的这样的一个条件概率关系,我们看下面的式子:

\[ p\left(w_{O} \mid w_{I}\right)=\frac{\exp \left(v_{w_{0}}^{\prime} v_{w_{I}}\right)}{\sum_{i=1}^{V} \exp \left(v_{w_{i}}^{\prime} v_{w_{I}}\right)} \]

这个由输入词 WI 预测输出词 WO 的条件概率,通过极大似然的方法去最大化这个条件概率,就能够让相似的词的内积距离更接近,这就是我们希望 Word2vec 神经网络学到的。

5. Word2vector的优化

但是由于Softmax 激活函数中存在归一化顶的缘故,推导出来的迭代公式需要对词汇表中的所有单词进行遍历,使得每次迭代过程非常提慢,由此产生了Hierarchical Softmax 和 Negative Sampling 两种改进方法。【日后进行补充】

6. 词向量在哪?

在训练完 Word2vec 的神经网络之后,每个词对应的 Embedding 向量在哪呢?其实,它就在输入层到隐层的权重矩阵 WVxN 中。权重矩阵 WVxN称为词向量矩阵。输入向量矩阵 WVxN 的每一个行向量对应输入的 one-hot 词向量。比如我们要找语料库里第 i 个词对应的 Embedding,因为输入向量是采用 One-hot 编码的,所以输入向量的第 i 维就应该是 1,那么输入向量矩阵 WVxN 中第 i 行的行向量自然就是该词的 Embedding 。语料库的 Embedding 就是 Embedding metrix,如图。

图5 - Embedding matrix 便是 我们寻找的词向量

7. 词向量如何用?

在实际的使用过程中,我们往往会把输入向量矩阵转换成等纬度的 词向量查找表(Lookup table)。例如,输入向量是 20000 个词组成的 one hot 向量,隐层维度是 300 维,那么输入层到隐层的权重矩阵为 20000x300 维。在转换为词向量 Lookup table 后,每行的权重即成了对应词的 Embedding 向量。在推荐场景中,如果我们把这个Lookup table存储到线上的数据库中,就可以轻松地在推荐物品的过程中,使用 Embedding 去计算相似性等重要的特征。

8. Word2vec 模型在深度学习推荐系统上的推广-Item2Vec

既然 Word2vec 可以对词“序列”中的词进行 Embedding,那么对于用户观看“序列”中的一个电影,和购买“序列”中的一个商品,也应该存在相应的 Embedding 方法。如图。

图6 - 观影和购物序列

微软于 2015 年提出了 Item2Vec 方法,使 Embedding 方法适用于几乎所有的序列数据。Item2Vec 模型的技术细节几乎和 Word2vec 完全一致,只要能够用序列数据的形式把我们要表达的对象表示出来,再把序列数据“喂”给 Word2vec 模型,我们就能够得到任意物品的 Embedding 了。

对于推荐系统来说,Item2vec 可以利用物品的 Embedding 直接求得它们的相似性,或者作为重要的特征输入推荐模型进行训练,这些都有助于提升推荐系统的效果。

参考

[1] 王喆. 深度学习推荐系统实战. 2020.

[2] CS的陋室. 再看word2vector. 2020. https://mp.weixin.qq.com/s/-BoM8PXS4Wa_Mi2B3aafuw.