Preface

三种序列转换模型的对比

  • CNN 模型
    • 优点:可以并行计算,计算效率高
    • 缺点:感受野小,受卷积核窗口大小的影响,不能同时考虑整个上下文
  • RNN 模型
    • 优点:可以考虑数据的时序特征,序列的位置信息自然获得
    • 缺点:受顺序计算的影响,无法并行计算
  • Transformer 模型
    • 优点:可以并行计算,还可以考虑数据的全局信息
    • 缺点:计算量大,训练参数多

1. 基础知识

建立 Transformer 模型之前,需要将序列数据转换为词向量数据。

2. Transformer 模型结构

全部采用自注意力 ( self-attention ) 层进行 编码,引入了三个变换矩阵,得到查询 ( Query, Q ) 、键 ( Key, K ) 、值 ( Value, V ) 三个向量,然后利用词与词之间 Q 和 K 相乘的结构进行注意力计算,将权重系数乘以 V 就是新的词向量表示。

Transformer模型详解

( 图 1-Transformer 模型结构 )

Transformer模型详解

2.1 Sequence

模型的输入

  • 输入序列:inputs=(i1,i2,,ip,,iN)\text{inputs}= ( i_1,i_2,\cdots,i_p,\cdots,i_N ),其中ipNi_p\in\mathbb{N}^*为输入符号表中的序号。用于图 1 中的Inputs\text{Inputs}
  • 目标序列:targets=(t1,t2,,tq,,tM)\text{targets}= ( t_1,t_2,\cdots,t_q,\cdots,t_M ),其中tqNt_q\in\mathbb{N^*}为目标符号表中的序号。用于图 1 中的Outputs\text{Outputs}

模型的输出

  • 输出序列:outputs=(o1,o2,,oq,,oM)\text{outputs}= ( o_1,o_2,\cdots,o_q,\cdots,o_M ),其中oqNo_q\in\mathbb{N}^*为目标符号表中的序号。用于图 1 中的Output Probabilities\text{Output Probabilities}
    • outputs=Transformer( inputs,targets )\text{outputs}=Transformer\text{( inputs,targets )}
  • 代价函数:loss function=L(targets,outputs)\text{loss function}=\mathcal{L} ( \text{targets,outputs} )

2.2 Embedding and Encoding

2.2.1 Word Embedding

序列的词嵌入(Word Embedding)编码

  • 词嵌入的维度:dmodeld_{model}
  • 输入序列
    • 序列长度:NN
    • 词嵌入编码:InputsEmbedding(inputs)RN×dmodel)InputsEmbedding ( \text{inputs} ) \in\mathbb{R}^{N\times d_{model}} )
  • 目标序列
    • 序列长度:MM
    • 词嵌入编码:TargetsEmbedding(targets)RM×dmodelTargetsEmbedding ( \text{targets} ) \in\mathbb{R}^{M\times d_{model}}

2.2.2 Positional Encoding

位置编码(Positional Encoding):因为自注意力机制并没有考虑位置信息,因此需要将每个位置编号,然后每个编号对应这个向量,最后将该向量与词向量相加,从而实现为每个词引入位置信息。

位置编码的维度和词嵌入的维度一致:dmodeld_{model}

  • 编码函数

PositionEncode(pos,i)={sin(pos/10000i21dmodel),if i is 偶数cos(pos/10000i121dmodel),if i is 奇数 PositionEncode(pos,i)= \begin{cases} \sin ( \text{pos}/10000^{\frac{i}2\frac1{d_{model}}} ) ,&\text{if i is 偶数}\\ \cos ( \text{pos}/10000^{\frac{i-1}2\frac1{d_{model}}} ),&\text{if i is 奇数} \end{cases}

注 1:使用 sin 和 cos 函数,是因为基于和差化积公式,

注 2:编码函数还有其他方式,Encoder 与 Decoder 的编码函数是相同的

  • 序列的位置编码
    • 输入序列位置编码:InputsPositionEncode={PositionEncode(inputs-position,i)}InputsPositionEncode=\{PositionEncode ( \text{inputs-position},i )\}

      • 输入符号对应的位置序列:inputs-position{1,2,,p,,N}\text{inputs-position}\in\{1,2,\cdots,p,\cdots,N\}
      • 输入符号对应的编码维度: i{0,1,2,,(dmodel1)}i\in\{0,1,2,\cdots,(d_{model}-1)\}
      • 输入序列位置编码的维度:InputsPositionEncodeRN×dmodelInputsPositionEncode\in\mathbb{R}^{N\times d_{model}}
    • 目标序列位置编码:TargetsPositionEncode={PositionEncode(targets-position,i)}TargetsPositionEncode=\{PositionEncode ( \text{targets-position},i )\}

      • 输入符号对应的位置序列:targets-position{1,2,,q,,M}\text{targets-position}\in\{1,2,\cdots,q,\cdots,M\}
      • 输入符号对应的编码维度:i{0,1,2,,(dmodel1)}i\in\{0,1,2,\cdots,(d_{model}-1)\}
      • 目标序列位置编码的维度:TargetsPositionEncodeRM×dmodelTargetsPositionEncode \in\mathbb{R}^{M\times d_{model}}

2.3 Encoder

2.3.1 Encoder Structure

编码器的结构

  • 输入层:e0=InputsEmbedding(inputs)+PositionEncode(inputs-position)e0RN×dmodele_{0}=InputsEmbedding ( \text{inputs} ) + PositionEncode ( \text{inputs-position} ) ,e_{0}\in\mathbb{R}^{N\times d_{model}}
  • 编码层:el=EncoderLayer(el1),elRN×dmodel,l[1,n]e_l=EncoderLayer ( e_{l-1} ) ,e_l\in\mathbb{R}^{N\times d_{model}},l\in [1,n]
    • 编码器的编码层的叠加层数:nn
    • ll个编码层的输入:einRN×dmodele_{in}\in\mathbb{R}^{N\times d_{model}}
    • ll个编码层的过渡:emid=LayerNorm(ein+MultiHeadAttention(ein)),emidRN×dmodele_{\text{mid}}=LayerNorm ( e_{in}+MultiHeadAttention ( e_{in} )) ,e_{mid}\in\mathbb{R}^{N\times d_{model}}
      • 多头注意力机制:MultiHeadAttention()MultiHeadAttention ( \cdot )
      • 层归一化:LayerNorm()LayerNorm ( \cdot )
    • ll个编码层的输出:eout=LayerNorm(emid+FFN(emid)),eoutRN×dmodele_{\text{out}}=LayerNorm ( e_{\text{mid}}+FFN ( e_{\text{mid}} )) ,e_{\text{out}}\in\mathbb{R}^{N\times d_{model}}
      • 前馈神经网络:FFN()FFN ( \cdot )

2.3.2 Multi-Head Attention

Transformer模型详解

( 图 2-多头注意力机制与缩放点积 )

多头注意力 ( Multi-Head Attention )

MultiHeadAttention(ein)=MultiHead(Q,K,V)=Concat(head1,,headh)WO MultiHeadAttention ( e_{in} ) =MultiHead ( Q,K,V ) =Concat ( head_1,\cdots,head_h ) W^O

  • 输入向量序列ein=(ein1,ein2,,einN)RN×dmodele_{in}= ( e_{in_1},e_{in_2},\cdots,e_{in_N} ) \in\mathbb{R}^{N\times d_{model}},分别得到:

    • 查询向量序列:Q=einQ=e_{in}
    • 键向量序列:K=einK=e_{in}
    • 值向量序列:V=einV=e_{in}
  • 多头输入:headi=Attention(QWiQ,KWiK,VWiV),i[1,h]headiRN×dvhead_i=Attention ( QW_i^Q,KW_i^K,VW_i^V ),i\in[1,h],head_i\in\mathbb{R}^{N\times d_v}

    • 使用缩放点积注意力 ( Scaled Dot-Product Attention ) 作为打分函数的自注意力函数
      Transformer模型详解

Attention(QWiQ,KWiK,VWiV)=softmax(QWiQ(KWiK)Tdk)VWiV Attention ( QW_i^Q,KW_i^K,VW_i^V ) =softmax ( \frac{QW_i^Q ( KW_i^K )^T}{\sqrt{d_k}} ) VW_i^V

  • 多头输出:MultiHeadAttention(ein)RN×dmodelMultiHeadAttention(e_{in})\in\mathbb{R}^{N\times d_{model}}

  • 可以学习的参数矩阵

    • WiQRdmodel×dk,QWiQRN×dkW_i^Q\in\mathbb{R}^{d_{model}\times d_k},QW_i^Q\in\mathbb{R}^{N\times d_k}
    • WiKRdmodel×dk,KWiQRN×dkW_i^K\in\mathbb{R}^{d_{model}\times d_k},KW_i^Q\in\mathbb{R}^{N\times d_k}
    • WiVRdmodel×dv,VWiVRN×dvW_i^V\in\mathbb{R}^{d_{model}\times d_v},VW_i^V\in\mathbb{R}^{N\times d_v}
    • WORhdv×dmodelW^O\in\mathbb{R}^{hd_v\times d_{model}}
    • 输出扩展的维度(头的数量):hh

注:QWiQ(KWiK)QW_i^Q ( KW_i^K )可以理解为相关矩阵,然后通过 softmax 将相关矩阵的值转化为概率,即归一化,相关性强的概率值大,将这个概率矩阵作为值的权重矩阵,使得输出结果具有更加明显的结构信息。这个结构信息可以作为输出数据的结构参考信息使用

2.3.3 Encoder Padding Mask

编码器的PAD掩码:因为每个批次输入序列长度不同,为了将输入序列对齐,需要将长句子截断,对短句子填充 0.

  • 编码函数:EncodePadMask()RN×NEncodePadMask(\cdot)\in\mathbb{R}^{N\times N}

EncodePadMaskj=(ej1,ej2,,ejp,,ejN) EncodePadMask_j= ( e_{j1},e_{j2},\cdots,e_{jp},\cdots,e_{jN} )

  • ejp={True,ip=0False,ip0,j=1,2,,Ne_{jp}=\begin{cases}True,i_p=0\\False,i_p\neq 0\end{cases},j=1,2,\cdots,N
    • ipi_p为输入序列 inputs 对应的单词序号,默认填充序号为 0
    • 因为 pad 掩码如果为 0,当进行 softmax 计算时,0 会使计算产生偏差,因此采用 mask 方法进行补偿,即把 0 的位置填充很大的负值 ( 代码中为-1e9 ) ,从而经过 Softmax 函数时对数据分布影响很小
  • Softmax 函数:Si=expxijexpxjS_i=\frac{\exp{x_i}}{\sum_j\exp{x_j}}

2.3.4 Residual

残差连接:经过注意力矩阵加权之后的 V,即 MultiHeadAttention(ein)MultiHeadAttention(e_{in})eine_{in} 的维度一致,

2.3.5 Layer Normalization

层归一化:把神经网络中的隐藏层归一化为标准正态分布,从而加快训练速度,加速模型收敛

2.3.6 Feedforward Network

前馈神经网络

  • 参数矩阵:W1Rdmodel×dff,W2Rdff×dmodelW_1\in\mathbb{R}^{d_{model}\times d_{ff}},W_2\in\mathbb{R}^{d_{ff}\times d_{model}}
  • 偏置:b1Rdff,b2Rdmodelb_1\in\mathbb{R}^{d_{ff}},b_2\in\mathbb{R}^{d_{model}}
  • 前馈神经网络的维度:dffd_{ff}

FFN(emid)=ReLU(emidW1+b1)W2+b2=max(0,emidW1+b1)W2+b2 \begin{aligned} FFN ( e_{mid} ) &=ReLU ( e_{mid}W_1+b_1 ) W_2+b_2\\ &=max ( 0,e_{mid}W_1+b_1 ) W_2+b_2 \end{aligned}

2.4 Decoder

2.4.1 Decoder Structure

解码器的结构

  • 输入层:d0=TargetsEmbedding(targets)+PositionEncode(targets-position),d0RM×dmodeld_0=TargetsEmbedding ( \text{targets} ) +PositionEncode ( \text{targets-position} ) ,d_0\in\mathbb{R}^{M\times d_{model}}
  • 编码层:dl=DecoderLayer(dl1),l[1,n],dlRM×dmodeld_l=DecoderLayer ( d_{l-1} ) ,l\in [1,n],d_l\in\mathbb{R}^{M\times d_{model}}
    • 解码器的编码层的层数:nn
    • ll 个编码层的输入:dinRM×dmodeld_{in}\in\mathbb{R}^{M\times d_{model}}
    • ll 个编码层的第一子层:dmid1=LayerNorm(din+MaskedMultiHeadAttention(din))d_{mid1}=LayerNorm ( d_{in}+MaskedMultiHeadAttention ( d_{in} ))
      • MaskedMultiHeadAttention()RM×dmodelMaskedMultiHeadAttention(\cdot)\in\mathbb{R}^{M\times d_{model}}
    • ll 个编码层的第二子层:dmid2=LayerNorm(dmid1+MultiHeadAttention(dmid1,eout))d_{mid2}=LayerNorm ( d_{mid1}+MultiHeadAttention ( d_{mid1},e_{out} ))
      • MultiHeadAttention()RM×dmodelMultiHeadAttention(\cdot)\in\mathbb{R}^{M\times d_{model}}
    • ll 个编码层的输出:dout=LayerNorm(dmid2+FFN(dmid2)),doutRM×dmodeld_{out}=LayerNorm ( d_{mid2}+FFN ( d_{mid2} )),d_{out}\in\mathbb{R}^{M\times d_{model}}
  • 输出层:output-probabilities=softmax(dnW),WRdmodel×tgt-vocab-size\text{output-probabilities}=\text{softmax} ( d_n W ) ,W\in\mathbb{R}^{d_{model}\times \text{tgt-vocab-size}}
    • 目标单词库的大小:tgt-vocab-size\text{tgt-vocab-size}

2.4.2 Decoder Padding Mask

解码器的 PAD 掩码:与编码器相同

2.4.3 Decoder Sequence Mask

解码器的序列掩码:因为解码阶段,后序单词不应该用于预测前序的单词,因此需要掩掉

  • 生成方法:产生一个下三角矩阵,下三角矩阵中的值全为1,矩阵中其它值都为0,将这个矩阵应用于序列上即可

相关文章: