1、BERT简介
首要需求介绍什么是自监督学习。咱们知道监督学习是有清晰的样本和对应的标签,将样本丢进去模型练习而且将练习成果将标签进行比较来批改模型,如下图:
而自监督学习便是没有标签也要自己创立监督学习的条件,即当前只要样本x但是没有标签y\hat{y},那详细的做法便是将样本x分红两部分x′x\prime和x′′x\prime \prime,其中一部分作为输入模型的样本,另一部分来作为标签:
如果觉得很笼统也不要紧,请继续往下阅览将会逐渐清晰这个定义。
1.1、BERT的masking
BERT的架构能够简略地看成跟Transformer中的Encoder的架构是相同的(能够参阅我这篇文章[点此]([机器学习]李宏毅——Transformer – ())),其完成的功能都是承受一排向量,并输出一排向量。而BERT特别的当地在于它关于承受的一排输入的向量(通常是文字或许语音等)会随机挑选某些向量进行“遮挡”(mask),而进行遮挡的方式又分为两种:
- 第一种是将该文字用一个特别的字符来进行替代
- 第二种是将该文字用一个随机的文字来进行替代
而这两种办法的挑选也是随机的,因而便是随机挑选一些文字再随机挑选mask的计划来进行遮挡。然后就让BERT来读入这一排向量并输出一排向量,那么练习过程便是将刚才遮挡的向量其对应的输出向量,通过一个线性变换模型(乘以一个矩阵)再通过softmax模块得到一个result,包含该向量取到一切文字的一切概率,尽管BERT不知道被遮挡的向量代表什么文字但咱们是知道的,因而咱们就拿答案的文字对应的one-hat-vector来与向量result最小化交叉熵,从而来练习BERT和这个线性变换模块,总体能够看下图:
1.2、Next Sentence Prediction
这个使命是判别两个语句它们是不是应该连接在一起,例如判别“我爱”和“我国”是不是应该连在一起,那么在BERT中详细的做法为:
- 先对两个语句进行处理,在第一个语句的前面加上一个特别的成为CLS的向量,再在两个语句的中心加上一个特别的SEP的向量作为分隔,因而就拼成了一个较长的向量集
- 将该长向量集输入到BERT之中,那么就会输出相同数目的向量
- 但咱们只重视CLS对应的输出向量,因而咱们将该向量同样通过一个线性变换模块,并让这个线性变换模块的输出能够用来做一个二分类问题,便是yes或许no,代表这两个语句是不是应该拼在一起
详细如下图:
而前面咱们介绍了两种BERT的使用场景,看起来好像都是填空题或许判别题,那么是否BERT只能够用于这种场景之下呢?当然不是!BERT具有强大的才能,它不仅能够用来处理咱们感兴趣的下流使命,更有趣的是,它只需求将刚才练习(Pre-train)完成的能够处理填空题使命的简略BERT进行微调(Fine-tune)就能够用来高效地处理一些下流、杂乱的使命。也便是说BERT只需求先用简略的使命来进行Pre-train,然后再进行微调就能够用于咱们感兴趣的下流杂乱使命!
这里补充一个知识点,由于BERT这类模型能够进行微调来处理各种下流使命,因而有一个使命集为GLUE,里面包好了9种自然言语处理的使命,一般评判BERT这种模型便是将BERT分为微调来处理这9个使命然后对正确率等进行均匀。9个使命如下:
1.3、How to ues BERT
Case 1
Case 1 是承受一个向量,输出一个分类,例如做语句的情感剖析,对一个语句判别它是积极的仍是消沉的。那么如何用BERT来处理这个问题呢,详细的流程如下:
- 在语句对应的一排向量之前再加上CLS这个特别字符所对应的向量,然后将这一整排向量放入BERT之中
- 咱们只重视CLS对应的输出向量,将该向量通过一个线性变换(乘上一个矩阵)后再通过一个softmax,输出一个向量来表示分类的成果,表示是积极的仍是消沉的
而重要的当地在于线性变换模块的参数是随机初始化的,而BERT中的参数是之前就pre-train的参数,这样会比随机初始化的BERT更加高效。而这也代表咱们需求许多语句情感剖析的样本和标签来让咱们能够通过梯度下降来练习线性变换模块和BERT的参数。如下图:
一般咱们是将BERT和线型变换模块一起称为Sentiment analysis。
Case 2
这个使命是输入一排向量,输出是和输入相同数目的向量,例如词性标示问题。那么详细的办法也是很相似的,BERT的参数也是通过pre-train得到的,而线性改变的参数是随机初始化的,然后就通过一些有标示的样本进行学习,如下图:
Case 3
在该使命中,输入是两个语句,输出是一个分类,例如自然言语揣度问题,输入是一个假定和一个推论,而输出便是这个假定和推论之间是否是抵触的,或许是相关的,或许是没有关系的:
那么BERT对这类使命的做法也是相似的,由于要输出两个语句,因而在两个语句之间应该有一个SEP的特别字符对应的向量,然后在开头也有CLS特别字符对应的向量,而且由于输出是单纯一个分类,那重视的也是CLS对应的输出向量,将其放入线性变换模块再通过softmax就得到分类成果了。参数的设置跟之前都是相同的。如下图:
Case 4
BERT还能够用来做问答模型!但是对这个问答模型具有必定的约束,即需求供给给它一篇文章和一系列问题,而且要保证这些问题的答案都在文章之间出现过,那么通过BERT处理之后将会对一个问题输出两个正整数,这两个正整数就代表问题的答案在文章中的第几个单词到第几个单词这样截出来的语句,即下图的s和e就能够截取出正确答案。
那么BERT详细在做这件事时,也是将文章和问题看成两个向量集,那么同样在它们中心要加上SEP,在开头要加上CLS,然后通过BERT之后会发生相同数目的向量。那么关键当地在于会初始化两个向量称为A和B,它们的长度和BERT输出的向量的长度相同,那首要拿A和文章对应的一切输出向量逐一进行点乘,每一个都得到一个数字,再全部通过softmax,然后看看哪一个最终的成果最大,最大的便是对应s的取值;B也是同理通过相同的处理最终取最大的作为e的取值,那么得到s和e之后就能够去文章中取答案了!如下图:
那么咱们要练习的便是随机初始化的两个向量和已经pre-train的BERT。
1.4、Pre-train seq2seq model
前面介绍的BERT的各种使用场景都没有用在seq2seq的场景,那么如果要将BERT用于这个场景呢还需求再加上一个Dncoder,即:
先将原始的输入加入必定的搅扰,然后通过Encoder和Decoder之后呢输出的向量是和原来的输入具有相同的数目,那么目的便是期望输出向量能够和未加搅扰之前的向量集满足挨近。
详细的搅扰办法也是多种多样:
2、BERT的奇闻轶事
2.1 Why does BERT work?
先从一个现实来阐明为什么BERT能够在文字处理中如此有效。
在BERT中,如果咱们给它一个语句,也便是一排向量,那么它对应输出的向量能够以为里面包含了对应输入向量文字的意义,怎样理解呢?看下面的比如,例如咱们给输入”台湾大学“,那么BERT的对应”大“的输出其实能够以为它是知道其意义的。这么阐明或许有点笼统,咱们需求通过下一个比如来解说。
由于中文中常常存在一词多意,那么现在假定苹果的苹的两个意义,搜集关于苹果的各种语句和关于苹果手机的各种语句让BERT先进行练习, 然后再输入关于苹果的五条语句和关于苹果手机的五条语句,如下图:
然后咱们就来查看,两个意义中的“苹”字对应的输出向量之间的相似性,成果如下图:
能够看到,关于吃的苹果的语句之中“苹”的对应输出向量,它们彼此之间相似性较高;关于苹果手机的也是;但是如果是不同的“苹“那么相似性则较低。
为什么会有这种奇特的现象呢?难道是BERT学会了这个文字的多个意义吗?
实际上是由于在练习的时分咱们将”苹“遮住的话,BERT要从上下文来剖析做出猜测,它会发现这两种不同的”苹“所对应的上下文经常是不相同的,因而它做出猜测的输出向量也就会存在差异!在许多论文上都是这个说法的。或许也能够以为由于上下文给这个遮掉的单词赋予了必定的意义,那么有或许,具有相似意义的单词在上下文就会比较挨近(例如食物的话上下文或许都跟餐具有关),那么在做出猜测的时分就向量比较挨近。
2.2、Multi-lingual BERT
这个模型也便是用许多种言语来练习一个模型:
那么有一个实验室表现了BERT的奇特之处,也便是用了104种言语Pre-trainBERT,也便是教BERT做填空题,然后再用英文的问答材料来教BERT做英文的问答题,再在测验集顶用中文的问答题来测验BERT,它的成果如下,能够到达这个正确率真的很令人吃惊!由于在BERT之前最好的是QANet,它的正确率比这样的BERT还低!
2.3、言语的资讯
通过上述中英文的练习,现在考虑的问题是:为什么你给的是英文的练习集,在测验集的中文中,它不会给你在猜测的当地猜测出英文呢?那么这是否能够阐明在BERT中实际上它是能够区分不同言语之间的差别,而不是单纯的将其看做一个向量呢?那么来做下面这个实验:如果把一切中文都放进去BERT得到输出然后均匀得到一个向量,英文也是相同做法得到一个向量,然后将这两个向量进行相减得到一个差值的向量;再将英文一句话丢进去BERT,得到输出后加上这个差值的向量,会出现这个奇特的现象:
能够发现竟然能够直接完成了翻译的功能!再来看更杂乱的比如:
能够看到尽管BERT不能够彻底地将中文转为英文,但是在某些单词上仍是能够正确的转换的!这也表达了BERT的强大之处。
3、GPT的野望
GPT做的事情和BERT所做的填空题是不相同的,GPT详细做的是根据当前的输入猜测下一个时刻或许的token,例如下图:
即给出Begin of Sequence,就猜测出台,然后给出BOS和台就猜测出湾,以此类推。对输出向量的处理便是右边那部分,先通过一个线性改变后再通过softmax得到成果向量,再跟抱负成果来核算交叉熵,然后是最小化交叉熵来练习的。
那么要注意的当地是它猜测的时分看到的只要上文罢了,即不知道后面的语句是什么。