深度学习NLP笔记(一):词向量表示

入坑自然语言处理,学习路线按照CS224N课程来,本人小白一枚,写的不对或不明确的地方请随意指正。

一、词向量表示

1. 独热表示(one-hot)

简单讲,就是使用一个二进制的向量来代表一个词,每个词对应一个位置,该位置为1,其他位置全为0的向量代表了这个词,词表的大小就是串的长度。这种方式简介且易于理解,但有两个缺点。
  (i)向量的维度会随词表包含的词的数量增加而增加;
  (ii)任意两个向量都是正交的,这意味着任意两个词都是独立的,在语义上是毫无关系的。比如,“喜悦”和“高兴”两个词是高度相关的,但用one-hot表示法无法表示出它们之间的关联性。

2. 分布式表示(Dristributed representation)

分布式表示的思想是通过训练将词向量映射到低维空间,使用“距离”来表示词与词之间的关联(距离的定义有多种,包括欧氏距离、余弦距离等,此处待写)。

二、Skip-gram和CBOW

1.Skip-gram

Skip-gram模型是给定一个词,预测这个词前后的词,比如,有一句话“杭州的西湖很美”,我们把“西湖”作为输入,模型的输出就应该为{“杭州”、“很”、“美”}。
  借用斯坦福CS224N课件提供的图片来描述一下模型。深度学习NLP笔记(一):词向量表示_第1张图片
  首先输入的是一个词的one-hot表示xi,这个向量与中心词(center word)权重矩阵W相乘可以得到这个词的向量表示,得到词向量之后,再与其他center word的权重矩阵W′ 相乘可以得到每个词的词向量,再经过softmax层即可得到概率表示。以上的WW′ 就是我们学习的目标。

2.CBOW(词袋模型)

CBOW模型与Skip-gram模型正好相反。Skip-gram是给定中心词,预测上下文;CBOW模型是指给定上下文,预测中心词。如下图所示,CBOW模型的输入层、隐藏层、输出层,包括学习参数的顺序与Skip-gram模型完全成一个镜像。不再细说。
 深度学习NLP笔记(一):词向量表示_第2张图片

三、过程推导

此处以Skip-gram模型为例,假设我们有如图一句话,并取“life”为中心词,则它前后的词出现的概率即可表示为 P ( w t − i ∣ w t ) P(w^{t-i}|w^{t}) P(wtiwt) P ( w t + i ∣ w t ) P(w^{t+i}|w^{t}) P(wt+iwt),比如“always”就可以表示为 P ( w t − 2 ∣ w t ) P(w^{t-2}|w^{t}) P(wt2wt),“was”可以表示为 P ( w t + 1 ∣ w t ) P(w^{t+1}|w^{t}) P(wt+1wt).

我们做一个假设,即给定一中心词,它生成的的每个背景词之间是相互独立的。那么整体概率就是,m为窗口大小: ∏ − m ≤ j ≤ m , j ≠ 0 P ( w t + j ∣ w t ) \prod_{-m\leq j\leq m,j\neq 0}P(w^{t+j}|w^{t}) mjm,j̸=0P(wt+jwt)
  则给定一个T大小的文本,我们想要使每个词都作为中心词来生成一遍,那么整个文本的联合概率就是: ∏ t = 1 T ∏ − m ≤ j ≤ m , j ≠ 0 P ( w t + j ∣ w t ) \prod_{t=1}^{T}\prod_{-m\leq j\leq m,j\neq 0}P(w^{t+j}|w^{t}) t=1Tmjm,j̸=0P(wt+jwt)
  我们的目的就是最大化这个联合概率,根据高等数学所学的知识,最大化这个联合概率可以等价于最小化以下式子: − 1 T ∏ t = 1 T ∏ − m ≤ j ≤ m , j ≠ 0 l o g P ( w t + j ∣ w t ) -\frac{1}{T}\prod_{t=1}^{T}\prod_{-m\leq j\leq m,j\neq 0}logP(w^{t+j}|w^{t}) T1t=1Tmjm,j̸=0logP(wt+jwt)
  至此,我们已经得到了Skip-gram模型的损失函数。
  想要最小化这个损失函数,我们就需要清楚式子中每个概率P的表达式,换句话说,我们需要将词向量按照一定的规则转化成概率。没错,上文已经提到了,就是使用softmax函数,如下所示: P ( w o ∣ w c ) = e x p ( u o T v c ) ∑ i ∈ V e x p ( u i T v c ) P(w_{o}|w_{c})=\frac{exp(u_{o}^{T}v_{c})}{\sum _{i\in V}exp(u_{i}^{T}v_{c})} P(wowc)=iVexp(uiTvc)exp(uoTvc)
   u u u v v v分别对应于背景词和中心词的向量。不需要过分纠结于这个式子是怎么来的,这个公式的主要作用就是将一组数据中的每个元素映射到(0,1)中,并使得映射之后的所有元素加起来等于1。
  接下来,就是使用随机梯度下降(SGD)对其进行优化,SGD具体原理不再赘述,直接得到梯度: ∂ l o g P ( w o ∣ w c ) ∂ v = u o − ∑ j ∈ V e x p ( u o T v c ) ∑ i ∈ V e x p ( u i T v c ) u j \frac{\partial logP(w_{o}|w_{c})}{\partial v}=u_{o}-\sum _{j\in V}\frac{exp(u_{o}^{T}v_{c})}{\sum _{i\in V}exp(u_{i}^{T}v_{c})}u_{j} vlogP(wowc)=uojViVexp(uiTvc)exp(uoTvc)uj
  我们注意到,这个式子可以得到转化: ∂ l o g P ( w o ∣ w c ) ∂ v = u o − ∑ j ∈ V P ( w o ∣ w c ) u j \frac{\partial logP(w_{o}|w_{c})}{\partial v}=u_{o}-\sum _{j\in V}P(w_{o}|w_{c})u_{j} vlogP(wowc)=uojVP(wowc)uj
  至此,实际上skip-gram已经说完了,剩余的就是经过数次循环进行梯度下降得到最终的模型。但是我们发现,梯度表达式中有一个连加表达式,而他的大小对应了词V典的大小,如果V很大(例如达到几万,甚至几十万),那么每一轮迭代的开销都会非常大。所以,我们引出了两种高效的训练方法:Hierarchical softmax和Negative sampling。

你可能感兴趣的:(深度学习NLP)