学习心得
(1)Word2vec 的研究中提出的模型结构、目标函数、负采样方法、负采样中的目标函数在后续的研究中被重复使用并被屡次优化。掌握 Word2vec 中的每一个细节成了研究 Embedding 的基础。
(2)Embedding 就是用一个数值向量“表示”一个对象的方法。通过 Embedding,我们又引出了 Word2vec,Word2vec 是生成对“词”的向量表达的模型。其中,Word2vec 的训练样本是通过滑动窗口一一截取词组生成的。在训练完成后,模型输入向量矩阵(即本文的W V × N W_{V\times N}W
V×N
)的第 i ii 个行向量,就是我们要提取的第 i ii 词向量。
(3)Skip-gram 模型(中心词决定了它的相邻词),而CBOW相反(是相邻词决定当前的词)。最后学习了 Item2vec,它是 Word2vec 在任意序列数据上的推广。
一、什么是Embedding
用 Embedding 方法进行相似物品推荐,几乎成了业界最流行的做法,无论是国外的 Facebook、Airbnb,还是在国内的阿里、美团,我们都可以看到 Embedding 的成功应用。
Embedding 就是用一个数值向量“表示”一个对象(Object)的方法,这里说的对象可以是一个词、一个物品,也可以是一部电影等等。
一个物品能被向量表示,是因为这个向量跟其他物品向量之间的距离反映了这些物品的相似性。或者说两个向量间的距离向量甚至能够反映它们之间的关系。
图1 词向量例子
图 1 是 Google 著名的论文 Word2vec 中的例子,它利用 Word2vec 这个模型把单词映射到了高维空间中,每个单词在这个高维空间中的位置都非常有意思,图 1 左边的例子,从 king 到 queen 的向量和从 man 到 woman 的向量,无论从方向还是尺度来说它们都异常接近。这说明什么?这说明词 Embedding 向量间的运算居然能够揭示词之间的性别关系。
比如 woman 这个词的词向量可以用下面的运算得出:
Embedding(woman)=Embedding(man)+[Embedding(queen)-Embedding(king)]
图 1 右的例子也很典型,从 walking 到 walked 和从 swimming 到 swam 的向量基本一致,这说明词向量揭示了词之间的时态关系。
Netflix 应用的电影 Embedding 向量方法,就是一个非常直接的推荐系统应用。
从 Netflix 利用矩阵分解方法生成的电影和用户的 Embedding 向量示意图(下图)中,可以看出不同的电影和用户分布在一个二维的空间内,由于 Embedding 向量保存了它们之间的相似性关系,因此有了这个 Embedding 空间之后,我们再进行电影推荐就非常容易了。具体来说就是,我们直接找出某个用户向量周围的电影向量,然后把这些电影推荐给这个用户就可以了。
图2 电影-用户向量例子
二、Embedding对推荐系统的重要性
Embedding 是深度学习的基础核心操作。
(1)Embedding 是处理稀疏特征的利器(将稀疏高维特征向量转换成稠密低维特征向量)。
上个task学习了 One-hot 编码,因为推荐场景中的类别、ID 型特征非常多,大量使用 One-hot 编码会导致样本特征向量极度稀疏,而深度学习的结构特点又不利于稀疏特征向量的处理。
(2)Embedding 可以融合大量有价值信息,本身就是极其重要的特征向量 。
相比直接从原始信息处理得来的特征向量,embedding向量具有更强表达能力(ps:特别是GNN提出后,embedding几乎可以引入任何信息进行编码,即具有大量有价值的信息),所以通过预训练得到的 Embedding 向量本身就是极其重要的特征向量。
三、Word2vec基础
自从 2013 年谷歌提出 Word2vec 以来,Embedding 技术从自然语言处理领域推广到广告、搜索、图像、推荐等几乎所有深度学习的领域,成了深度学习知识框架中不可或缺的技术点。Word2vec是经典的 Embedding 方法。
3.1 CBOW 和 Skip-gram
Word2vec即“word to vector”,是一个生成对“词”的向量表达的模型。
想要训练 Word2vec 模型,我们需要准备由一组句子组成的语料库。假设其中一个长度为 T 的句子包含的词有 w1,w2……wt,并且我们假定每个词都跟其相邻词的关系最密切。
根据模型假设的不同,Word2vec 模型分为两种形式,CBOW 模型(图 3 左)和 Skip-gram 模型(图 3 右)。
图3 Word2vec的两种模型结构CBOW和Skip-gram
(1)CBOW 模型假设句子中每个词的选取都由相邻的词决定,因此我们就看到 CBOW 模型的输入是 wt周边的词,预测的输出是 wt。
CBOW是用周围词预测中心词,训练过程中其实是在从output的loss学习周围词的信息也就是embedding,但是在中间层是average的,一共预测V次;
(2)Skip-gram 模型则正好相反,它假设句子中的每个词都决定了相邻词的选取,所以你可以看到 Skip-gram 模型的输入是 wt,预测的输出是 wt周边的词。按照一般的经验,Skip-gram 模型的效果会更好一些,所以下面会以 Skip-gram 作为框架,来讲Word2vec 的模型细节。
Skip-gram是用中心词预测周围词,对每一个中心词都有K个词作为output,对一个词的预测有K次,所以能够更有效的从context中学习信息,共预测K*V次,因此,skip-gram的训练时间更长。
总结:鉴于skip-gram学习的词向量更细致。当数据量较少或者语料库中有大量低频词时,使用skip-gram学习比较合适。
3.2 Word2vec的样本怎样生成
作为一个自然语言处理的模型,训练 Word2vec 的样本当然来自于语料库,比如我们想训练一个电商网站中关键词的 Embedding 模型,那么电商网站中所有物品的描述文字就是很好的语料库。
我们从语料库中抽取一个句子,选取一个长度为 2c+1(目标词前后各选 c 个词)的滑动窗口,将滑动窗口由左至右滑动,每移动一次,窗口中的词组就形成了一个训练样本。根据 Skip-gram 模型(中心词决定了它的相邻词),就可以根据这个训练样本定义出 Word2vec 模型的输入和输出,输入是样本的中心词,输出是所有的相邻词。
【example】:这里选取了“Embedding 技术对深度学习推荐系统的重要性”作为句子样本。
(1)我们对它进行分词、去除停用词的过程,生成词序列;
(2)再选取大小为 3 的滑动窗口从头到尾依次滑动生成训练样本;
(3)然后我们把中心词当输入,边缘词做输出,就得到了训练 Word2vec 模型可用的训练样本。
图4 生成Word2vec训练样本的例子
3.3 Word2vec模型结构
它的结构本质上就是一个三层的神经网络(如图 5)
图5 Word2vec模型的结构
它的输入层和输出层的维度都是 V,这个 V 其实就是语料库词典的大小。假设语料库一共使用了 10000 个词,那么 V 就等于 10000。根据图 4 生成的训练样本:
(1)输入向量自然就是由输入词转换而来的 One-hot 编码向量;
(2)输出向量则是由多个输出词转换而来的 Multi-hot 编码向量。
显然,基于 Skip-gram 框架的 Word2vec 模型解决的是一个多分类问题。
隐层的维度是 N,N 的选择就需要一定的调参能力了,需要对模型的效果和模型的复杂度进行权衡,来决定最后 N 的取值,并且最终每个词的 Embedding 向量维度也由 N 来决定。
激活函数:注意隐层神经元是没有激活函数的,或者说采用了输入即输出的恒等函数作为激活函数,而输出层神经元采用了 softmax 作为激活函数。为什么要这样设置 Word2vec 的神经网络,为什么要这样选择激活函数呢?因为这个神经网络其实是为了表达从输入向量到输出向量的这样的一个条件概率关系:
这个由输入词 WI 预测输出词 WO 的条件概率,其实就是 Word2vec 神经网络要表达的东西。通过极大似然的方法去最大化这个条件概率,就能够让相似的词的内积距离更接近,这就是我们希望 Word2vec 神经网络学到的。
如果你对数学和机器学习的底层理论没那么感兴趣的话,也不用太深入了解这个公式的由来,因为现在大多数深度学习平台都把它们封装好了,你不需要去实现损失函数、梯度下降的细节,你只要大概清楚他们的概念就可以了。
【注意】Word2vec 还有很多值得挖掘的东西,比如
为了节约训练时间,Word2vec 经常会采用负采样(Negative Sampling)或者分层 softmax(Hierarchical Softmax)的训练方法。
关于这一点,推荐阅读《Word2vec Parameter Learning Explained》这篇文章,有最详细和准确的解释。
四、把词向量从 Word2vec 模型中提取出来
在训练完 Word2vec 的神经网络之后,我们想得到每个词对应的 Embedding 向量,这个 Embedding 在哪呢?其实它就藏在输入层到隐层的权重矩阵 W V × N W_{V\times N}W
V×N
中。
图中橙色的部分,Embedding Matrix。
图6 词向量藏在Word2vec的权重矩阵中
这个W V × N W_{V\times N}W
V×N
的意思是W权重矩阵,下角标是(VxN),也就是输入层和隐藏层的权重矩阵吧! 然后我们一直在说embedding,那么embedding在哪儿呢? 如果看一下维度的话,我们输入是一个10000维的词的one-hot编码,那么这里的V就是10000,我们的输入应该是VxV的,那么我们的隐藏层有N个神经元,那么我们的权重矩阵不就是VxN的咯?而我们在python代码里运行torch.nn.Embedding()时候,第一个参数是输入维度,第二个参数是隐藏层维度,所以也就是说 我们习惯取这样的输入和隐藏层之间的权重矩阵为我们的Embedding矩阵。
输入向量矩阵 W V × N W_{V\times N}W
V×N
的每一个行向量对应的就是我们要找的“词向量”(即上图中橙色矩阵中的每行深色橙色向量)。
比如我们要找词典里第 i 个词对应的 Embedding,因为输入向量是采用 One-hot 编码的,所以输入向量的第 i 维就应该是 1,那么输入向量矩阵 W V × N W_{V\times N}W
V×N
中第 i 行的行向量自然就是该词的 Embedding 。
输出向量矩阵 W′ 也遵循这个道理,确实是这样的,但一般来说,我们还是习惯于使用输入向量矩阵(即这里的W V × N W_{V\times N}W
V×N
)作为词向量矩阵。
4.1 提取词向量
在实际的使用过程中,我们往往会把输入向量矩阵转换成词向量查找表(Lookup table,如图 7 所示)。例如,输入向量是 10000 个词组成的 One-hot 向量,隐层维度是 300 维,那么输入层到隐层的权重矩阵为 10000x300 维。在转换为词向量 Lookup table 后,每行的权重即成了对应词的 Embedding 向量。如果我们把这个查找表存储到线上的数据库中,就可以轻松地在推荐物品的过程中使用 Embedding 去计算相似性等重要的特征了。
图7 Word2vec的Lookup table
4.2 Word2vec 对 Embedding 技术的意义
Word2vec 是由谷歌于 2013 年正式提出的,其实它并不完全是原创性的,学术界对词向量的研究可以追溯到 2003 年,甚至更早的时期。但正是谷歌对 Word2vec 的成功应用,让词向量的技术得以在业界迅速推广,进而使 Embedding 这一研究话题成为热点。Word2vec 对深度学习时代 Embedding 方向的研究具有奠基性的意义。
从另一个角度来看,Word2vec 的研究中提出的模型结构、目标函数、负采样方法、负采样中的目标函数在后续的研究中被重复使用并被屡次优化。掌握 Word2vec 中的每一个细节成了研究 Embedding 的基础。
五、Word2vec的推广:Item2Vec
既然 Word2vec 可以对词“序列”中的词进行 Embedding,那么对于用户购买“序列”中的一个商品,用户观看“序列”中的一个电影,也应该存在相应的 Embedding 方法。
图8 不同场景下的序列数据
微软于 2015 年提出了 Item2Vec 方法,它是对 Word2vec 方法的推广,使 Embedding 方法适用于几乎所有的序列数据。
Item2Vec 模型的技术细节几乎和 Word2vec 完全一致:只要能够用序列数据的形式把我们要表达的对象表示出来,再把序列数据“喂”给 Item2Vec 模型,我们就能够得到任意物品的 Embedding 了。
Item2vec使得“万物皆 Embedding”成为了可能:对于推荐系统来说,Item2vec 可以利用物品的 Embedding 直接求得它们的相似性,或者作为重要的特征输入推荐模型进行训练,这些都有助于提升推荐系统的效果。
六、作业
在我们通过 Word2vec 训练得到词向量,或者通过 Item2vec 得到物品向量之后,我们应该用什么方法计算他们的相似性呢?你知道几种计算相似性的方法?
四大相似性计算公式:
(1)Cosine vector similarity
(2)Pearson correlation coefficient ( PCC )
(3)Euclidean distance similarity
(4)Tanimoto coefficient ( Jaccard similarity coefficient 雅卡尔指数 )