看模型:Transformer

Transformer是一个基于自注意力机制的大型编码器-解码器结构,用于处理序列数据。它通过单词的Embedding和位置Embedding获取输入,利用Self-Attention和Multi-HeadAttention处理全局信息,编码器和解码器通过残差连接和层归一化加速训练和提升性能。Decoder中的MaskedSelf-Attention用于防止未来信息泄露,确保翻译的顺序性。
摘要由CSDN通过智能技术生成

这里先以最原始的自然语言处理为例来写一下transformer


整体结构

其实transformer就是一个大型的编码器和解码器结构?每个编码器中有6个块

  • 工作流程
  1. 获取输入句子的每个单词的表示向量X,其是由单词本身所提取出来的特征(Embedding)以及其位置所得的特征相加所得的;
  2. 将上边提到的特征转换为向量矩阵(如下1图所示)后传入编码器Encoder中,然后经过6个编码器块后就可以得到句子所有单词的编码信息矩阵C,入下2图所示。

每一行是一个单词的表示x

单词向量矩阵用Xn×d表示。其中,n是句子中单词个数,d是表示响亮的维度。每个编码块输出的矩阵维度与输入的完全一致。

  1. 将编码器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 的信息,如下:


看法

总之这玩意儿就是通过编码数据值和位置信息来探讨其内部特征,从而实现一定功能。那么这个想法运用到气象预测也是一个不错的选择?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值