“ 自Embedding的概念问世以来,Embedding的探索和应用就没有停止过,Word2Vec、Sentence2Vec、Doc2Vec、Item2Vec,甚至Everything2Vec。对,“万物皆可Embedding”。几年来,Embedding在推荐系统中的应用也越来越多,方式众多,技法新颖。”
由于Embedding太过重要,本文我们将详细讲解Embedding的相关知识,以及在推荐系统中的一些应用。

1.什么是embedding

Embedding,即嵌入,起先源自于NLP领域,称为「词嵌入(word embedding)」,主要是利用背景信息构建词汇的分布式表示,最终可以可以得到一种词的向量化表达,即用一个抽象的稠密向量来表征一个词。
从数学角度看,Embedding其实是一个映射(mapping),同时也是一个函数(function),即LDA 推荐系统 推荐系统embedding_激活函数,该函数是injective(就是我们所说的单射函数,每个Y只有唯一的X对应,反之亦然)和structure-preserving (结构保存,比如在X所属的空间上LDA 推荐系统 推荐系统embedding_语义信息_02,那么映射后在所属空间上同理LDA 推荐系统 推荐系统embedding_激活函数_03)的。那么对于Word Embedding,就是将单词映射到另外一个空间,这个映射也具有injective和structure-preserving的特点。
“嵌入”本身是一个数学概念。我们这里通俗理解,「如果将词看作是文本的最小单元,词嵌入本身是一种特别的映射过程,即将文本空间中的某个词,通过一定的方法,映射或者说嵌入到另一个数值向量空间,原来的整数全部变为实数,是用连续向量表示离散变量的方法。之所以称之为Embedding,是因为这种表示方法往往伴随着一种降维的意思,就像高维事物拍扁了嵌入到另一个低维空间中一样。」

LDA 推荐系统 推荐系统embedding_语义信息_04


Embedding这种向量化表达过程通常伴随以下变化:

  • 高维——>低维
  • 稀疏——>稠密
  • 离散——>连续
  • 整数——>实数

不难发现,「经过Embedding向量化表达后的数据,其实变得更加适合深度神经网络的训练和学习,也有利于工业界数据的工程化处理。高维稀疏数据对于机器学习的参数学习和相关计算都不太友好(「高维易引发“维度之灾”,使空间距离很难有效衡量,另外高维经常使参数数量变得非常多,计算复杂度增加,也容易导致过拟合;稀疏容易造成梯度消失,导致无法有效完成参数学习」),因此通常特别稀疏的高维离散数据更适合使用Embedding代替传统One-Hot编码方式。
此外,「Embedding虽然是一种降维表示,但是却携带了语义信息,而且这种表示方式并不局限于词,可以是句子、文档、物品、人等等,Embedding能够很好地挖掘嵌入实体间的内部关联,即便降维也能保留这种潜在关系」,这简直就是“神来之笔”,怪不得说万物皆可Embedding。

词嵌入的维度表示某个隐含语义,一个词可能隐藏很多语义信息,比如北京,可能包含“首都、中国、北方、直辖市、大城市”等等,这些语义在所有文本上是有限的,比如 128 个,于是每个词就用一个 128 维的向量表达,向量中各个维度上的值大小代表了词包含各个语义的多少。
本质上来说,经过「Word Embedding」之后,各个单词就组合成了一个相对低维空间上的一组向量,这些向量之间的远近关系则由他们之间的语义关系决定。

2.使用embedding有什么好处

因为上面提到的特性,使用Embedding可带来诸多好处:

  • 不丢失信息的情况下降低维度
  • 矩阵及向量运行便于并行
  • 向量空间具有物理意义,比如可以根据距离比较相似性
  • 可以在多个不同的维度上具有相似性
  • 线性规则:king - man = queen - woman

Embedding的这种携带语义信息以及保留嵌入实体间的潜在关系的特性,使Embedding有了更多用武之地,例如:

  • 「计算相似度」,比如「man」和「woman」的相似度比「man」和「apple」的相似度高
  • 「在一组单词中找出与众不同的一个」,例如在如下词汇列表中:「[dog, cat, chicken,
    boy]」,利用词向量可以识别出「boy」和其他三个词不是一类。
  • 「直接进行词的运算」,例如经典的:「woman + king-man = queen」
  • 「表征文本」,如累加得到一个文本的稠密向量,或平均表征一个更大的主体;
  • 「方便聚类」,会得到比使用词向量聚类更好的语义聚类效果。
  • 「由于携带了语义信息,还可以计算一段文字出现的可能性」,也就是说,这段文字是否「通顺」。
    上面的嵌入实体是单词,如果换成推荐物品(item),上面的一些用法,是不是让你眼前一亮呢?

3.Word2Vec

词嵌入表示通常会用到谷歌提出的 Word2Vec工具库,另外fastText和TensorFlow中也可以实现Embedding的功能。这个小节我们借助Word2Vec工具的模型实现来更加深入理解Embedding。

3.1Word2Vec的原理

Word2Vec 是用浅层神经网络学习得到每个词的向量表达,而且在工程上进行了优化,使得百万词的规模在单机上可以几分钟轻松跑出来。它有两种网络结构,分别是CBOW(Continues Bag of Words)和Skip-gram,两种网络结构图见下图。

LDA 推荐系统 推荐系统embedding_机器学习_05


这两种结构都是假定每个词都跟其相邻的词的关系最密切,不同的是CBOW模型的动机是每个词都是由相邻的词决定的,所以CBOW的输入是 LDA 推荐系统 推荐系统embedding_语义信息_06 周边的词,预测的输出是LDA 推荐系统 推荐系统embedding_语义信息_06 ,而Skip-gram模型的动机则是每个词都决定了相邻的词,输入是 LDA 推荐系统 推荐系统embedding_语义信息_06,输出是 LDA 推荐系统 推荐系统embedding_语义信息_06周边的词。这里相邻的词通常由一个滑动窗口来获得,滑动窗口的长度为2c+1(目标词前后各选c个词),从句子左边滑倒右边,每滑一次,窗口中的词就形成了我们的一个正样本。如上图,这里的c设为2,其中是当前所关注的词,LDA 推荐系统 推荐系统embedding_LDA 推荐系统_10LDA 推荐系统 推荐系统embedding_点积_11LDA 推荐系统 推荐系统embedding_LDA 推荐系统_12LDA 推荐系统 推荐系统embedding_机器学习_13是上下文中出现的词。

LDA 推荐系统 推荐系统embedding_激活函数_14


经验上讲Skip-gram的效果要更好一点,我们以Skip-gram为例,理解一下原理。上面讲到通过滑动窗口可以获取到训练样本,有了训练样本之后我们就可以着手定义优化目标了,既然每个词 LDA 推荐系统 推荐系统embedding_语义信息_15都决定了相邻词LDA 推荐系统 推荐系统embedding_语义信息_16,基于极大似然,我们希望所有样本的条件概率 LDA 推荐系统 推荐系统embedding_语义信息_15之积最大,于是有:

LDA 推荐系统 推荐系统embedding_语义信息_18


转为最大化对数似然:

LDA 推荐系统 推荐系统embedding_语义信息_19


其中,T是文本长度,即单词总数,c是窗口大小,另外单词一般需要先用One-Hot编码。其实从上面的图中可以看出,在实际训练学习过程中,训练样本是由中心词和其上下文词组成一个个Pair对,那我们可以将目标函数写成一个更容易理解的的式子:

LDA 推荐系统 推荐系统embedding_语义信息_20


其中,LDA 推荐系统 推荐系统embedding_LDA 推荐系统_21表示中心词与其上下文词LDA 推荐系统 推荐系统embedding_激活函数_22构成的样本对,LDA 推荐系统 推荐系统embedding_激活函数_23是语料中所有单词及其上下文词构成的样本对集合,这里的 LDA 推荐系统 推荐系统embedding_点积_24为「待定参数集」。

接下来的问题是怎么定义 LDA 推荐系统 推荐系统embedding_LDA 推荐系统_25

于是设LDA 推荐系统 推荐系统embedding_激活函数_26为中心词w的词向量,LDA 推荐系统 推荐系统embedding_LDA 推荐系统_27为上下文词c向量,向量维度等于设置的隐藏层单元数量。整个语料共有V个单词,也就是词汇表单词数。

因此:

LDA 推荐系统 推荐系统embedding_语义信息_28


带入上面的目标函数,可以得到:

LDA 推荐系统 推荐系统embedding_LDA 推荐系统_29

其中,参数LDA 推荐系统 推荐系统embedding_点积_24LDA 推荐系统 推荐系统embedding_LDA 推荐系统_31LDA 推荐系统 推荐系统embedding_激活函数_32LDA 推荐系统 推荐系统embedding_LDA 推荐系统_33LDA 推荐系统 推荐系统embedding_机器学习_34是向量维度。

这两个单词的隐向量的点积表示语义的接近程度,其实点积的物理意义就是词之间的距离,点积越大,表明两个单词的语义越接近,向量点积展开如下:

LDA 推荐系统 推荐系统embedding_LDA 推荐系统_35


(注:向量点积在不同的论文有不同的表示形式,本文为了推导后面的负例采样优化,写法与第三篇论文的写法保持一致。)而Softmax的作用就是将点积转换成概率,下图的例子可以辅助理解[^1]:

LDA 推荐系统 推荐系统embedding_机器学习_36

3.2Word2Vec的网络结构

CBOW和Skip-gram都可以表示成由输入层(Input)、映射层(Projection)和输出层(Output)组成的神经网络。

LDA 推荐系统 推荐系统embedding_机器学习_37


输入层中的每个词通常由独热编码(One-Hot)方式表示,即所有词均表示成一个LDA 推荐系统 推荐系统embedding_激活函数_38维向量,其中LDA 推荐系统 推荐系统embedding_激活函数_38为词汇表中单词的总数。在向量中,每个词都将与之对应的维度置为1,其余维度的值均设为0。

在映射层(也就是隐含层)中,LDA 推荐系统 推荐系统embedding_LDA 推荐系统_40个隐含单元(Hidden Units)的取值可以由LDA 推荐系统 推荐系统embedding_激活函数_38维输入向量以及连接输入和隐含单元之间的LDA 推荐系统 推荐系统embedding_激活函数_42维权重矩阵LDA 推荐系统 推荐系统embedding_机器学习_43计算得到。在CBOW中,还需要将各个输入词所计算出的隐含单元求和。需注意的是,「Word2Vec网络中的隐含层没有使用任何非线性激活函数,或者可以勉强说用的是线性激活函数(Linear Activation Function)。因为Word2Vec不是为了做语言模型,它不需要预测的更准,加入非线性激活函数没有什么实际意义,反而会降低Word2Vec的性能。」

同理,输出层向量的值可以通过隐含层向量,以及连接隐含层和输出层之间的LDA 推荐系统 推荐系统embedding_LDA 推荐系统_44 维权重矩阵LDA 推荐系统 推荐系统embedding_激活函数_45计算得到。输出层也是一个LDA 推荐系统 推荐系统embedding_激活函数_38维向量,每维与词汇表中的一个单词相对应。最后,对输出层向量应用Softmax激活函数,可以计算出每个单词的生成概率。

再之后,利用反向传播来训练神经网络的权重即可。

不过上图的网络结构是单个上下文的一个示例,即当前词预测下一个词,对于真正的多词上下文的CBOW和Skip-gram,通常是下面的结构:

LDA 推荐系统 推荐系统embedding_激活函数_47


以Skip-gram模型为例,其前向公式为:

LDA 推荐系统 推荐系统embedding_点积_48


因为输出层共享权重LDA 推荐系统 推荐系统embedding_激活函数_45,所以LDA 推荐系统 推荐系统embedding_点积_50都是一样的,输出向量 LDA 推荐系统 推荐系统embedding_LDA 推荐系统_51也是都一样的,即LDA 推荐系统 推荐系统embedding_机器学习_52

「CBOW和Skip-gram的性能对比」
两种模型都有各自的优缺点,不过根据Mikolov的原论文,Skip-gram在处理少量数据时效果很好,可以很好地表示低频单词。而CBOW的学习速度更快,对高频单词有更好的表示。实际应用中,Skip-gram方式会更常见。

3.3从权重矩阵到词向量

那么,到底什么才是我们想得到的Embedding向量化表示呢?

其实就是上面的「权重矩阵」LDA 推荐系统 推荐系统embedding_机器学习_53LDA 推荐系统 推荐系统embedding_语义信息_54(对Skip-gram来说,分别对应损失函数公式中的中心词词向量LDA 推荐系统 推荐系统embedding_激活函数_55和上下文词向量LDA 推荐系统 推荐系统embedding_激活函数_56),这「两个都可以作为最终的向量化表示矩阵」,只是一个靠近输入空间,一个靠近输出空间,具体选择哪个,理论上没有什么区别。不过我个人更倾向于选择靠近中心词一端的权重矩阵,比如CBOW选择LDA 推荐系统 推荐系统embedding_语义信息_54,而Skip-gram选择LDA 推荐系统 推荐系统embedding_机器学习_53,在Word2Vec使用的Skip-gram就是选的LDA 推荐系统 推荐系统embedding_机器学习_53,「另外有些时候还可以尝试用两个矩阵的平均或者两个矩阵对应词向量的拼接作为最终Embedding」。

参考下图,训练完成的权重矩阵,一个维度是单词对应的维度,一个维度是隐含单元的维度,换个角度来看,它刚好就是每个词对应一个隐含特征向量,这不就是我们需要的词向量吗?因此由权重矩阵便可自然转化成Word2Vec的词向量查找表(Lookup Table)。

LDA 推荐系统 推荐系统embedding_点积_60


(未完待续)