BERT:是预训练语言模型之一,其全称是Bidirectional Encoder Representations from Transformers。
语言模型是指:
对于任意的词序列,它能够计算出这个序列是一句话的概率。
![](https://i-blog.csdnimg.cn/blog_migrate/dd89aedc5dab4fd2f539beb4d79e8bfc.png)
定义:假设我们要为中文创建一个语言模型,V表示词典,V={猫,狗,机器......语言},wi∈V,语言模型就是这样一个模型:给定词典 V ,能够计算出任意单词序列w1,w2,w3......wn,是一句话的概率 p ( w 1 , w 2 , . . . , w n )
预训练是一种迁移学习的概念,预训练模型产生的主要原因是在部分实验领域中,训练样本有限,因此可采取使用其他相近领域存在的大量数据进行模型训练,之后进行微调,得到目标输出。换言之,假设我们有大量的维基百科数据,那么我们可以用这部分巨大的数据来训练一个泛化能力很强的模型,当我们需要在特定场景使用时,例如做医学命名实体识别,那么,只需要简单的修改一些输出层,再用我们自己的数据进行一个增量训练,对权重进行一个轻微的调整即可。典型的预训练语言模型:ELMO、GPT、BERT
BERT的基础结构
![](https://i-blog.csdnimg.cn/blog_migrate/d408bd5fa818979f7938824e4aacef2f.png)
N表示多个Encoder块进行堆叠,其中BERT BASE使用12层Encoder,Bert Large使用的是24层Encoder。注意:Bert是由12层的Encoder堆叠在一起,而不是12层的Transform堆叠在一起。
(1)Input:
input=token emb+segment emb+position emb
![](https://i-blog.csdnimg.cn/blog_migrate/e2818b3f1d04ab926f3da9eed634e0fe.png)
Token Embedding:
将各个词转换成固定维度的向量,是每个输入字符的编码映射。在BERT中,每个词会被转换成768维的向量表示。在实际代码实现中,输入文本在送入token embeddings 层之前要先进行tokenization处理。此外,两个特殊的token会被插入到tokenization的结果的开头 ([CLS])和结尾 ([SEP])
Segment Embedding:
用于区分一个token属于句子对中的哪个句子。Segment Embeddings 层只有两种向量表示。前一个向量是把0赋给第一个句子中的各个token, 后一个向量是把1赋给第二个句子中的各个token。如果输入仅仅只有一个句子,那么它的segment embedding就是全0 。
Position Embedding:
Transformers无法编码输入的序列的顺序性,所以要在各个位置上学习一个向量表示来将序列顺序的信息编码进来,Bert采用随机初始化让模型学习每个位置的Embedding,区别于transofrm使用正余弦函数进行Position Embedding。加入position embeddings会让BERT理解下面下面这种情况,“ I think, therefore I am ”,第一个 “I” 和第二个 “I”应该有着不同的向量表示。
(2)Multi-head Attention
注意力机制:
![](https://i-blog.csdnimg.cn/blog_migrate/8d675f9f5945016c952074d0fb1253d4.png)
Self-Attention 的输入用矩阵X进行表示,则可以使用线性变阵矩阵WQ,WK,WV计算得到Q,K,V。
![](https://i-blog.csdnimg.cn/blog_migrate/5ccfb3805a43ddfffec68ea357286fe2.png)
self-attention的输出:
![](https://i-blog.csdnimg.cn/blog_migrate/28861ce5498c8156e7b7779817a4a610.png)
公式中矩阵Q和K的转置进行点乘,点乘的结果是一个向量在另一个向量上投影的长度,是一个标量,可以反映两个向量之间的相似度,相似度越高,点乘结果越大,意味着注意力越关注。为了防止内积过大,softmax之后梯度较小,容易造成梯度消失,因此除以dk的平方根。
多头注意力:多头相当于把原始信息分割到不同空间,保证注意力能够获取到多个子空间中的信息
(3)Add & Norm
![](https://i-blog.csdnimg.cn/blog_migrate/4c2c119bec530983b0efd49498be4e6f.png)
Add指 X+MultiHeadAttention(X),是一种残差连接,通常用于解决多层网络训练带来的网络退化问题
![](https://i-blog.csdnimg.cn/blog_migrate/565926a318e0ae04aa1e6a22856a3abe.png)
如果对函数求导,可以看出x的导数为1,另外的F(x,w)导数不可能一直为-1,所以不会出现梯度消失问题
批量归一化(Batch Normalization):是对每个特征/通道里的元素进行归一化。(不适合序列长度会变的NLP应用)
·层归一化(Layer Normalization):是对每个样本里面的元素进行归一化。
![](https://i-blog.csdnimg.cn/blog_migrate/ad3b89445cf802bd927846f98a06923d.png)
BN:是对不同样本里的每个特征或通道里的元素进行归一化
![](https://i-blog.csdnimg.cn/blog_migrate/26a4f1e5720481b0ca385810d29e0917.png)
LN:NLP中句子长度不一致,Layer Norm是对每个样本里的元素进行归一化
(4)Feed Forward
Feed Forward 层比较简单,是一个两层的全连接层,第一层的激活函数为 Relu,第二层不使用激活函数,对应的公式如下:
![](https://i-blog.csdnimg.cn/blog_migrate/eec1f947706c24deeb1716bb0948ea00.png)
(5)BERT的预训练
BERT的预训练阶段包括两个任务:
(1)掩码语言模型(MLM)
(2)下一个句子预测(Next Sentence Prediction,NSP)
Task 1:MLM
MLM: 可以形象地称为完形填空问题,随机掩盖掉每一个句子中15%的词,用其上下文来去判断被盖住的词原本应该是什么。
这里需要说明,GPT使用统计语言模型,这限制了它只能是单向的,而BERT通过Masked LM能够提取上下文信息。更一般地:
![](https://i-blog.csdnimg.cn/blog_migrate/29d39afbf831b97754398548ef6871bb.png)
任务:训练模型去预测 [mask] 位置的词,使预测出 hairy的可能性最大,在这个过程中就将上下文的语义信息学习并体现到模型参数中
MLM存在的问题:
pre-train 阶段与 fine-tune 阶段不匹配,因为在 fine-tune 期间不会有 [mask] token ;
每个batch只预测15%的token,因此需要训练更多的训练步骤才能收敛;
因此,
防止模型过度关注特定位置或masked token,模型随机遮掩15%的单词;
mask token并不总被[mask]取代,在针对特定任务fine-tune时不需要进行[mask]标注;
具体做法如下:
![](https://i-blog.csdnimg.cn/blog_migrate/e73bce3d1b1cfd93b8a4cf9685b2533b.png)
Task 2:Next Sentence Prediction
任务:训练数据选择两个句子,一般是一个正样本,一个负样本,判断第二个句子是不是真正的第一个句子的下文。
其输入形式是,开头是一个特殊符号[CLS],然后两个句子之间用[SEP]隔断:
·Input = [CLS] the man went to [MASK] store [SEP]he bought a gallon [MASK] milk [SEP]
Label = IsNext
·Input = [CLS] the man [MASK] to the store [SEP]penguin [MASK] are flight ##less birds[SEP]
Label = NotNext
(6)BERT的应用
![](https://i-blog.csdnimg.cn/blog_migrate/86ae7b609697c39dafa69f952c305e78.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4869a05844d625bef09c42702a002c18.png)