深度学习进阶篇 - 预训练模型 [3]:XLNet、BERT、GPT,ELMO 的区别优缺点,模型框架、一些 Trick、Transformer Encoder 等原理详细讲解
深度学习进阶篇-预训练模型[3]:XLNet、BERT、GPT,ELMO 的区别优缺点,模型框架、一些 Trick、Transformer Encoder 等原理详细讲解
1.XLNet:Generalized Autoregressive Pretraining for Language Understanding
1.1. 从 AR 和 AE 模型到 XLNet 模型
自回归模型(Autoregressive Model, AR),通过估计一串文本序列的生成概率分布进行建模。一般而言,AR 模型通过要么从前到后计算文本序列概率,要么从后向前计算文本序列概率,但不论哪种方式的建模,都是单向的。即在预测一个单词的时候无法同时看到该单词位置两边的信息。假设给定的文本序列,其从左到右的序列生成概率为:
自编码模型(Autoencoding Model, AE), 通过从破坏的输入文本序列中重建原始数据进行建模。例如 BERT 通过预测【mask】位置的词重建原始序列。它的优点在于在预测单词的时候能够同时捕获该单词位置前后双向的信息;它的缺点是预训练过程中采用了 mask 单词的策略,然而微调阶段并没有,因此导致了预训练阶段和微调阶段的的 GAP,另外在训练过程中,对不同 mask 单词的预测是相互独立的。假设序列中被 mask 的词为,未被 mask 的词为,则其相应的计算概率为:
这里对传统的 AR 和 AE 模型简单总结一下,AR 模型是生成式模型,是单向的;AE 模型是判别式模型,是双向的。鉴于传统的 AR 模型和 AE 模型自身的优点和缺点,XLNet 期望能够融合两者的优点同时又避免两者的缺点,这就是 XLNet 的设计思路。
整体上 XLNet 是基于 AR 模型的建模思路设计的,同时避免了只能单向建模的缺点,因此它是一种能看得见双向信息的广义 AR 模型。作为一个 AR 模型,XLNet 并没有采用预测 mask 单词的方式进行建模,因此它不存在上述预训练-微调的 GAP,更不存在预测 mask 的独立性假设。
1.2. Permutation Language Model
Permuatation Language Mode (下文将简称为 PLM) 是 XLNet 的核心建模思路,在正式介绍之前,我们再来回顾一下 AR 模型的建模策略,给定一串文本序列,其中每个表示一个 token,AR 模型的通过最大化下边这个似然函数进行建模:
这里,$\text{x}{<t}th{\theta}(\text{x}_{1:t-1})e(x_t)x_t$的 embedding。
这种建模方式是单向的,为了在预测某个位置单词的时候,能够让模型看见双向的信息,XLNet 采用了全排列的思路,允许模型在不同文本序列排列上进行建模,但模型的参数在不同序列上是共享的,相当于是模型能够看见预测位置单词左右两侧的信息。
举个例子,假设当前有文本序列,这串序列中共有 3 个 token,这三个 token 共计有 6 种排列组合方式,其相关的索引序列为:
采用索引序列的文本序列为,采用索引序列的文本序列为,如果模型在训练过程中能同时看到这样的两个排列,那么在预测的时候将可以看到,又可以看到,因为训练过程中模型的参数是共享的,因此相当于模型能够看到前后双向的信息。
下面正式归纳一下 XLNet 的目标函数,假设给定一串序列,它将有个不同的排列组合 $\mathbb{Z}=[\text{z}1,\text{z}2,...,\text{z}{n!}]\text{z}\in \mathbb{Z}z{t}\text{z}t\text{z}{<t}tt-1\text{x}{\text{z}}\text{x}\text{z}\text{x}{\text{z}<t}\text{x}\text{z}\text{x}{\text{z}}t-1\text{z}p(\text{z})$,则 XLNet 的正式目标函数依据极大似然估计为:
但是一个长度为的文本序列,其排列组合数为,数量实在庞大,不便训练,所以在实际训练过程中,XLNet 是通过采样的方式逼近目标函数的期望,即:
其中,表示第个排列的第个位置,$\text{x}{\text{z}i<t}\text{z}it-1\text{z}\text{x}{\text{z}}\text{x}\text{z}\sum{t=1}^n log;p{\theta}(x{z_t}|\text{x}_{\text{z}<t})$ 。这里需要注意的是,XLNet 只是调整了联合概率的分解顺序,但是原始 token 之间的顺序是不变的,即 token 之间还是使用原始顺序的 position embedding,的分解顺序的计算主要是通过 transformer 的 mask 机制实现的。这样的设定也保证了预训练阶段和微调阶段之间的顺序是一致的,均是正常的自然语序。
图 1 不同排列计算第 3 个单词输出的示意图
图 1 中和代表前一个的 segment 的缓存信息,另外,输入的序列顺序都是固定的自然语序,position embedding 还是按照正常的顺序确定的。只是不同的排列中,参与分解计算的内容不同。具体来讲,对第一个分解次序,因为位于最前边,所以在这个分解次序中看不到其他的 token 内容,只能看到前一个 segment 的缓存信息;对第一个分解次序,前边有和,所以在计算位置输出的时候使用了和。
这个想法就是 PLM 的建模思路,看到这里,相信你已经很好地理解了。
1.3. Permutation Language Model 如何建模
1.3.1 使用经典的 transformer 是否能建模 PLM
上边看似找到了一个比较好想法去让 AR 模型在预测一个单词的时候同时能够看到前后双向的信息,但具体怎么来建模实现呢?使用原始的 transformer 技术直接实现可能会带来一些问题,具体来说,假设当前有两个排列和,他们之间具有如下的关系:
这种情况下,使用经典 transformer 的方式去预测这两个排列位置的输出,将会有:
显然在这种情况下,预测第个位置的单词和预测第个位置的单词的概率分布是相同的,这肯定是不对的,因此使用经典的 transformer 是无法去做 Permutation Language Model 建模的。
为了解决这个问题,XLNet 在预测目标位置的 token 时,向其引入了位置信息,重新定义的预测 token 概率分布的计算方式为:
从公式中可以看到,其在预测位置 token 的时候,引入了位置信息。这样就能解决上述的问题,即经过这个变换后上式将变为:
1.3.2 使用 Two-Stream Self-Attention 建模 PLM
从上边讨论的这些可以看到,当预测位置的 token 时,最多只能使用位置信息,而不能使用该对应的内容,否则,就相当于使用来预测自己,这没有什么意义;当预测后的 token 时,不仅需要位置信息,同时还需要该位置对应的内容。
然而,经典的 transformer 中是将两者信息在输入层相加融合之后进行后续计算的,因此 XLNet 提出了一种双流自注意力机制:content-stream 和 query stream,下面我们将来具体探讨一下它们。
content-stream 提供了内容方面的表达 content representation $h_{\theta}(\text{x}{\text{z}{\leq t}} )h_{z_t}z_tx_{z_t}$。
query-stream 提供了查询方面的表达 query representation $g_{\theta}(\text{x}{\text{z}{<t}}, z_t)g_{z_t}x_{z<t}z_tx_{z_t}$的内容。
图 2 双流机制计算图
图 2 展示了分解顺序为的 two-stream 计算过程,我们通过这张图来具体聊聊如何去定义 $g_{\theta}(\text{x}{\text{z}{<t}},z_t)$。
图 2a 展示了 content-stream 的自注意力计算,其中是由 token 的 embedding 进行初始化,可以看到它的计算和经典的 transormer 是一致的,因为在分解顺序中 1 位于最后,因此它能看见前边所有的 token 内容,最终计算得出的同时包含了第个位置的内容信息。
图 2b 展示了 query-stream 的自注意力计算,其中由可学习的参数进行初始化,因为它能看见 token 3,2,4 的内容信息,所以这里用的是内容信息,同时对于第 1 个位置,只能使用位置信息,而不能使用内容信息,所以这里使用的是,它并不包含第 1 个位置的内容信息。 这样就能比较好地建模 $g_{\theta}(\text{x}{\text{z}{<t}},z_t)$。
图 2c 展示了整体的计算流程,最后一层输出的 query 向量就是我们想要的 $g_{\theta}(\text{x}{\text{z}{<t}},z_t)$。右边的两个矩阵分别展示了 content-stream 和 query-stream 的 mask 矩阵内容,就是使用这样的 mask 矩阵来计算序列分解式的。 关于这两个流的 Self-Attention 计算公式如下:
以上是 XLNet 在预训练阶段的计算过程,这里需要注意的是,在微调阶段,XLNet 仅仅使用 content respresentation 进行 fine-tune 下游任务。
1.3.3 引入 Transformer-XL 的想法
由于 XLNet 本身是个 AR 模型,它可以完美融入 Transformer-XL 的思想:相对位置编码和 segment 循环机制。这两者的原理部分感兴趣的同学可以去阅读 Transformer-XL 内容,本文重点讨论一下 segment 循环机制向 XLNet 的融入过程。
顾名思义,segment 循环机制是指长序列切分成个 segment (文本片段),然后将每个 segment 依次传入模型之中,同时传入到模型中,同时传入到模型中还有上一个 segment 的产生的输出,这个操作有点像 RNN,接收上一步的输出和当前步骤的输入,然后根据两者计算产生当前步骤的输出,只不过 RNN 的循环单位是单词,XLNet 的循环单位是 segment。
给定一个长序列,上一个 segment 为,其对应的排列用表示;当前的 segment 为,其对应的排列用表示。基于排列处理第 1 个 segment,并将其输出进行缓存,第层的输出用表示。则第 2 个 segment 的计算可以按照如下方式进行:
即将前一个 segment 的输出和当前位置能看到的内容进行拼接,然后进行 Self-Attention 融合计算。
这里需要注意的是,由于序列中的 position embedding 仅仅依赖于原始序列(输入序列)的位置,而不是排列的顺序,所以一旦前一个 segment 的输出确定,上述的 Attention 计算和前一个 segment 的分解顺序无关。这允许我们去缓存或者复用前一个 segment 的输出,而不用去管前一个 segment 的分解顺序。
1.3.4 关于 XLNet 的一些 Trick
Partial Prediction
最开始的时候有提到,AR 模型通过估计一串文本序列的生成概率分布进行建模: 。PLM 虽然解决了 AR 模型建模过程中的双向问题,但是由于通过这种排列组合的形式训练,导致 XLNet 收敛会比较慢。
因此 XLNet 在训练过程中,只选择预测序列最后面的部分位置的 token,这里涉及到一个切分点位置,它将指示不预测在前边的位置 $\text{z}{\leq c}c{\text{z}{>c}}$。XLNet 中切分点 的选择由超参数来确定,,其中为序列长度。越大,则需要预测的 token 数量越少。
这就是 Partial Prediction 部分预测,对于切分点之前的 token 无需计算 query representation,这会大大节省内存,加快模型训练速度。加入切分点后,XLNet 的目标函数将变为:
Multiple Segment Input
许多下游任务存在多段输入的情况,比如 QA 任务中包含 query( 简记为 A )和 answer (简记为 B)两个部分,数据的输入形式同 BERT 一致:。
但是在 segment 循环的时候,每个部分仅仅使用对应上下文的状态缓存。
Relative Segment Encoding
Relative Segment Encoding (相对段编码) , 这里的 Segment 不是上边将的将序列划分为固定的 Segment,而是指输入数据的不同部分,例如,和分别属于不同的 Segment。
BERT 直接使用了绝对编码,直接给和中的 token 依次设置了 0 和 1,用来指示整个序列中和是不同的 segment,即是不同的文本段,例如一个是 query,另一个是 answer。
XLNet 与 BERT 不同,它使用了相对编码,给定序列中的两个位置和,判断这两个位置对应的 token 是否在同一个 segment 里面,如果两者在同一个 segment 里面,,否则。 当预测第个位置 token 的时候,需要计算用位置的向量向另一位置做 attention 获取分数,其按照如下公式计算:
其中为第个位置的查询向量,是一个可学习的参数。最终将被加到正常 Self-Attention 的注意力分数上。
使用相对段编码有这样的优势:
模型的泛化效果会更好;
在微调任务上,它支持超过两个 segment 输入的下游任务(虽然预训练过程中使用了两个 segment);
相关资料
2.BERT
2.1 BERT 介绍
BERT(Bidirectional Encoder Representation from Transformers)是 2018 年 10 月由 Google AI 研究院提出的一种预训练模型,该模型在机器阅读理解顶级水平测试 SQuAD1.1 中表现出惊人的成绩: 全部两个衡量指标上全面超越人类,并且在 11 种不同 NLP 测试中创出 SOTA 表现,包括将 GLUE 基准推高至 80.4% (绝对改进 7.6%),MultiNLI 准确度达到 86.7% (绝对改进 5.6%),成为 NLP 发展史上的里程碑式的模型成就。
BERT 的网络架构使用的是《Attention is all you need》中提出的多层 Transformer 结构,如 图 1 所示。其最大的特点是抛弃了传统的 RNN 和 CNN,通过 Attention 机制将任意位置的两个单词的距离转换成 1,有效的解决了 NLP 中棘手的长期依赖问题。Transformer 的结构在 NLP 领域中已经得到了广泛应用。
2.2 BERT 框架
BERT 整体框架包含 pre-train 和 fine-tune 两个阶段。pre-train 阶段模型是在无标注的标签数据上进行训练,fine-tune 阶段,BERT 模型首先是被 pre-train 模型参数初始化,然后所有的参数会用下游的有标注的数据进行训练。
图 1 BERT 结构
BERT 是用了 Transformer 的 encoder 侧的网络,encoder 中的 Self-attention 机制在编码一个 token 的时候同时利用了其上下文的 token,其中‘同时利用上下文’即为双向的体现,而并非想 Bi-LSTM 那样把句子倒序输入一遍。
在它之前是 GPT,GPT 使用的是 Transformer 的 decoder 侧的网络,GPT 是一个单向语言模型的预训练过程,更适用于文本生成,通过前文去预测当前的字。
2.2.1Embedding
Embedding 由三种 Embedding 求和而成:
Token Embeddings 是词向量,第一个单词是 CLS 标志,可以用于之后的分类任务
Segment Embeddings 用来区别两种句子,因为预训练不光做 LM 还要做以两个句子为输入的分类任务
Position Embeddings 和之前文章中的 Transformer 不一样,不是三角函数而是学习出来的
其中[CLS]表示该特征用于分类模型,对非分类模型,该符号可以省去。[SEP]表示分句符号,用于断开输入语料中的两个句子。
BERT 在第一句前会加一个[CLS]标志,最后一层该位对应向量可以作为整句话的语义表示,从而用于下游的分类任务等。因为与文本中已有的其它词相比,这个无明显语义信息的符号会更“公平”地融合文本中各个词的语义信息,从而更好的表示整句话的语义。 具体来说,self-attention 是用文本中的其它词来增强目标词的语义表示,但是目标词本身的语义还是会占主要部分的,因此,经过 BERT 的 12 层(BERT-base 为例),每次词的 embedding 融合了所有词的信息,可以去更好的表示自己的语义。而[CLS]位本身没有语义,经过 12 层,句子级别的向量,相比其他正常词,可以更好的表征句子语义。
2.2.2Transformer Encoder
BERT 是用了 Transformer 的 encoder 侧的网络,如上图的 transformer 的 Encoder 部分,关于 transformer 的 encoder 的详细介绍
在 Transformer 中,模型的输入会被转换成 512 维的向量,然后分为 8 个 head,每个 head 的维度是 64 维,但是 BERT 的维度是 768 维度,然后分成 12 个 head,每个 head 的维度是 64 维,这是一个微小的差别。Transformer 中 position Embedding 是用的三角函数,BERT 中也有一个 Postion Embedding 是随机初始化,然后从数据中学出来的。
BERT 模型分为 24 层和 12 层两种,其差别就是使用 transformer encoder 的层数的差异,BERT-base 使用的是 12 层的 Transformer Encoder 结构,BERT-Large 使用的是 24 层的 Transformer Encoder 结构。
2.2.3 BERT 可视化
如上图将注意力看做不同的连线,它们用来连接被更新的位置(左半边)与被注意的位置(右半边)。不同的颜色分别代表相应的注意头,而线条颜色的深浅代表被注意的强度。
2.2.4 注意力六种模式
为了方便演示,这里采用以下例句:
句子 A:I went to the store.句子 B:At the store, I bought fresh strawberries.
BERT 用 WordPiece 工具来进行分词,并插入特殊的分离符([CLS],用来分隔样本)和分隔符([SEP],用来分隔样本内的不同句子)。
因此实际输入序列为: [CLS] i went to the store . [SEP] at the store , i bought fresh straw ##berries . [SEP]
模式 1:注意下一个词
在这种模式中,每个位置主要注意序列中的下一个词(token)。下面将看到第 2 层 0 号头的一个例子。(所选头部由顶部颜色条中突出的显示色块表示。)
模式 1:注意下一个词。
左:所有词的注意力。 右:所选词的注意力权重(“i”)
左边显示了所有词的注意力,而右侧图显示一个特定词(“i”)的注意力。在这个例子中,“i”几乎所有的注意力都集中在“went”上,即序列中的下一个词。
在左侧,可以看到 [SEP]符号不符合这种注意力模式,因为[SEP]的大多数注意力被引导到了[CLS]上,而不是下一个词。因此,这种模式似乎主要在每个句子内部出现。
该模式与后向 RNN 有关,其状态的更新是从右向左依次进行。模式 1 出现在模型的多个层中,在某种意义上模拟了 RNN 的循环更新。
模式 2:注意前一个词
在这种模式中,大部分注意力都集中在句子的前一个词上。例如,下图中“went”的大部分注意力都指向前一个词“i”。
这个模式不像上一个那样显著。有一些注意力也分散到其他词上了,特别是[SEP]符号。与模式 1 一样,这与 RNN 有些类似,只是这种情况下更像前向 RNN。
模式 2:注意前一个词。
左:所有词的注意力。 右:所选词的注意力权重(“went”)
模式 3:注意相同或相关的单词
这种模式注意相同或相关的单词,包括其本身。在下面的例子中,第一次出现的“store”的大部分注意力都是针对自身和第二次出现的“store”。这种模式并不像其他一些模式那样显著,注意力会分散在许多不同的词上。
模式 3:注意相同/相关的词。
左:所有词的注意力。 右:所选词的注意权重(“store”)
模式 4:注意“其他”句子中相同或相关词
这种模式注意另一个句子中相同或相关的单词。例如,第二句中“store”的大部分注意力都指向第一句中的“store”。可以想象这对于下句预测任务(BERT 预训练任务的一部分)特别有用,因为它有助于识别句子之间的关系。
模式 4:注意其他句子中相同/相关的单词。
左:所有词的注意力。 右:所选词的注意权重(“store”)
模式 5:注意能预测该词的其他单词
这种模式似乎是更注意能预测该词的词,而不包括该词本身。在下面的例子中,“straw”的大部分注意力都集中在“##berries”上(strawberries 草莓,因为 WordPiece 分开了),而“##berries”的大部分注意力也都集中在“straw”上。
模式 5:注意能预测该单词的其他单词。
左:所有词的注意力。 右:所选词的注意力(“## berries”)
这个模式并不像其他模式那样显著。例如,词语的大部分注意力都集中在定界符([CLS])上,而这是下面讨论的模式 6 的特征。
模式 6:注意分隔符
在这种模式中,词语的大部分注意力都集中在分隔符[CLS]或 [SEP]上。在下面的示例中,大部分注意力都集中在两个 [SEP]符号上。这可能是模型将句子级状态传播到单个词语上的一种方式。
模式 6:注意分隔符。 左:所有词的注意力。 右:所选词的注意权重(“store”)
2.3 BERT 的预训练任务
BERT 是一个多任务模型,它的预训练(Pre-training)任务是由两个自监督任务组成,即 MLM 和 NSP,如 图 2 所示。
图 2 BERT 预训练过程示意图
2.3.1MLM
MLM 是指在训练的时候随即从输入语料上 mask 掉一些单词,然后通过的上下文预测该单词,该任务非常像我们在中学时期经常做的完形填空。正如传统的语言模型算法和 RNN 匹配那样,MLM 的这个性质和 Transformer 的结构是非常匹配的。在 BERT 的实验中,15%的 WordPiece Token 会被随机 Mask 掉。在训练模型时,一个句子会被多次喂到模型中用于参数学习,但是 Google 并没有在每次都 mask 掉这些单词,而是在确定要 Mask 掉的单词之后,做以下处理。
80%的时候会直接替换为[Mask],将句子 “my dog is cute” 转换为句子 “my dog is [Mask]”。
10%的时候将其替换为其它任意单词,将单词 “cute” 替换成另一个随机词,例如 “apple”。将句子 “my dog is cute” 转换为句子 “my dog is apple”。
10%的时候会保留原始 Token,例如保持句子为 “my dog is cute” 不变。
这么做的原因是如果句子中的某个 Token 100%都会被 mask 掉,那么在 fine-tuning 的时候模型就会有一些没有见过的单词。加入随机 Token 的原因是因为 Transformer 要保持对每个输入 token 的分布式表征,否则模型就会记住这个[mask]是 token ’cute‘。至于单词带来的负面影响,因为一个单词被随机替换掉的概率只有 15%*10% =1.5%,这个负面影响其实是可以忽略不计的。 另外文章指出每次只预测 15%的单词,因此模型收敛的比较慢。
优点
1)被随机选择 15%的词当中以 10%的概率用任意词替换去预测正确的词,相当于文本纠错任务,为 BERT 模型赋予了一定的文本纠错能力;
2)被随机选择 15%的词当中以 10%的概率保持不变,缓解了 finetune 时候与预训练时候输入不匹配的问题(预训练时候输入句子当中有 mask,而 finetune 时候输入是完整无缺的句子,即为输入不匹配问题)。
缺点
针对有两个及两个以上连续字组成的词,随机 mask 字割裂了连续字之间的相关性,使模型不太容易学习到词的语义信息。主要针对这一短板,因此 google 此后发表了 BERT-WWM,国内的哈工大联合讯飞发表了中文版的 BERT-WWM。
2.3.2NSP
Next Sentence Prediction(NSP)的任务是判断句子 B 是否是句子 A 的下文。如果是的话输出’IsNext‘,否则输出’NotNext‘。训练数据的生成方式是从平行语料中随机抽取的连续两句话,其中 50%保留抽取的两句话,它们符合 IsNext 关系,另外 50%的第二句话是随机从预料中提取的,它们的关系是 NotNext 的。这个关系保存在图 4 中的[CLS]符号中。
注意
在此后的研究(论文《Crosslingual language model pretraining》等)中发现,NSP 任务可能并不是必要的,消除 NSP 损失在下游任务的性能上能够与原始 BERT 持平或略有提高。这可能是由于 Bert 以单句子为单位输入,模型无法学习到词之间的远程依赖关系。针对这一点,后续的 RoBERTa、ALBERT、spanBERT 都移去了 NSP 任务。
BERT 预训练模型最多只能输入 512 个词,这是因为在 BERT 中,Token,Position,Segment Embeddings 都是通过学习来得到的。在直接使用 Google 的 BERT 预训练模型时,输入最多 512 个词(还要除掉[CLS]和[SEP]),最多两个句子合成一句。这之外的词和句子会没有对应的 embedding。
如果有足够的硬件资源自己重新训练 BERT,可以更改 BERT config,设置更大 max_position_embeddings 和 type_vocab_size 值去满足自己的需求。
2.4 BERT 的微调
在海量的语料上训练完 BERT 之后,便可以将其应用到 NLP 的各个任务中了。 微调(Fine-Tuning)的任务包括:基于句子对的分类任务,基于单个句子的分类任务,问答任务,命名实体识别等。
基于句子对的分类任务:
MNLI:给定一个前提 (Premise) ,根据这个前提去推断假设 (Hypothesis) 与前提的关系。该任务的关系分为三种,蕴含关系 (Entailment)、矛盾关系 (Contradiction) 以及中立关系 (Neutral)。所以这个问题本质上是一个分类问题,我们需要做的是去发掘前提和假设这两个句子对之间的交互信息。
QQP:基于 Quora,判断 Quora 上的两个问题句是否表示的是一样的意思。
QNLI:用于判断文本是否包含问题的答案,类似于我们做阅读理解定位问题所在的段落。
STS-B:预测两个句子的相似性,包括 5 个级别。
MRPC:也是判断两个句子是否是等价的。
RTE:类似于 MNLI,但是只是对蕴含关系的二分类判断,而且数据集更小。
SWAG:从四个句子中选择为可能为前句下文的那个。
基于单个句子的分类任务
SST-2:电影评价的情感分析。
CoLA:句子语义判断,是否是可接受的(Acceptable)。
问答任务
SQuAD v1.1:给定一个句子(通常是一个问题)和一段描述文本,输出这个问题的答案,类似于做阅读理解的简答题。
命名实体识别
CoNLL-2003 NER:判断一个句子中的单词是不是 Person,Organization,Location,Miscellaneous 或者 other(无命名实体)。
图 3 BERT 用于不同的 NLP 任务
2.5 BERT,GPT,ELMO 的区别
如上图所示,图中的 Trm 代表的是 Transformer 层,E 代表的是 Token Embedding,即每一个输入的单词映射成的向量,T 代表的是模型输出的每个 Token 的特征向量表示。
BERT 使用的是双向的 Transformer,OpenAI GPT 使用的是从左到右的 Transformer。ELMo 使用的是单独的从左到右和从右到左的 LSTM 拼接而成的特征。其中只有 BERT 在所有的层考虑了左右上下文。除此之外,BERT 和 OpenAI GPT 是微调(fine-tuning)的方法,而 ELMo 是一个基于特征的方法。
2.5.1 BERT 比 ELMo 效果好的原因
从网络结构以及最后的实验效果来看,BERT 比 ELMo 效果好主要集中在以下几点原因:
LSTM 抽取特征的能力远弱于 Transformer
拼接方式双向融合的特征融合能力偏弱
BERT 的训练数据以及模型参数均多于 ELMo
2.5.2 优缺点
优点
BERT 相较于原来的 RNN、LSTM 可以做到并发执行,同时提取词在句子中的关系特征,并且能在多个不同层次提取关系特征,进而更全面反映句子语义。
相较于 word2vec,其又能根据句子上下文获取词义,从而避免歧义出现。
缺点
模型参数太多,而且模型太大,少量数据训练时,容易过拟合。
BERT 的 NSP 任务效果不明显,MLM 存在和下游任务 mismathch 的情况。
BERT 对生成式任务和长序列建模支持不好。
版权声明: 本文为 InfoQ 作者【汀丶人工智能】的原创文章。
原文链接:【http://xie.infoq.cn/article/71880a86c09391224bdd482ac】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论