Transformer

0、前置知识

Seq2Seq

Seq2Seq(是 Sequence-to-sequence 的缩写),就如字面意思,输入一个序列,输出另一个序列。这种结构最重要的地方在于输入序列和输出序列的长度是可变的。Seq2Seq 也不特指具体方法,满足「输入序列、输出序列」的目的,都可以统称为 Seq2Seq 模型。

Encoder-Decoder

Decoder 的通用的框架如上

Encoder 又称作编码器。它的作用就是「将现实问题转化为数学问题」
Decoder 又称作解码器,他的作用是「求解数学问题,并转化为现实世界的解决方案」

Encoder-Decoder 这个框架很好的诠释了机器学习的核心思路

将现实问题转化为数学问题,通过求解数学问题,从而解决现实问题

其中需要注意的是:

1、不论输入和输出的长度是什么,中间的向量 C 长度都是固定的
2、根据不同的任务可以选择不同的编码器和解码器,Encoder-Decoder 两部分都可以在 RNN、LSTM、GRU 模型中任意挑选。

Encoder-Decoder 和 Seq2Seq 的区别:

1、Seq2seq 是应用层的概念,即序列到序列,强调应用场景。
2、Encoder-decoder 是网络架构层面的概念,是现在主流框架,特指同时具有 encoder 模块和 decode 模块的结构。
3、encoder-decoder 模型是一种应用于 seq2seq 问题的模型。
4、目前,Seq2Seq 使用的具体方法基本都属于 Encoder-Decoder 模型的范畴

1、Transformer 模型结构

Transformer 可以看作是一个 Encoder-Decoder 模型,黑框表示出了整个 Transformer 的模型结构,在红线左侧是 Encoder 部分,在红线的右侧是 Decoder 部分。

2、Encoder 部分

Encoder 结构

这里需要注意到两个地方,一个是红框框出来的地方,这里说明 Transformer 是由多个该结构组成的,每个该结构称为一个 block。黄框框出来的地方说明在 Transformer 中加入了位置信息。

执行过程

Self Attention

下面需要计算 Self Attention,Self Attention 的计算见 https://clay-nuyoah.club/2021/07/10/self-attention/

Layer Norm

下面的计算中会用到 Layer Norm,先进行介绍。

对于向量 x = [1,2,3,4] 来说,首先获取 x 的均值,获取 x 的标准差,然后用下面的公式计算新的向量 $x_i’$

代码如下

1
2
3
4
5
6

import numpy as np

x = np.array([1,2,3,4])
(x - x.mean()) / x.std()

详细过程

红线部分框出了 Encoder 的输入,先执行左侧黄色框,然后执行右侧黄色框。

1、根据输入 b 计算 Self Attention,得到新向量 a
(向量 b 有两个来源,一个来源是起始时的输入,另一个来源是上一层的 block 块的输出)
2、根据 Self Attention 的输出 a 与输入向量 b 相加得到新的向量 c
3、向量 c 按照上面介绍的 Layer Norm 做归一化处理得到向量 d
4、向量 d 经过全神经网络得到新的向量 e
5、向量 e 与向量 d 向量相加得到新的向量 f
6、向量 f 做 Layer Norm 得到新的向量 g
7、当前的 block 计算结束,向量 g 可能作为下一个 block 的输入,或者是直接作为 Encoder 的输出
8、通过上面的步骤依次计算每一个输入的输出

Encoder 总结

上图是 Encoder 部分的简化图,红框部分就是步骤 4,黄框部分是 步骤 2,3 和步骤 5,6。

Transformer 的 Encoder 部分有很多结构,上图中左侧是上面讲的 Encoder 结构,右侧是另外一种结构,而且还有很多其他的结构。

3、Decoder 部分

Decoder 部分有两种结构,分别是 Auto regressive (AT) 和 Non-auto regressive (NAT)。

Self Attention And Masked Self Attention

下面的内容会用到 Self Attention 和 Masked Self Attention,先做介绍。

Self Attention

Self Attention 是每个输入彼此之间做 Attention。

Self Attention 的计算见 https://clay-nuyoah.club/2021/07/10/self-attention/

Masked Self Attention

正如上图所显示的那样,Decoder 输入并不是一次性进行输入的,只有在预测完一个词,才能用这个词的信息和 Encoder 的输出信息一起输入到 Decoder 中来预测下一个词,所以在 Decoder 中只有当前输入和以前的输入信息。

由于存在上面的问题,所以 Masked Self Attention 对 Self Attention 做了修改,做 Attention 的时候只有当前向量和以前的输入向量。

Auto regressive

Auto regressive 是将 Decoder 前期产生的输出信息,输入到 Decoder 中,然后根据 Encoder 的输出,使用 Decoder 预测下一个输出。

Auto regressive 首先会给 Decoder 一个特殊的 token,表示开始进行预测,然后 Decoder 根据 Decoder 自己的输入和 Encoder 的输入,预测出了 机 这个输出。由于用到了表示预测开始的这个 token,所以在词表中需要添加这个 token。

每次的输出都会根据上一次的输出和 Encoder 的输出产生新的输出。

直到遇到表示结束的特殊 token 来结束预测。所以在词表中也会添加表示预测结束的 token。有时也在词表中用同一个 token 来表示预测开始和预测结束。

Decoder 的内部结构如上图所示,看着非常的复杂,其实在 Encoder 中已经学习了绝大部分。这里也需要注意,在 Decoder 中也是由非常多的 block 组成,而且也加入了位置信息。

上面的图展示了 Encoder 和 Decoder 的区别,除了灰色覆盖区域外和红框区域,其他部分和 Encoder 是一样的。其中 Masked Self Attention 也已经做了介绍。

红框是 Cross Attention 部分,该部分的两个蓝圈表示 Multi-Head Attention 部分会受到来自于 Encoder 的两个输入,红圈表示 Multi-Head Attention 部分会受到一个来自 Decoder 内部的输入。

上图中 $q$ 就是来自 Decoder 内部的输入,$k^i、v^i$是来自 Encoder 的两个输入,会把 Encoder 的输出变成两个向量 $k^i、v^i$,这两个向量会跟 Decoder 内部传过来的向量做 Self Attention,得到 $v$,然后 $v$ 和 $q$ 相加,做 Layer Norm (这一块图中没有给出,但是根据上上图是有这么一个操作,而且图中做的是 Self Attention,而不是 Multi-Head Attention),最入输出到全连接网络中。

生成第二个输出的过程和生成第一个输出的过程是一样的。

做 Cross Attention 有很多的形式,上图的上部分是上面讨论的 Cross Attention,将 Encoder 中产生的输出,输入到 Decoder 中的每一个块中。下部分也列举了各种 Cross Attention。

AT v.s. NAT

AT 是给定一个输入,会有一个输出,而 NAT,是给定 N 个输入,会有 N 个输出。NAT 给定输入的方式有 2 种。

一种是用其他的模型当预测模型,来预测输出的长度,根据输出的长度,给定输入。

另一种是不管三七二十一给定非常多的输入,然后根据给定的 N 个输入,产生 N 个输出。从 $W_1$ 开始,直到出现结尾符结束,第一个结尾符后面的字符全都不要。

NAT 与 NT 相比 NT 能够进行并行计算,而现在 NAT 的表现还没有 NT 的表现好。

4、技巧

添加噪声

在训练时每次都给 Decoder 正确的输入,会使 Decoder 在看到哪几个关键字时,应该给出怎样的输出。

但是这样也会存在一些问题,问题是在测试时,输出中的某个词有错误,因为在训练的时候,模型没有见过这种错误,导致模型在接下来可能所有的输出都是错误的。

所以要给模型适当的输入少量的错误信息,能让模型拥有更强的容错性。

学会复制

在对话机器人任务中,要让机器人学会复制,对于* 库洛洛* 这样的名字,模型有很大的概率是没有见过的,所以当机器人在看到 你好,我是 XXX 时,要学会复制。

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信