BERT基础(三):BERT与Word2Vec、ELMO的比较与所做改进分析

时间:2024-03-22 12:41:17

参考文章:
Bert浅析
从Word Embedding到Bert模型——自然语言处理预训练技术发展史

关于self-attention与transformer参考之前的博文
BERT基础(二):Transformer 详解
BERT基础(一):self_attention自注意力详解

简单来说,词向量模型是一个工具,可以把文字(词语/字符)转换成向量,然后我们使用这些向量来完成各种 NLP 任务。因而某种意义上,NLP 任务分成两部分:预训练产生词向量,对词向量进行操作(下游具体 NLP 任务)

一、 Word2vec

Word2Vec 模型训练出来的词向量之间具有类似线性的关系,这是一个很神奇的地方,例如:
vec(king)vec(man)=vec(queen)vec(woman) vec(king)-vec(man)=vec(queen)-vec(woman) {v}
BERT基础(三):BERT与Word2Vec、ELMO的比较与所做改进分析

从而也说明高维空间映射的词向量可以很好体现真实世界中 token 之间的关系。

Word2Ved 的另一个重要特性就是其采用的负采样(nagative sampling)技术。由于训练词向量模型的目标不是为了得到一个多么精准的语言模型,而是为了获得它的副产物——词向量。所以要做到的不是在几万几十万个 token 中艰难计算 softmax 获得最优的那个词(预测对于给定词的下一词),而只需能做到在几个词中找到对的那个词就行。这几个词包括一个正例(即直接给定下一词),和随机产生的噪声词(采样抽取的几个负例),就是说训练一个 sigmoid 二分类器,只要模型能够从中找出正确的词就认为完成任务。这种负采样思想也应用到之后的 BERT 里,只不过从 word-level 变成 sentence-level,这样能获取句子之间的关联关系。

负采样:不同于原本每个训练样本更新所有的权重,负采样每次让一个训练样本仅仅更新一部分的权重,这样就好降低梯度下降过程中的计算量

负采样讲解例子

例1:当我们用训练样本(input word:“fox”, output word:“quick”)来训练我们的神经网络时,“fox”和“quick”都是经过one-hot编码的。如果我们的vocabulary大小为10000时,在输出层,我们希望“quick”单词那个位置输出1,其余都是0。这些其余我们期望输出0的位置所对应的单词我们成为“negative” word。当使用负采样时,我们将随机选择一小部分的negative words(比如选5个negative words)来更新对应的权重。我们也会对我们的positive word进行权重更新(上面的例子指的是"quick")。

缺点:获得的词向量是上下文无关 (static) 的。

二、 ELMO

ELmo 模型是 AllenNLP 在 2018 年 8 月发布的一个上下文相关模型,甚至在 9 月 10 月 BERT 没出来时,也小火了一把。但据说使用时很慢效率很低,ELMo 很快就被人们遗忘了。

ELMo 通过采用 Bi-LSTM 做 encoder 来实现上下文相关,也就是之前我们说的把下游具体 NLP 任务转移到预训练产生词向量的过程里,从而达到获得一个根据上下文不同而不断变化的动态词向量。具体实现方法是使用双向语言模型 Bi-LSTM 来实现,如下图所示。从前到后和后到前分别通过双向的两层 LSTM 进行 encoding,从而获得两个方向的 token 联系,进而获得句子的 context。

BERT基础(三):BERT与Word2Vec、ELMO的比较与所做改进分析

但这里有两个潜在问题,姑且称作不完全双向自己看见自己

  • 首先,不完全双向是指模型的前向和后向 LSTM两个模型是分别训练的,从图中也可以看出,对于一个序列,前向遍历一遍获得左边的 LSTM,后向遍历一遍获得右边的LSTM,最后得到的隐层向量直接通过拼接 (concat) 得到结果向量,并且在最后的Loss Function 直接相加,并非完全同时的双向计算。

  • 另外,自己看见自己是指要预测的下一个词在给定的序列中已经出现的情况。传统语言模型的数学原理决定了它的单向性。从公式p(s)=p(w0)p(w1w0)p(w2w1,w0)p(wncontext)p(s)=p(w_0)⋅p(w_1∣w_0)⋅p(w_2∣w_1,w_0)⋯p(w_n∣context) 可以看出,传统语言模型的目标是获得在给定序列从头到尾条件概率相乘后概率最大的下一词,而加深网络的层数会导致预测的下一词已经在给定序列中出现了的问题,这就是“自己看见自己”。

    BERT基础(三):BERT与Word2Vec、ELMO的比较与所做改进分析

如上图所示(从下往上看),最下行是训练数据ABCDA B C D,经过两个Bi-LSTM操作,需要预测某个词位置的内容。比如第二行第二列ACDA|CD这个结果是第一层Bi-LSTM在BB位置输出的内容,包括正向AA 和反向 CDCD,直接拼接成ACDA|CD。比如第三行第二列ABCDABCD这个结果是前向 BCDBCD和反向ABDAB|D拼接结果,而当前位置需要预测的是 BB,已经在 ABCDABCD​中出现了,这就会有问题。因而对于 Bi-LSTM,只要层数增加,就是会存在“自己看见自己”的问题。

ELMo 模型将 context 的 encoding 操作从下游具体 NLP 任务转换到了预训练词向量这里,但在具体应用时要做出一些调整。当 Bi-LSTM 有多层时,由于每层会学到不同的特征,而这些特征在具体应用中侧重点不同,每层的关注度也不同。ELMo 给原始词向量层和每个 RNN 隐层都设置了一个可训练参数,通过 softmax 层归一化后乘到相应的层上并求和起到了加权作用。

比如,原本论文中设定了两个隐层,第一隐层可以学到对词性、句法等信息,对此有明显需求的任务可以对第一隐层参数学到比较大的值;第二隐层更适合对词义消歧有需求的任务,从而分配更高权重。

三、BERT

Transformer 的原型包括两个独立的机制,一个 encoder 负责接收文本作为输入,一个 decoder 负责预测任务的结果。

BERT基础(三):BERT与Word2Vec、ELMO的比较与所做改进分析

BERT是一种基于微调的多层Transformer编码器,它的目标是生成语言模型,所以只需要transformer的encoder部分。BERT 使用 Transformer 而不是 Bi-LSTM 做encoder,可以有更深的层数、具有更好并行性。

BERT基础(三):BERT与Word2Vec、ELMO的比较与所做改进分析

BERT 模型进一步增加词向量模型泛化能力,充分描述字符级、词级、句子级甚至句间关系特征。

CBOW(连续词袋模型) 的核心思想是:在做语言模型任务的时候,我把要预测的单词抠掉,然后根据它的上文 Context-Before 和下文 Context-after 去预测单词。其实Bert就是这么做的。 Bert 在模型方面其实没有太大创新,更像一个最近几年 NLP 重要技术的集大成者。它本身的效果好和普适性强才是最大的亮点。

BERT模型使用两个新的无监督预测任务进行预训练,分别是Masked LM和Next Sentence Prediction。

BERT基础(三):BERT与Word2Vec、ELMO的比较与所做改进分析

1. Masked Language Model

模型假设: BERT 每次随机 mask 语料中 15% 的 token,然后将 masked token 位置输出的最终隐层向量送入 softmax,来预测 masked token。这样输入一个句子,每次只预测句子中大概 15% 的词,所以 BERT 训练很慢。

问题:训练过程大量看到 [mask] 标记,但是真正后面用的时候是不会有这个标记的,这会引导模型认为输出是针对 [mask] 这个标记的,但是实际使用又见不到这个标记。

解决方法:以my dog is hairy为例,15% 的 token中:

  • 有80%的概率用[mask]标记来替换,如:my dog is [MASK]

  • 有10%的概率用随机采样的一个单词来替换,如:my dog is apple

  • 有10%的概率不做替换,如:my dog is hairy

2. Sentence-level Representation

在很多任务中,仅仅靠 encoding 是不足以完成任务的(这个只是学到了一堆 token 级的特征),还需要捕捉一些句子级的模式,来完成 SLI、QA、dialogue 等需要句子表示、句间交互与匹配的任务。对此,BERT 又引入了另一个极其重要却又极其轻量级的任务,来试图把这种模式也学习到。

模型假设:作句子级别的连续性预测任务,即预测输入 BERT 的两端文本是否为连续的文本。训练的时候,输入模型的第二个片段会以 50% 的概率从全部文本中随机选取,剩下 50% 的概率选取第一个片段的后续文本。

这可以看作是句子级负采样,即首先给定的一个句子(相当于 Word2Vec 中给定 context),它下一个句子或者为正例(相当于 Word2Vec 中的正确词),或者随机采样一个句子作为负例(相当于 Word2Vec 中随机采样的词),然后在该 sentence-level 上来做二分类(即判断句子确实是当前句子的下一句还是噪声)。

BERT基础(三):BERT与Word2Vec、ELMO的比较与所做改进分析

BERT 是一个句子级别的语言模型,不像 ELMo 模型在与下游具体 NLP 任务拼接时需要每层加上权重做全局池化,BERT 可以直接获得一整个句子的唯一向量表示。它在每个 input 前面加一个特殊的记号 [CLS],如上图所示,然后让 Transformer 对 [CLS] 进行深度 encoding,由于 Transformer 是可以无视空间和距离的把全局信息 encoding 进每个位置的,而 [CLS] 的最高隐层向量作为句子/句对的表示直接跟 softmax 的输出层连接,因此其作为梯度反向传播路径上的“关卡”,可以学到整个 input 的上层特征。

BERT 还采用了 segment embedding,对于句对来说,EA 和 EB 分别代表左句子和右句子;对于句子来说,只有 EA。这个 EA 和 EB 也是随模型训练出来的。如下图所示,最终输入结果会变成下面 3 个 embedding 拼接的表示。

BERT基础(三):BERT与Word2Vec、ELMO的比较与所做改进分析

从transformer到bert的理解参考:(视频涉及部分代码的讲解及详细过程)https://www.bilibili.com/video/av58239477/spm_id_from=333.788.videocard.1