推荐系统的主要算法(2)


前言

推荐系统中通常需要计算物品的内容相似度,内容相似就是通过对物品内容的理解,比如物品的基础属性、物品的特征等,得到物品的向量表达,然后通过向量之间的相似度计算得到相似物品列表。基于文本内容的物品,常用Word2vec方法计算相似内容。

本篇博文主要介绍Word2vec算法的理论。


一、语言模型

语言模型也就是自然语言处理(NLP),语言模型的范围非常广,比如分词、信息抽取、命名实体识别、词性标注、句法分析、语音识别、语音合成、机器翻译、问答系统、信息检索等。

语言模型是对一段文本的出现概率进行估计的数学表达式,就是一个长度为 T T T的字符串所确定的概率分布 p ( w 1 , w 2 , . . . , w T ) p(w_1,w_2,...,w_T) p(w1,w2,...,wT),表示其存在的可能性,其中 w i w_i wi表示这段文本中的一个词,则有
p ( s ) = p ( w 1 , w 2 , . . . , w T ) = p ( w 1 ) ∗ p ( w 2 ∣ w 1 ) ∗ . . . ∗ p ( w T ∣ w 1 , w 2 , . . . , w T − 1 ) = ∑ p ( w i ∣ c o n t e n t i ) p(s)=p(w_1,w_2,...,w_T)=p(w_1)*p(w_2|w_1)*...*p(w_T|w_1,w_2,...,w_{T-1})=\sum p(w_i|content_i) p(s)=p(w1,w2,...,wT)=p(w1)p(w2w1)...p(wTw1,w2,...,wT1)=p(wicontenti) Word2vec是语言模型中的一种,它是从大量文本预料中以无监督方式学习语义知识的模型,它被大量用于NLP中。

如果用一个词语作为输入来预测它的上下文,这个模型就叫做Skip-Gram模型。而如果拿一个词语的上下文作为输入预测这个词语本身,则是CBOW(Continuous Bagof-Words)模型。

1. 跳字模型(Skip-gram)

在跳字模型中,每个词被表示成两个 d d d维向量,用来计算条件概率。假设这个词在字典中索引维 i i i,当它为中心词时向量被表示为 v i ∈ R d v_i \in \mathbb{R} ^d viRd,而为背景词时向量表示为 u i ∈ R d u_i \in \mathbb{R} ^d uiRd。设中心词 w c w_c wc在词典中索引为 c c c,背景词 w o w_o wo在词典中索引为 o o o,给定中心词生成背景词的条件概率可以通过对向量内积做softmax运算而得到
P ( w o ∣ w c ) = e x p ( u o T v c ) ∑ i ∈ ν e x p ( u i T v c ) P(w_o|w_c) = \frac{exp(u_o^T v_c)}{\sum_{i \in \nu} exp(u_i^T v_c)} P(wowc)=iνexp(uiTvc)exp(uoTvc)其中词典索引集 ν = { 0 , 1 , . . . , ∣ ν ∣ − 1 } \nu = \{0,1,...,|\nu|-1\} ν={0,1,...,ν1}。假设给定一个长度为 T T T的文本序列,设时间步 t t t的词为 w ( t ) w^{(t)} w(t)。假设给定中心词的情况下背景词的生成相互独立,当背景窗口大小为 m m m时,跳词模型的似然函数即给定任一个中心词生成所有背景词的概率
∏ t = 1 T ∏ − m ≤ j ≥ m , j ≠ 0 P ( w ( t + j ) ∣ w ( t ) ) \prod_{t=1}^{T}\prod_{-m\le j \ge m , j \ne 0} P(w^{(t+j)}|w^{(t)}) t=1Tmjm,j=0P(w(t+j)w(t)) 这里小于1或大于 T T T的时间步可以忽略。

接下里介绍跳词模型的训练过程

跳词模型的参数是每个词所对应的中心词向量和背景词向量。训练中我们通过最大似然函数来学习模型参数,即最大似然估计。这等价于最小化以下损失函数:
− ∑ t = 1 T ∑ − m ≤ j ≤ m , j ≠ 0 l o g P ( w ( t + j ) ∣ w ( t ) ) -\sum_{t=1}^{T}\sum_{-m\le j \le m , j \ne 0} log P(w^{(t+j)}|w^{(t)}) t=1Tmjm,j=0logP(w(t+j)w(t)) 如果使用随机梯度下降,那么在每一次迭代里我们随机采用一个较短的子序列来计算有关该子序列的损失,然后计算梯度来更新模型参数。梯度计算的关键是条件概率的对数有关中心词向量和背景词向量的梯度。根据定义,首先看到
l o g P ( w o ∣ w c ) = u o T v c − l o g ⟮ ∑ i ∈ ν e x p ( u i T v c ) ⟯ log P(w_o|w_c) = u_o^T v_c - log \lgroup \sum_{i \in \nu} exp(u_i^T v_c) \rgroup logP(wowc)=uoTvclogiνexp(uiTvc) 通过微分,我们可以的到上式中 v c v_c vc的梯度
∂ l o g P ( w o ∣ w c ) ∂ v c = u 0 − ∑ j ∈ ν e x p ( u j T v c ) u j ∑ i ∈ ν e x p ( u i T v c ) = u 0 − ∑ j ∈ ν ⟮ e x p ( u j T v c ) ∑ i ∈ ν e x p ( u i T v c ) ⟯ u j = u 0 − ∑ j ∈ ν P ( w j ∣ w c ) u j \begin{aligned} \frac{\partial {log P(w_o|w_c)}}{\partial {v_c}} &= u_0 - \frac{\sum_{j \in \nu} exp(u_j^T v_c)u_j}{ \sum_{i \in \nu} exp(u_i^T v_c) } \\ &= u_0 - \sum_{j \in \nu} \lgroup \frac{exp(u_j^T v_c)}{ \sum_{i \in \nu} exp(u_i^T v_c) } \rgroup u_j \\ &= u_0 - \sum_{j \in \nu} P(w_j | w_c) u_j \end{aligned} vclogP(wowc)=u0iνexp(uiTvc)jνexp(ujTvc)uj=u0jνiνexp(uiTvc)exp(ujTvc)uj=u0jνP(wjwc)uj 它的计算需要词典中所有词以 w c w_c wc为中心词的条件概率。有关其他词向量的梯度同理可得。

训练结束后,对于词典中的任一索引为 i i i的词,均得到该词作为中心词和背景词的两组词向量 v i v_i vi u i u_i ui。在自然语音处理应用中,一般使用跳词模型的中心词向量作为词的表征向量。

2. 连续词袋模型(CBOW)

与跳字模型最大的不同在于,连续词袋模型假设基于某中心词在文本序列前后的背景词来生成该中心词。因为连续词袋模型的背景词有多个,我们将这些背景词向量取平均,然后使用和跳词模型一样的方法来计算条件概率。

v i ∈ R d v_i \in \mathbb R ^d viRd u i ∈ R d u_i \in \mathbb R ^d uiRd分别表示词典中索引为 i i i的词作为背景词和中心词的向量(注意符合的含义与跳词模型中的相反)。设中心词 w c w_c wc在词典中索引为 c c c,背景词 w o 1 , w o 2 , . . . , w o 2 m w_{o_1},w_{o_2},...,w_{o_{2m}} wo1,wo2,...,wo2m在词典中索引为 o 1 , . . . , o 2 m o_1, ..., o_{2m} o1,...,o2m,那么给定背景词生成中心词的条件概率
P ( w c ∣ w o 1 , w o 2 , . . . , w o 2 m ) = e x p ⟮ 1 2 m u c T ( v o 1 + . . . + v o 2 m ) ⟯ ∑ i ∈ ν e x p ⟮ 1 2 m u i T ( v o 1 + . . . + v o 2 m ) ⟯ P(w_c|w_{o_1},w_{o_2},...,w_{o_{2m}}) = \frac{exp \lgroup \frac{1}{2m} u_c^T (v_{o_1} +...+ v_{o_2m}) \rgroup}{\sum _{i \in \nu} exp \lgroup \frac{1}{2m} u_i^T (v_{o_1} +...+ v_{o_2m}) \rgroup } P(wcwo1,wo2,...,wo2m)=iνexp2m1uiT(vo1+...+vo2m)exp2m1ucT(vo1+...+vo2m) 为了让符号更加简单,记 W o = { w o 1 , w o 2 , . . . , w o 2 m } \mathcal W _o = \{ w_{o_1},w_{o_2},...,w_{o_{2m}} \} Wo={wo1,wo2,...,wo2m},且 v ˉ o = ( v o 1 + . . . + v o 2 m ) / ( 2 m ) \bar{v}_o = (v_{o_1} +...+ v_{o_2m})/(2m) vˉo=(vo1+...+vo2m)/(2m) ,那么上式可以简写成
P ( w c ∣ W o ) = e x p ( u c T v ˉ o ) ∑ i ∈ ν e x p ( u i T v ˉ o ) P(w_c|\mathcal W _o) = \frac{exp(u_c^T \bar{v}_o)}{\sum _{i \in \nu} exp(u_i^T \bar{v}_o)} P(wcWo)=iνexp(uiTvˉo)exp(ucTvˉo) 给定一个长度为 T T T的文本序列,设时间步 t t t的词为 w ( t ) w^{(t)} w(t),背景窗口大小为 m m m时,连续词袋模型的似然函数即由背景词生成任一中心词的概率
∏ t = 1 T P ( w ( t ) ∣ w ( t − m ) , . . . , w ( t − 1 ) , w ( t + 1 ) , . . . , w ( t + m ) ) \prod_{t=1}^{T} P(w^{(t)}|w^{(t-m)},...,w^{(t-1)},w^{(t+1)},...,w^{(t+m)}) t=1TP(w(t)w(tm),...,w(t1),w(t+1),...,w(t+m)) 下面介绍连续词袋模型的训练过程

训练连续词袋模型的过程与跳词模型基本一致。连续词袋模型的最大似然估计等价于最小化损失函数
− ∑ t = 1 T l o g P ( w ( t ) ∣ w ( t − m ) , . . . , w ( t − 1 ) , w ( t + 1 ) , . . . , w ( t + m ) ) -\sum_{t=1}^{T} log P(w^{(t)}|w^{(t-m)},...,w^{(t-1)},w^{(t+1)},...,w^{(t+m)}) t=1TlogP(w(t)w(tm),...,w(t1),w(t+1),...,w(t+m)) 注意到
l o g P ( w c ∣ W o ) = u c T v ˉ o − l o g ⟮ ∑ i ∈ ν e x p ( u i T v ˉ o ) ⟯ log P(w_c|\mathcal W _o) = u_c^T \bar{v}_o - log \lgroup \sum _{i \in \nu} exp(u_i^T \bar{v}_o) \rgroup logP(wcWo)=ucTvˉologiνexp(uiTvˉo) 通过微分,可以计算出上式中条件概率的对数有关任一背景词向量 v o i ( i = 1 , 2 , . . . , 2 m ) v_{o_i}(i=1,2,...,2m) voi(i=1,2,...,2m)的梯度
∂ l o g P ( w c ∣ W o ) ∂ v o i = 1 2 m ⟮ u c − ∑ j ∈ ν e x p ( u j T v ˉ o ) u j ∑ i ∈ ν e x p ( u i T v ˉ o ) ⟯ = 1 2 m ⟮ u c − ∑ j ∈ ν P ( w j ∣ W o ) u j ⟯ \frac{\partial log P(w_c|\mathcal W _o)}{\partial v_{o_i}} = \frac{1}{2m} \lgroup u_c - \sum_{j \in \nu} \frac{exp(u_j^T \bar{v}_o)u_j}{\sum_{i \in \nu} exp(u_i^T \bar{v}_o)} \rgroup = \frac{1}{2m} \lgroup u_c - \sum_{j \in \nu} P(w_j|\mathcal W _o)u_j \rgroup voilogP(wcWo)=2m1ucjνiνexp(uiTvˉo)exp(ujTvˉo)uj=2m1ucjνP(wjWo)uj 有关其他词向量的梯度同理可得。同跳字模型不一样的一点在于,我们一般使用连续词袋模型的背景词向量作为词的表征向量。

二、近似训练

Word2vec作为神经概率语言模型的输入,其本身就是神经概率语言模型的副产品,是为了通过神经网络学习CBOW模型和Skip-Gram模型而产生的中间结果,在学习过程中会用到两个降低复杂度的近似方法——Hierarchical Softmax和Negative Sampling。

跳字模型的核心在于使用softmax运算得到给定中心词 w c w_c wc来生成背景词的条件概率
P ( w c ∣ w o ) = e x p ( u o T v c ) ∑ i ∈ ν e x p ( u i T v c ) P(w_c|w_o) = \frac {exp(u_o^T v_c)} {\sum_{i \in \nu} exp(u_i^T v_c)} P(wcwo)=iνexp(uiTvc)exp(uoTvc) 该条件概率对应的对数损失
− l o g P ( w c ∣ w o ) = − u o T v c + l o g ∑ i ∈ ν e x p ( u i T v c ) -log P(w_c|w_o) = -u_o^T v_c + log \sum_{i \in \nu} exp(u_i^T v_c) logP(wcwo)=uoTvc+logiνexp(uiTvc) 由于softmax运算考虑了背景词可能是词典 ν \nu ν中的任一词,以上损失包含了词典中大小数据的项的累加。从上述“一”中的分析可以看到,每一步的梯度计算都包含词典大小数目的项的累加。对含几十万或上百万的较大词典而言,每次的梯度计算开销可能过大。为了降低计算复杂度,在学习过程中会用到两个近似方法——负采样(Negative Sampling)和层序softmax(Hierarchical Softmax)。

由于跳字模型和连续词袋模型相似,这里以跳词模型为例。

1. 负采样(Negative Sampling)

负采样修改了原来的目标函数。给定中心词 w c w_c wc的一个背景窗口,我们把背景词 w o w_o wo出现在该背景窗口看作一个事件,并将该事件的概率计算为
P ( D = 1 ∣ w c , w o ) = σ ( u o T v c ) P(D=1|w_c, w_o) = \sigma(u_o^T v_c) P(D=1wc,wo)=σ(uoTvc) 其中的 σ \sigma σ函数与sigmoid激活函数的含义相同。

我们先考虑最大化文本序列中所有该事件的联合概率来训练词向量。具体地说,给定一个长度为 T T T的文本序列,设时间步 t t t的词为 w ( t ) w^{(t)} w(t)且背景窗口大小为 m m m,考虑最大化联合概率
∏ t = 1 T ∏ − m ≤ j ≤ m , j ≠ 0 P ( D = 1 ∣ w ( t ) , w ( t + j ) ) \prod_{t=1}^{T} \prod_{-m \le j \le m, j \neq 0} P(D=1|w^{(t)}, w^{(t+j)}) t=1Tmjm,j=0P(D=1w(t),w(t+j)) 然而,以上模型中包含的事件仅考虑了正类样本。这导致当所有词向量相等且值为无穷大时,以上的联合概率才被最大化为1。很明显,这样的词向量毫无意义。负采样通过采样并添加负类样本使目标函数更有意义。设背景词 w o w_o wo出现在中心词 w c w_c wc的一个背景窗口为事件 P P P,我们根据分布 p ( w ) p(w) p(w)采样 K K K个未出现在该背景窗口的词,即噪声词。设噪声词 w k ( k = 1 , . . , K ) w_k(k=1,..,K) wk(k=1,..,K)不出现在中心词 w c w_c wc的该背景窗口为事件 N k N_k Nk。假设同时含有正类样本和负类样本的事件 P , N 1 , . . . , N K P,N_1, ..., N_K P,N1,...,NK相互独立,负采样将以上需要最大化的仅考虑正类样本的联合概率改写成
∏ t = 1 T ∏ − m ≤ j ≤ m , j ≠ 0 P ( w ( t + j ) ∣ w ( t ) ) \prod_{t=1}^{T} \prod_{-m \le j \le m, j \ne 0} P(w^{(t+j)} | w^{(t)}) t=1Tmjm,j=0P(w(t+j)w(t)) 其中条件概率被近似表示为
P ( w ( t + j ) ∣ w ( t ) ) = P ( D = 1 ∣ w ( t ) , w ( t + j ) ) ∏ k = 1 , w k ∼ P ( w ) K P ( D = 0 ∣ w ( t ) , w k ) P(w^{(t+j)} | w^{(t)}) = P(D=1|w^{(t)}, w^{(t+j)}) \prod\limits_{k=1, w_k \sim P(w)} ^{K} P(D=0|w^{(t)}, w_{k}) P(w(t+j)w(t))=P(D=1w(t),w(t+j))k=1,wkP(w)KP(D=0w(t),wk) 设文本序列中时间步 t t t的词 w ( t ) w^{(t)} w(t)在词典中的索引为 i t i_t it,噪声项 w k w_k wk在词典中的索引为 h k h_k hk。有关以上条件概率的对数损失函数为
− l o g P ( w ( t + j ) ∣ w ( t ) ) = − l o g P ( D = 1 ∣ w ( t ) , w ( t + j ) ) − ∑ k = 1 , w k ∼ P ( w ) K P ( D = 0 ∣ w ( t ) , w k ) = − l o g σ ( u i t + j T v i t ) − ∑ k = 1 , w k ∼ P ( w ) K l o g ( 1 − σ ( u h k T v i t ) ) = − l o g σ ( u i t + j T v i t ) − ∑ k = 1 , w k ∼ P ( w ) K l o g σ ( − u h k T v i t ) \begin{aligned} -log P(w^{(t+j)}|w^{(t)}) &= -log P(D=1|w^{(t)}, w^{(t+j)}) - \sum\limits_{k=1, w_k \sim P(w)} ^{K} P(D=0|w^{(t)}, w_{k}) \\ &= -log \sigma(u_{i_{t+j}}^{T} v_{i_t}) - \sum\limits_{k=1, w_k \sim P(w)} ^{K} log(1-\sigma(u_{h_k}^{T} v_{i_t})) \\ &= -log \sigma(u_{i_{t+j}}^{T} v_{i_t}) - \sum\limits_{k=1, w_k \sim P(w)} ^{K} log\sigma(-u_{h_k}^{T} v_{i_t}) \end{aligned} logP(w(t+j)w(t))=logP(D=1w(t),w(t+j))k=1,wkP(w)KP(D=0w(t),wk)=logσ(uit+jTvit)k=1,wkP(w)Klog(1σ(uhkTvit))=logσ(uit+jTvit)k=1,wkP(w)Klogσ(uhkTvit) 现在,训练中每一步的梯度计算开销不再与词典大小相关,而与 K K K线性相关。当 K K K取较小的常数时,负采样在每一步的梯度计算开销较小。

2. 层序softmax (Hierarchical Softmax)

层序softmax是另一种近似训练法。它使用了二叉树这一种数据结构,树的每个叶节点代表词典 ν \nu ν中的每个词。

假设 L ( w ) L(w) L(w)为从二叉树的根结点到词 w w w的叶结点的路径(包括根结点和叶结点)上的节点数。设 n ( w , j ) n(w,j) n(w,j)为该路径上第 j j j个结点,并设该结点的背景词向量为 u n ( w , j ) u_{n(w,j)} un(w,j)。以下图为例, L ( w 3 ) = 4 L(w_3)=4 L(w3)=4

层序softmax
层序softmax将跳字模型中的条件概率近似表示为
P ( w o ∣ w c ) = ∏ j = 1 L ( w o ) − 1 σ ⟮ ⟨ n ( w o , j + 1 ) = l e f t C h i l d ( n ( w 0 , j ) ) ⟩ ⋅ u n ( w o , j ) T v c ⟯ P(w_o|w_c) = \prod_{j=1}^{L(w_o)-1} \sigma \lgroup \langle n(w_o, j+1) = leftChild(n(w_0,j)) \rangle \cdot u_{n(w_o, j)} ^T v_c \rgroup P(wowc)=j=1L(wo)1σn(wo,j+1)=leftChild(n(w0,j))un(wo,j)Tvc其中, σ \sigma σ函数为sigmoid激活函数, l e f t C h i l d ( n ) leftChild(n) leftChild(n)是结点 n n n的左子结点:如果判断 x x x为真,则 ⟨ x ⟩ = 1 \langle x \rangle = 1 x=1;反之 ⟨ x ⟩ = − 1 \langle x \rangle = -1 x=1。下面计算上图中给定词 w c w_c wc生成词 w 3 w_3 w3的条件概率。我们需要将 w c w_c wc的词向量 v c v_c vc和根结点到 w 3 w_3 w3路径上的非叶结点向量一一求内积。由于在二叉树中由根结点到叶结点 w 3 w_3 w3的路径上需要向左、向右再向左地遍历,我们得到
P ( w 3 ∣ w c ) = σ ( u n ( w 3 , 1 ) T v c ) ⋅ σ ( u n ( w 3 , 2 ) T v c ) ⋅ σ ( u n ( w 3 , 3 ) T v c ) P(w_3|w_c) = \sigma(u_{n(w_3,1)}^T v_c) \cdot \sigma(u_{n(w_3,2)}^T v_c) \cdot \sigma(u_{n(w_3,3)}^T v_c) P(w3wc)=σ(un(w3,1)Tvc)σ(un(w3,2)Tvc)σ(un(w3,3)Tvc) 由于 σ ( x ) + σ ( − x ) = 1 \sigma(x)+\sigma(-x)=1 σ(x)+σ(x)=1,给定中心词生成词典 ν \nu ν中任一词的条件概率之和为1这一条件也将满足:
∑ w ∈ ν P ( w ∣ w c ) = 1 \sum_{w \in \nu} P(w|w_c) = 1 wνP(wwc)=1此外,由于 L ( w o ) − 1 L(w_o)-1 L(wo)1的数量级为 O ( l o g 2 ∣ ν ∣ ) \mathcal O (log_2|\nu|) O(log2ν),当词典 ν \nu ν很大时,层序softmax训练中每一步的梯度计算开销相较未使用近似训练时大幅降低。

3. 小节

负采样通过考虑同时含有正类样本和负类样本的相互独立事件来构造损失函数。其训练中每一步的梯度计算开销与采样的噪声词的个数线性相关。

层序softmax使用了二叉树,并根据根结点到叶结点的路径来构造损失函数,训练中每一步的的梯度计算开销与词典大小的对数相关。

三、训练过程

因为CBOW和Skip-gram具有相似性,所以接下来仅以CBOW模型为例说明word2vec是如何训练到词向量的。

CBOW训练权重

  1. 将上下文词和目标词都进行one-hot表征作为输入;
  2. 将one-hot表征分别乘输入层权重矩阵 W W W,这个矩阵也叫嵌入矩阵,可以随机初始化生成;
  3. 将得到的向量结果相加求平均值作为隐藏层向量;
  4. 将隐藏层向量乘输出层权重矩阵,这个矩阵也是嵌入矩阵,可以初始化得到。得到输出向量;
  5. 对输出向量做softmax激活处理得到实际输出,并将其与真是标签做比较,再基于损失函数做梯度优化训练。

总结

本博文介绍的是推荐算法中常用的word2vec模型,参考的是李沐考试的《动手学深度学习》。很多地方自己也没搞懂,之后慢慢学习,慢慢丰富博文。

有错误的地方敬请指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值