这里先以最原始的自然语言处理为例来写一下transformer
文章目录
整体结构
其实transformer就是一个大型的编码器和解码器结构?每个编码器中有6个块
- 工作流程:
- 获取输入句子的每个单词的表示向量X,其是由单词本身所提取出来的特征(Embedding)以及其位置所得的特征相加所得的;
- 将上边提到的特征转换为向量矩阵(如下1图所示)后传入编码器Encoder中,然后经过6个编码器块后就可以得到句子所有单词的编码信息矩阵C,入下2图所示。
每一行是一个单词的表示x
单词向量矩阵用Xn×d表示。其中,n是句子中单词个数,d是表示响亮的维度。每个编码块输出的矩阵维度与输入的完全一致。
- 将编码器Encoder输出的编码信息矩阵C传递到解码器Decoder中,它会一次根据当前翻译过的单词1~ i来翻译下一个单词i+1,如下图所示:在使用的过程中,当翻译到单词i+1的时候需要通过Mask掩盖操作来遮盖住i+1之后的单词。
图中,解码器接受了编码器的编码矩阵C,然后首先输入一个翻译开始符< Begin>,和预测第一个单词"I";然后输入翻译开始符 “< Begin>” 和单词 “I”,预测单词 “have”,以此类推
接下来说说各部分细节:
Transformer的输入
其输入表示如下图所示:
单词的输入表示 x由单词 Embedding 和位置 Embedding (Positional Encoding)相加得到
单词 Embedding
这玩意儿可以直接用Transformer来训练得到,也可以使用一些其他算法预训练得到。
位置 Embedding
由于Transformer不采用RNN结构,而是用全局信息。因此无法利用单词的顺序信息,但是这些信息对于NLP来说又很重要(或许气象预测的位置也很重要?)。所以要通过位置 Embedding来保存单词的位置。
这东西用PE表示,其维度和上边的单词Embedding是一样的。而且也可以通过训练得到/用某种公式计算得到,Transformer就是这样:
其中,pos表示单词在句子中的位置,d表示PE的维度,2i表示偶数的维度,2i+1表示奇数维度。用该公式有以下好处:
- 使 PE 能够适应比训练集里面所有句子更长的句子,比如训练集中最长句子只有10个单词,用这个方法即使来了个11词的橘子也可以计算出第11位的Embedding;
- 可以让模型轻松的计算出相对位置,也就是对于固定长度的间距 k,PE(pos+k) 可以用 PE(pos) 计算得到。因为 Sin/Cos(A+B)的展开式;
自注意力Self-Attention
Transformer的内部结构图如下所示:
左边是编码器块,右边是解码器块。红框里头的是由多个Self-Attention所组成的Multi-Head Attention。从图中不难看出,这东西在编码其中就一个,而在解码器中有两个,而且还有个有用的Masked。在其上方还有一个Add(用于防止网络退化的残差连接) & Norm(用于对每一层的激活值进行归一化) 层。
这玩意儿是这个模型的重点,接下来要好好介绍一下
Self-Attention 结构
下图是 Self-Attention 的结构,在计算的时候需要用到矩阵Q(查询),K(键值),V(值)
在实际应用中,其所接收的是输入(单词的表示向量x组成的矩阵X)/上个编码块的输出。而Q,K,V正式通过将Self-Attention的输入进行线性变换所得的。
Q, K, V 的计算
就是通过把输入的矩阵X分别乘上线性变化矩阵WQ,WK,WV来计算得到Q,K,V:
注意 X, Q, K, V 的每一行都表示一个单词
Self-Attention 的输出
计算公式如下:
计算矩阵Q和K每一行向量的内积,为了防止内积过大,因此除以 d k d_{k} dk的平方根
Q
×
K
T
Q×K^{T}
Q×KT所得的矩阵行列数都为n,也就是句子的单词数,该矩阵可以表示单词之间的attention强度,如下图所示:
再通过Softmax来计算每个单词对于其他单词的attention系数:
Softmax就是让每一行的和变为1
然后再乘上V就可以得到最终输出Z了:
上图中 Softmax 矩阵的第 1 行表示单词 1 与其他所有单词的 attention 系数,最终单词 1 的输出
Z
1
Z_{1}
Z1等于所有单词 i 的值
V
i
V_{i}
Vi根据 attention 系数的比例加在一起得到,如下图所示:
Multi-Head Attention
就是由多个Self-Attention组成,其结构如下所示:
包含多个 Self-Attention 层,首先将输入X分别传递到 h 个不同的 Self-Attention 中,计算得到 h 个输出矩阵Z
下图是 h=8 时候的情况,此时会得到 8 个输出矩阵Z:
得到 8 个输出矩阵Z1到Z8之后,Multi-Head Attention 将它们拼接在一起 (Concat),然后传入一个Linear层,得到 Multi-Head Attention 最终的输出Z。
可以看到 Multi-Head Attention 输出的矩阵Z与其输入的矩阵X的维度是一样的。
Encoder 结构
就是红框框起来的那部分,现在了解一下 Add & Norm 和 Feed Forward 部分
Add & Norm
这一层的计算公式如下所示:
其中 X表示 Multi-Head Attention 或者 Feed Forward 的输入,MultiHeadAttention(X) 和 FeedForward(X) 表示输出 (输出与输入 X 维度是一样的,所以可以相加)
- Add指 X+MultiHeadAttention(X),是一种残差连接,通常用于解决多层网络训练的问题,可以让网络只关注当前差异的部分,在 ResNet 中经常用到:
- Norm指 Layer Normalization,通常用于 RNN 结构,Layer Normalization 会将每一层神经元的输入都转成均值方差都一样的,这样可以加快收敛。
Feed Forward
该层较为简单,就是一个两层的全连接层。其中,第一次的激活函数为ReLU,而第二层则不使用激活函数,对应公式如下所示:
X是输入,Feed Forward 最终得到的输出矩阵的维度与X一致
组成 Encoder
通过上边提到的东西就可以构造出一个编码器块,它可以接受输入矩阵
X
(
n
×
d
)
X_{(n×d)}
X(n×d),并输出一个矩阵
O
(
n
×
d
)
O_{(n×d)}
O(n×d)。通过多个 Encoder block 叠加就可以组成 Encoder:
第一个 Encoder block 的输入为句子单词的表示向量矩阵,后续 Encoder block 的输入是前一个 Encoder block 的输出,最后一个 Encoder block 输出的矩阵就是编码信息矩阵 C,这一矩阵后续会用到 Decoder 中
Decoder 结构
红框框起来的就是解码器块结构,与编码器块结构的区别有以下几种:
- 包含两个 Multi-Head Attention 层;
- 第一个 Multi-Head Attention 层采用了 Masked 操作;
- 第二个 Multi-Head Attention 层的K, V矩阵使用 Encoder 的编码信息矩阵C进行 计算,而Q使用上一个 Decoder block 的输出计算;
- 最后有一个 Softmax 层计算下一个翻译单词的概率;
第一个 Multi-Head Attention
因为在翻译的过程中是顺序翻译的,即翻译完第 i 个单词,才可以翻译第 i+1 个单词,所以采用了Masked 操作来防止第 i 个单词知道 i+1 个单词之后的信息。
下面以"我有一只猫" 翻译成 “I have a cat” 为例来讲述下Masked操作:
- 在 Decoder 的时候,是需要根据之前的翻译,求解当前最有可能的翻译,如下图所示:
首先根据输入 “” 预测出第一个单词为 “I”,然后根据输入 “ I” 预测下一个单词 “have”
Decoder 可以在训练的过程中使用 Teacher Forcing (使用来自先验时间步长的输出作为输入)并且并行化训练,即将正确的单词序列 (< Begin> I have a cat) 和对应输出 (I have a cat < end>) 传递到 Decoder。
那么在预测第 i 个输出时,就要将第 i+1 之后的单词掩盖住,注意 Mask 操作是在 Self-Attention 的 Softmax 之前使用的,下面用 0 1 2 3 4 5 分别表示 “< Begin> I have a cat < end>”
- **第一步:**是 Decoder 的输入矩阵和 Mask 矩阵,输入矩阵包含 “< Begin> I have a cat” (0, 1, 2, 3, 4) 五个单词的表示向量,Mask 是一个 5×5 的矩阵,如下所示:
在 Mask 可以发现单词 0 只能使用单词 0 的信息,而单词 1 可以使用单词 0, 1 的信息,即只能使用之前的信息
- 第二步: 接下来就是和之前的Self-Attention一样了,输入X得到Q,K,V然后计算QKT:
- 第三步: 进行 Softmax,计算 attention score,我们在 Softmax 之前需要使用Mask矩阵遮挡住每一个单词之后的信息,遮挡操作如下:
就是跟之前比起来变成了经过mask处理后的矩阵。注意,单词 0 在单词 1, 2, 3, 4 上的 attention score 都为 0(应该是因为这只是个起始符的原因吧)
- 第四步: 用上边得到的那个矩阵和V相乘从而得到输出Z:
- 第五步: 通过上述步骤就可以得到一个 Mask Self-Attention 的输出矩阵 Z i Z_{i} Zi,然后也是拼接多个输出 Z i Z_{i} Zi然后计算得到第一个MHA的输出 Z Z Z;
第二个MHA
变化不大,主要就是 K, V矩阵是使用 Encoder 的编码信息矩阵 C 计算的:
- 根据 Encoder 的输出 C C C计算得到 K K K, V V V;
- 根据上一个 Decoder block 的输出 Z Z Z 计算 Q Q Q(如果是第一个 Decoder block 则使用输入矩阵 X 进行计算);
好处: 在 Decoder 的时候,每一位单词都可以利用到 Encoder 所有单词的信息 (这些信息无需 Mask)
Softmax 预测输出单词
最后用Softmax来预测下一个单词,通过之前的各种操作后得到一个最终输出
Z
Z
Z来预测单词:
又因为Mask,使得单词 0 的输出 Z0 只包含单词 0 的信息,如下:
看法
总之这玩意儿就是通过编码数据值和位置信息来探讨其内部特征,从而实现一定功能。那么这个想法运用到气象预测也是一个不错的选择?