1. 相比神经概率语言模型的改进
神经概率语言模型的主要目的是得到语言模型(N-gram模型同上),该过程可以求解出词向量。
而Word2vec模型主要的目的是计算「词向量 word embedding」,因此会引起网络结构的调整;而计算词向量,通常是通过对语言模型的概率求最大似然来实现的。具体展开如下:
1.1 优化网络结构
基于上一小节 神经概率语言模型结尾的内容,可以了解到,对于神经概率语言模型,其缺点主要是计算量太大:具体体现在「隐层和输出层之间的矩阵运算」和「输出层上的Softmax归一化运算」这两点。
Word2vec就是针对上述两点来对神经概率语言模型进行优化的。
Word2vec的网络结构相对于神经概率语言模型简化了很多,也正是因为模型简单,使得训练速度较快,可以训练更多的数据;而神经概率语言模型结构复杂,使得训练速度较慢,难以训练更多的数据。
Word2vec的网络结构,如下图所示:
首先,Word2vec将输入层到投影层的运算从「拼接」变成「叠加」。也就是说,投影层的节点数不再是上下文词数量*词向量维度,而就是词向量维度。
其次,针对「隐层和输出层之间的矩阵运算」,word2vec选择删去隐藏层。
注:Projection Layer和Output Layer和之间的连线没有画完。
假设词向量维度为3维,那么,Projection layer只有3个节点。若词典中只有4个词,那么,输出层只有4个节点,代表的就是词典中的词。
对于上图中的输出层节点而言,任意节点的计算公式如下:
y i = ∑ i = 1 3 x j w i j = w i → T x ⃗ y_i= \sum_{i=1}^3x_jw_{ij}=\overrightarrow{w_i}^T\vec{x} yi=i=1∑3xjwij=wiTx
其中,输入层的参数是 C o n t e x t ( w ) Context(w) Context(w)中各个词的词向量,而这个词向量就是输出层和映射层之间的参数,即 w i → \overrightarrow{w_i} wi。
对于任意输出层节点而言,它与映射层的每个节点都相连接。而映射层节点数就是词向量的维度,所以可将参数 w i 1 , w i 2 , . . . , w i n w_{i1}, w_{i2}, ..., w_{in} wi1,wi2,...,win (n是词向量维度) 看作是词 y i y_i yi的词向量。由此,训练神经网络的参数,就相当于训练了每个词的词向量,也就得到了词典中每个词的词向量。
1.2 优化Softmax归一化
神经概率语言模型,为计算条件概率,引入了Softmax来归一化:
p ( y i ∣ C o n t e x t ( w ) ) = e x p ( y i ) ∑ i = 1 4 e x p ( y k ) = e x p ( w i → T x ⃗ ) ∑ i = 1 4 e x p ( w k → T x ⃗ ) (1) p(y_i|Context(w))= \frac{exp({y_i})}{\sum_{i=1}^4exp({y_k})}\tag{1} \\ \text{} \\ =\frac{exp(\overrightarrow{w_i}^T\vec{x})}{\sum_{i=1}^4exp(\overrightarrow{w_k}^T\vec{x})} p(yi∣Context(w))=∑i=14exp(yk)exp(yi)=∑i=14exp(wkTx)exp(wiTx)(1)
对于该神经网络,其参数包括:「词向量 v ( w ) v(w) v(w)」以及「神经网络参数 W , p , U , q W,p,U,q W,p,U,q」。
一旦确定了这些参数,就相当于确定了「函数 F F F」的参数,也就相当于知道了参数 p ( w ∣ C o n t e x t ( w ) ) p(w|Context(w)) p(w∣Context(w)),继而能求得整个句子的概率。
上述公式的计算瓶颈在于分母:分母需要遍历词典,而词典中词的数目在 1 0 5 10^5 105量级,训练复杂度大。
由此,Word2vec提出了两种优化Softmax计算过程的方法,分别对应Word2vec的两种框架:Hierarchical Softmax 和 Negative Sampling。
1.2.1 使用 Hierarchical Softmax 优化
之所以称作「Hierarchical Softmax」,是因为它利用树实现了分层的Softmax(即,用树形结构替代了输出层的结构)。
使用分层Softmax的原因是:计算更加高效。
Hierarchical Softmax采用的树是二叉树。它将树上的叶子节点分配给词典里的词,同时将从树根到叶子节点的路径上的每个非叶子结点都看作二分类,由此,路径上二分类概率连乘的结果就是该叶子节点对应的词的概率。
一个full softmax需要一次计算所有的 W W W个词,而Hierarchical Softmax却只需要计算大约 l o g 2 ( W ) log_2(W) log2(W)(即,树根到该叶子节点的路径长度)个词,大大减少了计算的复杂度。
实际应用中,Hierarchical Softmax采用是Huffman树而非其他二叉树,这是因为Huffman树对于高频词会赋予更短的编码,使得高频词离根节点距离更近,从而使得训练速度加快。
1.2.2 使用 Negative Sampling 优化
另一种可行的方法是: N o i s e C o n t r a s t i v e E s t i m a t i o n ( N C E ) Noise \ Contrastive \ Estimation(NCE) Noise Contrastive Estimation(NCE)。 N C E NCE NCE 假定好的模型应该能够通过逻辑回归的方法从数据中区别出噪声。
Word2vec采用的Negative Sampling是NCE的一种简化版本,目的是为了提高训练速度并改善所得词的质量。相比于Hierarchical Softmax,Negative Sampling不再采用Huffman树,而是采用随机负采样。
由上述公式 ( 1 ) (1) (1):
p ( y i ∣ C o n t e x t ( w ) ) = e x p ( y i ) ∑ i = 1 4 e x p ( y k ) = e x p ( w i → T x ⃗ ) ∑ i = 1 4 e x p ( w k → T x ⃗ ) p(y_i|Context(w))= \frac{exp({y_i})}{\sum_{i=1}^4exp({y_k})} \\ \text{} \\ =\frac{exp(\overrightarrow{w_i}^T\vec{x})}{\sum_{i=1}^4exp(\overrightarrow{w_k}^T\vec{x})} p(yi∣Context(w))=∑i=14exp(yk)exp(yi)=∑i=14exp(wkTx)exp(wiTx)
其中, x ⃗ \vec{x} x是 C o n t e x t ( w ) Context(w) Context(w)联合构成的词向量, w i → \overrightarrow{w_i} wi对应 y i ( w i ) y_i(w_i) yi(wi)的词向量。
最大化 p ( y i ∣ C o n t e x t ( w ) ) p(y_i|Context(w)) p(yi∣Context(w)),相当于最大化分子,最小化分母。
由于两个向量的点积越大,相当于两个向量的余弦相似度越高,因此,需要尽量最大化 w i → \overrightarrow{w_i} wi和 x ⃗ \vec{x} x的相似度,尽量最小化 w k → \overrightarrow{w_k} wk和 x ⃗ \vec{x} x的相似度。
即,最大化 x ⃗ \vec{x} x与当前词 w i w_i wi的词向量的相似度,最小化 x ⃗ \vec{x} x与非当前词的词向量的相似度。
可以将分子的 ( C o n t e x t ( w ) , w i ) (Context(w), w_i) (Context(w),wi)看作一个正样本,将分母的 ( C o n t e x t ( w ) , w k ) (Context(w), w_k) (Context(w),wk)看作负样本(因其未在训练数据中出现)。
问题在于,上述公式将词典里的所有词都看作了负样本,使得分母的计算太耗时间。
因此,使用Negative Sampling,每次只从词典里随机选一些word作为当前词的负样本(称为 N E G ( w ) NEG(w) NEG(w)),而非以字典里的其他所有词作为负样本。
1.3 总结
总结上述Word2vec对于经典神经网络概率语言模型的优化,可以发现:
Word2vec大大简化了网络结构。同时,也因为网络结构简单所带来的低计算复杂度,使得在更大规模的数据集上计算出非常精确的高维词向量成为可能。
由此,值得借鉴的是:需要权衡模型复杂度与可训练数据之间的关系。模型越复杂,可训练数据的量级越小;而模型越简单,可训练数据的量级越多。