Word2vec

作者: rssivy | 来源:发表于2018-11-12 22:27 被阅读0次

    预备知识:
    LR、贝叶斯公式、赫夫曼编码、统计语言模型、n-gram模型、神经概率语言模型、词向量、词袋模型、softmax、负采样,可以参考word2vec中的原理

    Word2vec将词映射到K维向量空间,并且词向量能和语义相对应。

    语言概率模型

    计算一个句子的概率的概率模型,基于一个语料库来构建。生成一个句子可以利用贝叶斯公式进行链式分解,求得生成的概率。通常是先计算好词串出现次数,将概率值存起来,下次计算一个句子的概率时,找到概率值进行连乘 image.png

    n-gram模型
    n-gram是语言概率模型中的一种

    它作了一个n-1阶马尔科夫假设,认为一个词出现的概率只和它前面的n-1个词相关,同时根据大数定律,将概率计算进行了简化 image.png

    对于机器学习而言,通常是构建一个目标函数,然后对这个函数进行优化,求得最优参数解,得到模型,利用模型进行预测
    对于语言模型来说,目标函数可以利用最大似然,设为:p(w|context(w))连乘(给定的语料库样本出现的可能性最大,此时参数最可信),这个时候里面的待定参数能够通过不断优化求得。利用这种方法计算的参数比语言概率模型所需要计算的参数少得多

    n-gram模型利用极大似然估计优化模型: image.png

    n-gram的优点:

    1. 常见的Bigram,Trgram 实现简单,能够很好地应用在一些经典场景中,例如检查拼写错误(极大似然句子概率)。
    2. 常见搜索引擎的输入下拉帮助,就是通过n-gram来实现的。
    3. 可解释性强,易于理解和调试。
    4. 易于增量实现和并行训练。

    n-gram的缺点:

    1. 需要解决数据稀疏性的问题(没有出现过的词语的概率会被置为0),一般有平滑算法,back-off算法,Interpolation算法。
    2. 由于是离散型变量,没有办法度量词语之间相似度。
    3. 模型巨大,与|V| 词库大小呈指数增长。

    神经网络也能够用来构造这样的一个目标函数,并对参数进行训练,同时能利用训练出的词向量来度量词语之间的相似度,并且自带平滑功能,不需要想n-gram那样使用平滑算法进行平滑处理

    真正测试/训练的时候,网络的输入和输出都是向量。因此要将输入的文本和单词变成向量的形式。这个时候会涉及到词向量

    词向量:将自然语言进行数学化

    • one-hot representation:最简单的词向量构造方法,词典的长度为N的话,那么每一个词的词向量的维度都是N,向量的分量只有一个1,对应着它在词典中的位置,其它全为0。缺点:维度过高、不能刻画词与词之间的相似性
    • Distributed representation:通过训练,将每一个词映射到一个固定长度的短向量中,把词的信息分布到各个分量中,并且语义相近的词向量见距离越近

    神经概率语言模型

    四个层:输入层、投影层、隐藏层、输出层 image.png
    对于给定的语料库,每一个(context(w),w)为一个训练样本 image.png
    对于每一层的输入输出:
    • 输入层:词的上下文,输入形式为向量形式,这里一个词向量维度为m,n-1个词输入
    • 投影层:对输入的n-1个词进行拼接,得到一个维度为(n-1)m的向量
    • 隐藏层:利用双曲正切函数tanh作为激活函数,隐藏层规模nh为可调参数
    • 输出层:矩阵运算得到y为一个长度为N的向量,但是分量不能代表每个词出现的概率,必须要进行一个softmax归一化,归一化后,p(w|context(w))就可以表示为: image.png

    那么,目标函数就能够确定了(最大对数似然),目标函数的待确定参数包括:词向量+神经网络参数,通过优化可求解,最后能够得到语言概率模型,顺便训练出来了每个词的词向量

    这里面涉及到的参数:

    • n:词的上下文的词数,通常不超过5
    • m:词向量长度,通常为10-100量级
    • nh:用户指定,通常不用取太大,一般100量级
    • N:语料库词典的大小,通常10000-100000量级

    整个模型的计算集中在隐藏层和输出层的矩阵运算,以及输出层上的softmax归一化运算。
    Word2vec的工作就是针对这一部分进行优化

    softmax需要对语料库中每个词语(类)都计算一遍输出概率并进行归一化,当语料库的词汇量很大时,运算量会非常大。(上述过程其实可以看做一个多分类问题。给定特征,根据softmax归一化结果中,从N个分类概率中挑一个词)

    不用softmax怎么样?比如SVM中的多分类的问题中,其中有一种方法是由二分类组合而来的: image.png

    这是一种二叉树结构,应用到word2vec中被称为Hierarchical Softmax(使用二分类近似多分类,使用Huffman编码构造一连串的二分类。比如给定一个词,先判断这个词是名词吗,然后判断是不是水果,再判断是不是橘子。树中每个叶子结点代表词,非叶子结点的中间结点会被赋予一些合适的向量,叶子结点(真正的词)会共用这些抽象结点的向量)

    Word2vec两种模型

    • CBOW:已知词w上下文context(w)前提下,预测当前词w
    • Skip-gram :已知当前词w,预测其上下文context(w) image.png

    关于这两种模型,Word2vec给出了两套框架,分别是:

    • 基于Hierarchical Softmax (使用Huffman树)
    • 基于Negative Sampling(随机负采样)

    1、基于Hierarchical Softmax的Word2vec的两种模型

    CBOW
    CBOW (Continuous Bag-of-Words Model ),根据上下文的词语预测当前词语的出现概率的模型,其学习目标是最大化对数似然函数: image.png

    网络结构:输入层、投影层、输出层

    image.png
    • 输入层:包含context(w)中的2c个词的词向量(context(w)为词w的前后各c个词构成)
    • 投影层:将输入层的2c个向量进行累加求和,得到一个m为的向量: image.png
    • 输出层:输出层对应一颗二叉树,叶子结点为预料库中的词,各词在预料库中出现的次数作为权值构成这个Huffman树。非叶子结点相当于一个神经元(感知机,我认为逻辑斯谛回归就是感知机的输出代入f(x)=1/(1+e^x)),二分类决策输出1或0,分别代表分到左边或者是右边。于是每个词语都可以被01唯一地编码,并且其编码序列对应一个事件序列,于是我们可以计算条件概率
      在开始计算之前,还是得引入一些符号:
    1. p^w:从根结点出发到达w对应叶子结点的路径.
    2. l^w:路径p^w中包含结点的个数
    3. {p_1}^w,{p_2}^w,{p_3}^w...{p_{l^w}}^w路径p^w中的各个节点
    4. {d_2}^w{d_3}^w...{d_{l^w}}^w词w的Huffman编码({d_i}^w\in{0,1}),{d_j}^w表示路径p^w第j个节点对应的编码(根节点不对应编码)
    5. {\theta_1}^w{\theta_2}^w...{\theta_{l^{w-1}}}^w路径p^w中非叶节点对应的向量,向量维度为m(与词向量相同),{\theta_j}^w表示路径p^w第j个非叶子结点对应的向量
    从根结点出发,到达代表w词的叶子节点的路径,可以看作是经过了多次二分类,每次分类的将其视作是一次逻辑回归: image.png
    写成整体的形式为: image.png
    那么得到词w的条件概率p(w|context(w))就可以求解为: image.png 我们的目标函数取对数似然: image.png

    目标就是最大化这个函数,用到随机梯度上升法:先求函数对每个变量的偏导数,每取一个样本,就代入偏导数表达式得到函数在该维度的增长梯度,然后让对应参数加上这个梯度,对目标函数的所有参数做一次刷新,函数在这个维度上就增长了。观察目标函数\zeta,函数中的参数包括向量x^w, {\theta_{j-1}}^w, w \in C, j=2,3...l^w.计算函数\zeta关于这些向量的梯度:

    关于{\theta_{j-1}}^w的梯度计算:

    image.png

    那么{\theta_{j-1}}^w的更新公式为:

    image.png

    其中\eta为学习率

    关于x^w的梯度计算:

    image.png

    但是x^w在模型中,并不是代表每个词的向量,而是上下文词向量的和。Word2vec利用这个梯度,对词向量v(\hat{w}),\hat{w} \in context(w)进行更新:

    image.png

    这里没有将其平均后更新到每个词向量上,而是直接贡献到每个词的词向量上。

    Skip-gram
    Skip-gram和CBOW模型的网络结构一样,也包括了三层:输入层,投影层,输出层。只是逆转了CBOW的因果关系而已,即已知当前词语,预测上下文。 image.png
    • 输入层:当前词w的词向量
    • 投影层:恒等投影,其实是多余的,将输入层的词向量传递给输出层
    • 输出层:输出层也是对应一颗Huffman树(与CBOW模型一样)
      那么概率函数被定义为: image.png
      (词袋模型,认为每个u之间无序)
      其中: image.png
      与CBOW一样: image.png
      对数似然函数为: image.png

    关于{\theta_{j-1}}^w的梯度计算:

    image.png

    那么{\theta_{j-1}}^w的更新公式为:

    image.png

    关于x^w的梯度计算:

    image.png

    那么x^w的更新公式为:

    image.png

    2、基于Negative Sampling的两种模型

    从机器学习的角度来理解,在分类任务的训练中,不但要给正例,还要给负例。对于Hierarchical Softmax,负例是二叉树的其他路径。对于Negative Sampling,负例是随机挑选出来的,不再使用Huffman树,能大幅度提高性能。

    CBOW
    在给定的一个context(w)中,正样本是w,其它词就是负样本。假设我们通过某种采样方法获得了负例子集NEG(w)。对于正负样本,分别定义一个标签: image.png

    表示词\hat{w}的标签,正样本标签为1,负样本为0

    对一个给定的正样本(context(w),w),我们希望能够最大化: image.png
    其中: image.png
    写成整体表达式为: image.png
    这时,g(w)可表示为: image.png

    那么我们希望,当u是正样本时,\sigma({x_w}^T\theta^u)越大越好,当u是负样本时,\sigma({x_w}^T\theta^u)越小越好。类似于逻辑回归,\sigma({x_w}^T\theta^u)等于模型预测样本为正例的概率,当答案就是正的时候,我们希望这个概率越大越好,当答案是负的时候,我们希望它越小越好,这样模型的分类效果才好。增大正样本的概率同时降低夫样本的概率

    那么对于一个给定的语料库C,函数 image.png 是我们整体的优化目标,取对数,方便计算 image.png 梯度计算: image.png
    image.png
    image.png 更新公式: image.png
    image.png
    Skip-gram

    一样的类似Hierarchical Softmax从CBOW过渡到Skip-gram模型,颠倒样本的x和y部分,也即对(w,context(w)),我们希望最大化:


    image.png

    其中:


    image.png
    image.png
    image.png
    image.png

    梯度计算:


    image.png
    image.png
    更新公式:
    image.png
    image.png

    相关文章

      网友评论

          本文标题:Word2vec

          本文链接:https://www.haomeiwen.com/subject/mmyhfqtx.html