最近在工作中用bert做了不少NLP的算法任务,但是对bert的前世今生总感觉了解不够深入,通过开源社区的知识分享和原始论文的研读,做了以下学习笔记,结合工作中遇到场景,争取做到温故知新:
博客来源:【1】http://jalammar.github.io/illustrated-transformer/
【2】https://zhuanlan.zhihu.com/p/48508221
【3】https://zhuanlan.zhihu.com/p/46833276
1. Language Model
语言模型来辅助NLP任务已经得到了学术界较为广泛的探讨,通常有两种方式:
1.1 Feature-based方法
Feature-based指利用语言模型的中间结果也就是LM embedding, 将其作为额外的特征,引入到原任务的模型中,例如在下图中,采用了两个单向RNN构成的语言模型,将语言模型的中间结果
引入到序列标注模型中,如下图所示,其中左边部分为序列标注模型,也就是task-specific model,每个任务可能不同,右边是前向LM(Left-to-right)和后向LM(Right-To-Left), 两个LM的结果进行了合并,并将LM embedding与词向量、第一层RNN输出、第二层RNN输出进行了concat操作。
1.2 Fine-tuning方法
Fine-tuning方式是指在已经训练好的语言模型的基础上,加入少量的task-specific parameters, 例如对于分类问题在语言模型基础上加一层softmax网络,然后在新的语料上重新训练来进行fine-tune。
又比如,针对实体识别,fine-tuning的方式就是在语言模型的基础上加一层CRF层,并在实体标注的训练语料重新训练模型。
首先语言模型采用了Transformer Decoder的方法来进行训练,采用文本预测作为语言模型训练任务,训练完毕之后,加一层Linear Project来完成分类/相似度计算等NLP任务。因此总结来说,LM + Fine-Tuning的方法工作包括两步:(1)构造语言模型,采用大的语料A来训练语言模型(2)在语言模型基础上增加少量神经网络层来完成specific task例如序列标注、分类等,然后采用有标记的语料B来有监督地训练模型,这个过程中语言模型的参数并不固定,依然是trainable variables.
2. Transformer
2.1 什么是Transformer
个人理解:一个解决长期依赖的,不依赖顺序的,并行的特征抽取器。
Transformer中抛弃了传统的CNN和RNN,整个网络结构完全是由Attention机制组成。更准确地讲,Transformer由且仅由self-Attention和Feed Forward Neural Network组成。
采用Attention机制的原因是考虑到RNN(或者LSTM,GRU等)的计算限制为是顺序的,也就是说RNN相关算法只能从左向右依次计算或者从右向左依次计算,这种机制带来了两个问题:(1)时间片 t的计算依赖 t-1时刻的计算结果,这样限制了模型的并行能力;(2)顺序计算的过程中信息会丢失,尽管LSTM等门机制的结构一定程度上缓解了长期依赖的问题,但是对于特别长期的依赖现象,LSTM依旧无能为力。
首先它使用了Attention机制,将序列中的任意两个位置之间的距离是缩小为一个常量;其次它不是类似RNN的顺序结构,因此具有更好的并行性,符合现有的GPU框架。
Transformer的本质上是一个Encoder-Decoder的结构,可以按下图结构进行理解:
如论文中所设置的,编码器由6个编码block组成,同样解码器是6个解码block组成。与所有的生成模型相同的是,编码器的输出会作为解码器的输入,如下图所示:
在Transformer的encoder中,数据首先会经过一个叫做‘self-attention’的模块得到一个加权之后的特征向量 Z ,这个 Z 便是论文公式1中的 [公式1] :
得到 [公式1]之后,它会被送到encoder的下一个模块,即Feed Forward Neural Network。这个全连接有两层,第一层的激活函数是ReLU,第二层是一个线性激活函数,可以表示为:
在最底层的block中,x将直接作为Transformer的输入,而在其他层中,输入则是上一个block的输出。
Decoder的结构如下图所示,它和encoder的不同之处在于Decoder多了一个Encoder-Decoder Attention,两个Attention分别用于计算输入和输出的权值:Self-Attention:当前翻译和已经翻译的前文之间的关系;Encoder-Decoder Attention:当前翻译和编码的特征向量之间的关系。
2.2 Self-Attention
Self-Attention是Transformer最核心的内容,其核心内容是为输入向量的每个单词学习一个权重
在self-attention中,每个单词有3个不同的向量,它们分别是Query向量( Q),Key向量( K )和Value向量(V),长度均是64。它们是通过3个不同的权值矩阵由嵌入向量 [公式] 乘以三个不同的权值矩阵 W(q),W(k),W(v)得到,其中三个矩阵的尺寸也是相同的。均是 512*64。
Multi-Head Attention:Multi-Head Attention相当于h个不同的self-attention的集成(ensemble),在这里我们以h=8举例说明。Multi-Head Attention的输出分成3步:
将数据X分别输入到图13所示的8个self-attention中,得到8个加权后的特征矩阵:
将8个Z(i)按列拼成一个大的特征矩阵;特征矩阵经过一层全连接后得到输出Z 。
2.3 Position Embedding
截止到已经介绍的模块,Transformer模型并还没有具备捕捉顺序序列的能力,也就是说无论句子的结构怎么打乱,Transformer都会得到类似的结果。Transformer目前只是一个功能更强大的词袋模型而已。
为了解决这个问题,论文中在编码词向量时引入了位置编码(Position Embedding)的特征。具体地说,位置编码会在词向量中加入了单词的位置信息,这样Transformer就能区分不同位置的单词了。通过下图编码公式进行位置编码。
根据一下两个正余弦公式原理 ,这为模型捕捉单词之间的相对位置关系提供了保障。
2.4 Summary
decoder解码之后,解码的特征向量经过一层激活函数为softmax的全连接层之后得到反映每个单词概率的输出向量。此时便可以通过CTC等损失函数训练模型了。
而一个完整可训练的网络结构便是encoder和decoder的堆叠,如左图完整的Transformer的结构。
Transformer本质上也只是一个全连接(或者是一维卷积)加Attention的结合体。
Transformer的设计最大的带来性能提升的关键是将任意两个单词的距离是1,这对解决NLP中棘手的长期依赖问题是非常有效的。
Transformer失去的位置信息其实在NLP中非常重要,且捕捉局部特征的能力比较缺失,而论文中在特征向量中加入Position Embedding也只是一个权宜之计。
Transformer是第一个用纯attention搭建的模型(特征抽取器),不仅计算速度更快,在翻译任务上获得了更好的结果,也为后续的BERT模型做了铺垫。
论文参考
Reference:
[1] Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need [C]//Advances in Neural Information Processing Systems. 2017: 5998-6008.
[2] Bahdanau D, Cho K, Bengio Y. Neural machine translation by jointly learning to align and translate[J]. arXiv preprint arXiv:1409.0473, 2014.
[3] Devlin J, Chang M W, Lee K, et al. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding[J]. arXiv preprint arXiv:1810.04805, 2018.
[4] He K, Zhang X, Ren S, et al. Deep residual learning for image recognition[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 770-778.
[5]Peters, Matthew, et al. "Semi-supervised sequence tagging with bidirectional language models."Proceedings of the 55th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers). Vol. 1. 2017.
[6]Peters M, Neumann M, Iyyer M, et al. Deep Contextualized Word Representations[C]//Proceedings of the 2018 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies, Volume 1 (Long Papers). 2018, 1: 2227-2237.
[7]Radford A, Narasimhan K, Salimans T, et al. Improving language understanding by generative pre-training[J]. URL https://s3-us-west-2. amazonaws. com/openai-assets/research-covers/language-unsupervised/language_ understanding_paper. pdf, 2018.
[8]Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need[C]//Advances in Neural Information Processing Systems. 2017: 5998-6008.
[9]Pre-training of Deep Bidirectional Transformers for Language Understanding