Transformer
模型
基于编码器-解码器架构处理序列对;
跟使用注意力的seq2seq不同,Transformer纯用基于注意力,不用RNN
多头注意力 Multi-Head Attention
对同一key、value、query,希望抽取不同的信息(例如短距离/长距离关系)
使用h个独立的注意力池化,合并各个头输出得到最终输出
- 给定查询 q ∈ R d q \mathbf{q} \in \mathbb{R}^{d_q} q∈Rdq、键 k ∈ R d k \mathbf{k} \in \mathbb{R}^{d_k} k∈Rdk和值 v ∈ R d v \mathbf{v} \in \mathbb{R}^{d_v} v∈Rdv;
- 注意力头 h i \mathbf{h}_i hi( i = 1 , … , h i = 1, \ldots, h i=1,…,h)的计算方法为: h i = f ( W i ( q ) q , W i ( k ) k , W i ( v ) v ) ∈ R p v \mathbf{h}_i = f(\mathbf W_i^{(q)}\mathbf q, \mathbf W_i^{(k)}\mathbf k,\mathbf W_i^{(v)}\mathbf v) \in \mathbb R^{p_v} hi=f(Wi(q)q,Wi(k)k,Wi(v)v)∈Rpv
- 注意力头 h i \mathbf{h}_i hi可学习的参数: W i ( q ) ∈ R p q × d q \mathbf W_i^{(q)}\in\mathbb R^{p_q\times d_q} Wi(q)∈Rpq×dq、 W i ( k ) ∈ R p k × d k \mathbf W_i^{(k)}\in\mathbb R^{p_k\times d_k} Wi(k)∈Rpk×dk和 W i ( v ) ∈ R p v × d v \mathbf W_i^{(v)}\in\mathbb R^{p_v\times d_v} Wi(v)∈Rpv×dv
- 注意力汇聚的函数 f f f(加性、缩放点集…)
- 输出可学习参数: W o ∈ R p o × h p v \mathbf W_o\in\mathbb R^{p_o\times h p_v} Wo∈Rpo×hpv
- 多头注意力输出: W o [ h 1 ⋮ h h ] ∈ R p o . \begin{split}\mathbf W_o \begin{bmatrix}\mathbf h_1\\\vdots\\\mathbf h_h\end{bmatrix} \in \mathbb{R}^{p_o}.\end{split} Wo⎣ ⎡h1⋮hh⎦ ⎤∈Rpo.
有掩码的多头注意力 Masked multi-head attention
解码器对序列中一个元素输出时,不应考虑该元素之后的元素
通过掩码来实现,计算
x
i
x_i
xi的输出时假装当前序列长度为
i
i
i(valid_len控制)
基于位置的前馈网络 Positionwise FFN
- 将输入由(b, n, d)变成(bn, d)
- 作用两个全连接
- 输出形状由(bn, d)变回(b, n, d)
b=batch_size, n=time_step, d=dimention
为什么要变维度?如果不变则为(b, nd),n非定值,导致网络不好设计,因此手动变为(bn, d)
等价于两层核窗口为1的1x1卷积
残差+层归一化 Add & Norm
Residual connection + Normalization
层归一化LayerNorm vs. 批量归一化BatchNorm
- BatchNorm批量归一化:对每个特征/通道里元素进行归一化
- LayerNorm层归一化:对每个样本的元素进行归一化
normalization方差变1,均值变0;图中,len为序列长度对应time_step,d为dimention为一个元素的特征维度,b为batch_size;
如果是BatchNorm,每次序列长度len都不一样,会不稳定
信息传递
Encoder和Decoder之间的信息传递
编码器的输出
y
1
,
.
.
.
,
y
n
y_1, ... , y_n
y1,...,yn作为解码器第i个Transformer块中多头注意力的key和value,query来自输入解码器的目标序列
意味着编码器和解码器的块的个数和输出维度一样
预测
预测第t+1个输出时,解码器中输入前t个预测,在self-attention中前t个预测值为key和value,第t个预测值为query
总结
- Transformer是Encoder-Decoder架构,纯用注意力机制
- Encoder和Decoder都有n个transformer块
- 每个块中用多头(自)注意力,基于位置的前馈网络和层归一化
参考
DIVE INTO DEEP LEARNING> 10 注意力机制 > 10.7. Transformer
DIVE INTO DEEP LEARNING> 11 Attention Mechanisms and Transformers > 11.7. The Transformer Architecture
68 Transformer【动手学深度学习v2】
系列文章
【动手学深度学习v2】注意力机制—1 注意力评分函数
【动手学深度学习v2】注意力机制—2 使用注意力机制Seq2Seq
【动手学深度学习v2】注意力机制—3 自注意力&位置编码
【动手学深度学习v2】注意力机制—4 Transformer