12 Tranformer原理及Python实现

根据台湾大学李宏毅老师的课程进行了整理,推荐大家去看李老师在B站上的课程。

1 CNN及RNN的缺点

12 Tranformer原理及Python实现_第1张图片

  • RNN:很难实现并行(左图,计算 b 4 b^4 b4需要串行的查询 a 1 , a 2 , a 3 , a 4 a^1, a^2, a^3, a^4 a1,a2,a3,a4);
  • CNN:可以实现并行,需要堆叠多层的CNN才能学习到整个序列的特征(右图)。

2 自注意力机制(self-attention)

12 Tranformer原理及Python实现_第2张图片
采用自注意力机制层取代RNN来处理序列,同时实现序列的并行处理

2.1 单头自注意力

2.1.1 按步骤进行描述计算过程

12 Tranformer原理及Python实现_第3张图片
自注意力机制操作步骤如下:

  • 输入序列 x x x与矩阵 W W W相乘得到输入的 a a a,即 a i = W x i a^i = Wx^i ai=Wxi
  • 分别与三个矩阵相乘,得到三个向量: q i ( q u e r y ) , k i ( k e y ) , v i ( v a l u e ) q^i (\mathbf{query}), k^i (\mathbf{key}), v^i (\mathbf{value}) qi(query),ki(key),vi(value),即 q i = W q a i , k i = W k a i , v i = W v a i q^i = W^q a^i, k^i = W^k a^i, v^i = W^v a^i qi=Wqai,ki=Wkai,vi=Wvai
  • 每个 q q q对每个 k k k做attention(二者进行向量scale点积),即 q 1 q^1 q1分别与 k 1 , k 2 , k 3 , k 4 k^1, k^2, k^3, k^4 k1,k2,k3,k4做点积(同时除以一个常数的scale因子),分别得到 a 1 , 1 , a 1 , 2 , a 1 , 3 , a 1 , 4 a_{1,1}, a_{1,2}, a_{1,3}, a_{1,4} a1,1,a1,2,a1,3,a1,4,计算公式为: a 1 , i = q 1 ⋅ k i d a_{1, i} = \frac{q^1 \cdot k^i}{\sqrt{d}} a1,i=d q1ki;
  • 输入向量 a 1 a^1 a1 a 2 a^2 a2,用 a 1 a^1 a1去和 W q W^q Wq相乘,得到一个向量 q 1 q^1 q1,然后使用 a 2 a^2 a2 W k W^k Wk相乘,得到一个向量 k 2 k^2 k2。最后使用 q 1 q^1 q1 k 2 k^2 k2做点积,得到 α 1 , 2 \alpha_{1, 2} α1,2 α 1 , 2 \alpha_{1, 2} α1,2表示两个向量之间的相关联程度;
  • 自注意力:也可以计算向量 a 1 a^1 a1和自己的关联性。
    12 Tranformer原理及Python实现_第4张图片
  • α 1 , i \alpha_{1, i} α1,i进行softmax,得到 α ^ 1 , i \hat{\alpha}_{1, i} α^1,i表示对应 v i v_i vi的权重;
    12 Tranformer原理及Python实现_第5张图片
  • 计算 b 1 = ∑ i α ^ 1 , i v i b^1 = \sum_i \hat{\alpha}_{1, i} v^i b1=iα^1,ivi
    12 Tranformer原理及Python实现_第6张图片
  • 同理可以计算 b 2 , b 3 , b 4 b^2, b^3, b^4 b2,b3,b4
    12 Tranformer原理及Python实现_第7张图片
  • 输出序列 b b b可以并行计算出来。
    12 Tranformer原理及Python实现_第8张图片

2.1.2 以矩阵形式描述计算过程

  • 计算 q i = W q a i , k i = W k a i , v i = W v a i q^i = W^q a^i, k^i = W^k a^i, v^i = W^v a^i qi=Wqai,ki=Wkai,vi=Wvai
    12 Tranformer原理及Python实现_第9张图片
  • 计算 α 1 , 1 , α 1 , 2 , α 1 , 3 , α 1 , 4 \alpha_{1,1}, \alpha_{1,2}, \alpha_{1,3}, \alpha_{1,4} α1,1,α1,2,α1,3,α1,4; α 2 , 1 , α 2 , 2 , α 2 , 3 , α 2 , 4 \alpha_{2,1}, \alpha_{2,2}, \alpha_{2,3}, \alpha_{2,4} α2,1,α2,2,α2,3,α2,4; α 3 , 1 , α 3 , 2 , α 3 , 3 , α 3 , 4 \alpha_{3,1}, \alpha_{3,2}, \alpha_{3,3}, \alpha_{3,4} α3,1,α3,2,α3,3,α3,4; α 4 , 1 , α 4 , 2 , α 4 , 3 , α 4 , 4 \alpha_{4,1}, \alpha_{4,2}, \alpha_{4,3}, \alpha_{4,4} α4,1,α4,2,α4,3,α4,4
    12 Tranformer原理及Python实现_第10张图片
  • 计算 b 1 , b 2 , b 3 , b 4 b^1, b^2, b^3, b^4 b1,b2,b3,b4
    12 Tranformer原理及Python实现_第11张图片
    12 Tranformer原理及Python实现_第12张图片
    12 Tranformer原理及Python实现_第13张图片

2.2 多头自注意力(以两头为例)

12 Tranformer原理及Python实现_第14张图片
12 Tranformer原理及Python实现_第15张图片
12 Tranformer原理及Python实现_第16张图片

2.3 位置编码

在训练self attention的时候,实际上对于位置的信息是缺失的,没有前后的区别,上面讲的 a 1 , a 2 , a 3 , a 4 a^1,a^2,a^3, a^4 a1,a2,a3,a4不代表输入的顺序,只是指输入的向量数量,不像RNN,对于输入有明显的前后顺序,比如在翻译任务里面,对于“机器学习”,机器学习依次输入。而self-attention的输入是同时输入,输出也是同时产生的。
新引入了一个位置向量 e i e^i ei,如下图所示:
12 Tranformer原理及Python实现_第17张图片
在计算的过程中将位置向量叠加到输入向量上进行后续的计算。
12 Tranformer原理及Python实现_第18张图片
图中的 e i e^i ei, 在原始论文中是一个预设值,不可学习。

3 Tranformer的原理

Transformer 模型主要分为两大部分,分别是 Encoder 和 Decoder。

  • Encoder编码器负责把输入(语言序列)隐射成隐藏层(下图中第 2 步用九宫格代表的部分),即把自然语言序列映射为隐藏层的数学表达的过程;
  • Decoder解码器再把隐藏层映射为自然语言序列。

12 Tranformer原理及Python实现_第19张图片

3.1 编码器

编码器的关键部分以下四个部分:
12 Tranformer原理及Python实现_第20张图片
12 Tranformer原理及Python实现_第21张图片

  • 1.子向量和位置编码;
    X =  Embedding-Lookup  ( X ) +  Positional-Encoding  X=\text { Embedding-Lookup }(X)+\text { Positional-Encoding } X= Embedding-Lookup (X)+ Positional-Encoding 

  • 2.多头自注意力机制;
    Q = Linear ⁡ q ( X ) = X W Q K = Linear ⁡ k ( X ) = X W K V = Linear ⁡ v ( X ) = X W V X attention  = Self-Attention ⁡ ( Q , K , V ) \begin{array}{l} Q=\operatorname{Linear}_{q}(X)=X W^{Q} \\ K=\operatorname{Linear}_{k}(X)=X W^{K} \\ V=\operatorname{Linear}_{v}(X)=X W^{V} \\ X_{\text {attention }}=\operatorname{Self-Attention}(Q, K, V) \\ \end{array} Q=Linearq(X)=XWQK=Lineark(X)=XWKV=Linearv(X)=XWVXattention =Self-Attention(Q,K,V)

  • 3.残差连接和Layer Normalization;
    X attention  = X + X attention  X attention  = LayerNorm ⁡ ( X attention  ) \begin{array}{l} X_{\text {attention }}&=&X+X_{\text {attention }} \\ X_{\text {attention }}&=&\operatorname{LayerNorm}\left(X_{\text {attention }}\right) \end{array} Xattention Xattention ==X+Xattention LayerNorm(Xattention )
    Layer Normalization 的作用是把神经网络中隐藏层归一为标准正态分布,也就是 i.i.d 独立同分布,以起到加快训练速度,加速收敛的作用。
    (1) 计算均值,以矩阵的列为单位:
    μ j = 1 m ∑ x i j . \mu_j = \frac{1}{m} \sum x_{ij}. μj=m1xij.
    (2) 计算方差,也是以矩阵的列为单位:
    σ j 2 = 1 m ∑ ( x i j − μ j ) 2 . \sigma^2_j = \frac{1}{m} \sum (x_{ij} - \mu_j)^2. σj2=m1(xijμj)2.
    (3) 进行归一化,根据中心极限定理,加一个 ϵ \epsilon ϵ是为了防止分母为0.:
    LayerNorm ⁡ ( x ) = x i j − μ j σ j 2 + ϵ . \operatorname{LayerNorm}(x) = \frac{x_{ij} - \mu_j}{\sqrt{\sigma_j^2 + \epsilon}}. LayerNorm(x)=σj2+ϵ xijμj.

  • 4.FeedForward的残差连接和Layer Normalization。FeedForward部分,其实就是两层线性映射并用激活函数(例如ReLU)激活。
    X hidden  = Linear ⁡ ( ReLU ⁡ ( Linear ⁡ ( X attention  ) ) ) X hidden  = X attention  + X hidden  X hidden  = LayerNorm ⁡ ( X hidden  ) \begin{array}{l} X_{\text {hidden }} &=&\operatorname{Linear}\left(\operatorname{ReLU}\left(\operatorname{Linear}\left(X_{\text {attention }}\right)\right)\right) \\ X_{\text {hidden }}&=&X_{\text {attention }}+X_{\text {hidden }} \\ X_{\text {hidden }}&=&\operatorname{LayerNorm}\left(X_{\text {hidden }}\right) \end{array} Xhidden Xhidden Xhidden ===Linear(ReLU(Linear(Xattention )))Xattention +Xhidden LayerNorm(Xhidden )

3.2 解码器

12 Tranformer原理及Python实现_第22张图片

整体上看,解码器的结构从下到上依次是:

  • Masked Multi-Head Self-Attention;
  • Multi-Head Encoder-Decoder Attention;
  • FeedForward Network。

和编码器一样,上面三个部分的每一个部分,都有一个残差连接,后接一个 Layer Normalization。

3.2.1 Masked Multi-Head Self-Attention

3.2.2 Multi-Head Encoder-Decoder Attention

4 代码分析

参考文献

https://www.cnblogs.com/chenhuabin/p/16453665.html
https://zhuanlan.zhihu.com/p/425203821

你可能感兴趣的:(机器学习,机器学习)