博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Transformer学习

Posted on 2021-10-19 13:58  Antel  阅读(135)  评论(0编辑  收藏  举报

Attention Is All You Need

模型结构

image

Encoder

Encoder是有N=6层的一个整体。是这6层按顺序走下来的一个整体。
每层有两个子层。分别是多头自注意力和全连接前馈网络。
对于每个子层,先采用残差连接,后采用layer normalization

\[LayerNorm(x+Sublayer(x)) \]

为保证能够进行残差连接,所有隐变量(包含embedding)都保持\(d_{model}=512\)

Decoder

同样共N=6层,
与Encoder不同,额外增加了一个子层,在encoder堆栈输出上进行多头注意力。
同样对于每个子层,先残差后layer normalization、
修改了自注意力子层,避免每个位置融入了后续位置的信息。这种mask,保证了每个输出的embedding对应了一个位置,在对位置i进行预测时,只依赖i之前的位置,这种位置的结果是已知的。

注意力

image

注意力函数可以描述为将一个q和一组k,v映射到一个输出,其中q、k、v和输出都是向量。 输出为每个位置对应的v的加权总和,其中分配给每个v的权重由q与相应k计算 。

  • Scaled Dot-Product Attention

\[Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_{k}}})V \]

additive attention和dot-product (multiplicative) attention是两种常见attention,相比dot-product attention,transformer增加了放缩因子。
additive attention采用单隐层前馈网络,两种方法在理论上复杂度相似,但dot-product attention在实际中更快更节约空间,因为其矩阵乘法运算能被优化。
计算时,若\(d_{k}\)比较大,点积会很大,导致softmax梯度很小,所以增加放缩因子\(\frac{1}{\sqrt{d_{k}}}\)

  • additive attention
    采用单隐层前馈网络计算attention score

\[f_{att}(h_{i},s_{j}) = v_{a}^{T}tanh(W_{a}[h_{i};s_{j}]) \]

\[a_{i} = softmax(f_{att})(h_{i},s_{j}) \]

其中\(v_{a}\)\(W_{a}\)为注意力参数,可以学习。
暂时这么理解,h是q,s是v。
参考

  • Multi-Head Attention
    多组qkv构成多头注意力计算。从不同表示子空间连接信息

    \[MultiHead(Q,K,V) = Concat(head_{1},...,head_{h})W^{O} \]

    \[where \space head_{i}=Attention(QW_{i}^{Q},KW_{i}^{K},VW_{i}^{V}) \]

    注意,根据上式,上一层结果h,分别作为QKV,输入多头注意力,每个head下,先通过一个权重矩阵相乘得到对应head下的qkv。
  • Applications of Attention in our Model
    • 在encoder-decoder attention层,q来自前一个decoder层,k、v来自encoder堆栈的输出,这样允许decoder的每个位置获取input序列所有位置的信息。这样做模仿了seq2seq
    • encoder包含了self-attention层。在一个sa层里,所有qkv均为上一层的输出,每个位置都包含了上一层所有位置的信息
    • 同样,decoder的sa层中,每个位置都包含了这个位置之前的所有位置的信息。为了自回归,防止右边的信息流入左边,在scaled dot-product attention时,计算softmax之前进行mask

Position-wise Feed-Forward Networks

这是另一个子层,每个encoder和decoder都包含这个子层

\[FFN(x)=max(0,xW_{1}+b_{1})W_{2}+b_{2} \]

Embeddings and Softmax

两个Embedding采用相同的权重,同时采用相同的pre-softmax线性转换。

在Embedding层,权重乘以一个系数\(\sqrt{d_{model}}\)

Positional Encoding

因为transformer没有递推,没有卷积,需要采用位置编码的方式提供序列顺序。

pe与embedding采用相加的方式

关于为什么采用相加而不是concat

在transformer中,采用正余弦方法表示位置编码

\[PE(pos,2i)=sin(pos/10000^{2i/d_{model}}) \]

\[PE(pos,2i+1)=cos(pos/10000^{2i/d_{model}}) \]

pos是位置,i是维度。

固定i的话,可以看到根据pos变化,得到一个正弦波形。

对于固定k,\(PE_{pos+k}\)何以表示成\(PE_{pos}\)的线性变换。

为什么使用自注意力

  1. 每层计算复杂度
  2. 并行度,最少的顺序操作
  3. 长范围依赖,输入和输出序列建路径越短,越容易学习长范围依赖