BERT模型总结
说明:这几天整理了BERT模型相关资料,并总结如下,本文所提及BERT代码均来自 transformers。
BERT模型简介
Bert的基本原理和框架
BERT是Bidirectional Encoder Representations from Transformers的首字母缩写,整体是自编码语言模型,使用Maksed LM任务和Next Sentence Prediction任务进行联合。
- 任务一:Masked LM
即在输入一句话的时候随机的选取一些词汇抹去,然后根据剩余的词汇来预测被抹去的几个词分别是什么。
具体来说,BERT会随机选择(抹去)15%的词汇用于预测,对于原句中被抹去的词80%的采用[MASK]替换,10%的用任意词替换,剩下的10%保持不变。 - 任务二:Next Sentence Prediction
即给定一篇文章的两句话判断第二句话在文本中是否紧跟在第一句话后,在实际训练过程中从语料中随机选择50%正确句对和50%的错误句对。
BERT基本框架简图如下:
在这个框架简图中对于每一个输入的[Token]在每一层都会有一个Transformer的Encode与之对应,非常容易让人误解为BERT中每一层都会有512个transformer(BERT限制句子最大长度为512),以及BERT在训练时会将每个句子padding到512。但其实对于Transformer的Attention模块来说是,在代码中表现为和句子的长度无关,并不会将所有的句子padding到512。(关于这块内容在后续Transformer在BERT中的应用里会有详细说明)
BERT的输入和输出
BERT模型的输入有三种,字向量、文本向量和位置向量
- 字向量:该向量可以随机初始化,也可以利用word2vector等算法进行预训练以作为初始值
- 文本向量:该向量的取值在模型训练过程中自动学习,用于刻画全局语义信息,并与单词/字的语义信息相互融合。
- 位置向量:由于出现在文本不同位置的字/词所携带的语义信息存在差异,因此,BERT模型对于不同位置的字/词分别附加一个不同的向量以作区分,但是与Transformer不同之处在于这里的位置向量不是由三角函数给出,而是由模型在训练过程中自动学习。
BERT模型Embedding层如下:
class BertEmbeddings(nn.Module):
"""Construct the embeddings from word, position and token_type embeddings.
"""
def __init__(self, config):
super().__init__()
self.word_embeddings = nn.Embedding(config.vocab_size, config.hidden_size, padding_idx=config.pad_token_id)
self.position_embeddings = nn.Embedding(config.max_position_embeddings, config.hidden_size)
self.token_type_embeddings = nn.Embedding(config.type_vocab_size, config.hidden_size)
# self.LayerNorm is not snake-cased to stick with TensorFlow model variable name and be able to load
# any TensorFlow checkpoint file
self.LayerNorm = BertLayerNorm(config.hidden_size, eps=config.layer_norm_eps)
self.dropout = nn.Dropout(config.hidden_dropout_prob)
值得注意的是Bert模型限制了输入句子的最大长度(512),所以 self.position_embeddings
的输入为从1到N的递增序列,N为句子长度且小于512.
self.token_type_embeddings
的输入为句子标记,是一个取值为0或者1的向量
Transformer在BERT中的应用
BERT模型使用了Transformer的Encoder模块,原论文中作者分别用了12层和24层Transformer Encoder组装了两套BERT模型,分别是:
BERT_base: L=12, H=768, A=12, Total Parameters=110M
BERT_large: L=24, H=1024, A=16, Total Parameters=340M
其中层的数量(即Transformer Encoder模块的数量)为L,隐藏层的维度为H,自注意力头的个数为A,过滤器/前馈网络(Transformer Encoder端的feed-forward层)的维度为4H
Transformer的Encoder端结构如下图所示:
以下将详细介绍Transformer Encode端的各个子模块
-
多头self-attention模块
self-attention模块如下图所示:
Attention的输出为
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dkQKT)V
其中K,Q,V是由X通过三个参数矩阵 W Q , W K , W V W^Q,W^K,W^V WQ,WK,WV相乘得到的。
而多头的self-attention则由多组 W i Q , W i K , W i V W{^Q_i},W{^K_i},W{^V_i} WiQ,WiK,WiV相乘得到在讲结果拼接在一起送入一个全连接层。具体结构如下:
对应公式如下:
M u l t i H e a d ( Q , K , V ) = C o n c a t ( h e a d 1 , h e a d 2 , … … h e a d n ) W O w h e r e h e a d i = A t t e n t i o n ( X W i