「embedding白盒子」参数梯度更新视角的word2vec模型解释

本文是2016年的论文《word2vec Parameter Learning Explained》的论文笔记。经过该论文的分析,词的word2vec预训练模型不再是一个黑盒子。该论文透彻地回答了一个问题:
为什么在一个以onehot词向量作为输入和输出的三层神经网络里,第一层与第二层中间的权重矩阵能够表达词的信息呢?更简洁地来说,为什么word2vec能够训练出表达语言信息的稠密词向量呢?

简单模型:一个输入词和一个输出词

先抛弃掉带有滑动窗口概念的CBOW模型和skip-gram模型,先考虑以下简单的模型,只有一个输入词和一个输出词(输入和输出都是onehot):


简单版CBOW模型

word2vec模型里,只要输入词和输出词在语言上是接近的,就能通过训练得到表达语言信息的稠密词向量。注意,在这个简单的模型里,还未有句子里相邻的词的概念。

w_I是输入词;
V是词的总数;
x\in \mathbb{R}^{V}是词的onehot向量;
W\in \mathbb{R}^{V×N}是第一层到第二层的权重矩阵;
v_{w_I}^{T}\in \mathbb{R}^{N}是权重矩阵W里代表词w_I的那一行向量的转置;
h是隐藏层向量:
h=W^Tx=v_{w_I}^{T}
W'\in \mathbb{R}^{N×V}是第二层到输出层的权重矩阵;
v'_{w_j}\in \mathbb{R}^{N}是权重矩阵W'的第j列;
u_j={v'_{w_j}}^Th
p(w_j|w_I)=p_j=\frac{exp(u_j)}{\sum_{j'=1}^{V}exp(u_{j'})}=\frac{exp({v'_{w_j}}^Tv_{w_I})}{\sum_{j'=1}^{V}exp({v'_{w_{j'}}}^Tv_{w_I})}
必须注意的是,向量v_wv'_w都是词w的稠密表达。前者是输入层到隐藏层的权重矩阵的某一行,后者是隐藏层到输出层的某一列。为了简化表达,下文将v_w称为输入词向量,将v'_w称为输出词向量。
假设t_j是输出词的onehot向量的第j个元素,如果输出词恰好是第j个词,那么
t_j=1,否则为0。假设输出词是第j^*个词,交叉熵损失函数为
E=-\sum_{j=1}^{V}t_jlogp(w_j|w_I)=-logp(w_{j^*}|w_I)=-u_{j^*}+log\sum_{V}^{j=1}exp(u_j)
套用一下求导公式,当j=j^*时有\frac{\partial E}{\partial u_j}=p_j-1,当j≠j^*时有\frac{\partial E}{\partial u_j}=p_j,总而言之,有:
\frac{\partial E}{\partial u_j}=p_j-t_j=e_j
e_j的含义是第j个词的error。对于权重矩阵W'的其中一个元素:
\frac{\partial E}{\partial w'_{ij}}=\frac{\partial E}{\partial u_j}\frac{\partial u_j}{\partial w'_{ij}}=e_jh_i
假设学习率是\eta,那么矩阵W'的某个元素的梯度更新的公式为:
{w'_{ij}}^{(new)}={w'_{ij}}^{(old)}-\eta e_jh_i
或者,矩阵W'的某一列的梯度更新公式为:
{v'_{w_j}}^{(new)}={v'_{w_j}}^{(old)}-\eta e_jh
在最初的时候,权重w_{ij}是被随机初始化的。上式是W'的某一列的梯度更新,该权重矩阵的每一列都是要被更新的。如果第j列刚好是输出词,那么e_j<0v'_{w_j}就会加上一小部分的h,这使得v'_{w_j}与输入词的输入向量v_{w_I}的距离更近;如果第j列不是输出词,那么e_j>0v'_{w_j}就会减去一小部分的h,这使得v'_{w_j}与输入词的输入向量v_{w_I}的距离更远。这里说的近和远,都是在内积测度下的距离。思考一下如果输入词和输出词是在一个小窗口里面的两个词,那么这两个词大抵上是在语言上意思接近的两个词。以上的梯度更新过程能让输入词和输出词的对应的权重更接近。这里说的权重是W'。接下来我们来看一下权重W
\frac{\partial E}{\partial h_i}=\sum_{j=1}^{V}\frac{\partial E}{\partial u_j}\frac{\partial u_j}{\partial h_i}=\sum_{j=1}^{V}e_jw'_{ij}=EH_i
标量EH_i并成一个向量:EH,其含义是输出权重的每一列(每一个输出词向量)的加权和,而权重是error。
经过简单的矩阵运算可以得到:
\frac{\partial E}{\partial W}=xEH^T=\begin{bmatrix} 0 & 0 & ... & 0\\ 0 & 0 & ... & 0\\ \vdots &\vdots & & \vdots \\ EH_1 & EH_2 & ... & EH_N\\ \vdots &\vdots & & \vdots \\ 0 & 0 & ... & 0 \end{bmatrix}
上式便是梯度,而只有输入词w_I的那一行的梯度会被更新,其它梯度都不变:
{v_{w_I}}^{(new)}={v_{w_I}}^{(old)}-\eta EH^T
直观地来说,由于EH是以e_j作为权重的输出词向量的加权求和,我们可以理解为对输入词w_I的输入向量加上了所有词的输出词向量的一部分,以\eta e_j为权重。v_{w_I}加上了v'_{w_O},以及减去了其它所有词v'_j。在内积测度上,每次更新梯度,v_{w_I}向输出词的输出向量v'_{w_O}走得更近了,以及向所有不是输出词的词的输出向量v'_j走得更远了。
在使用一个语料库不断地更新梯度时,所有词的输出向量v'_j被输入词的输入向量“来回地拉扯”,输入词的输入向量v_{w_I}也被所有词的输出向量“来回地拉扯”,就像有一个物理的力量在不断调整词向量在空间的位置,使得意思相近的词在空间上的距离更接近。只要通过一种工程方法保证输入词和输出词是意思接近的或者有联系的,那就能够保证在梯度下降的过程中,意思相近的词在空间上的距离更接近。而这种工程方法就是基于滑动窗口的CBOW或者skip-gram。

CBOW:多个输入词与一个输出词

CBOW模型

如图所示,句子的滑动窗口的中心词w_O作为输出词,中心词旁边的C个词w_{I,1},...w_{I,C}作为输入词。输入层到隐藏层里,不同的输入词共享一个权重矩阵:
h=\frac{1}{C}W^T(x_1+x_2+...+x_C)=\frac{1}{C}(v_{w_1}+v_{w_2}+...+v_{w_C})^T
u_j={v'_{w_j}}^Th
p(w_j|w_{I,1},...w_{I,C})=\frac{exp(u_j)}{\sum_{j'=1}^{V}exp(u_{j'})}
\frac{\partial E}{\partial h_i}=\sum_{j=1}^{V}e_jw'_{ij}=EH_i
这种情况下损失函数、\frac{\partial E}{\partial W'}以及W'的梯度更新的含义都是和上面一样的。重点探究一下W的梯度更新的含义。
上面的简单模型里,W的梯度下降只需要更新一个输入词的输入向量的梯度。此处的CBOW里,需要更新C个词的输入向量的梯度。通过简单的矩阵运算得到:
\frac{\partial E}{\partial W}=\frac{1}{C}(x_1+x_2+...+x_C)EH^T
\frac{\partial E}{\partial W}是一个梯度矩阵,这个矩阵里只有对应着输入词的行的梯度才是非零的。梯度更新的公式如下:
{v_{w_{I,c}}}^{(new)}={v_{w_{I,c}}}^{(old)}-\frac{1}{C}\eta EH^T
其含义与上面的分析也是一样的。其实多对一的CBOW模型与上面简单的一对一模型几乎没有变化,只不过是窗口内多个输入词输入进去一起训练了。

skip-gram:一个输入词与多个输出词

skip-gram模型

skip-gram模型的输入层到隐藏层与简单模型一样,仅考察输出层。对于第c个词:
p(w_{c,j}=w_O|w_I)=\frac{exp(u_{c,j})}{\sum_{j'=1}^{V}exp(u_{j'})}
由于隐藏层到输出层是共享权重的,所以u_{c,j}u_j是相等的。下标多了个字母c只是为了表达这是第c个输出词的预测。
u_{c,j}=u_j={v'_{w_j}}^Th
skip-gram的一个细节是,假定C个输出词之间是独立的。因此C个输出词的联合概率密度的对数,作为损失函数,可以写成:
E=-logp(w_{O,1},w_{O,2},...,w_{O,C}|w_{I})=-log\prod_{c=1}^{C}p(w_{O,c}|w_{I})
=-log\prod_{c=1}^{C}\frac{exp(u_{c,j_c^*})}{\sum_{j'=1}^{V}exp(u_{j'})}=-\sum_{c=1}^{C}u_{c,j_c^*}+Clog\sum_{j'=1}^{V}exp(u_{j'})
对于第c个词(c=1,2,...,C)有:
\frac{\partial E}{\partial u_{c,j}}=p_{c,j}-t_{c,j}=e_{c,j}
定义EI_j=\sum_{c=1}^{C}e_{c,j}EI_j的含义是C个词的error加起来。便得到了损失函数对W'的梯度:
\frac{\partial E}{\partial w'_{ij}}=\sum_{c=1}^{C}\frac{\partial E}{\partial u_{c,j}}\frac{\partial u_{c,j}}{\partial w'_{ij}}=EI_jh_i
梯度下降的公式:
{w'_{ij}}^{(new)}={w'_{ij}}^{(old)}-\eta EI_jh_i
或者,矩阵W'的某一列的梯度更新公式为:
{v'_{w_j}}^{(new)}={v'_{w_j}}^{(old)}-\eta EI_jh
EH_i=\sum_{j=1}^{V}EI_jw'_{ij},只与简单模型的有了些许变化,其含义并没有变;在简单模型里,v_{w_I}是朝着一个输出词的输出向量接近,朝着所有不是输出词的输出向量远离,在skip-gram理则是朝着C个输出词的输出向量接近,朝着所有不是输出词的输出向量远离(内积测度下的接近和远离)。W的梯度下降公式:
{v_{w_I}}^{(new)}={v_{w_I}}^{(old)}-\eta EH^T

word embedding的优良性质

词embedding向量有非常优良的性质,这些性质使得embedding向量包含了语义信息,因此可以直接用于深度语言模型的有监督训练;例如:

  1. 词性相同且意思相近的词embedding很接近。这个接近不仅体现在cosine相似度上,也体现在欧氏距离上。例如,v(猫咪)与v(狗狗)相似,而v(萨摩耶)与v(柴犬)相似。
  2. 类比性质:这是一个非常神奇的,更加能体现语义的性质。如v(中国)-v(北京)≈v(法国)-v(巴黎),国家的embedding和首都的embedding之差能得到相似的向量。又如v(国王)-v(王后)≈v(男人)-v(女人)。人类在婴儿时期学习语言很大程度上都是依靠类比的能力;本文在解释Word2vec的原理也大量使用了类比的方法。类比是人类学习的一把不可或缺的斧子。而word2vec模型居然有类比的能力,太神奇了!但是本文对word2vec的原理探究中,为何它能有类比性质依然没有很清晰地说明。下图是embedding向量的降维可视化:


TODO: hierarchical softmax、negative sampling...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容