BERT是基于微调的多层Transformer编码器,目标是生成语言模型,只需要transformer的encoder部分。BERT 使用 Transformer 做encoder,可以有更深的层数、更好并行性。
BERT 模型增加了词向量模型泛化能力,充分描述字符级、词级、句子级甚至句间关系特征。
模型非常的深,12层,并不宽(wide),中间层只有1024。
BERT 五个关键:
Pre-training、Deep、Bidirectional、Transformer、Language Understanding
Bert用两个无监督预测任务做预训练,Masked LM和Next Sentence Prediction
Bert使用中的一些建议:
使用Bert模型一定要跑在GPU上,不论是训练还是预测阶段。跑在GPU上速度是CPU的60多倍。
使用Bert做分类,seq2seq,序列标注等很多任务上,Bert的学习速率不宜调的过高,否则训练的效果很差。官方代码中学习速率是5e-5。训练方式要使用官方优化器,其学习速率是动态调整的。
建议Bert先参与训练,然后固定Bert参数,再训练N轮。这样最后的效果比较好。
Bert不参与训练需要调整两个地方,创建模型时is_train=False,还有Bert参数不参与反向传播。
Bert的预训练:BERT是一个语言模型语,而语言模型通常采用大规模、与特定NLP任务无关的文本语料进行训练,目标是学习语言本身应该是什么样的,其预训练过程就是逐渐调整模型参数,使得模型输出的文本语义表示能够刻画语言的本质,便于后续针对具体NLP任务作微调。BERT提出了两个预训练任务:Masked LM和Next Sentence Prediction。
Masked LM:给定一句话,随机抹去一个或几个词,根据剩余词汇预测被抹去词。实际中,随机选择15%的词汇用于预测。对于在原句中被抹去的词汇,80%情况下采用一个特殊符号[MASK]替换,10%情况下采用一个任意词替换,剩余10%情况下保持原词汇不变。这样在后续微调任务中语句中并不会出现[MASK]标记;预测一个词汇时,模型不知道输入对应位置的词汇是否为正确的词汇,使模型更多地依赖于上下文信息去预测词汇,并且赋予了模型一定的纠错能力。
Next Sentence Prediction:给定文章中的两句话,判断第二句话在文本中是否紧跟前一句话。相当于段落重排序的简化版;实际预训练过程中,从文本语料库中随机选择50%正确语句对和50%错误语句对进行训练,与Masked LM任务相结合,让模型能够更准确地刻画语句乃至篇章层面的语义信息。
BERT模型通过对Masked LM任务和Next Sentence Prediction任务进行联合训练,使模型输出的每个字/词的向量表示都能尽可能全面、准确地刻画输入文本(单句或语句对)的整体信息,为后续的微调任务提供更好的模型参数初始值。
Transformer是组成BERT的核心模块,而Attention机制又是Transformer中最关键的部分。
Attention: “注意力机制”,让神经网络把“注意力”放在一部分输入上,即:区分输入的不同部分对输出的影响。可以从增强字 / 词的语义表示这一角度来理解一下Attention机制。一个字 / 词在一篇文本中表达的意思通常与它的上下文有关。比如:光看“鹄”字,我们可能会觉得很陌生,而看到它的上下文“鸿鹄之志”后,就熟悉了。因此字 / 词的上下文信息有助于增强其语义表示。上下文中不同字 / 词对增强语义表示所起的作用往往不同。如上“鸿”字对理解“鹄”字的作用最大,而“之”字的作用较小。为利用上下文字信息增强目标字的语义表示,就可用Attention机制。
Attention机制主要涉及到三个概念:Query、Key和Value。在上面增强字的语义表示场景中,目标字及其上下文的字都有各自的原始Value,Attention机制将目标字作为Query、上下文的各个字作为Key,将Query与各个Key的相似性作为权重,把上下文各个字的Value融入目标字的原始Value中。Attention机制将目标字和上下文各个字的语义向量表示作为输入,首先通过线性变换获得目标字的Query向量表示、上下文各个字的Key向量表示以及目标字与上下文各个字的原始Value表示,然后计算Query向量与各个Key向量的相似度作为权重,加权融合目标字的Value向量和各个上下文字的Value向量,作为Attention的输出,即:目标字的增强语义向量表示。
Self-Attention:对于输入文本,对其中的每个字分别增强语义向量表示,将每个字作为Query,加权融合文本中所有字的语义信息,得到各个字的增强语义向量,如下图所示。此时Query、Key和Value的向量表示均来自于同一输入文本,则该Attention机制也叫Self-Attention。
Multi-head Self-Attention:为增强Attention的多样性,利用不同的Self-Attention模块获得文本中每个字在不同语义空间下的增强语义向量,并将每个字的多个增强语义向量进行线性组合,从而获得一个最终的与原始字向量长度相同的增强语义向量。
举例理解对多头self-attention(非严格正确):例句,“南京市长江大桥”,在不同语义场景下有不同的理解:“南京市 / 长江大桥”,或“南京市长 / 江大桥”;对于这句话中的“长”字,在前一种语义场景下需要和“江”字组合才能形成一个正确的语义单元;而在后一种语义场景下,则需要和“市”字组合才能形成一个正确的语义单元。而Self-Attention旨在用文本中的其它字来增强目标字的语义表示。在不同的语义场景下,Attention所重点关注的字应有所不同。因此 Multi-head Self-Attention可理解为考虑多种语义场景下目标字与文本中其它字的语义向量的不同融合方式。Multi-head Self-Attention的输入和输出在形式上完全相同,输入为文本中各个字的原始向量表示,输出为各个字融合了全文语义信息后的增强向量表示。多头Self-Attention是对文本每个字增强语义向量的黑盒。
Transformer 编码器:
在Multi-headSelf-Attention的基础上再添加一些组件就构成了Transformer Encoder。Transformer模型还包含Decoder模块生成文本,但BERT模型中并未使用到Decoder模块,此处不详述。如下图的Transformer结构:
Transformer Encoder的输入和输出在形式上完全相同,也可以表示为将输入文本中各个字的语义向量转换为相同长度的增强语义向量的一个黑盒。
Bert模型:把多个Transformer Encoder一层层地堆叠起来就是BERT模型。
原始的Bert 使用12层和24层Transformer Encoder组装了两套BERT模型,参数为110M和340M。
参考:
https://www.jianshu.com/p/4dbdb5ab959b
https://www.jianshu.com/p/bfd0148b292e
https://blog.csdn.net/weixin_43922901/article/details/102602557 (bert参数大小计算)
https://www.cnblogs.com/dogecheng/p/11617940.html (keras_bert, bert4keras使用)
https://blog.csdn.net/yangdan1025/article/details/102913566
https://www.jianshu.com/p/45e95b4bd705
https://github.com/huwenxianglyy/bert-use-demo
https://cloud.tencent.com/developer/article/1389555(Bert详述)