理解bert首先需要,attention和transformer理论的铺垫。
BERT 的 PyTorch 实现(实现方式!记得看!)
1、bert理论基础
BERT的全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder,因为decoder是不能获得要预测的信息的。
BERT采用两阶段过程,第一个阶段是利用语言模型进行预训练,第二阶段通过 Fine-tuning 的模式解决下游任务。
bert是字符级别切词。切出来是单字,对于每个字去预测emb。
bert是自监督模型,自己产生label。(1、类似w2v,中心词预测上下文词;2、句对预测,一篇文章里随便找2个句子,判断是不是语句连贯的。)
seq_masks:指定对哪些字进行self-attentin;
seq_segments: 单个句子都是0;
1.1、Bert是如何基于Transformer Encoder的?
我们知道Bert,XLNet等架构都是基于Encoder的。而完全没有Decoder的存在,那么它是对Encoder做如何的改造的呢?
很少有人会专门把这个问题拿出来说,因为它的思路真的很朴素。
当encoder当做语言模型的一部分,每一个encoder layer的输出都输入到下一个encoder layer里面。
也就是说,Encoder作为Transformer一部分的时候,每一个encoder的输出会传入Decoder。而作为语言模型的一部分的时候,每一个encoder的输出会作为下一个encoder的输入。
而不管是输入到Decoder还是输入到Encoder,都是作为Multi Head Attention的一部分。
- 对于Decoder来说是作为q和k;
- 对于语言模型来说是作为q和k和v;
1.2、预训练阶段
1.3、fine-tining阶段
Next Sentence Prediction(NSP)
为了训练一个理解句子间关系的模型,例如QA和NLI之类的任务,引入一个下一句预测任务。这一任务的训练语料可以从语料库中抽取句子对包括两个句子A和B来进行生成,其中50%的概率B是A的下一个句子,50%的概率B是语料中的一个随机句子。NSP任务预测B是否是A的下一句。NSP的目的是获取句子间的信息,这点是语言模型无法直接捕捉的。
Google的论文结果表明,这个简单的任务对问答和自然语言推理任务十分有益,但是后续一些新的研究《Roberta: A robustly optimized BERT pretraining approach》发现,去掉NSP任务之后模型效果没有下降甚至还有提升。我们在预训练过程中也发现NSP任务的准确率经过1-2个Epoch训练后就能达到98%-99%,去掉NSP任务之后对模型效果并不会有太大的影响。
标注:
绿色的所有T维度是[B,N,768],N是seq_len=128。C则是[B,1,768],就是['cls']这个字的embsize是多少。
2、总结
BERT是两阶段模型,第⼀阶段双向语⾔模型预训练,这里注意要用双向⽽不是单向,第⼆阶段采 用具体任务Fine-tuning或者做特征集成;第⼆是特征抽取要用Transformer作为特征提取器⽽不是 RNN或者CNN;第三,双向语⾔模型可以采取MASK的⽅法去做。
BERT用的是Transformer,也就是相对rnn更加⾼效、能捕捉更长距离的依赖。对比起之前的预 训练模型, 它捕捉到的是真正意义上的bidirectional context信息。 但是, 他的缺点是:[MASK]标 记在实际预测中不会出现, 训练时用过多[MASK]影响模型表现;每个batch只有15%的token被预 测, 所以BERT收敛得比left-to-right模型要慢(它们会预测每个token)。 关于实战请参考这篇: https://zhuanlan.zhihu.com/p/61671334,写的很好很清晰明了。
3、bert的应用场景
nlp任务分类
文本纠错
task-oriented daloge
知识图谱
第一步
抽取entity
。。。
抽取relation(边)
集合了很多的任务
https://super.gluebenchmark.com/
参考:
bert:当我们说GPT2是基于Transformer Decoder的时候,我们在说什么? - Jotline的文章 - 知乎
transformer模型(一)-注意力机制-位置编码-attention is all you need