预训练BERT学习笔记
一、概述
BERT(Bidirectional Encoder Representations from Transformers)作为Word2Vec的替代者,在NLP领域的11个方向大幅刷新了精度,其主要特点以下几点:
- 使用了Transformer作为算法的主要框架,Trabsformer能更彻底的捕捉语句中的双向关系;
- 使用了Mask Language Model(MLM)和Next Sentence Prediction(NSP)的多任务训练目标;
- 使用更强大的机器训练更大规模的数据,并且Google开源了BERT模型,用户可以直接使用BERT作为Word2Vec的转换矩阵并高效的将其应用到自己的任务中。
BERT的本质上是通过在海量的语料的基础上运行自监督学习方法为单词学习一个好的特征表示,可以直接使用BERT的特征表示作为该任务的词嵌入特征。ERT提供的是一个供其它任务迁移学习的模型,该模型可以根据任务微调或者固定之后作为特征提取器。
二、Transformer框架
Transformer使用了Attention机制,将序列中的任意两个位置之间的距离是缩小为一个常量;它不是类似RNN的顺序结构,因此具有更好的并行性,符合现有的GPU框架。
2.1 总体结构
Transformer的本质上是一个Encoder-Decoder的结构:
其编码器由6个编码block组成,同样解码器是6个解码block组成。与所有的生成模型相同的是,编码器的输出会作为解码器的输入,如下图所示:
在Transformer的encoder中,数据首先会经self-attention模块得到一个加权之后的特征向量 Z Z Z,即 A t t e n t i o n ( Q , K , V ) Attention(Q,K,V) Attention(Q,K,V):
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(dkQKTV)
得到 Z Z Z之后,被送到encoder的下一个模块,Feed Forward Neural Network。这个全连接有两层,第一层的激活函数是ReLU,第二层是一个线性激活函数,可以表示为:
F F N ( Z ) = m a x ( 0 , Z W 1 + b 1 ) W 2 + b 2 FFN(Z)=max(0,ZW_1+b_1)W_2+b_2 FFN(Z)=max(0,ZW1+b1)W2+b2
Decoder的结构与Encoder相比多了一个Encoder-Decoder Attention,两个Attention分别用于计算输入和输出的权值:
- Self-Attention:当前翻译和已经翻译的前文之间的关系;
- Encoder-Decnoder Attention:当前翻译和编码的特征向量之间的关系。
Encoder和Decoder的结构下图所示:
2.2 输入编码
首先通过Word2Vec等词嵌入方法将输入语料转化成特征向量,在最底层的block中, x x x将直接作为Transformer的输入,而在其他层中,输入则是上一个block的输出。
2.3 Self-Attention
Self-Attention是Transformer最核心的内容,其内容是为输入向量的每个单词学习一个权重,例如在下面的例子中我们判断it代指的内容,
The animal didn’t cross the street because it was too tired.
通过加权之后可以得到类似下图的加权情况:
在self-attention中,每个单词有3个不同的向量,它们分别是Query向量( Q Q Q),Key向量( K K K)和Value向量( V V V),长度均是64。它们是通过3个不同的权值矩阵由嵌入向量 X X X乘以三个不同的权值矩阵 W Q W^Q WQ, W K W^K WK, W V W^V WV得到,其中三个矩阵的尺寸均为 512 × 64 512 \times 64 512×64。
Attention的计算方法可以分成7步:
- 1.将输入单词转化成嵌入向量;
- 2.根据嵌入向量得到 q q q, k k k, v v v三个向量;
- 3.为每个向量计算一个score: s c o r e = q ⋅ k score = q·k score=q⋅k;
- 4.为了梯度的稳定,Transformer使用了score归一化,即除以 d k \sqrt{d_k} dk;
- 5.对score施以softmax激活函数;
- 6.softmax点乘Value值 v v v ,得到加权的每个输入向量的评分 v v v;
- 7.相加之后得到最终的输出结果 z z z: z = ∑ v z=\sum v