zoukankan      html  css  js  c++  java
  • 推荐系统实践 0x13 Word2Vec

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

    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_{-cle j le c,j e 0}log p(w_{t+j}|w_t) ]

    那么我们如何定义条件概率(p(w_{t+j}|w_t))呢?在多分类问题当中,通常使用softmax函数。我们希望,通过词向量的向量表示,可以用内积直观的表示出语义的接近程度。那么我们可以用(w_o)代表(w_{t+j}),也就是输出词;用(w_i)表示(w_t),也就是输入词。

    [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})} ]

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

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

    负采样

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

    [E=-logsigma({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)。

    参考

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

  • 相关阅读:
    Android 自定义标题栏 并进行事件处理
    java synchronized详解
    Java中LinkedList与ArrayList有什么区别
    android动态全屏切换
    java线程机制介绍
    设置导航栏背景和文字属性
    Dictionary的用法
    bundle
    解析Json
    Copy与MutableCopy
  • 原文地址:https://www.cnblogs.com/nomornings/p/14228410.html
Copyright © 2011-2022 走看看