NLP之词向量
Posted dyl222
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NLP之词向量相关的知识,希望对你有一定的参考价值。
1.对词用独热编码进行表示的缺点
向量的维度会随着句子中词的类型的增大而增大,最后可能会造成维度灾难2、任意两个词之间都是孤立的,仅仅将词符号化,不包含任何语义信息,根本无法表示出在语义层面上词与词之间的相关信息,而这一点是致命的。
2.用向量代表词的好处
3.词嵌入的由来
在NLP之分词中提过,one-hot 表示法具有维度过大的缺点,那么现在将 vector 做一些改进:
1、将 vector 每一个元素由整形改为浮点型,变为整个实数范围的表示;
2、将原来稀疏的巨大维度压缩嵌入到一个更小维度的空间。这也是词向量又名词嵌入的缘由了。
用向量代表词的好处。
4.传统的Embedding技术
最早的词向量是作为副产物产出的。在https://www.cnblogs.com/dyl222/p/11005948.html中的神经网络语言模型中有详细的介绍。
5.Word2vec
为了克服传统的Embedding技术中参数过多的问题,大名鼎鼎的Word2vec对神经网络语言模型进行了改进。
Word2vec有两种训练模式CBOW以及skip-gram,有两种优化方法,层次化的softmax以及负采样。其中速度最快的组合是CBOW+负采样,在下文的Word2vec的详细解析中会介绍为什么,同时这也是通过gensim包中的Word2vec训练词向量的默认方法。
优点:
通过Word2vec获得的词向量是在低维空间的分布式表示,其中包含丰富的语法和语义信息。
缺点:
1)词向量的解释性太差。
2)对于CBOW模型,在训练阶段中心词的词向量是把窗口大小内上下文的词向量相加作为输入,显然这忽略了文本的序列信息。
3)无法获得文本的情感信息,例如好,坏这两个词其使用的语境基本相同,训练出的这两个词向量会十分相似,但是其表示的情感意思却完全的相反。要获得情感信息需要大量标注好的语料。需要包含词不同情感得分的句子作为训练语料以获得这个词的词向量,需要大量的相关语料。
4)其最主要的问题是无法获得语境信息从而无法解决一词多义的问题,因为通过Word2vec所训练出的词向量是静态的,对于一个词无论其所处的语言环境如何最终都用相同的词向量表示。
Word2vec的详细解析(参考https://www.cnblogs.com/pinard/category/894695.html,个人从他的博客中学到了很多知识)
1)CBOW+层次化的softmax
整体结构图如下:
该结构所创建的语言模型是根据中心词汇窗口大小内的词预测该词。具体过程如下:
随机初始化所有词的词向量,根据训练样本结合词频建立霍夫曼树,设定一个滑动窗口,每次以一个窗口内的文本作为训练样本,树的叶子节点代表一个个词,训练样本中有多少不同的词就有多少个叶子节点。每次训练树的树根是训练样本中心词其窗口大小内上下文词其词向量的均值,从树根往下每次都是一个通过Logistic进行二分类的过程,正类的霍夫曼编码为0,负类的霍夫曼编码为1,每个训练样本的学习策略是使得从树根到中心词这个叶子节点的概率值最大,具体为使得一次次Logistic回归其值的乘积最大,以对数似然函数作为损失函数,通过梯度下降法对每次Logistic回归中的参数进行更新,同时以路径上所有梯度之和对窗口大小内的上下文词向量进行更新(注意并不是对中心词的值进行更新),非叶子节点代表的是参数,对于相同的训练样本参数是相同的。
2)Skip_gram+层次softmax
它和CBOW+层次softmax非常相似,都是对中心词窗口大小内的词向量进行更新,只不过这里的输入(根节点)是中心词的词向量,目标节点是上下文窗口大小内的词,因此相对于CBOW+层次softmax它多了一个外层的循环,循环的把上下文窗口大小内的词其词向量作为目标节点。它和CBOW都是对上下文窗口大小内的词向量进行更新,所以说CBOW是对输入进行更新,它是对输出进行更新。
由于多个外层循环使得skip-gram的速度慢于CBOW。
注意:由于层次softmax优化方法是根据词频建立霍夫曼树,词频小的词离根节点更远,而由于稀疏性的原因(训练语料词袋中的词往往大部分出现词频较低),使得训练时到大部分中心词所经历的路径会过长,解决这一问题可以通过负采样。
先介绍一下使用负采样选取neg个负例词的方法
假定训练样本中共有I个词,把长度为1的线段分成I份,这里并不是等分的,词频越高的词其所占长度相对越大。然后再把该线段等分为M份,注意M远大于V,从M中随机的选取neg个,这neg个M所对应的词作为负例词。
3)CBOW+负采样
每一次以一个中心词作为正例(其词向量是上下文窗口大小内的词其词向量的均值),随机选取neg个中心词作为负例,以和logistic相同的思想最大化条件概率为学习策略,以对数似然函数做为损失函数,以正例词所对应的概率值最大为优化目标,通过梯度上升算法进行优化。最后也是对上下文窗口大小内的词的词向量进行更新。
4)Skip_gram+负采样
每次循环的以上下文窗口大小内的某一个词作为正例,随机选取neg个中心词作为负例,以和logistic相同的思想最大化条件概率为学习策略,以对数似然函数做为损失函数,以使得正例词所对应的概率值最大为优化目标,通过梯度上升算法进行优化。最后对该词的词向量进行更新。
6.FastText
FastText在用于类别种类数比较多且训练语料比较大的文本分类中效果很好,但是通过这种方法也能获得词向量。
FastText每次以文本的所有词词向量的均值以及字符级文本的ngram作为输入,使得其相比于Word2vec能够获得语序信息。所预测的是类别标签。
7.Glove
和word2vector不同,GloVe更倾向于对前后语境之间的共现关系进行分析,通过共现关系抽象出词向量,相比于word2vector它能获得语料中的统计信息。该论文明确指出它是充分利用统计信息使用词共现矩阵中频率非零的元素来训练模型。
详细解析:
https://blog.csdn.net/u014665013/article/details/79642083
论文和源码的详细解析
https://blog.csdn.net/Mr_tyting/article/details/80180780
8.Doc2vec
Doc2Vec(dm默认为1是PV-DM类似于Word2vec中的CBOW,选择0则使用的为PV-DBOW,类似于Word2vec中的skip-gram,也有hs默认0为负采样)和Word2vec类似,它是每次从一句话中滑动采样固定长度的词,取其中一个词作预测词,其他的作输入词。输入词对应的词向量word vector和本句话对应的句子向量Paragraph vector作为输入层的输入,将本句话的向量和本次采样的词向量相加求平均或者累加构成一个新的向量X,进而使用这个向量X预测此次窗口内的预测词。
Doc2vec相对于word2vec不同之处在于,在输入层,增添了一个新句子向量Paragraph vector,Paragraph vector可以被看作是另一个词向量,它扮演了一个记忆,词袋模型中,因为每次训练只会截取句子中一小部分词训练,而忽略了除了本次训练词以外该句子中的其他词,这样仅仅训练出来每个词的向量表达,句子只是每个词的向量累加在一起表达的。正如上文所说的词袋模型的缺点,忽略了文本的词序问题。而Doc2vec中的Paragraph vector则弥补了这方面的不足,它每次训练也是滑动截取句子中一小部分词来训练,Paragraph Vector在同一个句子的若干次训练中是共享的,所以同一句话会有多次训练,每次训练中输入都包含Paragraph vector。它可以被看作是句子的主旨,有了它,该句子的主旨每次都会被放入作为输入的一部分来训练。这样每次训练过程中,不光是训练了词,得到了词向量。同时随着一句话每次滑动取若干词训练的过程中,作为每次训练的输入层一部分的共享Paragraph vector,该向量表达的主旨会越来越准确。Doc2vec中PV-DM模型具体的训练过程和word2vec中的CBOW模型训练方式相同,训练完了以后,就会得到训练样本中所有的词向量和每句话对应的句子向量。
9.ELMO
相比于前面几种方法所获得的词向量通过ELMO所获得的词向量能够富含语境信息,也就是能够一定程度上解决一词多义问题。
ELMO属于一种预训练方法(对于预训练的发展会在随后的博文中介绍),它所创建的语言模型的任务是通过上下文来预测当前词。ELMO采用了典型的两阶段过程,第一个阶段是利用统计语言模型进行预训练;第二个阶段是在做下游任务时,从预训练网络中提取对应单词的网络各层的Word Embedding进行线性组合作为新特征补充到下游任务中。ELMO的网络结构采用了双层双向LSTM。
具体流程
先用训练语料通过多层双向的LSTM网络(论文中使用的是两层)来训练一个语言模型,属于预训练阶段。关于BI-LSTM的双向输入问题,语言模型训练的任务目标是根据单词的上下文去正确预测单词,它之前的单词序列Context-before称为上文,之后的单词序列Context-after称为下文。左端的前向双层LSTM代表正方向编码器,输入的是从左到右顺序的除了预测单词外的上文Context-before;右端的逆向双层LSTM代表反方向编码器,输入的是从右到左的逆序的句子下文Context-after(也就是说这里并不是输入的整个句子)。
在解决下游的具体任务时,把当前任务的训练语料输入到网络模型中,此时参数都是训练好的,只是在此基础上进行微调,句子中每个单词都能得到对应的三个Embedding:最底层是单词的Word Embedding,往上走是第一层双向LSTM中对应单词位置的Embedding,这层编码单词的句法信息更多一些;再往上走是第二层LSTM中对应单词位置的Embedding,这层编码单词的语义信息更多一些。这三层的向量可以结合下游具体任务的训练语料学习得到相应的权重,根据各自权重进行线性求和,将三个Embedding整合成一个从而得到ELMO向量。这个ELMO向量富含语境信息。对于下游的NLP任务,在词向量的基础上拼接上ELMO向量,其总体作为新的词向量进行训练,这样的词向量不仅富含语法和语义信息也富含语境信息,正因为拼接的ELMO向量的不同,所以说词向量是不断改变的,从而解决了Word2vec最大的缺陷,无法处理多义词的问题。
以上是关于NLP之词向量的主要内容,如果未能解决你的问题,请参考以下文章