以google神经机器翻译(NMT)为例网络
无attention:函数
encoder-decoder在无attention机制时,由encoder将输入序列转化为最后一层输出state向量,再由state向量来循环输出序列每一个字符。优化
attention机制:google
将整个序列的信息压缩在一维向量里形成信息丢失,而且考虑到输出的某个字符只与输入序列的某个或某几个相关,与其余输入字符不相关或相关性较弱,由此提出了attention机制。在encoder层将输入序列的每一个字符output向量以不一样权重进行组合再decode输出字符,每须要输出一个字符,encoder层权重序列都会变,这就能够理解为须要输出的字符是由哪些或那个字符影响最大,这就是注意力机制。 .net
attention权重的得到须要经过一个函数层得到,而该函数参数须要经过training来优化,详细理解能够参考我这篇blog翻译
从加强字/词的语义表示这一角度来理解一下Attention机制:code
Attention机制主要涉及到三个概念:Query、Key和Value。在上面加强字的语义表示这个应用场景中,目标字及其上下文的字都有各自的原始Value,Attention机制将目标字做为Query、其上下文的各个字做为Key,并将Query与各个Key的类似性做为权重,把上下文各个字的Value融入目标字的原始Value中。以下图所示,Attention机制将目标字和上下文各个字的语义向量表示做为输入,首先经过线性变换得到目标字的Query向量表示、上下文各个字的Key向量表示以及目标字与上下文各个字的原始Value表示,而后计算Query向量与各个Key向量的类似度做为权重,加权融合目标字的Value向量和各个上下文字的Value向量,做为Attention的输出,即:目标字的加强语义向量表示。orm
self-attention来自于google文章《attention is all you need》。 一个序列每一个字符对其上下文字符的影响做用都不一样,每一个字对序列的语义信息贡献也不一样,能够经过一种机制将原输入序列中字符向量经过加权融合序列中全部字符的语义向量信息来产生新的向量,即加强了原语义信息。blog
Self-Attention:对于输入文本,咱们须要对其中的每一个字分别加强语义向量表示,所以,咱们分别将每一个字做为Query,加权融合文本中全部字的语义信息,获得各个字的加强语义向量,以下图所示。在这种状况下,Query、Key和Value的向量表示均来自于同一输入文本,所以,该Attention机制也叫Self-Attention。get
为了加强Attention的多样性,文章做者进一步利用不一样的Self-Attention模块得到文本中每一个字在不一样语义空间下的加强语义向量,并将每一个字的多个加强语义向量进行线性组合,从而得到一个最终的与原始字向量长度相同的加强语义向量,以下图所示。
在Multi-headSelf-Attention的基础上再添加一些“佐料”,就构成了大名鼎鼎的Transformer Encoder。实际上,Transformer模型还包含一个Decoder模块用于生成文本,但因为BERT模型中并未使用到Decoder模块,所以这里对其不做详述。下图展现了Transformer Encoder的内部结构,能够看到,Transformer Encoder在Multi-head Self-Attention之上又添加了三种关键操做:
残差链接(ResidualConnection):将模块的输入与输出直接相加,做为最后的输出。这种操做背后的一个基本考虑是:修改输入比重构整个输出更容易(“锦上添花”比“雪中送炭”容易多了!)。这样一来,能够使网络更容易训练。
Layer Normalization:对某一层神经网络节点做0均值1方差的标准化。
线性转换:对每一个字的加强语义向量再作两次线性变换,以加强整个模型的表达能力。这里,变换后的向量与原向量保持长度相同。
能够看到,Transformer Encoder的输入和输出在形式上仍是彻底相同,所以,Transformer Encoder一样能够表示为将输入文本中各个字的语义向量转换为相同长度的加强语义向量的一个黑盒。
把Transformer Encoder模块一层一层的堆叠起来就是大名鼎鼎的bert了
参考1:https://mp.weixin.qq.com/s/HOt11jG0DhhVuFWYhKNXtg 参考2:https://mp.weixin.qq.com/s/RLxWevVWHXgX-UcoxDS70w