1 前言

2017年Google提出Transformer模型。过去了四年,想要入门Transformer原本是非常容易的,网上的资源一搜一大堆,但是大同小异,或者说没说到的地方都没说到,初学者看了之后除非悟性极好,否则还是不能理解(比如我)。所以我想尽量详细地叙述这个模型,综合网上各种贴子,可能你会有熟悉感。

修完大学公共数学基础三部曲即可。

2 总体概述

首先祭出这张最经典的论文图。

transformer版本对应python transformer入门_transformer

总体上Transformer模型使用的是 解码器-译码器 的模式,即encoder-decoder。直观上讲,

就是一个输入,被输入到encoder模块当中,encoder模块输出一个中间产物,中间产物被decoder使用(应该是反复使用),结合decoder本身的输入,经过一系列运算,输出结果(中间结果)。

理解上可以当做一个阅卷过程。encoder是试题组,综合考卷试题,给出一个给分细则,decoder像批卷老师,decoder输入是一份未批阅试卷,老师一手拿着给分细则打分,打分收到你之前题目作答情况,比如之前老师觉得给分太低,这时候有可能补偿式打分,最后将整分卷子批完。当然,给分一定合理吗?并不是。

这是个大概理解,接下来才是重点。

3. 各模块分析

Encoder

1. input embedding (输入嵌入)

以翻译为例。我要翻译一句话:I am a man.

我们中间是要对其进行数学运算,显然字符不合适,需要转化成数字。比如 数字1表示 I ,数字2表示 am,数字3表示 a , 数字4表示 man。只不过这是最朴素的想法,事实上一个句子中的每个单词,都有个词向量去表示,例如 man 可以表示成
transformer版本对应python transformer入门_搜索_02
这个叫做transformer版本对应python transformer入门_transformer_03编码方式,最简单的一种,直接“看式思义“。但是这个词向量长度维数非常高(不应该叫”长度“, “大小”感觉还可以),存储开销比较大,于是利用某些技术,降低维度,
transformer版本对应python transformer入门_搜索_04
某些技术指词嵌入技术,比如transformer版本对应python transformer入门_transformer_05, 可以在本站搜索,没搜索到应该是我还没写。 = =

转化成向量,很多计算就更加方便了,可以牵扯到矩阵的运算。向量->矩阵。

0

1

2

3

4

I

transformer版本对应python transformer入门_深度学习_06

transformer版本对应python transformer入门_深度学习_07

transformer版本对应python transformer入门_词向量_08

transformer版本对应python transformer入门_人工智能_09

transformer版本对应python transformer入门_人工智能_10

am

transformer版本对应python transformer入门_人工智能_11

transformer版本对应python transformer入门_transformer_12

transformer版本对应python transformer入门_搜索_13

transformer版本对应python transformer入门_搜索_14

transformer版本对应python transformer入门_搜索_15

a

transformer版本对应python transformer入门_人工智能_16

transformer版本对应python transformer入门_深度学习_17

transformer版本对应python transformer入门_transformer_18

transformer版本对应python transformer入门_词向量_19

transformer版本对应python transformer入门_搜索_20

man

transformer版本对应python transformer入门_人工智能_21

transformer版本对应python transformer入门_transformer_22

transformer版本对应python transformer入门_词向量_23

transformer版本对应python transformer入门_transformer_24

transformer版本对应python transformer入门_词向量_25

这样一个句子就转化成了矩阵,每一行是一个单词的词向量。实际上词向量列数有很多,整个矩阵大小是transformer版本对应python transformer入门_词向量_26 , 而真正的输入transformer版本对应python transformer入门_人工智能_27,是很多个这样类似的矩阵,是一个 transformer版本对应python transformer入门_transformer_28 的张量。

transformer版本对应python transformer入门_搜索_29

transformer版本对应python transformer入门_transformer_30 一般指同时代入训练模型的实例个数。因为你总不能把所有句子所代表的矩阵全扔进去。

2. position embedding (位置嵌入)

位置信息在翻译当中是重要的。

You do like it. (你确实喜欢它) Do you like it? (你喜欢它吗?) 翻译上存在不同。

position embedding 就是刻画位置信息的编码,类似于词向量。

 

论文当中采用三角式,

transformer版本对应python transformer入门_搜索_31

transformer版本对应python transformer入门_transformer_32

transformer版本对应python transformer入门_词向量_33 是单词在句子中的位置,transformer版本对应python transformer入门_深度学习_34 , transformer版本对应python transformer入门_transformer_35

 

最后信息添加的方式也非常简单,直接将输入矩阵transformer版本对应python transformer入门_人工智能_36

transformer版本对应python transformer入门_transformer_37

3. Multi-Head Attention (多头注意力机制)

这是核心部分。

transformer版本对应python transformer入门_人工智能_38

首先是transformer版本对应python transformer入门_搜索_39

我们在之前得到了处理过的transformer版本对应python transformer入门_人工智能_27了,我们需要用transformer版本对应python transformer入门_人工智能_27得到transformer版本对应python transformer入门_搜索_39. 转化如下(图中三个Linear部分)
transformer版本对应python transformer入门_transformer_43

transformer版本对应python transformer入门_词向量_44

transformer版本对应python transformer入门_词向量_45 一般情况下,最初可以是个transformer版本对应python transformer入门_transformer_46

下面我们先看不进行分头处理的注意力机制,就是解释下述公式。
transformer版本对应python transformer入门_深度学习_47

我们先看 transformer版本对应python transformer入门_transformer_48

在这里插入图片描述

transformer版本对应python transformer入门_transformer_48 是一个 transformer版本对应python transformer入门_transformer_46注意力矩阵,每一个元素 transformer版本对应python transformer入门_transformer_51 表示第 transformer版本对应python transformer入门_深度学习_52 个词和第 transformer版本对应python transformer入门_搜索_53 个词的相联程度,而这种相联程度使用对应词向量的点积进行描述。

比如向量 transformer版本对应python transformer入门_搜索_54

transformer版本对应python transformer入门_transformer_55

在向量运算当中, transformer版本对应python transformer入门_深度学习_56transformer版本对应python transformer入门_transformer_57transformer版本对应python transformer入门_transformer_58

transformer版本对应python transformer入门_词向量_59

那么为什么要除以 transformer版本对应python transformer入门_搜索_60 ?作用是把注意力矩阵变成标准正态分布,使得 transformer版本对应python transformer入门_词向量_61

transformer版本对应python transformer入门_词向量_62 是个怎样的函数呢?

Softmax函数,或称归一化指数函数,是逻辑函数的一种推广。它能将一个含任意实数的K维向量 “压缩”到另一个K维实向量 中,使得每一个元素的范围都在之间,并且所有元素的和为1。 ——百度百科

transformer版本对应python transformer入门_词向量_63

例如,transformer版本对应python transformer入门_搜索_64 , transformer版本对应python transformer入门_人工智能_65

可以发现 transformer版本对应python transformer入门_词向量_61

不过存在的问题就是指数运算过后,可能有上溢/下溢,解决方法就是对其进行变式。

经过这一系列处理,得到一个注意力矩阵,可以看作一个评分机制,或者是权值矩阵。我们再乘以 transformer版本对应python transformer入门_人工智能_67 ,本质上是对 transformer版本对应python transformer入门_人工智能_67 做一次求加权均值的过程。这样整个 transformer版本对应python transformer入门_人工智能_69 就获得了句子整体的信息。

最后我们来解释多头的含义。

所谓多头,就是指将矩阵均分成 transformer版本对应python transformer入门_transformer_70 组,每一组分别做注意力计算,最后我们再将他们连接到一起,再做一个线性变换,得到注意力层输出。需要注意的是 transformer版本对应python transformer入门_transformer_70 需要能整除 transformer版本对应python transformer入门_搜索_29

(论文中 transformer版本对应python transformer入门_transformer_70

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hsqghzPS-1644115648285)(Transformer学习/ai-1-6.png)]

我们说注意力机制是一种词和词之间的关系,一个词在每个头更“关注”的部分不同,使用多个头可以反映这种不同的关注,接合起来使得矩阵蕴含更复杂的信息。

4. Add&Norm (残差连接与归一化)

transformer版本对应python transformer入门_词向量_74 过程是一个残差连接的过程,做的事情就是 transformer版本对应python transformer入门_transformer_75 。这一处理主要目的是防止梯度消失

transformer版本对应python transformer入门_transformer_76 过程是一个归一化的过程,主要目的是将矩阵按行化为标准正态分布,加快收敛过程,加快训练速度。

5. Feed Forward (前馈神经网络)

transformer版本对应python transformer入门_搜索_77

前馈神经网络主要作用是提供非线性转换,增强模型泛化能力。非线性部分指的是 transformer版本对应python transformer入门_人工智能_78 函数,常见的一种激活函数。
transformer版本对应python transformer入门_深度学习_79

transformer版本对应python transformer入门_搜索_80

Decoder

6. Outputs (解码器输入)

解码器也是有输入的,输入为译码器输入句子的译文。这种译文输入形式类似译码器输入,并不是“翻译”结果,这个 transformer版本对应python transformer入门_词向量_81 是我们给定的。但是我们并不能让模型以一个“上帝视角”去学习,如果整个译文信息在翻译时被全部观测到,那“学习”是效果差的。所以需要 transformer版本对应python transformer入门_人工智能_82 技术使得翻译时不能够提前得到词的信息。

7. Masked Multi-Head Attention

transformer版本对应python transformer入门_人工智能_82

transformer版本对应python transformer入门_深度学习_84

其中一种 transformer版本对应python transformer入门_人工智能_82 是一种填充 (transformer版本对应python transformer入门_搜索_86) 技术,因为句子长度不一,我们并行处理的张量规模需要一致,因此我们选择其中最长的句子长度作为句子的尺度,空出来的部分(灰色),使用 0 填充。

第二种 transformer版本对应python transformer入门_人工智能_82 只在 transformer版本对应python transformer入门_transformer_88 中使用,注意蓝色和橙色部分。我们不能利用未来的信息,所以也需要 transformer版本对应python transformer入门_人工智能_82 ,所利用的是之前的译文信息。使用 transformer版本对应python transformer入门_词向量_90

8. Linear && Softmax

transformer版本对应python transformer入门_transformer_91 负责将得到的解码器输出映射到一个高维向量,维度取决于词典大小。

transformer版本对应python transformer入门_搜索_92

3. 过程

例子 I am a man.

首先我们需要一个词典,记录用到的词。还有开始符(BOS),结束符(EOS),也被记录到词典里。

初始时,只有BOS一个符号。我们把句子以张量形式输入到译码器中,注意解码器和译码器并不是只有一个,而是有 transformer版本对应python transformer入门_词向量_93 个复制。transformer版本对应python transformer入门_transformer_94 的特点之一就是方便并行处理,提高效率。通过编码器我们得到一个隐藏层 (中间矩阵),这时候我们利用这个编码器输出矩阵线性变换为解码器的 transformer版本对应python transformer入门_词向量_95 输入,另外解码器还有输入部分就是给出的译文信息变换成的 transformer版本对应python transformer入门_词向量_96

BOS -> BOS 我 -> BOS 我 是 -> BOS 我 是 一 … -> BOS 我 是 一 个 男 人 EOS

我们定义损失函数,和真实翻译结果比较,运用反向传播算法,更新权值矩阵。