0、Background
之前已经看过BERT模型,一直没有深入研究,最近工作上遇到点问题,试着用BERT模型解决
0.1、BERT 模型
BERT的全称是Bidirectional Encoder Representation from Transformers,是Google2018年提出的预训练模型,即双向Transformer的Encoder,从名字上也可以知道,是基于transformer的双向编码表示,说的再直白些,就是一个词向量工具,不过比传统word2vec和ELMo效果好太多,其根本原因是加入了attention机制,使其不管在decode还是encode(self-attention)步骤都可以考虑上下文信息对正处理字符的贡献程度。模型的主要创新点都在pre-train方法上,即用了Masked LM和Next Sentence Prediction两种方法分别捕捉词语和句子级别的representation。
从模型全称可知,BERT模型是基于transformer的,所以要想深入理解BERT,首先要深度剖析Transformer
0.2、Transformer
研究发现,Transformer模型是受attention机制启发来编码输⼊序列并解码出输出序列的。Transformer抛弃了卷积神经⽹络和循环神经⽹络的架构。它在计算效率上⽐基于循环神经⽹络的编码器—解码器模型通常更具明显优势。至此,引出本篇博客的中心也就是BERT模型的核心:attention
1、Attention
我们知道,在attention机制出现之前,词向量都是采用encode-decode训练出来,解码器在各个时间步根据输入序列的相同编码信息来decode,不同的只是在编码方式上采用的网络结构不同而已。而Attention机制则不同,其核心思想是解码器在每一时间步对输入序列中不同时间步的编码信息分配不同的attention(即权重),这也是注意力机制的由来。
也就是说,解码器在每一时间步使用不同的背景变量(编码器对输入序列的编码)。记ct’是解码器在时间步t’的背景变量,那么解码器在该时间步的隐藏状态可以改写为:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N5XBPcIJ-1572228258668)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1571383269518.png)]
这里的关键是如何计算背景变量ct’和如何使用它来更新隐藏状态st’。接下来分别介绍这两点。
1.1、计算背景变量
下图描绘了注意力机制如何为解码器在时间步2计算背景变量。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hrj60av6-1572228258675)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1571383525824.png)]
1、函数a根据解码器在时间步1的隐藏状态和编码器在各个时间步隐藏状态计算softmax的输入。
2、softmax输出概率分布并对编码器各个时间步的隐藏状态做加权平均,从而得到背景变量。记编码器在时间步t的隐藏状态为ht,总时间步数为T,那么解码器在时间步t’的背景变量为所有编码器隐藏状态的加权平均:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BAnn6m5u-1572228258678)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1571383841979.png)]
2、Attention的物理含义
一般在自然语言处理应用里会把Attention模型看作是输出Target句子中某个单词和输入Source句子每个单词的对齐模型,这是非常有道理的。
**目标句子生成的每个单词对应输入句子单词的概率分布可以理解为输入句子单词和这个目标生成单词的对齐概率,**这在机器翻译语境下是非常直观的:传统的统计机器翻译一般在做的过程中会专门有一个短语对齐的步骤,而注意力模型其实起的是相同的作用。
如果把Attention机制从上文讲述例子中的Encoder-Decoder框架中剥离,并进一步做抽象,可以更容易看懂Attention机制的本质思想。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gPMJGp3l-1572228258681)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1571384473632.png)]
我们可以这样来看待Attention机制(参考图9):将Source中的构成元素想象成是由一系列的<Key,Value>数据对构成,此时给定Target中的某个元素Query,通过计算Query和各个Key的相似性或者相关性,得到每个Key对应Value的权重系数,然后对Value进行加权求和,即得到了最终的Attention数值。所以本质上Attention机制是对Source中元素的Value值进行加权求和,而Query和Key用来计算对应Value的权重系数。
至于Attention机制的具体计算过程,如果对目前大多数方法进行抽象的话,可以将其归纳为两个过程:第一个过程是根据Query和Key计算权重系数,第二个过程根据权重系数对Value进行加权求和。而第一个过程又可以细分为两个阶段:第一个阶段根据Query和Key计算两者的相似性或者相关性;第二个阶段对第一阶段的原始分值进行归一化处理;
3、Self-Attention模型
Self Attention也经常被称为intra Attention(内部Attention),最近一年也获得了比较广泛的使用,比如Google最新的机器翻译模型内部大量采用了Self Attention模型。
在一般任务的Encoder-Decoder框架中,输入Source和输出Target内容是不一样的,比如对于英-中机器翻译来说,Source是英文句子,Target是对应的翻译出的中文句子,Attention机制发生在Target的元素Query和Source中的所有元素之间。**而Self Attention顾名思义,指的不是Target和Source之间的Attention机制,而是Source内部元素之间或者Target内部元素之间发生的Attention机制,也可以理解为Target=Source这种特殊情况下的注意力计算机制。**其具体计算过程是一样的,只是计算对象发生了变化而已,所以此处不再赘述其计算过程细节。
很明显,引入Self Attention后会更容易捕获句子中长距离的相互依赖的特征,因为如果是RNN或者LSTM,需要依次序序列计算,对于远距离的相互依赖的特征,要经过若干时间步步骤的信息累积才能将两者联系起来,而距离越远,有效捕获的可能性越小。
距离的相互依赖的特征,要经过若干时间步步骤的信息累积才能将两者联系起来,而距离越远,有效捕获的可能性越小。
但是Self Attention在计算过程中会直接将句子中任意两个单词的联系通过一个计算步骤直接联系起来,所以远距离依赖特征之间的距离被极大缩短,有利于有效地利用这些特征。除此外,Self Attention对于增加计算的并行性也有直接帮助作用。这是为何Self Attention逐渐被广泛使用的主要原因。