0%

cs224n-11.Transformers

主要概念理解

self-Attention 自注意力机制

注意力机制介绍

自注意力机制与注意力不同点在于,自注意力机制在序列内部进行注意力的计算,每个词与相邻词进行F(Q,K)计算,当前词作为Q,临近词作为K,计算主力注意力分数后,进行嵌入向量的加权平均。

  • 一个词语的含义取决于上下文临近词语的含义(语境),自注意力机制解决了RNN无法抽取长距离信息的问题
  • 自注意力机制的计算可以通过矩阵运算实现并行化,解决了RNN无法并行优化的问题

self-attention过程简单总结

  1. 为每个输入词语随机初始化Query、Key、Value三个向量,其中,Value与注意力分数相乘做加权平均,输出结果
  2. 当需要计算某个词语表示时候,以当前词语的Query和相邻词Key(包括自己)用来计算注意力分数
  3. 使用上一步计算的注意力分数,输入softmax归一化,对相邻词的Value向量进行加权平均后输出当前词的向量表示

Multi-head Attention

降维思想,将原来的Q,K,V映射到多个不同得子空间(即一系列得$Q_i K_i V_i$ ,transformers中为八个),这种映射通过矩阵乘法实现,每个一head维护一组$W_{iQ} W_{iK} W_{iV}$,通过单头中的$Q_i K_i V_i$ 与对应权重矩阵相乘得到对应得$Q_i K_i V_i$

  • $QKV \in R^{1*512}$
  • $W_{iQ}W_{iK}W_{iV} \in R^{512*64}$
  • $Q*W_{iQ} = Q_i$
  • 可得 $Q_i K_i V_i \in R^{1*64}$,共计8个不同head,实现了从高维到低维得转换,但是没有增加参数数量。

在不同得子空间上进行注意力机制得计算后,进行拼接乘以权重矩阵获得多头注意力机制的输出

其中 $W_{out} \in R^{512*512}$

相当于 输出结果得每个位置都是由所有参数加权平均得到

为什么要使用多头注意力机制

  • 通过将QKV映射到不同的子空间,实现了从不同角度对于当前词语含义的捕捉,而在不同的翻译任务中,我们对不同角度的重视程度不同(例如 The Illustrated Transformer 举得it的例子),这种映射有助于模型自适应的捕捉特征,提升NMT的效果。
  • 我觉得这就是个trick,到底有什么用也没人说清楚了(对黑盒算法强行解释),能用好用就完事了

网络结构理解

Postion-Encoding 位置编码

transformer在对输入词语进行embedding后,由于transformer舍弃了RNN的时间序列输入形式,整个序列中不同位置的单词在输入时的地位是相同的,通过位置编码重赋予输入位置特征

位置编码存在两种计算方式

  1. 通过固定的公式,根据字符在序列中的位置,计算得到 (公式理解),总结就是又要体现不同位置的差异性,又不能影响embedding的词语含义。

  2. 随机初始化pos编码,通过模型学习生成对应编码

LayerNormalization层

LN方法与BN方法类似,在一条数据不同特征之间进行归一化处理(BN对不同数据的同一特征归一化处理),由于RNN类似于一个不固定batchsize(时间步)的CNN网络,无法使用BN方法,采用LN方法一定程度上也可以实现BN方法的效果。

Feed Forward(FFN)层

类似于两个卷积核大小为1的卷积操作,目的是为了应用非线性激活函数RELU,增加非线性性质。

Decoder端

与encoder段基本一致,每个decoder块每部增加了一个 “encoder-decoder attention” 注意力机制,以encoder输出的K,V矩阵为输入,和Encoder当前词的Q进行注意力机制运算。

img

基本流程如图

img