系统学习NLP(三十二)--BERT、XLNet、RoBERTa、ALBERT

参考:https://zhuanlan.zhihu.com/p/84559048

一.BERT

BERT是一种基于Transformer Encoder来构建的一种模型,它整个的架构其实是基于DAE(Denoising Autoencoder)的,这部分在BERT文章里叫作Masked Lanauge Model(MLM)。MLM并不是严格意义上的语言模型,因为整个训练过程并不是利用语言模型方式来训练的。BERT随机把一些单词通过MASK标签来代替,并接着去预测被MASK的这个单词,过程其实就是DAE的过程。BERT有两种主要训练好的模型,分别是BERT-Small和BERT-Large, 其中BERT-Large使用了12层的Encoder结构。 整个的模型具有非常多的参数。

BERT在2018年提出,当时引起了爆炸式的反应,因为从效果上来讲刷新了非常多的记录,之后基本上开启了这个领域的飞速的发展。

二.XLNet

BERT之后的一个爆发节点发生在XLNet发布的时候,因为它刷新了BERT保留的很多记录。除了效果之外,那为什么要提出XLNet呢?这就需要从BERT的缺点说起。

虽然BERT有很好的表现,但本身也有一些问题。总结起来有以下几点:

1.训练数据和测试数据之间的不一致性,这也叫作Discrephancy。当我们训练BERT的时候,会随机的Mask掉一些单词的,但实际上在使用的过程当中,我们却没有MASK这类的标签,所以这个问题就导致训练的过程和使用(测试)的过程其实不太一样,这是一个主要的问题。

2. 并不能用来生成数据。由于BERT本身是依赖于DAE的结构来训练的,所以不像那些基于语言模型训练出来的模型具备很好地生成能力。之前的方法比如NNLM[12],ELMo是基于语言模型生成的,所以用训练好的模型可以生成出一些句子、文本等。但基于这类生成模型的方法论本身也存在一些问题,因为理解一个单词在上下文里的意思的时候,语言模型只考虑了它的上文,而没有考虑下文!

基于这些BERT的缺点,学者们提出了XLNet, 而且也借鉴了语言模型,还有BERT的优缺点。最后设计出来的模型既可以很好地用来执行生成工作,也可以学习出上下文的向量表示。那如何做的呢?

首先,生成模型是单向的,即便我们使用Bidirectional LSTM类模型,其实本质是使用了两套单向的模型。那又如何去解决呢?答案是他们使用了permutation language model, 也就是把所有可能的permutation全部考虑进来。这个想法源自于hugo之前的工作叫作NADE,感兴趣的读者可以去看一下。

另外,为了迎合这种改变,他们在原来的Transformer Encoder架构上做了改进,这部分叫作Two-stream attention, 而且为了更好地处理较长的文本,进而使用的是Transformer-XL。 这就是XLNet的几大核心!关于Transformer-XL 看这里 https://zhuanlan.zhihu.com/p/70745925

核心:

Transformer编码固定长度的上下文,即将一个长的文本序列截断为几百个字符的固定长度片段(segment),然后分别编码每个片段[1],片段之间没有任何的信息交互。比如BERT,序列长度的极限一般在512。动机总结如下:

  • Transformer无法建模超过固定长度的依赖关系,对长文本编码效果差。
  • Transformer把要处理的文本分割成等长的片段,通常不考虑句子(语义)边界,导致上下文碎片化(context fragmentation)。通俗来讲,一个完整的句子在分割后,一半在前面的片段,一半在后面的片段。

文章围绕如何建模长距离依赖,提出Transformer-XL【XL是extra long的意思】:

  • 提出片段级递归机制(segment-level recurrence mechanism),引入一个记忆(memory)模块(类似于cache或cell),循环用来建模片段之间的联系。
    • 使得长距离依赖的建模成为可能;
    • 使得片段之间产生交互,解决上下文碎片化问题。
  • 提出相对位置编码机制(relative position embedding scheme),代替绝对位置编码。
    • 在memory的循环计算过程中,避免时序混淆【见model部分】,位置编码可重用。

小结一下,片段级递归机制为了解决编码长距离依赖和上下文碎片化,相对位置编码机制为了实现片段级递归机制而提出,解决可能出现的时序混淆问题。

三.RoBERTa

RoBERTa 模型更多的是基于 BERT 的一种改进版本。是 BERT 在多个层面上的重大改进。

RoBERTa 在模型规模、算力和数据上,主要比 BERT 提升了以下几点:

  • 更大的模型参数量(从 RoBERTa 论文提供的训练时间来看,模型使用 1024 块 V 100 GPU 训练了 1 天的时间)

  • 更多的训练数据(包括:CC-NEWS 等在内的 160GB 纯文本)

此外如下所示,RoBERTa 还有很多训练方法上的改进。

1. 动态掩码

BERT 依赖随机掩码和预测 token。原版的 BERT 实现在数据预处理期间执行一次掩码,得到一个静态掩码。而 RoBERTa 使用了动态掩码:每次向模型输入一个序列时都会生成新的掩码模式。这样,在大量数据不断输入的过程中,模型会逐渐适应不同的掩码策略,学习不同的语言表征。

2. 更大批次

RoBERTa 在训练过程中使用了更大的批数量。研究人员尝试过从 256 到 8000 不等的批数量。

3. 文本编码

Byte-Pair Encoding(BPE)是字符级和词级别表征的混合,支持处理自然语言语料库中的众多常见词汇。

原版的 BERT 实现使用字符级别的 BPE 词汇,大小为 30K,是在利用启发式分词规则对输入进行预处理之后学得的。Facebook 研究者没有采用这种方式,而是考虑用更大的 byte 级别 BPE 词汇表来训练 BERT,这一词汇表包含 50K 的 subword 单元,且没有对输入作任何额外的预处理或分词。

四.ALBERT

ALBERT试图解决上述的问题: 1. 让模型的参数更少 2. 使用更少的内存 3. 提升模型的效果。

文章里提出一个有趣的现象:当我们让一个模型的参数变多的时候,一开始模型效果是提高的趋势,但一旦复杂到了一定的程度,接着再去增加参数反而会让效果降低,这个现象叫作“model degratation"。

基于上面所讲到的目的,ALBERT提出了三种优化策略,做到了比BERT模型小很多的模型,但效果反而超越了BERT, XLNet。

Factorized Embedding Parameterization. 他们做的第一个改进是针对于Vocabulary Embedding。在BERT、XLNet中,词表的embedding size(E)和transformer层的hidden size(H)是等同的,所以E=H。但实际上词库的大小一般都很大,这就导致模型参数个数就会变得很大。为了解决这些问题他们提出了一个基于factorization的方法。

他们没有直接把one-hot映射到hidden layer, 而是先把one-hot映射到低维空间之后,再映射到hidden layer。这其实类似于做了矩阵的分解。

Cross-layer parameter sharing. Zhenzhong博士提出每一层的layer可以共享参数,这样一来参数的个数不会以层数的增加而增加。所以最后得出来的模型相比BERT-large小18倍以上。

Inter-sentence coherence loss. 在BERT的训练中提出了next sentence prediction loss, 也就是给定两个sentence segments, 然后让BERT去预测它俩之间的先后顺序,但在ALBERT文章里提出这种是有问题的,其实也说明这种训练方式用处不是很大。 所以他们做出了改进,他们使用的是setence-order prediction loss (SOP),其实是基于主题的关联去预测是否两个句子调换了顺序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章