从Transformer到BERT模型-葛瀚骋
一词多义问题,前两个bank代表银行,后两个bank代表河床:
Elmo全程为Embeddings from Language MOdels,是一个基于LSTM的语言模型,主要是根据上下文预测下一个词。他对一词多义提供了一个思路。Elmo对于每一个词都会给出3个Embedding。
如果Elmo把LSTM换成Transformer就和Bert的结构基本一样了
LSTM与Transformer的区别是什么?LSTM是迭代的,一个接着一个字来的。Transformer是并行的,所有的字可以同时训练。Transformer使用了位置嵌入,帮助模型理解语言的顺序。
最重要的是使用了Multi-Head Attention。给你一个Quary,你有一个Keys,你需要对每一个Key计算和Quary的相关度,最后用value表示这个Quary(?)。
- 最新的榜单被ALBert霸榜了,ALBert可以看做是瘦版的Bert。
- Bert全称为使用Transformer的双向编码表象(BERT是编码器)。
- Bert有两个方面:一个是Pre-traning,一个是fine-tuning。Pre-traning是从一个很大的wiki来Pre-train。
- Bert站在巨人的肩膀上,集大家之所长。基本思想和Word2Vec和Cbow很相近,使用context来预测单词。结构和ELMO相似,都是双向结构。
- 它不是第一次使用Transformer,第一次是GPT。ELMO把LSTM换成Transformer的话就是BERT
-
GPT只考虑了从左向右的信息。GPT-2效果太好没有开源。
BERT是序列到序列的结构,中间是Transformer的Encoder
BERT的输入有3个部分Token Embeddings、Segment Embeddings(表示word属于那一段)、Position Embeddings(表示单词的位置)。
CLS是做分类任务的一个标志,因为本身是并行结构,放在哪个位置都可以。SEP是用来区分两个句子的,因为通常train Bert的时候会把两个句子放到一起。
BERT有两个TASK,如图
因为预训练的时候是这两个任务同事训练的,所以LOSS就把这两个任务的LOSS加起来。
BERT官方有两个版本:
基础版是有12个Transformer,hiden Embeddings是768,Head是12(?Head是什么),参数总数是110M
Large版有24个Transformer Layer,hiden Embeddings是1024,Head是16(?),参数总数是340M
Masked Language Model 灵感来源于完形填空。在BERT中mask了15%的token。这15%的token中 分3中情况:
80%的情况会用[mask]这种特殊字符来取代,10%的情况会用另外一个词取代,还有10%的可能性保持不动(?那不应爱是总共mask了15%*90%吗)。
最后在计算loss的时候,只关注被mask掉的token,其他的token无论是好是坏都不管。(?为啥)
另外一个task:Nest Sentence Prediction,更关注与两个句子之间的关系。如下所示, 最下面input的两句话是有上下文关系的,就被label成isNext。实际训练中在isNext的sentence和NotNext的sentence各选一半来训练。相对于mask language model, Nest Sentence Prediction相对来说是比较简单的。 对于Nest Sentence Prediction这个task,只需要用到CLS这个token产生的hidden vector来计算他们是不是有next的relationship。
训练技巧:
- 表示从一个文档中生成多少data,如果你的data不够多可以把这个参数适当调高一点。比如说我有一句话,我会增加这句话里面不同token做mask的机会。这样我们就可以生成更多的training data。
- 用来定义一个sample里面最大、最多可能被mask token的数量
- BERT中,traning的时候不是用一个word和一个word ,而是用一个word pieces,他会把一个完整的词分成sub-word,例如new york会分成五份。这个参数是用来,在做mask的时候,有时候我们想针对某个词而不是只是针对subword,如果把这个参数生成为真的话,会对new york中5个subwords,(后面因为英文单词没听懂)
- 如果你的文档里的长度超过了限制,从开头或者结尾随机删除来达到长度。
深入理解BERT的机制是怎么样的
第一个head我们可以看到连线非常的密集,所以他的attends相对来说意义不大。第二个到第三个head他表示的是next word,found对应in,in对应taiwan。head8-7来说更多的是attends句子的停止符。head 6-11刚好是attends到句号.所以对于每一个heads来说,每一个代表的意义不一样。所以这就是bert很powerful,因为BERT本身的这个 mutil-head这个结构能抓住不一样的feature,无论是局部的feature还是全局的feature。
我们看完了head,对于BERT来说还有12个layer。每一个颜色代表一个layer,从第一个layer到第十二个layer,同样颜色的layer会比较接近,会在同一个颜色的区域。这就说在同一层的layer他们之间是比较相近的。对于12层+12个head的bert模型,对于每一层来说,他们head的功能都差不太多。对于每一个head里面来说,不同head表现的功能室完全不一样的。
那我们就问BERT学到了什么东西才使他这么强大,或者说对于不同的任务来说BERT到底学到了些什么东西。这个图是用BERT-LARGE model做的实验,针对了9种NLP常见的不一样的任务。这图横坐标代表Transformer有24层,纵坐标代表发挥作用的大小,指标高代表发挥作用大,就是蓝色所表示的那些。蓝色越长表示在这个任务中,这些layer发挥的作用越大。
BERT在fine-tune之后,就是说。大家熟悉ELMO就发现,BERT同样就像ELMO一样。ELMO给每一个word提供3个embedding,针对不同的task把这些embedding加起来。BERT同样,BERT有24层,那对于同一个词就有24个embedding。我们可以把这24个embedding做average。做average怎么给每一层增加权重,是通过不同任务训练出来的。权重就是蓝色代表,蓝色越长权重越大,在这一层中扮演的角色就越重。
BERT现在还提供了multilinggual BERT 版本,被训练了104个语言,我在工作中也是用了multilinggualBERT,效果是非常好的。工作中有一个指代关系,比如上一句提到了,谁是川普,下一句说他的老婆是谁,你要把上一句的川普给指代过来。如果我们有一个model,现在想转换成multilinggual model,直接把之前的embedding直接换成BERT。例如我先用word embedding,再用lstm去encode,然后我们把这部分直接换成BERT去encode。tranin的时候会把多种语言合起来,最后反而会比单独tranin英语、法语要好。
接下来我们有了pre-tranin,我们能干什么:
论文中提到了4种fine-tune之后的应用。第一种是classification,只用CLS这一种token。比如我现在有两个sentence,我可以预测哪一个sentence是下一句话,或者这两句话是不是一个意思有没有相关性。对于single sentence,也可以做成sentence的classification,比如这句话代表的事某一种类型或者某一个topic,或者说这句话的意图是哪一类。所以BERT model都不变,要想用BERT model做分类问题的时候,就直接用cls第一个token出来的hidden vector就可以了。
第二个应用比较广的就是QA中的应用。结构还是一样的结构。QA问题可以把sentence1换成question,sentence2换成paragraph。目的是给一个问题,要在paragraph中找到正确答案,对于QA问题需要设立两个额外的vector(start/end)。我们可以用start的vector与每一个paragraph对应的hidden vector做点乘,然后用softmax输出最大对应的token。end也同理,start与end之间就是对应的answer。如果start大于end,对于这个question,这个paragraph中没有答案。start和end向量也是初始化后自己学习的,因为整个training过程中是supervise learning,他有他的groundthruth。
上面更多讲的是BERT对于QA在任务级别上的使用,那从系统级别上来看,我们怎么在QA系统中应用BERT的呢?对于问答系统通常分为两部分,一部分是Retriever,一部分是QA,就是说有两个阶段,一个阶段是检索一个阶段是问答判断。
首先我们往往会把比较长的文档切割成段落或者句子。利用搜索的倒排序简历搜索查询的机制。如图中显示的第一部分是检索,和常规的检索过程是一样的例如使用BM25、RM3等基本的技术,我们是想尽可能找出和question有关的文章。第二个阶段是和之前介绍的问答判断的环节,BERT(?用BERT)在训练QA系统的时候会用到类似于SQuAD这样比较大的问答数据集合。一般有了Pre-treain的BERT,有了SQuAD数据集,在fine-tune BERT model。fine-tune之后被后来执行线上的推理。这是一个比较通用的系统构架,结合一些资料来看,吧BERT用到QA上来看表现可以提升30%。
接下来算是一个比较简单的任务,NER就是命名实体识别,识别一句话或者文档中有特定意义的实体(人名、地名、专有名词、时间、数量),BERT能完成这样的任务,本质上来说BERT是一个Squence2Squence的model。所以你把一个sentence输入到一个BERTmodel ,BERT对于每一个相对应的hidden vector属于哪一个类别,例如属于人名还是属于时间或者属于钱。所以对于NER来说只需要比较短的上下文。所以浅层的一些非语义特征貌似能很好的解决这一类的问题,BERT能发挥的余地就没有QA那样显著。BERT做摘要的提升是非常显著的,因为摘要往往会很长,很大一段或者好几个document,所以他的context就很长。对于NER和classification来说BERT往往不能很好的发挥它的作用,就像杀鸡用牛刀,有力使不出来。
下面再简单看一下BERT在chat bot里面,这里的例子举的是单轮对话的应用。比如说需要做intent classification和Slot filling(槽填充)。聊天机器人和对话系统最近几年都非常的活跃亚马逊和谷歌都花了很多资金人力物力在push这个方面,以我的观念还是在很初期,要达到用户满意的体验还有相当的距离。