推荐系统中的embedding应用

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

1.什么是embedding

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

在这里插入图片描述
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,两种网络结构图见下图。
在这里插入图片描述
这两种结构都是假定每个词都跟其相邻的词的关系最密切,不同的是CBOW模型的动机是每个词都是由相邻的词决定的,所以CBOW的输入是 w t w_t wt 周边的词,预测的输出是 w t w_t wt ,而Skip-gram模型的动机则是每个词都决定了相邻的词,输入是 w t w_t wt,输出是 w t w_t wt周边的词。这里相邻的词通常由一个滑动窗口来获得,滑动窗口的长度为2c+1(目标词前后各选c个词),从句子左边滑倒右边,每滑一次,窗口中的词就形成了我们的一个正样本。如上图,这里的c设为2,其中是当前所关注的词, w ( t − 2 ) w(t-2) w(t2) w ( t − 1 ) w(t-1) w(t1) w ( t + 1 ) w(t+1) w(t+1) w ( t + 2 ) w(t+2) w(t+2)是上下文中出现的词。

在这里插入图片描述
经验上讲Skip-gram的效果要更好一点,我们以Skip-gram为例,理解一下原理。上面讲到通过滑动窗口可以获取到训练样本,有了训练样本之后我们就可以着手定义优化目标了,既然每个词 p ( w t + j ∣ w t ) p(w_{t+j}|w_t) p(wt+jwt)都决定了相邻词 w t + j w_{t+j} wt+j,基于极大似然,我们希望所有样本的条件概率 p ( w t + j ∣ w t ) p(w_{t+j}|w_t) p(wt+jwt)之积最大,于是有:
在这里插入图片描述
转为最大化对数似然:
在这里插入图片描述
其中,T是文本长度,即单词总数,c是窗口大小,另外单词一般需要先用One-Hot编码。

其实从上面的图中可以看出,在实际训练学习过程中,训练样本是由中心词和其上下文词组成一个个Pair对,那我们可以将目标函数写成一个更容易理解的的式子:
在这里插入图片描述
其中, ( w , c ) (w,c) (w,c)表示中心词与其上下文词 c c c构成的样本对, D D D是语料中所有单词及其上下文词构成的样本对集合,这里的 θ \theta θ为「待定参数集」。

接下来的问题是怎么定义 p ( c ∣ w ) p(c|w) p(cw) ,作为一个多分类问题,最简单最直接的方法当然是直接用Softmax函数,同时我们希望用隐向量来表示每个词。

于是设 v w v_w vw为中心词w的词向量, v c v_c vc为上下文词c向量,向量维度等于设置的隐藏层单元数量。整个语料共有V个单词,也就是词汇表单词数。

因此:
在这里插入图片描述
带入上面的目标函数,可以得到:
在这里插入图片描述

其中,参数 θ \theta θ v w i v_{w_i} vwi v c i v_{c_i} vci i ∈ 1 , 2 , . . . , d i\in{1,2,...,d} i1,2,...,d d d d是向量维度。

这两个单词的隐向量的点积表示语义的接近程度,其实点积的物理意义就是词之间的距离,点积越大,表明两个单词的语义越接近,向量点积展开如下:
在这里插入图片描述
(注:向量点积在不同的论文有不同的表示形式,本文为了推导后面的负例采样优化,写法与第三篇论文的写法保持一致。)

Softmax的作用就是将点积转换成概率,下图的例子可以辅助理解[^1]:
在这里插入图片描述

3.2Word2Vec的网络结构

CBOW和Skip-gram都可以表示成由输入层(Input)、映射层(Projection)和输出层(Output)组成的神经网络。
在这里插入图片描述
输入层中的每个词通常由独热编码(One-Hot)方式表示,即所有词均表示成一个 V V V维向量,其中 V V V为词汇表中单词的总数。在向量中,每个词都将与之对应的维度置为1,其余维度的值均设为0。

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

同理,输出层向量的值可以通过隐含层向量,以及连接隐含层和输出层之间的 N × V N\times V N×V 维权重矩阵 W ′ W' W计算得到。输出层也是一个 V V V维向量,每维与词汇表中的一个单词相对应。最后,对输出层向量应用Softmax激活函数,可以计算出每个单词的生成概率。

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

不过上图的网络结构是单个上下文的一个示例,即当前词预测下一个词,对于真正的多词上下文的CBOW和Skip-gram,通常是下面的结构:
在这里插入图片描述
以Skip-gram模型为例,其前向公式为:
在这里插入图片描述
因为输出层共享权重 W ′ W' W,所以 u c ( c = 1 , 2 , . . . , C ) u_c(c=1,2,...,C) uc(c=1,2,...,C)都是一样的,输出向量 y c ( c = 1 , 2 , . . . , C ) y_c(c=1,2,...,C) yc(c=1,2,...,C)也是都一样的,即 y 1 = y 2 = . . . = y C y_1=y_2=...=y_C y1=y2=...=yC

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

3.3从权重矩阵到词向量

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

其实就是上面的「权重矩阵」 W V × N W_{V\times N} WV×N W N × V ′ W'_{N\times V} WN×V(对Skip-gram来说,分别对应损失函数公式中的中心词词向量 u u u和上下文词向量 v v v),这「两个都可以作为最终的向量化表示矩阵」,只是一个靠近输入空间,一个靠近输出空间,具体选择哪个,理论上没有什么区别。不过我个人更倾向于选择靠近中心词一端的权重矩阵,比如CBOW选择 W N × V ′ W'_{N\times V} WN×V,而Skip-gram选择 W V × N W_{V\times N} WV×N,在Word2Vec使用的Skip-gram就是选的 W V × N W_{V\times N} WV×N,「另外有些时候还可以尝试用两个矩阵的平均或者两个矩阵对应词向量的拼接作为最终Embedding」。

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

在这里插入图片描述
(未完待续)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值