推荐系统实践 0x13 Word2Vec

Word2Vec是谷歌团队提出的,让词向量在天然语言处理当中再度流行,而且推广到了广告、搜索、推荐等各个领域当中。Word2Vec顾名思义,就是一个生成对词的向量表达的模型。假设咱们使用一组句子组成的语料库做为训练数据,其中一句长度为\(T\)的句子为\(w_1,w_2,...,w_T\),假设每一个词都与最相邻的词关系最为密切。那么这种密切的关系能够分为两种:html

  1. CBOW。 每一个词都是由相邻的词决定的。cbow输入是某一个特征词的上下文相关的词对应的词向量,而输出就是这特定的一个词的词向量,即先验几率。
  2. Skip-gram。每一个词都都决定了相邻的词。Skip-Gram模型和CBOW的思路是反着来的,即输入是特定的一个词的词向量,而输出是特定词对应的上下文词向量,即后验几率。

这里借用一下参考图示:
算法

不过从经验上来说,Skip-gram效果要好一些。函数

训练过程

假如咱们选取了\(2c+1\)长度的滑动窗口,从语料库中抽取一个句子而后从左到右不断滑动窗口。每移动一次,窗口中的词就造成了一个训练样本。有了训练样本,咱们就能够定义优化目标。以Skip-gram为例,每一个词\(w_t\)都决定了相邻词\(w_{t+j}\),基于极大似然估计的方法,咱们但愿全部样本的条件几率\(p(w_{t+j}|w_t)\)之积最大,咱们使用对数几率来表示目标函数为优化

\[\frac{1}{T}\sum_{t=1}^{T}\sum_{-c\le j \le c,j\ne 0}\log p(w_{t+j}|w_t) \]

那么咱们如何定义条件几率\(p(w_{t+j}|w_t)\)呢?在多分类问题当中,一般使用softmax函数。咱们但愿,经过词向量的向量表示,能够用内积直观的表示出语义的接近程度。那么咱们能够用\(w_o\)表明\(w_{t+j}\),也就是输出词;用\(w_i\)表示\(w_t\),也就是输入词。spa

\[p(w_o|w_i)=\frac{exp(V_{w_o}'^T V_{w_1})}{\sum_{w_1}^{W}exp(V_{w_o}'^T V_{w_1})} \]

咱们容易忽略一个事实,那就是输入词和输出词的向量表达并不在一个向量空间当中,输入向量表达和输出向量表达能够用以下图来表示:
htm

在这里,输入向量表达就是输入层到隐层的权重矩阵\(W_{v\times N}\),而输出向量表达就是隐层到输出层的权重矩阵\(W'_{Nt\times V}\)。因为输入向量通常是one-hot形式的向量,那么输入向量矩阵\(W_{v\times N}\)的每一行对应的权重向量就是一样意义上的“词向量”,它也能够被看作是一个查找表,如如数向量是10000词的one-hot向量,隐层维度为300,那么输入层到隐层的权重向量为\(10000\times 300\)。在转化为词向量的查找表以后,每行的权重变成了对应词的Embedding向量。blog

负采样

因为语料库中的词数量巨大,对每一个词都要预测偏差是巨大的计算量,所以,为了减轻训练复旦,每每采用负样本的方法进行训练,也就是须要对采样出的几个负样本进行计算预测偏差。从多分类问题退化成了一个近似二分类问题。以下所示:ip

\[E=-\log\sigma({v'_{w_o}}^T h)-\sum_{w_j \in W'_{neg}}\log \sigma({v'_{w_j}}^T h) \]

\(v'_{w_o}\)是输出词向量(正样本),而\(W_{neg}\)是负样本集合,\(v'_{w_j}\)是负样本词向量,因为负样本集合的大小很是有限,一般来讲小于10,在每次梯度降低爹地啊过程当中,计算复杂度能够缩小为原来的1/1000(假设词表为10000)。get

参考

cbow与skip-gram
(二)通俗易懂理解——Skip-gram和CBOW算法原理class

相关文章
相关标签/搜索