从BERT, XLNet, RoBERTa到ALBERT
原文地址:https://zhuanlan.zhihu.com/p/84559048
拜读贪心科技李文哲老师的文章,我做个笔记。
摘抄记录如下:
谷歌Lab近日发布了一个新的预训练模型"ALBERT"全面在SQuAD 2.0、GLUE、RACE等任务上超越了BERT、XLNet、RoBERTa再次刷新了排行榜!ALBERT是一种轻量版本的BERT,利用更好的参数来训练模型,但是效果却反而得到了很大提升!ALBERT的核心思想是采用了两种减少模型参数的方法,比BERT占用的内存空间小很多,同时极大提升了训练速度,更重要的是效果上也有很大的提升!
1. 什么是预训练
预训练也叫做Pre-training, 是迁移学习中很重要的一项技术。在自然语言处理中主要以词向量为主。单词我们一般可以用两种不同的方式来表示,一种方式为"one-hot encoding",另外一种方式为分布式表示(通常也叫作词向量/Word2Vec)。 由于单词是所有文本的基础,所以如何去更好地表示单词变得尤其重要。
那如何去理解预训练呢? 举个例子,比如我们用BERT训练了一套模型,而且已经得到了每个单词的词向量, 那这时候我们可以直接把这些词向量用在我们自己的任务上,不用自己重新训练,这就类似于迁移学习的概念。 或者通过BERT已经训练好的模型去动态地去得出上下文中的词向量。
预训练在通常情况下既可以提升训练效率也可以提高模型效果,因为使用预训练的结果本身其实就是去试图寻找最好的最优解。
2. 词向量技术
通过词向量技术我们可以把一个单词表示为向量的形式,然后接着应用在后续的模型当中。我们可以认为词向量表示的是单词的语义(semantic)。 我们可以按照不同的类别区分词向量技术。
常用的词向量模型比如SkipGram, CBOW, Glove 是不考虑上下文的,也就是一个单词有个固定(Fixed)的向量,不依赖于上下文的改变而改变。比如“I back my car"和 "I hurt my back"里,单词"back"在不同的语境下的含义是不一样的 。
近2,3年很多工作的重点放在了学习考虑上下文的词向量。在这个领域产生了诸多很有突破性的进展,从ELMo,BERT, XLNet到今日刚刚发布的ALBERT,无一不是以这个为重点。利用这些模型,我们可以动态地去学出一个单词在不同上下文之间的词向量。当然,这些向量在不同的语境下的表示肯定是不一样的。
3. 什么是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年提出,当时引起了爆炸式的反应,因为从效果上来讲刷新了非常多的记录,之后基本上开启了这个领域的飞速的发展。
4. 什么是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的几大核心!
5. 为什么要提出ALBERT
接着看一下那为什么要提出ALBERT呢?其实他们的想法很简单就是想让模型更轻,训练更快,效果更好!
过去几年深度学习圈子里一直出现了一些“怪象”,就是堆数据,让模型更复杂,训练出来的效果更好! 但真正的智能应该是用更简单的模型,用更少量的数据,得到更好的结果! 可以想一下人类是如何学习的?我们的学习不需要大量的样本,而且有举一反三的能力,这才叫作真正的智能! 我们的研究在这个道路上还有很长的路要走。
之前的BERT,XLNet为什么效果好? 这绝对离不开模型本身的复杂度,一个模型拥有上百亿的参数,效果不好就太对不起我们的资源了。我们要知道训练一套这类模型需要花费甚至几百万美金的成本。
所以这时候提出ALBERT也不奇怪的,就是试图解决上述的问题: 1. 让模型的参数更少 2. 使用更少的内存 3. 提升模型的效果。就是这么简单!
6. ALBERT的贡献
文章里提出一个有趣的现象:当我们让一个模型的参数变多的时候,一开始模型效果是提高的趋势,但一旦复杂到了一定的程度,接着再去增加参数反而会让效果降低,这个现象叫作“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),其实是基于主题的关联去预测是否两个句子调换了顺序。