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 时,要学会复制。

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

请我喝杯咖啡吧~

支付宝
微信