浅谈BERT
本文将主要介绍BERT模型以及BERT相关的一些东西。
过去在NLP的领域通常是一个任务对应一个model,但是今年来已经发展到可以让机器先了解人类的语言再来解决各式各样的NLP任务。可以通过给机器大量的文字,让机器读懂,这个过程叫预训练(pre-train),然后再根据特定的任务给机器特定的有限的有关数据对pre-train的model进行微调(fine-tune)。
这种pre-train的做法类似于人类学习一门语言的过程,比如评价一个人的英语水平往往可以通过考托福,雅思等,做一些列的口语,写作,听力各种各样的题型。但是在学习英语的过程中却不是靠做题,而是靠阅读大量的文字了解了每一个单词的意思,然后针对不同的体型采取相应的方法就可以通过考试了。那这些pre-train的model里面最知名的就是BERT了。
1. What is pre-trained model?
其实在BERT,ELMO出现之前就已经有pre-trained model了,总的来说就是给每一个词一个embedding vector,vector的某一些维度会代表某些语义相关的意思,寓意相近的词之间的vector的相似度会比较高。这样的pre-trained model就是输入一个token然后得到一个embedding(把vector和token对应到一起的表是提前训练好的)这样的技术有很多像是Word2vec,Glove等。
这种model的一个缺点就是如果有新加入的词汇则无法找到对应的embedding。对于英文来说,一种解决方式是把token换成字母,来训练字母对应的embedding。这种做法最出名的叫FastText。
对于中文来说,由于中文的特殊性(不同的偏旁部首有不同的意思)可以把方块字当作图片来处理,用CNN的model来处理。
然而这种模型最大的缺点就是,不管在什么样的语境下,同样的token得到的一定是同样的embedding,没有考虑上下文的信息。比如说“单身狗”的“狗”和“养只狗”的“狗”明明意思不同但是得到的却是一样的embedding。
为了解决这个问题,可能会想说把不同的“狗”当作不同的token来看待,分成“狗1”和“狗2”,但是这两个“狗”又不是完全不一样,还有些意思相近的地方,所以说当作不通的token的做法也不太好。于是就出现了contextualized word embedding,也是给每一个token一个embedding,区别是新的model是输入一排的token然后同时得到一排的embedding,这样就像是机器看过了整句话语境以后再得到embedding。就可以区分“狗1”和“狗2”,给不同的embedding。
像这种模型往往都有很深的架构,很多的layers,中间的部分可以采用不同的结构,像ELMO用的就是LSTM,BERT用的就是self-attention。这种模型真的可以让相同的token在不同的context下有不同的embedding。下面是用BERT学出来的embedding计算句子的相似度的一个例子:
黄颜色代表语义相似度最高,深蓝色代表最低。可以发现同样是“苹果”,作为水果时和作为公司名称时的语义就完全不一样了。
2. How to Pre-train BERT?
首先介绍一下self-supervised learning,我们都知道supervised-learning有feature和label。而self-supervised learning简单说就是在没有label的情况下,自己想办法做supervise。把没有标注的数据分成两部分,一部分作为模型输入,另一部分作为标注(现在听起来肯定会比较抽象)
先明白一点,BERT实际上就是transformer的Encoder部分。 首先看一下BERT模型的输入是长什么样子的:
- 模型的输入是一排token,然后在句首加入一个特殊的token [CLS],在两个句子中间和句尾加入一个特殊的token [SEP],可以简单的理解为整个句子的embedding信息存在了[CLS]对应的输出中
- 把每一个token找到对应的Token Embedding
- 分别把句子A中的token和句子B中的token加上一个表示句子的embedding,Segment Embedding
(与transformer模型的一个区别) - 最后给每一个位置的token加上对应位置的Position Embedding
再来看模型是如何pre-train的:
1.Masked token prediction:
- 随机的选取15%的token
- 把其中的80%换成一个特殊的"Mask"的token,其中10%换成随机的任何token,其余10%保持不变
- 预测被mask起来的部分(整个过程有点像是在做填空题)
有人可能会说,这不是和Word2vec的CBOW很像吗。这里有两个关键的区别,CBOW获取上下文的信息是受到window size的限制的,而BERT则是无限长的,看给BERT多长的输入。第二个就是BERT是一个很复杂的model,内部有12或24层的self-attention layer,而CBOW只有两层。
2.Next sentence prediction:
随机的从训练集中选两个句子A和B,其中50%的概率B是A的下一句,另外50%的概率二者没有关系。然后让模型来预测。两个句子中间用特殊的token [SEP]隔开,结果被储存在特殊的token [CLS]对应的embedding中
但是这种训练方式在很多篇论文中被看成是意义不大。其中最著名的一篇是RoBERTa。原因可能是这种预测任务看起来太简单了,实际上model根本没有学到什么有用的信息。然后又有人提出了新的训练方法SOP(Sentence order prediction)选定的A,B两个句子本来就是前后文的关系,这回预测的是谁是前一句,谁是后一句,这种方法被应用在了ALBERT中。
但是机器学会了做填空题和做上下文顺序预测又有什么用呢?后来被发现经过了pre-train的model可以用在很多其他的特定的下游任务(downstream task)上面,后文也叫做tspecific task。
3. How to fine-tune?
接下来介绍关于如何fine-tune的部分。刚才说到如果有一个pre-trained model,然后在加一个对于一个特定任务的架构,再进行fine-tune就可以在特定任务上有很好的效果。
这边有两种做法:
1.第一种是利用已有的pre-trained model作为特征提取器(Feature Extractor)来得到一组输入的embedding,然后再把embedding作为输入送到特定任务(Task-specific)的model中来进行训练,也就是只fine-tune task-specific的部分(右图)
2.第二种把pre-trained部分和task-specific的部分连在一起当作是一个巨大的model一起训练,用这歌巨大的model来解决特定的NLP任务(左图)(虽然是一起训练的,但是只有task-specific的部分参数是随机初始化的,pre-trained部分依然是经过了预训练的)
一般来说,往往把pre-trained model和task-specific部分一起fine-tune效果更好。但是如果fine-tune整个巨大的model可能会遇到这样的问题:假设今天有三个不同的NLP任务,虽然是同样的pre-trained model,在不同任务重进行了不同的fine-tune后得到的mod个参数el的参数也会完全不一样。而储存这种巨大的model往往消耗很大的内存(有些模型甚至有上亿个参数)
然后就有人提出了Adaptor的概念,也就是要调pre-trained model可不可以只fine-tune一部分就好了呢?也就在pre-trained model里面加入一些layers作为adaptor(相对于pre-trained model来说参数很少很少),在对pre-trained model进行fine-tune的时候只调adaptor的部分,其余的大部分餐素保持不变。在储存模型的时候也只需要储存一个pre-trained model没有调整的部分和三个adaptor就好了。
下面是一个adaptor的例子,在pre-train的时候不加adaptor在fine-tune的时候加入adaptor的部分,然后只对adaptor的参数进行调整。
结果显示如果fine-tune整个model(pre-train加task-specific model)则参与fine-tune的参数越多模型的效果也就越好。如果加入了adaptor以后只调adaptor也会得到很好的performance。但是如何设计adaptor是一个值得讨论的问题,
刚才介绍的一直都是把pre-trained model的最后一个layer得到的embedding输入到task-specific model里面。还有一种做法是假设pre-trained的model里面不同的layer能提取不同维度的特征那可以吧每一个layer输出的embedding加权平均在一起表示最后的embedding。每一层的权重可以当作是task-specific model里的参数一起学习出来。
上面只是简单的介绍了一下fine-tune,接下来还会有详细的介绍BERT的pre-train model是如何用在不同的NLP下游任务上面的。
to be continued…
本文是学习李宏毅老师机器学习课程的笔记,在这里附上李宏毅老师主页链接:https://speech.ee.ntu.edu.tw/~hylee/
如果对self-attention和transformer还不了解可以看我的另外两篇笔记:
- self-attention https://blog.csdn.net/weixin_42254244/article/details/116572402
- transformer https://blog.csdn.net/weixin_42254244/article/details/116593666