Word2Vec

2019-05-28  本文已影响0人  Luuuuuua

本文基本上“复现”这篇博客 / 转载自 https://blog.csdn.net/itplus/article/details/37969519

前言

入门学习NLP的同学,遇到的第一个概念可能就是词向量。因为将文本向量化已经是NLP任务中的常规操作。

预备知识

sigmoid 函数

sigmoid函数是神经网络中常用的激活函数之一。
定义如下:
\sigma = \frac{1}{1+e^{-x}}
导数为:
\sigma^{'}(x) = \frac{e^{-x}}{({1+e^{-x}})^{2}} = \frac{1}{1+e^{-x}}(1-\frac{1}{1+e^{-x}}) = \sigma(x)(1-\sigma(x))
(1-\sigma(x))'=(\frac{e^{-x}}{1+e^{-x}})'=\left(\frac{1}{1+e^{-x}}\right)\left(\frac{-e^{-x}}{1+e^{-x}}\right)=\sigma(x)(\sigma(x)-1)
则:
[\log\sigma(x)]^{'} = \frac{1}{\sigma(x)}(\sigma^{'}(x))=1-\sigma(x) [\log(1-\sigma(x))]^{'}=\frac{1}{1-\sigma(x)}((1-\sigma(x))^{'}=-\sigma(x)
图像如下:

sigmoid

逻辑回归

二分类问题:设\lbrace\left(x_i,y_i\right)\rbrace_{i=1}^m 是一个二分类问题的样本数据,其中x_i\in R^n,y_i\in\lbrace0,1\rbrace,当y_i=1时称相应的样本为正例,当y_i=0时称相应的样本为负例。
利用sigmoid函数,可将二分类问题的假设函数(Hypothesis)写成:
h_\theta(x)=\sigma(\theta^Tx)=\frac{1}{1+e^{-\theta^Tx}}
h_\theta(x_i)可认为是x_i所对应的样本被判定为正例的概率,那么,对应的1-h_\theta(x_i)可认为是x_i所对应的样本被判定为负例的概率。若y_i=1,那么h_\theta(x)的值应较大,即x_i所对应的样本被判定为正例的概率较大,被判定为负例的概率较小。
取阈值为0.5,则二分类的判别公式为:
y(x)=\begin{cases} 1,\, h_\theta(x)\ge0.5 \\ 0,\, h_\theta(x)<0.5 \end{cases}
要求参数\theta,先定义一个整体损失函数:
J(\theta)=\frac{1}{m}\sum_{i=1}^{m}cost(x_i,y_i)
其中,单个样本的损失函数cost(x_i,y_i)一般取为对数似然函数
cost(x_i,y_i)=\begin{cases} -\log(h_\theta(x_i)),\, y_i=1\\ -\log(1-h_\theta(x_i)),\, y_i=0\\ \end{cases}
所以,整体损失函数可写为:
J(\theta)=\frac{1}{m}\sum_{i=1}^{m}(-y_i\log(h_\theta(x_i))-(1-y_i)\log(1-h_\theta(x_i)))
然后对其优化,梯度下降求最优值\theta^*

贝叶斯公式

P(A),P(B)分别表示事件A和事件B发生的概率,P(A|B)表示事件B发生的情况下事件A发生的概率,P(A,B)表示事件A,B同时发生的概率,则有
P(A|B)=\frac{P(A,B)}{P(B)},\,P(B|A)=\frac{P(A,B)}{P(A)},\,P(AB)=P(A)P(B|A)

Huffman编码

首先介绍Huffman树的定义及其构造算法。

背景知识

统计语言模型

统计语言模型是用来计算一个句子的概率的概率模型。假设W=\omega_i^T:=(\omega_1,\omega_2,...,\omega_T)表示由T个词\omega_1,\omega_2,...\omega_T按顺序构成的一个句子,那么这个句子是一句真正/正常的句子的概率可以表示为:
p(W)=p(\omega_i^T)=p(\omega_1,\omega_2,...\omega_T)
利用贝叶斯公式,上式可以分解为:
p(W)=p(\omega_1)p(\omega_2|\omega_1)p(\omega_3|\omega_1\omega_2)...
其中的(条件)概率p(\omega_1)p(\omega_2|\omega_1)p(\omega_3|\omega_1\omega_2)...就是语言模型的参数,知道这些参数,那么给定一个句子,就可以很快的计算出相应的概率。
但是,简单进行一下分析可知,模型参数的个数是比较大的,假设句子的长度为T,语料库对应词典大小是N,那么每个句子需要计算T个参数,而一共有N^T种句子,总共就需要计算TN^T个参数。
因此,人们提出很多计算语言模型的参数的方法,如n-gram模型,决策树、最大熵模型、条件随机场、神经网络等等。

n-gram模型

p(\omega_4|\omega_1\omega_2\omega_3)为例进行说明,利用贝叶斯公式,有:
p(\omega_4|\omega_1\omega_2\omega_3)=\frac{p(\omega_1\omega_2\omega_3\omega_4)}{p(\omega_1\omega_2\omega_3)}
根据大数定律,有:
p(\omega_4|\omega_1\omega_2\omega_3)=\frac{count(\omega_1\omega_2\omega_3\omega_4)}{count(\omega_1\omega_2\omega_3)}
而n-gram的思想就是:n-1阶的马尔可夫假设(Markov),认为一个词出现的概率就只与它前面的n-1个词相关,若n=2,那么,上式变为:
p(\omega_4|\omega_1\omega_2\omega_3)=\frac{count(\omega_3\omega_4)}{count(\omega_3)}
这样,统计时所匹配的词串更短,单个参数的统计变得更容易,而且参数的总数也变少了。模型的参数数量随着n的增大而增大,量级是词典大小N的指数函数(O(N^n)),实际应用种一般采用n=2/n=3的二元模型或三元模型。
总结一下,n-gram模型的主要工作是在语料中统计各种词串出现的次数以及平滑性处理,概率值计算好后就存储起来,下次需要计算一个句子的概率时,就找到相应的概率参数,将它们连乘起来。
而在机器学习中,解决问题的方法是:对所考虑的问题建模后先为其构造一个目标函数,然后对这个目标进行优化,从而求得一组最优的参数,最后利用这组最优参数对应的模型来进行预测。
对于统计语言模型,利用最大似然,可把目标函数设为:
\prod_{\omega\in C}p(\omega|(Context(omega)))
其中,C表示语料(Corpus),Context(\omega)表示词\omega的上下文(Context),即\omega周边的词的集合,若是n-gram模型,那么就是上下文就是\omega前面的n-1个单词。
实际应用中经常采用最大对数似然,目标函数变为:
L=\sum_{\omega \in C}\log p(\omega|Context(\omega))
然后对这个函数进行最大化。
分析可知,概率 p(\omega|Context(\omega))已被视为关于\omegaContext(\omega)的函数,即
p(\omega|Context(\omega))=F(\omega,Context(\omega),\theta)
求得最优参数\theta^*后,F就被确定了,那么任何概率都可以通过F进行计算,不需要像n-gram一样,提前计算并保存好所有可能的概率值。
通过神经网络可以构造F。

神经概率语言模型

该模型出自Bengio等人的文章《A neural probabilistic language model》

神经概率语言模型

神经概率语言模型对应的神经网络结构可以分为四层:输入层(Input Layer)、投影层(Projection Layer)、隐藏层(Hidden Layer)和输出层(Output layer),其中W,U分别为投影层与隐藏层以及隐藏层和输出层之间的权值矩阵,p,q分别为隐藏层和输出层上的偏置向量。
训练样本为二元对(Context(\omega),\omega),其中,Context(\omega)\omega前面的n-1个词。
输入层:输入就是\omega前面的n-1个词的词向量。
投影层:输入层的n-1个词向量按顺序首尾拼接起来形成一个长向量,即投影层的向量X_\omega。那么,投影层的规模就是(n-1)m,m为词向量的维度。
隐藏层和输出层:隐藏层的规模n_h是可调参数,输出层的规模是N即语料C的词汇量大小。计算过程如下:
\begin{cases} z_\omega=\tanh(Wx_\omega+p),\\ y_\omega=Uz_\omega+q\end{cases}
计算得到的y_\omega=(y_{\omega,1},y_{\omega,2},...,y_{\omega,n})^T是一个长度为N的向量,其分量不能表示概率,需要做softmax归一化:
p(\omega|Context(\omega))=\frac{e^{y_{\omega,i_\omega}}}{\sum_{i=1}^Ne^{y_\omega,i}}
其中,i_\omega表示词\omega在词典D中的索引。
结合上一节,可知F(\omega,Context(\omega),\theta)=p(\omega|Context(\omega))=\frac{e^{y_{\omega,i_\omega}}}{\sum_{i=1}^Ne^{y_\omega,i}}
其中需要确定的参数有:

词向量的理解

wordvec

word2vec中的两个重要模型 : CBOW模型(Continuous Bag-of-Words Model)和 Skip-gram(Continuous Skip-gram Model)出自于Tomas Mikolov 的论文《Efficient Estimation of Word Representations in Vector Space》

CBOW & Skip-gram Model.PNG
CBOW模型是在已知上下文的前提下预测当前词,Skip-gram模型是在已知当前词的前提下,预测其上下文。
对于CBOW和Skip-gram模型,wordvec给出了两套框架,分别基于Hierarchical Softmax和negative samping进行设计的。

基于Hierarchical Softamx 的模型

目标函数
CBOW: L=\sum_{w\in C}log p(w|Context(w))
Skip-gram: L=\sum_{w\in C}logp(Context(w)|w)
应将重点放到目标函数的构造上。

CBOW模型

CBOW模型包括三层:输入层、投影层和输出层。以样本 (Context(w),w)为例(假设Context(w)w前后各c个词构成),对这三个层进行简要说明。

CBOW模型的网络结构示意图
梯度计算

考虑Huffman树中的某个叶子结点,假设它对应词典D中的词w,记

  1. p^w:从根结点出发到达w对应叶子结点的路径。
  2. l^w:路径p^w中包含结点的个数。
  3. p_1^w,p_2^w,...,p_{l^w}^w:路径p^w中的l^w个结点,其中p_1^w表示根结点,p_{l^w}^w表示词w对应的结点。
  4. d_1^w,d_2^w,...,d_{l^w}^w:词w的Huffman编码,由l^w-1为编码构成,d_j^w表示路径p^w中第j个结点对应的编码(根结点不对应编码)。
  5. \theta_1^w,\theta_2^w,...,\theta_{l^w-1}^w \in R^m : 路径p^w中非叶子结点对应的向量,\theta_j^w表示路径p^w中第j个非叶子结点对应的向量。
    w=足球时的记号示意图
    从根结点出发到达“足球”这个叶子结点时,共经历了四次二分类。可将分到左边看作正类,编码为1,分到右边看作负类,编码为0。
    Label(p_i^w)=d_i^w,i=1,2,..,l^w
    根据前面介绍的逻辑回归,可知,一个结点被分为正类的概率是:
    \sigma(x_w^T\theta)=\frac{1}{1+e^{-x_w^T\theta}}
    被分为负类的概率是:
    1-\sigma(x_w^T\theta)
    对于上边的例子,从根结点到达“足球”这个叶子结点经历的四次二分类,将每次的分类结果写出来就是:
    1. 第一次:p(d_2^w|x_w,\theta_1^w)=\sigma(x_w^T\theta_1^w)
    2. 第二次:p(d_3^w|x_w,\theta_2^w)=1- \sigma(x_w^T\theta_2^w)
    3. 第三次:p(d_4^w|x_w,\theta_3^w)=1-\sigma(x_w^T\theta_3^w)
    4. 第四次:p(d_5^w|x_w,\theta_4^w)=\sigma(x_w^T\theta_4^w)
      我们最终要求的是p(足球|Context(足球)),有了上边4个概率值,可以求得:
      p(足球|Context(足球))=\prod_{j=2}^5p(d_j^w|x_w,\theta_{j-1}^w)
      对Hierarchical Softmax思想做一下总结:对于词典D中的任意词w,Huffman树中必存在一条从根结点到词w对应结点的路径p^w,而且这条路径是唯一的。路径p^w上存在l^w-1个分支,每个分支都可以看作一次二分类,每一次二分类产生一个概率,将这些概率相乘起来就是p(w|Context(w))
      条件概率p(w|Context(w))的一般公式可写为:
      p(w|Context(w))=\prod_{j=2}^{l^w}p(d_j^w|x_w,\theta_{j-1}^w)
      其中:
      p(d_j^w|x_w,\theta_{j-1}^w)=\begin{cases} \sigma(x_w^T\theta),\, d_j^w=1\\1-\sigma(x_w^T\theta),d_j^w=0\end{cases}
      或者整理为一个整体表达式:
      p(d_j^w|x_w,\theta_{j-1}^w)= \sigma(x_w^T\theta_{j-1}^w)^{d_j^w}(1-\sigma(x_w^T\theta_{j-1}^w))^{1-d_j^w}
      目标函数可以整理为:
      L=\sum_{w \in C}log\prod_{j=2}^{l^w} \sigma(x_w^T\theta_{j-1}^w)^{d_j^w}(1-\sigma(x_w^T\theta_{j-1}^w))^{1-d_j^w} \\ = \sum_{w\in C}\sum_{j=2}^{l^w}d_j^{l^w}log(\sigma(x_w^T\theta_{j-1}^w))+(1-d_j^{l^w})log(1-\sigma(x_w^T\theta_{j-1}^w))
      为了梯度求导方便,可将上式简记为:
      L(w,j)=d_j^{l^w}log(\sigma(x_w^T\theta_{j-1}^w))+(1-d_j^{l^w})log(1-\sigma(x_w^T\theta_{j-1}^w))
      得到CBOW模型的目标函数之后,优化目标是将这个函数最大化,word2vec中采用的随机梯度上升法:每取一个样本(Context(w),w),就对目标函数中的所有相关参数做一次更新。观察目标函数L可知,函数中包含的参数有x_w,\theta_{j-1}^w,j=2,3...,l^w
      可先对\theta_{j-1}^w进行梯度计算:
      \frac{\partial{L}}{\partial{\theta_{j-1}^w}}=\frac{\partial}{\theta_{j-1}^{w}}( d_j^{l^w}log(\sigma(x_w^T\theta_{j-1}^w))+(1-d_j^{l^w})log(1-\sigma(x_w^T\theta_{j-1}^w))) \\ =d_j^w(1-\sigma(x_w^T\theta_{j-1}^w))x_w +(1-d_j^{l^w})(-\sigma(x_w^T\theta_{j-1}^w))x_w \\ =(d_j^w-\sigma(x_w^T\theta_{j-1}^w))x_w
      于是,\theta_{j-1}^w的更新公式为:
      \theta_{j-1}^w:=\theta_{j-1}^{w}+\eta(d_j^w-\sigma(x_w^T\theta_{j-1}^w))x_w
      其中\eta表示学习率。
      观察目标函数发现,L(w,j)中变量x_w\theta_{j-1}^w是对称的,因此,x_w的梯度计算为:
      \frac{\partial{L}}{\partial{x_w}}=(d_j^w-\sigma(x_w^T\theta_{j-1}^w))\theta_{j-1}^w
      因为x_w表示的是Context(w)中各词词向量的累加,要求得每个单词的词向量,可以取:
      v(w_i)=v(w_i)+\eta\sum_{j=2}^{l^w}\frac{\partial(L(w,j))}{\partial(x_w)},w_i \in Context(C), i = 1,2 ..,|C|
      伪代码
Skip-gram模型

Skip-gram模型同CBOW模型一样,包括三层:输入层,投影层和输出层,接下来以(w,Context(w))为例,对这三个层进行简要说明。

基于Negative Sampling的模型

Negative Sampling 的目的是用来提高训练速度并改善所得词向量的质量。与Hierarchical Softmax 相比,Negative Sampling 不再使用复杂的Huffman 树,而是利用相对简单的随机负采样,能大幅提高性能。

CBOW模型

对于CBOW模型来说,已知Context(w),预测w。那么,w为正样本,其他词都是负样本。
假定现在已经选定一个关于Context(w)的负样本子集NEG(w)\neq \varnothing,且对\forall\widetilde{w}\in D,定义
L^w(\widetilde{w}) = \begin{cases} 1,\, \widetilde{w}=w,\\ 0,\, \widetilde{w}\neq w \end{cases}
表示词\widetilde{w}的标签,即正样本的标签为1,负样本的标签为0。
对于一个正样本,我们希望最大化
g(w)=\prod_{u\in {w}\bigcup NEG(w)}p(u|Context(w))
其中
p(u|Context(w))=\begin{cases} \sigma(x_w^T\theta^u),\, L^w(u)=1,\\ 1-\sigma(x_w^T\theta^u),\, L^w(u)=0 \end{cases}
整理为一个整体表达式为
p(u|Context(w))=[\sigma(x_w^T\theta^u)]^{ L^w(u)}[(1-\sigma(x_w^T\theta^u))]^{(1- L^w(u))}
x_wContext(w)中各词的词向量之和,\theta^u\in R^m表示词u对应的一个向量。
则目标函数可表示为
g(w)=\sigma(x_w^T\theta^u)\prod_{u\in NEG}(1-\sigma(x_w^T\theta^u))
整体的目标函数可表示为
G=\prod_{w\in C}g(w)
取对数后为
L=\log G=\log \prod_{w\in C}g(w)=\sum_{w\in C}\log g(w)\\ =\sum_{w\in C}\log \prod_{u\in {w}\bigcup NEG(w)}p(u|Context(w)) \\ =\sum_{w\in C} \sum_{u\in {w}\bigcup NEG(w)}\log p(u|Context(w))\\ =\sum_{w\in C} \sum_{u\in {w}\bigcup NEG(w)}\log [\sigma(x_w^T\theta^u)]^{ L^w(u)}[(1-\sigma(x_w^T\theta^u))]^{(1- L^w(u))} \\ =\sum_{w\in C} \sum_{u\in {w}\bigcup NEG(w)} \{L^w(u) \log [\sigma(x_w^T\theta^u)]+(1- L^w(u))\log [(1-\sigma(x_w^T\theta^u))]\}
为求导方便,可将上式简记为
L(w,u)=L^w(u) \log [\sigma(x_w^T\theta^u)]+(1- L^w(u))\log [(1-\sigma(x_w^T\theta^u))]
利用梯度上升法对上式进行优化,首先计算对\theta^u的梯度(与之前的梯度计算一样)
\frac{\partial L(w,u)}{\partial \theta^u}=(L^w(u)-\sigma(x_w^T\theta^u))x_w
于是,\theta^u的更新公式为:
\theta^u:=\theta^{u}+\eta(L^w(u)-\sigma(x_w^T\theta^u))x_w
同样,利用对称性,得到x_w的梯度
\frac{\partial L(w,u)}{\partial x_w}=(L^w(u)-\sigma(x_w^T\theta^u))\theta^u
那么,v(\widetilde{w})的更新公式为
v(\widetilde{w}):=v(\widetilde{w})+\eta(L^w(u)-\sigma(x_w^T\theta^u))\theta^u

伪代码
Skip-gram模型

基于Negative Sampling 的Skip-gram 模型的思想与上一节的CBOW模型一样,直接从目标函数出发。
整体的目标函数可表示为
G=\prod_{w\in C}\prod_{u\in Context(w)}g(u)
这里\prod_{u\in Context(w)}g(u)表示给定一个样本,我们需要最大化的量。
g(u)=\prod_{z\in u\bigcup NEG(u)}p(z|w)
其中NEG(u)表示处理词u时生成的负样本子集,条件概率
p(z|w)=\begin{cases} \sigma(v(w)^T\theta^z),\, L^u(z)=1,\\ 1-\sigma(v(w)^T\theta^z),\, L^u(z)=0 \end{cases}
整理为一个整体表达式为
p(z|w)=[\sigma(v(w)^T\theta^z)]^{ L^u(z)}[(1-\sigma(v(w)^T\theta^z))]^{(1- L^u(z))}

取对数后为
L=\log G=\log \prod_{w\in C}\prod_{u\in Context(w)}g(u) =\sum_{w\in C}\sum_{u\in Context(w)}g(u)\\ =\sum_{w\in C}\sum_{u\in Context(w)} \log \prod_{z\in u\bigcup NEG(u)}p(z|w) \\ =\sum_{w\in C}\sum_{u\in Context(w)} \sum_{z\in u\bigcup NEG(u)} \log p(z|w) \\ =\sum_{w\in C}\sum_{u\in Context(w)} \sum_{z\in u\bigcup NEG(u)} \log [\sigma(v(w)^T\theta^z)]^{ L^u(z)}[(1-\sigma(v(w)^T\theta^z))]^{(1- L^u(z))}\\ =\sum_{w\in C}\sum_{u\in Context(w)} \sum_{z\in u\bigcup NEG(u)} L^u(z) \log [\sigma(v(w)^T\theta^z)]+(1- L^u(z)) \log [(1-\sigma(v(w)^T\theta^z))]

上一篇下一篇

猜你喜欢

热点阅读