【自然语言处理】 词向量

【传统的语义向量表示方法】

  • one-hot:每个词表示为一个很长的向量,向量的维度是词表大小,其中只有一个维度的值为1,其它元素为0.
  • 词袋模型(BOW):将语料库中所有词语装进一个袋子里,不考虑其词法和语序的问题,即每个词语都是独立的,语料库中所有的词组成一个清单进行映射匹配。对于每一个句子或文档,其对应的下标与映射数组的下标相匹配,其值为该词语出现的次数。
    例如:该例子来源于百度百科
    以下是两个简单的文件:
    (1) John likes to watch movies. Mary likes movies too.
    (2) John also likes to watch football games.
    基于以上两个文件,可以建构出下列清单:
    [ “John”, “likes”, “to”, “watch”, “movies”, “also”, “football”, “games”, “Mary”, “too”]
    此处有10个不同的词,使用清单的索引表示长度为10的向量:
    (1) [1, 2, 1, 1, 2, 0, 0, 0, 1, 1]
    (2) [1, 1, 1, 1, 0, 1, 1, 1, 0, 0]
    每个向量的索引内容对应到清单中词出现的次数。
    但是此向量表示法不会保存原始句子中词的顺序。

可见传统的表示方法存在的一个问题就是“词汇鸿沟”现象。

【Word2Vec】
深度学习中的词向量通常使用一种低维实数向量,这使得在语义上相似或相关的词,在距离上更接近。这样就可以通过两个词向量之间的余弦值来衡量它们之间的相似度。但是使用one-hot并不是一个好的选择,因为任何一对词的one-hot向量的余弦相似度都为0。现在常用word2vec将词表示为低维实数值向量,它的底层采用基于CBOW(连续词袋模型)和Skip-Gram(跳词模型)算法的神经网络模型,以及两种高效的训练方法——负采样和层序softmax。

  • CBOW:连续词袋模型中用一个中心词在文本序列周围的词来预测该中心词。在训练CBOW模型的过程中,其输入是某一个词的上下文对应的词向量,这个词向量是随机初始化产生的,输出的是所有词的softmax的概率,训练目标是希望这个词对应的softmax值最大,对应的CBOW神经网络模型输入层有4个神经元,输出层有|V|(词汇表的大小)个神经元。比如对于"I am a student from BIT",假设将上下文大小取值为2,要预测的是student的词向量,我们就要将上下文前2个后2个,共4个词的词向量(am、a、from、BIT )作为模型的输入。CBOW使用的是词袋模型,因此该方法不会保存原始句子中词的顺序,也就是说这四个词对student的贡献是相等的,不考虑它们和student之间距离的远近。

  • Skip-Gram:跳字模型中用一个词来预测他在本文序列周围的词。Skip-Gram和CBOW正好相反,即输入某个词的词向量,输出所有词的softmax概率,训练目标是希望这个词对应的上下文的2n个词取得前2n大的softmax值。对应的神经网络模型输入层有一个神经元,输出层有|V|(词汇表的大小)个神经元。

负采样应用于Word2Vec
可以看到,无论是连续词袋模型还是跳词模型,每一步梯度计算的开销与词典V的大小相关。因此,使用上述训练方法在实践中是有难度的,所以使用近似的方法来计算这些梯度,从而减小计算开销。
负采样:在NLP中,判断两个单词是不是一对上下文词与目标词,如果是一对,则是正样本;反之则是负样本。采样得到一个上下文词和一个目标词,生成一个正样本。生成一个负样本,则是用与正样本相同的上下文词,再在字典中随机选择一个单词,这就是负采样。
负采样的本质:每次让一个训练样本只更新部分权重,其他权重全部固定,以减少计算量。(一定程度上还可以增加随机性)

层次softmax应用于Word2Vec
由于从隐藏层到输出的softmax层的计算量很大,因为如果采用softmax,要计算所有词的softmax概率,再去找概率最大的值。
层次softmax的基本思想是:根据词以及其出现的频率建立哈夫曼树,即一个词出现的频率越高,哈夫曼树的路径就越短,哈夫曼树中每一个叶子节点代表一个词,中间节点等价于是神经网络的隐藏层,根节点是对所有输入的词向量求和并取平均。对于softmax值的计算只要沿着树形结构进行就可以了。即:使用sigmoid函数判别正类还是负类,如果是正类,则沿着左子树走;如果是负类,则沿着右子树走。
其优点在于:哈夫曼二叉树的最大深度是logV-1,每个节点处进行一个二分类,大大减少了参数,将多分类问题转化为多个二分类问题,并且由于高频的词其路径更短,这样高频词就可以以更少的时间找到,从而降低了计算的复杂度,提高了运算效率。

【Glove】
由于word2vec的两种网络都是基于局部上下窗口的,没有考虑到词与窗口之外的词之间的关系,Glove可以基于全局词汇共现的统计信息来学习词向量,以此将统计信息与局部窗口的优点结合起来。
以下参考了Glove
【自然语言处理】 词向量_第1张图片
【自然语言处理】 词向量_第2张图片
作者发现,Ratio可以在一定程度上可以反映词之间的相关性,当相关性较低时,其值应该在1附件,当相关性较高时,比值应该偏离1比较远。
基于这样的观测,作者提出通过训练词向量,使得词向量经过某种计算之后可以拟合上面的比值。

【ELMo】
对于word2vec和Glove,同一个词在不用的语境下的向量表示是相同的,但是很多词在不同的语境下却有相同的含义。word2vec和glove中,每个词对应于一个固定的向量,而在ELMo中,预训练好的模型不是向量的对应关系,将语句输入到ELMo预训练模型,模型会根据上下文来推测每个词所对应的词向量,这样就可以结合上下文的语境对多义词进行解释。
在ELMo模型的训练过程中,采用双向LSTM来预测某个特定的词,在前向过程中,使用第1到第k-1的词来预测第k个词;在后向过程中,用第k+1个词到第N的词来预测第k个词。通过pre-train+fine tuning的方式实现,先在一些语料库上使用两层的BiLSTM进行pre-train,然后再在下游任务的语料库(!!注意 :是语料库,忽略label)上进行fine tuning,也就是根据输入的句子来作word embedding,最后在进行NLP任务时,可以将ELMo直接作为特征拼接到具体任务模型的词向量输入或者是模型的最高层表示上。也就是说ELMo可以根据具体的输入从语言模型中得到上下文依赖的当前词表示,再作为特征加入到具体的模型中。

【GPT】
与ELMo模型采用的pre-train和fine-tuning的方式一致,GPT也采用了这种方式,不同于ELMo的是,ELMo采用的是双向LSTM作为语言模型,但LSTM是序列模型,要等前一步计算结束才可以进行下一步的计算,其并行计算的能力不好,而GPT采用Transformer的解码器作为语言模型,通过前k个词预测当前词;第二个不同之处在于,ELMo在fine-tuning的过程中,是作为特征加入到具体的模型中的,GPT不用重新对任务构建新的模型结构,而是直接在Transformer的最后一层接一个softmax作为任务输出层,然后再对整体的模型进行微调。

【Bert】
由于GPT是用前k个词预测当前词,是单方向的,损失了下文的信息,所以BERT采用了双向Transformer作为语言模型。在语言模型的训练过程中,不是使用前k个词预测当前的词,而是提出了两个新的预训练任务:

  1. MLM(Masked Language Model):受到完形填空的启发,在输入的词序列中,随机遮挡15%的词,然后用剩下的词来预测这些被mask的词,在这15%的词中,又有10%被替换成其他单词,10%不做替换,剩下的80%被替换为[MASK]。相比于传统的语言模型预测,MLM可以从任何方向来预测这些mask的词。
  2. NSP(Next Sentence Prediction):由于传统的语言模型只考虑了词之间的关系,而没有考虑句子之间的关系,所以BERT的第二个预训练任务是预测下一个句子,在预训练过程中,输入句子A和B,B有50%的概率不是A的下一句,模型的训练目标是预测B是否是A的下一句。

同GPT,BERT在fine-tune的过程中,只是在输入和输出有所区别,然后对整个模型的所有参数进行微调。

你可能感兴趣的:(自然语言处理,词向量,BERT,ELMo,GPT,word2vec)