【深度学习入门基础】二、简单理解 Transformer

【深度学习入门基础】二、简单理解 Transformer


这是“深度学习入门基础”系列的第二篇文章,事多更新慢,望见谅。前一篇文章(先导篇)见:
【深度学习入门基础】一、从线性代数和微积分的角度看神经网络

ResNet 和 Transformer 近五年来是影响最深远的两个网络结构,没有之一,bert 也是从 Transformer 发展而来。近年来,Transformer 更是从 NLP 领域走入了 CV 领域,似乎什么东西都可以 attention 一下,大有一统天下之势。

因为 Transformer 很火,所以网上的各式各样的讲解很多,我就不介绍(chao xi)了,意义不大。本文依然秉承先导篇的代数风格,我们对 Transformer 做一个简单的总结。为了方便入门,我将尽可能少地去引入一些新名词。

自注意力层

Transformer 的核心是 self-attention layer,所以,我们先介绍一下这是个什么东西。

它是一个变换,把一个输入序列,变成一个输出序列。如图所示,

在这里插入图片描述

它把 4 个向量 a 1 , a 2 , a 3 , a 4 a_1,a_2,a_3,a_4 a1,a2,a3,a4 输入(习惯上,下面所有的向量一般都是指列向量),通过的一波瞎操作,变成了 4 个向量输出 b 1 , b 2 , b 3 , b 4 b_1,b_2,b_3,b_4 b1,b2,b3,b4。那么,这一波瞎操作是什么呢?看过先导篇的直到,神经网络层无非是一些“矩阵乘向量”的函数表示,那么这一波瞎操作,无非就是一些代数运算,人们称之为 Self-Attention Layer。

下面我们开门见山地给出这一波瞎操作。假设输入是一组列向量 x i , i = 1 , ⋯   , n x_i,i=1,\cdots,n xii=1,,n,输入也是一组列向量, y i , i = 1 , ⋯   , n y_i,i=1,\cdots,n yii=1,,n,我们把输入输出按行排成一个矩阵,即
X = [ x 1 , x 2 , ⋯   , x n ] X = [x_1,x_2,\cdots,x_n] X=[x1,x2,,xn]
Y = [ x 1 , x 2 , ⋯   , x n ] Y = [x_1,x_2,\cdots,x_n] Y=[x1,x2,,xn]
那么,attention 做的事情无非就是,
A = W X A=WX A=WX
Y = W V A softmax ⁡ ( ( W K A ) T W Q A d ) Y = W_VA\operatorname{softmax}\left(\frac{(W_KA)^TW_QA}{\sqrt d}\right) Y=WVAsoftmax(d (WKA)TWQA)

其中, softmax ⁡ \operatorname{softmax} softmax 作用在矩阵上分别对每一列做 softmax ⁡ \operatorname{softmax} softmax
softmax ⁡ ( M ) i j = e M i j ∑ i = 1 N e M i j \operatorname{softmax}(M)_{ij}=\frac{e^{M_{ij}}}{\sum_{i=1}^{N}e^{M_{ij}}} softmax(M)ij=i=1NeMijeMij
其中, W , W V , , W K , W Q W,W_V,,W_K,W_Q W,WV,,WK,WQ 都是一些参数矩阵, d = W K 的 行 数 = W Q 的 行 数 d = W_K 的行数 = W_Q 的行数 d=WK=WQ。参数矩阵的大小要令等式 make sense 即可。令 W V A = V , W K A = k , W Q A = Q W_VA = V,W_KA = k,W_QA=Q WVA=V,WKA=k,WQA=Q,那么上面的公式可以简记为:
Y = V softmax ⁡ ( K T Q d ) Y = V \operatorname{softmax}\left(\frac{K^TQ}{\sqrt d}\right) Y=Vsoftmax(d KTQ)

看公式总是可以接受,但是不太好形象地理解,有点莫名其妙。没关系,可以看看李宏毅老师的对 transformer 的宇宙最强解释,他的 PPT 做的我认为极好。

多头注意力

什么是 multi-head self-attention?假设我们有多组 K , Q , V K,Q,V K,Q,V,那么就可以得到多组的 Y Y Y,这些组的 Y Y Y 可以揉成一个 Y Y Y。多组 K , Q , V K,Q,V K,Q,V 的可以原始的一组“分裂”得到。多组的 Y Y Y 揉成一个 Y Y Y 可以通过在行方向上串联,再乘以一个系数矩阵得到。

细致地说,假设 Q , K , V Q,K,V Q,K,V 通过如下方式分裂成 h h h 个头,
K i = W K , i K ,   i = 1 , ⋯   , h K_i = W_{K,i}K, \space i=1,\cdots,h Ki=WK,iK, i=1,,h
Q i = W Q , i Q ,   i = 1 , ⋯   , h Q_i = W_{Q,i}Q, \space i=1,\cdots,h Qi=WQ,iQ, i=1,,h
V i = W V , i V ,   i = 1 , ⋯   , h V_i = W_{V,i}V, \space i=1,\cdots,h Vi=WV,iV, i=1,,h
那么,multi-head 就是
Y = W O ( V 1 softmax ⁡ ( K 1 T Q 1 d 1 ) V 2 softmax ⁡ ( K 2 T Q 2 d 2 ) ⋮ V h softmax ⁡ ( K h T Q h d h ) ) Y = W_O\left(\begin{array}{l} V_1 \operatorname{softmax}\left(\frac{K_1^TQ_1}{\sqrt {d_1}}\right) \\ V_2 \operatorname{softmax}\left(\frac{K_2^TQ_2}{\sqrt {d_2}}\right) \\ \vdots \\ V_h \operatorname{softmax}\left(\frac{K_h^TQ_h}{\sqrt {d_h}}\right) \end{array}\right) Y=WOV1softmax(d1 K1TQ1)V2softmax(d2 K2TQ2)Vhsoftmax(dh KhTQh)
其中 W O W_O WO 是为了把结果降维的系数矩阵, d i d_i di 对应着 Q i Q_i Qi(or K i K_i Ki)的行数。

Transformer

Attention 是 transformer 的核心,介绍了 attention-layer,下面就可以介绍 transformer 了。不同的神经网络层,无非就是把输入变成输出的不同的处理方式,如果不在乎细节的话,你甚至可以把某些层就当成黑箱。深度学习论文好阅读的地方就在于,我们看到它们给的神经网络架构图,如果操作就能大概猜个八九不离十了,不明白的地方再看看论文也就全部了解。我们一起来看看 原论文

核心就一张图如下:

在这里插入图片描述

箭头就表示了数据的流向,这就不用多说了。下面我们再来解释一下,那些英文单词标注的层都是什么意思。

输入(输出)嵌入

Embedding 是什么呢?我们知道,输入需要时一组向量,那么 Input Embedding 就是想办法把输入点变成一个向量。比如说做翻译,我们需要找到每个词组对应的向量是什么,词组对应什么向量,怎么个对应法,我们暂时不用管,只要知道这是训练出来的结果即可。

位置编码

什么是 Positional Encoding?由上述过程,我们知道所有的输入是地位等价的、位置无关的,没有蕴含相对位置信息在里面,也就是说即使打乱顺序也不影响结果,这不符合输入序列有序的性质。那么,我们就需要对位置进行编码,即在上述的过程中,对 A A A 进行一个偏移,别的过程一样,
A = A + E A = A+E A=A+E
其中 E E E 是和 A A A 相同形状的矩阵。

Add 和 Norm

黄色框的 Add 顾名思义就是将前一步 Multi-Head Attention 的输出和输入加载一起。Norm 是 normalization 的缩写,他在这里表示的其实是 Layer Normalization,所谓的 normalization 也就是常说的 “减去均值,除以方差”。这里的 Layer Normalization 先不用管它是怎么个 Layer 法的,只要知道它无非是对数据做了某种“规范化”。感兴趣可以参考再 google search一下。

Feed Forward

这里的 Feed Forward 也就是最最最简单的前馈神经网络,也就是你能想到的你最开始学的那个神经网络。

Linear

顾名思义,这就是线性化处理。

Nx

表示图中框住的部分要跑 N 遍。

seq2seq 模型和 marked 注意力机制

我们注意到,Figure 1 还有一部分没有不明晰的。即右边那个图的输入 “Outputs” 是什么东西,是 “Output Probability” 的 “Output” 吗?另外,提到的 marked attention 又是什么?
要说清楚这个,就不得不介绍 seq2seq model,seq2seq 这不是指 sequence to sequence 的一类模型,这是一个模型,来自于某个作者在某篇论文中提出的。

简单地说,Figure 1 左边的一半编码器,右边的一半叫解码器,解码器可能会被循环多次。解码器的输入来自于解码器的已有输出(起始输入是一个“起始命令”,知道输出为“终止命令”不再循环解码器结束输出)。

听起来比较抽象,我们举个简单的例子,比如说翻译 “我爱中国”。将“我”、“爱”、“中国”三个词儿词嵌入编码后进行输入,通过左边的编码器,将他们编码成了 c 待用。然后,我们开始解码,解码器输入 bos,告诉解码器开始解码,如图 1 所示,在 Multi-Head Attention 层,将 c 和 到这一层之前的输出放一块,一起做 attention,再经过后面的一堆操作,最后得到了解码器的 Output——I。接着我们把这个 I 作为解码器的输入,一堆操作到了 Multi-Head Attention 层,依然和 c 一起做 attention,再经过几层得到了解码器的输出——Love。再一次,我们将 I 和 Love 作为解码器的输入,通过 Masked Multi-Head Attention 层做了 attention, Add & Norm 之后再次和 c 做 attention,再经过后面的几层输入得到了解码器新的输出——China。最后,我们依然将 I Love China 作为输入,通过加码器,得到结束翻译标志的输出 eos,表示翻译终止。

容易发现,在解码的这个过程中,解码器的输入是慢慢增加的,是已经翻译出来的一些词。所以,为了以示特别,下一层是对已经生成出来的信息做 attention,称为 Masked Multi-Head Attention。事实上,它就是普通的 Multi-Head Attention,我们不用专门去留意它。因为没有生成的信息,我们怎么拿他来做 attention 嘛,我们本来也只能拿已经有的已经翻译出来的词儿做 atten。

训练

到这我们基本上把 transformer 的框架讲清楚了,剩下的细节可以看论文了。比如说训练,依然以翻译举例,seq2seq 模型告诉我们,我们可以拿正确的翻译(标签)来矫正解码器的输入,也就是说,解码器的输入可能不太对,我们用相应的正确的输入把它替代掉。

其他

深度学习的论文,图即一切。《Attention Is All You Need 》还有几张图,我们来解释一下。

在这里插入图片描述

这张图是为了说明标准的 Self-Attention 和 Multi-Head Attention 的,前面已经解释过了。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

上面的这三种图,是为了阐述 Multi-Head Attention 的必要性。一方面展示了 attention layer 对于语义理解的准确性,譬如代词 attention 的 words 恰是他表达的准确含义,就是这么神奇。另一方面,体现了不同的 head 代表了不同的功能和含义,譬如有的 head 抓住了 local 的信息,有的 head 更侧重于全局的性质。就这样简单地理解就可以,不必深究。

猜你喜欢

转载自blog.csdn.net/lusongno1/article/details/125699549