原文地址:https://www.jianshu.com/p/5a896955abf0
2)基于迭代的方法直接学
相较于基于SVD的方法直接捕获所有共现值的做法,基于迭代的方法一次只捕获一个窗口内的词间共现值。
好的语言模型中,有意义的句子高概率,无意义的句子即使语法正确也低概率。
在得到输入词向量和输出词向量后如何得到最终词向量?常取输入词向量(word2vec)、拼接、相加(GloVe)等。
主要有以下3种模型算法:
- word2vec
- GloVe
- fastText
(三)word2vec
基本设计:1层隐藏层的神经网络结构,隐藏层使用线性激活函数。why?
一是因为快;二是因为训练词向量可以被认为是提取特征,后续可能会使用deep结构,现阶段没有必要deep。
1、Continuous Bag of Words(CBoW)
根据上下文词预测中心词。
1)前向过程
希望(hat{y})与(y)即(x_c)尽可能相同。
2)反向过程
2、Skip-Gram
根据中心词预测上下文词。
引入strong/naive条件独立假设:给定中心词,所有输出词间完全独立。
1)前向过程
2)反向过程
CBoW和Skip-Gram都存在着的问题:代价函数中的softmax需要对(|V|)进行求和,时间复杂度为(O(|V|)),当(|V|)很大时,代价很高。
解决方式:Negative Sampling和Hierarchical Softmax。
3、Negative Sampling
负采样的基本思想是用采样一些负例的方式近似代替遍历整个词汇。以(P_n(w))的概率分布进行采样,(P_n(w))与词汇词频相匹配。目前看,最佳(P_n(w)=frac{count(w)^{frac{3}{4}}}{sum_{win V}count(w)^{frac{3}{4}}}),实现了低频词被采样概率的上升比例高于高频词。采样前,将长度为1的线段分成(M)等份,其中,(M>>|V|)。这样子可以保证每个词对应的线段都会被划分成不同的小块,(M)份的每一份都会落在某一个词对应的线段上。每个词对应的线段长度为(len(w)=P_n(w))。采样时,从(M)个未知
中采样出(Neg)个位置即可,对应线段所属词即为负例词。word2vec中(M)默认为(10^8),与Skip-Gram合作时,采样到中心词就跳过。
1)目标函数
2)反向过程
(1)CBoW
(2)Skip-Gram
4、Hierarchical Softmax
Hierarchical Softmax中无词的输出表示,词为输出词的概率等于从根节点走到词叶子节点的概率,代价由(O(|V|))变为(O(log_2|V|))。Hierarchical Softmax中不更新每个词的输出词向量,更新的是二叉树上节点对应的向量。这个方法的速度由二叉树的构建方式以及词到叶子节点的分配方式决定。其中,Huffman树尤其适合,因为其分配给高频词短路径,使其花费更短时间被找到。
1)目标函数
2)反向过程
(1)CBoW
(2)Skip-Gram
5、word2vec小结
1)CBoW vs Skip-Gram
- CBoW更快一些。CBoW对于高频词效果较好,低频词常受到较少注意。窗口大小常5左右。
- Skip-Gram更慢一些。Skip-Gram对于低频词效果更好,小数据下表现依旧好。窗口大小常10左右。
对于"Yesterday was really a ____ day.":
CBoW认为最可能是beautiful/nice,delightful受到较少注意;Skip-Gram则不会将delightful与beautiful/nice比较,而是作为一组新观测值。
2)Hierarchical Softmax vs Negative Sampling
- Hierarchical Softmax
优点是对低频词的效果更好。因为表示低频词的叶子节点会不可避免地继承祖先节点的向量表示,这个祖先节点可能会受到其他高频词的影响。
缺点是如果所需要的输出词很生僻,得一直往下走很久。 - Negative Sampling
对高频词效果更好。向量维度较低时效果更好,维度高时近似误差会比较大。
word2vec对句子进行处理时还采用了高频词亚采样的trick,其能够带来2~10倍的性能提升,并且能够提升低频词的表示精度。具体来说,(w_i)被丢弃的概率(P(w_i)=1-sqrt{frac{sample}{freq(w_i)}})。(sample)常取值(10^{-5})~(10^{-3}),(sample)越小,达到相同的丢弃率所需的(frequency)则越小,即更多词会被丢弃。高频词亚采样的目的是以一定的概率拒绝高频词,使得低频词有更多的出境率。低频词被丢弃的概率低,高频词被丢弃的概率高。