Word2vec

预备知识:
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. :从根结点出发到达w对应叶子结点的路径.
  2. :路径中包含结点的个数
  3. 路径中的各个节点
  4. 词w的Huffman编码(),表示路径第j个节点对应的编码(根节点不对应编码)
  5. 路径中非叶节点对应的向量,向量维度为m(与词向量相同),表示路径第j个非叶子结点对应的向量

从根结点出发,到达代表w词的叶子节点的路径,可以看作是经过了多次二分类,每次分类的将其视作是一次逻辑回归:
image.png

写成整体的形式为:
image.png

那么得到词w的条件概率p(w|context(w))就可以求解为:
image.png

我们的目标函数取对数似然:
image.png

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

关于的梯度计算:

image.png

那么的更新公式为:

image.png

其中为学习率

关于的梯度计算:

image.png

但是在模型中,并不是代表每个词的向量,而是上下文词向量的和。Word2vec利用这个梯度,对词向量进行更新:

image.png

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

Skip-gram

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

    (词袋模型,认为每个u之间无序)
    其中:
    image.png

    与CBOW一样:
    image.png

    对数似然函数为:
    image.png

关于的梯度计算:

image.png

那么的更新公式为:

image.png

关于的梯度计算:

image.png

那么的更新公式为:

image.png

2、基于Negative Sampling的两种模型

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

CBOW

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

表示词的标签,正样本标签为1,负样本为0

对一个给定的正样本(context(w),w),我们希望能够最大化:
image.png

其中:
image.png

写成整体表达式为:
image.png

这时,g(w)可表示为:
image.png

那么我们希望,当u是正样本时,越大越好,当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)