Ex_treme's blog.

从NLP讲到神经网络————词向量word2vec原理浅析

2018/03/23 Share

自然语言处理

  • 检查拼写、关键词检索……
  • 文本挖掘(产评价格、日期、时间、地点、地点、人民、公司名)
  • 文本分类
  • 机器翻译
  • 客服系统
  • 复杂对话系统(微软小冰)

深度学习

基础模型>>神经网络>>优化目标>>效果最优

为什么需要研究深度学习

  • 手工特征耗时耗力,还不易拓展
  • 自动特征学习快,方便拓展
  • 深度学习提供了一种通用的学习框架,可用来表示世界、视觉和语言学信息
  • 深度学习既可以无监督学习,也可以监督学习(强化学习是无监督的)

语言模型

  • 机器翻译

算概率最可能的翻译

  • 拼写纠错

算概率标注红线

  • 智能问答

Example

我 今天 下午 打 篮球(边说边想)

p(S)=p(w1,w2,w3,w4,w5)=p(w1)p(w2w1)...p(w5w1,w2,w3,w4)p(S)=p(w_1,w_2,w_3,w_4,w_5)=p(w_1)p(w_2|w_1)...p(w_5|w_1,w_2,w_3,w_4)

P(S)被称为语言模型,即用来计算一个句子的概率模型  

** 存在问题:**
1. 数据过于稀疏
2. 参数空间太大

N-gram模型

假设下一个词只依赖它前面的一个词:

P(S)=p(w1)p(w2w1)...p(wnwn1)P(S)=p(w_1)p(w_2|w_1)...p(w_n|w_{n-1})

可以指定参数n的值,n=2即和前面两个词相关,通过样本计算每个词的出现概率。

模型参数的量级是O(Nn)O(N^n),常用参数为2或3。

词向量

把一个词转换成向量,生成的向量相似的词之间的距离要相近
我们希望我们构造出来的词向量和语言无关(因为语言的逻辑是差不多的)
因此不同语言构造出来的词向量是差不多的

神经网络模型

  • 输入层

比如输入“今天 下午 打”(分别生成一个词向量)–> 预测第四个词

  • 投影层

把词向量首位连接起来

  • 隐藏层(黑盒子)

隐层和隐层之间的参数

  • 输出层

隐藏层和输出层之间的参数

训练样本
(Context(w),w)(Context(w),w)包括前n1n-1个词分别的向量,假定每个词的向量大小都为mm

投影层
(n1)m(n-1)*m首位拼接起来的大向量

输出
yw=(yw1,yw2,...,ywn)Ty_w = (y_{w1},y_{w2},...,y_{wn})^T
表示上下文为Context(w)Context(w)时,预测结果:下一个词旗号为词典中第ii个词的概率
labellabel去表示,然后可以定义损失函数

归一化
分类层,一般用softmaxsoftmaxp(wContext(w))=eyw,iw/1neyw,ip(w|Context(w))=e^{y_w},iw/\sum_1^ne^{y_w},i

神经网络模型相对于传统的语言模型的优势,举个栗子:
s1=今天去网咖,s2=今天去网吧,s1出现1000次和s2出现10次是差不多的
我们可以得到词之间的对应关系,这很符合现实。

Hierarchical Softmax(分层的softmax)

  • CBOW

输入就是上下文,输出就是预测词

  • Skip-gram

输入是当前词,输出是上下文

CBOW

CBOWCBOWContinuousBagofWorldsModelContinuous Bag-of-Worlds Model的缩写,是一种根据上下文的词语预测当前词语出现概率的模型

ι=wclogp(wContext(w))\iota=\sum_{w\in c}logp(w|Context(w))

输入层是上下文的词语的词向量,在训练CBOWCBOW模型,词向量只是个副产品,确切来说,是CBOWCBOW模型的一个参数。训练开始的时候,词向量是个随机值,随着训练的进行不断被更新。

投影层对其求和,所谓求和,就是简单的向量加法。

输出层输出最有可能的w。由于语料库中词汇量是固定的C|C|个,所以上述过程其实可以看作一个多分类问题。给定特征,从C|C|个分类中挑选一个。

哈夫曼树

带权路径长度最短的二叉树,也称为最优二叉树。

	举个栗子:霍夫曼编码
    高频词汇尽可能的离根结点近,即结点的权值大,最后通过哈夫曼树进行分层判断(二分类问题)。
    它的构造过程就是高频词先合并,然后比较权值继续构造。

Logistic回归

SigmoidSigmoid函数:g(z)=1/1+ezg(z)=1/1+e^z
将任意一个数映射到(0,1)(0,1),根据正例和负例解决二分类问题,
比如我 爱 巴西 足球,输出就是4次正例或负例的概率连乘积,
以上就是分层的softmax。

求解目标

通过LogisticLogistic回归我们就知道了当们我要得到一个词ww而分层(正例的次数幂与负例的次数幂)恰好得到ww的概率为:

p(djwXw,θj1w)=[σ(XwTθj1w)]1djw[1σ(XwTθj1w)]djwp(d^w_j|X_w,\theta ^w_{j-1})=[\sigma (X^T_w\theta^w_{j-1}) ]^{1-d^w_j}*[1-\sigma (X^T_w\theta^w_{j-1})]^{d^w_j}

把上面的概率公式带入CBOW语言概率模型(优化成对数和形式的似然函数):

ι=wclogp(wContext(w))\iota=\sum_{w\in c}logp(w|Context(w))

连续相乘在log的作用下变成了连续相加,最后得到以下公式:

ι=wcj=2lw(1djw)log[σ(XwTθj1w)]+djwlog[1σ(XwTθj1w)]\iota=\sum_{w\in c}\sum_{j=2}^{l^w}{(1-d^w_j)log[\sigma (X^T_w\theta^w_{j-1}) ]+d^w_jlog[1-\sigma (X^T_w\theta^w_{j-1})]}

我们求解的目标就是优化这个似然函数求得它的最大值,我们采用梯度上升方法求解。

梯度上升

σ\sigma求导数,求得方向,然后我们再指定一个步长,最后得到θj1w\theta ^w_{j-1}的更新表达式:
θj1w=θj1w+η[1djwσ(XwTθj1w)]Xw\theta ^w_{j-1} = \theta ^w_{j-1}+ \eta[1-d^w_j-\sigma (X^T_w\theta^w_{j-1})]X_w

然后再对投影层词向量的和XwX_w求导数,但是这里需要注意的是XwX_w是上下文的词向量的和,不是上下文单个词的词向量。怎么把这个更新量应用到单个词的词向量上去呢?word2vecword2vec采取的是直接将XwX_w的更新量整个应用导每个单词的词向量上去:

v(w)=v(w)+ηj=2lwι(w,j)/Xw,wContent(w)v(\overline w)=v(\overline w)+\eta \sum ^{l^w}_{j=2}\partial \iota (w,j)/\partial X_w,\overline w \in Content(w)

负采样模型

如果语料库过大,为了避免模型过大,我们可以使用负采样模型,通过指定正样本(我 爱 打 篮球),篮球就是正样本,其它的就是负样本。
任何采样算法都应该保证频次越高的样本越容易被采样出来。基本的思路就是对于长度为1的线段,根据词语的词频将其公平的分配给每个词语。

CATALOG
  1. 1. 自然语言处理
  2. 2. 深度学习
    1. 2.1. 为什么需要研究深度学习
  3. 3. 语言模型
    1. 3.1. Example
    2. 3.2. N-gram模型
    3. 3.3. 词向量
      1. 3.3.1. 神经网络模型
      2. 3.3.2. Hierarchical Softmax(分层的softmax)
        1. 3.3.2.1. CBOW
        2. 3.3.2.2. 哈夫曼树
        3. 3.3.2.3. Logistic回归
        4. 3.3.2.4. 求解目标
        5. 3.3.2.5. 梯度上升
        6. 3.3.2.6. 负采样模型