论文笔记|ITEM2VEC: NEURAL ITEM EMBEDDING FOR COLLABORATIVE FILTERING

前两天在朋友圈看到学弟发的一个图,巨佬学习是hash,大佬学习是遍历,我学习是无穷递归,今天才发现诚不我欺。早上决定将YouTube 16年在RecSys那篇经典的文章学习一下,结果看到Negative Sample就看不懂了,然后在知乎查了一下,又在大佬的指引下找ICML 2016的这篇文章学习一下。
推荐系统最经典的算法是基于用户相似度的推荐算法u2u,称为memory-based,和基于物品相似度的推荐算法i2i,称为model-based。而在深度学习加入后,NLP中embedding的方法在推荐系统算法中发挥了较好的效果。

word2vec

在NLP中,word2vec可以说是最知名的word embedding算法。
词向量最早采用one-hot编码,也称为1-of-N表示,即在长向量中仅有该词对应的那一维值为1,其余维度皆为0。向量的长度与词库大小相关,通常达百万级别(推荐系统中物品资料也是如此),因此向量相似度的计算复杂度十分高昂。Dristributed representation解决了one-hot的这一问题,其通过训练,将高维稀疏向量映射到低维稠密向量空间(值为float),之后再采取相应的相似度计算。但是,如何保证词向量之间的关系不变,是模型的关键所在。在NLP中,认为词的含义与其上下文信息相关,若两个词的上下文信息相似,则认定这两个词相似。
那如何用DNN训练这一模型呢?一般分为CBOW(Continuous Bag-of-Words)与Skip-Gram两种模型。其中,CBOW是输入某一词上下文中词的词向量,输出该词的词向量。设定词袋大小后,输入维度是确定的。经过隐藏层的非线性变换后,输出层(softmax层)的长度与词库的长度相同,计算每个词的softmax概率,通过反向传播优化模型参数。最终可以得任意词的one-hot编码到Dristributed representation的变换模型。
与CBOW相似,Skip-Gram模型是反着来的,即输入一个词向量,输出中选取softmax值最高的2N个值对应于与该词对应的上下文中2N个词。
这两个模型是完全可行的,但是由于庞大的词库,该模型训练的复杂度十分高,比如计算数百万个softmax值。针对这一问题,word2vec做了相应的优化。首先,word2vec也采用了CBOW和Skip-Gram的方式训练模型得到词向量,但是并没有采用简单的DNN模型。结构方面,隐藏层、输出层的神经元用霍夫曼树代替,霍夫曼树的叶子节点起到输出层神经元作用,内部节点起到隐藏层神经元作用。众所周知,将节点构建霍夫曼树后,权重高的叶子节点离根节点更近,霍夫曼编码更短。在word2vec中,左子树编码为1,右子树编码为0。
对于DNN模型的优化,word2vec有基于Hierarchical Softmax和基于Negative Sampling两种优化方式。在基于Hierarchical Softmax的模型中,输入层到隐藏层没有采用线性变换加激活函数的方式,而是对所有输入词向量求和取平均,得到一个词向量(此部分对应于CBOW中的2N个词向量拼接)。根据词库中各词在训练数据中的出现频率作为权值,建立霍夫曼树,则每个词可得到一个霍夫曼编码。假设one-hot编码长为M,则共有M-1个非叶节点,每个叶节点代表一长为M-1的参数 θ \theta θ。从根节点,每分裂一次相当于做一次二分类,左负右正,按照sigmoid函数计算是正类的概率。对于每个训练样本,按照最大似然方法,从根节点到该叶路线上所有节点处概率值乘积作为最终概率
L ( θ , x ) = l o g ∏ j = 2 ( σ ( x w T θ j − 1 w ) ) 1 − d j w ( 1 − σ ( x w T θ j − 1 w ) ) d j w L(\theta,x)=log\prod_{j=2}(\sigma(x_w^T\theta_{j-1}^w))^{1-d_j^w}(1-\sigma(x_w^T\theta_{j-1}^w))^{d_j^w} L(θ,x)=logj=2(σ(xwTθj1w))1djw(1σ(xwTθj1w))djw
此时运算复杂度从 O ( ∣ V ∣ ) O(|V|) O(V)降低为 O ( l o g ∣ V ∣ ) O(log|V|) O(logV)。采用SGD的方法,每次随机对一个样本进行梯度上升算法,优化 θ \theta θ x x x,最终得到词的词向量与参数 t h e t a theta theta
Hierarchical Softmax通过使用霍夫曼树代替传统神经网络隐含层与输出层,降低了运算的复杂度。但是,对于生僻词,仍然需要在霍夫曼树中往下走很久。word2vec的另一种方法Negative Sampling使模型做到了更简单。负采样,顾名思义,采用了采样的方式。假设一个样本中,中心词 w w w,上下文共2
N个词记作 c o n t e x t ( w ) context(w) context(w),则这是一个正例。接下来,需要通过负采样的方式,得到neg个与 w w w不同的中心词,与 c o n t e x t ( w ) context(w) context(w)构成neg个负例。同样按照最大似然方法,将neg+1个sigmoid计算的概率的对数似然函数作为代价函数,每次选取一个样本采用梯度上升方法优化各 x w 0 x_{w0} xw0 θ w i \theta^{wi} θwi i = 0 , 1 , . . . n e g i=0,1,...neg i=0,1,...neg。 对于负采样的方式,假设词库长 V V V,则将长度为1的线段分为 V V V份,每个词对应的线段长度为
l e n ( w ) = c o u n t ( w ) 3 / 4 ∑ c o u n t ( u ) 3 / 4 len(w)=\frac{count(w)^{3/4}}{\sum count(u)^{3/4}} len(w)=count(u)3/4count(w)3/4
然后将线段均分成 M M M份, M > > V M>>V M>>V,默认 M M M 1 0 8 10^8 108,从 M M M中中采样neg个位置对应的词即负例。

item2vec

在item2vec中,将商品等价于word2vec中的word,则出现在同一集合(同一用户购买)的item则视为正例。对于集合 w 1 , w 2 , . . . , w k w_1,w_2,...,w_k w1,w2,...,wk目标函数定义为
L = 1 K ∑ i = 1 K ∑ j ≠ i K l o g p ( w j ∣ w i ) L=\frac{1}{K}\sum^K_{i=1}\sum^K_{j\neq i}log p(w_j|w_i) L=K1i=1Kj̸=iKlogp(wjwi)
利用负采样,
p ( w j ∣ w i ) = σ ( u i T v j ) ∏ k = 1 N σ ( − u i T v k ) p(w_j|w_i)=\sigma(u_i^Tv_j)\prod_{k=1}^N\sigma(-u_i^Tv_k) p(wjwi)=σ(uiTvj)k=1Nσ(uiTvk)
采用SGD方法训练,得到每个item对应的embedding representation。

你可能感兴趣的:(论文笔记|ITEM2VEC: NEURAL ITEM EMBEDDING FOR COLLABORATIVE FILTERING)