目前,词向量(又叫词嵌入)已经成为NLP领域各种任务的必备一步,而且随着bert elmo,gpt等预训练模型的发展,词向量演变为知识表示方法,但其本质思想不变。学习各种词向量训练原理可以很好地掌握NLP各种方法。生成词向量的方法有很多种,本文重点介绍word2vec,glove和bert。
各种词向量的特点:
- One-hot:维度灾难 and 语义鸿沟
- 矩阵分解(LSA):利用全局语料特征,但SVD求解计算复杂度大
- 基于NNLM/RNNLM的词向量:词向量为副产物,存在效率不高等问题
- word2vec、fastText:优化效率高,但是基于局部语料
- glove:基于全局预料,结合了LSA和word2vec的优点
- elmo、GPT、bert:动态特征
从one-hot到word2vec到elmo,可以看到技术的演进总是在现有基础上解决之前的问题,同时引出新的问题。这里总结一下比较经典的语言模型:word2vec、glove、ELMo、BERT。
word2vec
word2vec来源于2013年的论文《Efficient Estimation of Word Representation in Vector Space》,它的核心思想是利用神经网络对词的上下文训练得到词的向量化表示,训练方法:CBOW(通过附近词预测中心词)、Skip-gram(通过中心词预测附近的词):
- CBOW :
NOTE:花括号内{}为解释内容.
1.输入层:上下文单词的onehot. {假设单词向量空间dim为V,上下文单词个数为C}
2.所有onehot分别乘以共享的输入权重矩阵W. {V*N矩阵,N为自己设定的数,初始化权重矩阵W}
3.所得的向量 {因为是onehot所以为向量} 相加求平均作为隐层向量, size为1*N.
4.乘以输出权重矩阵W' {N*V}
5.得到向量 {1*V} 激活函数处理得到V-dim概率分布 {PS: 因为是onehot嘛,其中的每一维斗代表着一个单词},概率最大的index所指示的单词为预测出的中间词(target word)
6.与true label的onehot做比较,误差越小越好
所以,需要定义loss function(一般为交叉熵代价函数),采用梯度下降算法更新W和W'。训练完毕后,输入层的每个单词与矩阵W相乘得到的向量的就是我们想要的词向量(word embedding),这个矩阵(所有单词的word embedding)也叫做look up table(其实聪明的你已经看出来了,其实这个look up table就是矩阵W自身),也就是说,任何一个单词的onehot乘以这个矩阵都将得到自己的词向量。有了look up table就可以免去训练过程直接查表得到单词的词向量了。
- Skip-gram :
跟CBOW的原理相似,它的输入是目标词,先是将目标词映射为一个隐藏层向量,根据这个向量预测目标词上下文两个词,因为词汇表大和样本不均衡,同样也会采用多层softmax或负采样优化。
- 分层softmax
一般神经网络语言模型在预测的时候,输出的是预测目标词的概率,也就是说我每一次预测都要基于全部的数据集进行计算,这无疑会带来很大的时间开销。不同于其他神经网络,word2vec提出两种加快训练速度的方式,一种是Hierarchical softmax,另一种是Negative Sampling。
和传统的神经网络输出不同的是,word2vec的hierarchical softmax结构是把输出层改成了一颗哈夫曼树,其中图中白色的叶子节点表示词汇表中所有的|V|个词,黑色