Transformer
0. 概览
作为当下最先进的深度学习架构之一,Transformer 被广泛应用于自然语言处理领域。它不单替代了以前流行的循环神经网络(recurrent neural network,RNN)和长短期记忆(long short-term memory,LSTM)网络,并且以它为基础衍生出了诸如 BERT、 GPT-3、T5 等知名架构。
本文主要深入总结Transformer的实现细节及工作原理,具体内容包括:
- Transformer 简介
- 理解编码器
- 理解解码器
- 整合编码器和解码器
- 训练Transformer
1. Transformer 简介
1.1 Transformer背景
RNN和LSTM已经广泛应用于时序任务,比如文本预测、机器翻译、文章生成等。然而,它们面临的一大问题就是如何记录长期依赖。
tips.常见的时序任务:时间序列预测、机器翻译、语音识别、音乐/文本生成、视频分析与处理等等
1 | 1.RNN具有记忆能力,能够通过循环连接在时间步上传递信息,捕捉到先前时间步的信息。可以处理不同长度的输入序列。 |
为了解决这个问题,一个名为 Transformer 的新架构应运而生。从那以后,Transformer被应用到多个自然语言处理方向,到目前为止还未有新的架构能够将其替代。可以说,它的出现是自然语言处理领域的突破,并为新的革命性架构(BERT、GPT-3、T5 等)打下了理论基础。
1.2 Transformer定义
Transformer是一种用于自然语言处理(NLP)和其他序列到序列任务(sequence-to-sequence)的深度学习模型架构。
tips.能够将一个输入序列(比如一段文本)转换为另一个输出序列,例如翻译后的文本、生成的新文本等。
NLP中很多问题都可以被抽象为序列到序列的学习问题,比如机器翻译,文本摘要生成,问答系统。
Transformer 完全依赖于注意力机制,并摒弃了循环。它使用的是一种特殊的注意力机制,称为自注意力(self-attention)
Transformer 是如何工作的呢?我们通过一个文本翻译实例来了解。Transformer 由 编码器和解码器两部分组成。
- 首先向编码器输入一句话(原句),让其学习这句话 的特征
- 再将特征作为输入传输给解码器。
- 最后,此特征会通过解码器生成输出句(目标句)。
这个方法看起来简单,但是如何实现的呢?编码器和解码器是如何 将英文(原句)转换为法文(目标句)的呢?内部又是怎样工作的呢?
下面按照数据处理的顺序,依次介绍下 编码器和解码器的细节。
1.3 Transformer应用场景
- 自然语言处理(NLP)
- 机器翻译:最初Transformer就是应用于机器翻译任务.
- 文本生成:例如生成文章、对话等。
- 语言建模:预测下一个单词或字符
- 计算机视觉(CV)
- 图像分类:利用Transformer强大的特征提取能力对图像进行分类
- 目标检测:可作为目标检测模型的骨干网络。
- 语义分割:例如Pyramid Vision Transformer(PVT)被用于处理高分辨率图像的语义分割任务
- 语音识别与合成:结合声学模型和语言模型,实现高质量的语音识别和语音合成。
2. 编码器
Transformer 中的编码器不止一个,而是由一组 N 个编码器串联而成。一个编码器 的输出作为下一个编码器的输入。
需要注意的是,在 Transformer 原论文“Attention Is All You Need”中,作者使用 了 N = 6,也就是说,一共有 6 个编码器叠加在一起。
先来看看编码器的内部结构:

每一个编码器的构造都是相同的,并且包含两个部分:多头注意力层、前馈网络层。
这两部分是如何工作的呢? 我们先看看什么是自注意力机制。
2.1 自注意力机制
1. 背景引入
看一个例子:A dog ate the food because it was hungry(一只狗吃了食物,因为它很饿)。
例句中的代词 it(它) 可以指代 dog(狗)或者 food(食物)。 我们自然而然地认为 it 指代的是 dog,而不是 food。
但计算机改如何决定呢(指代消解)?这时,自注意力机制有助于解决这个问题。
2. 自注意力机制了解
模型首先计算 单词A 的特征值,其次计算 dog的特征值,以此类推。 当计算每个词的特征值时,模型都需要 遍历每个词与句子中其他词的关系。模型可以通过词与词之间的关系来更好地理解当 前词的意思。
比如,当计算 it 的特征值时,模型会将 it 与句子中的其他词一一关联,以便更好 地理解它的意思。
it 的特征值由它本身与句子中其他词的关系计算所得。通过关系,模型可以明确知道原句中 it 所指代的是 dog 而不是 food,这是因为 it 与 dog 的 关系更紧密,关系连线相较于其他词也更粗。
初步了解了什么是自注意力机制之后,我么具体看是怎么实现的
3. 实现原理
这个关系是怎么实现的呢?? 简单起见,假设输入句(原句)为 I am good(我很好)。
- 首先,我们将每 个词转化为其对应的词嵌入向量。(需要注意的是,嵌入只是词的特征向量,这个特征 向量也是需要通过训练获得的。)
- 这样原句( I am good )就可以用一个矩阵 X(输入矩阵或嵌入矩阵)来表示.(矩阵结构是什么样子呢?)矩阵 X 的维度为[句子的长度×词嵌入向量维度]
- (重点)通过矩阵 X,我们再创建三个新的矩阵:查询(query)矩阵 Q、键(key) 矩阵 K,以及值(value)矩阵 V。 (why 三个矩阵, 作用是?)
这三个矩阵在自注意力机制中的存在是为了实现不同的功能和计算步骤,从而使得模型能够有效地学习输入序列中不同位置之间的关系和依赖。
- 查询矩阵(Query Matrix):通过输入序列的线性变换得到的矩阵。用来计算注意力权重。每个查询向量对应于输入序列中的一个位置或单词,通过与键矩阵进行点积运算来计算与所有位置或单词之间的关联度(注意力分数)。
- 键矩阵(Key Matrix):键矩阵也是通过输入序列的线性变换得到的矩阵,用来计算注意力权重。每个键向量同样对应于输入序列中的一个位置或单词,通过与查询矩阵进行点积运算来计算注意力分数。
- 值矩阵(Value Matrix):值矩阵同样是通过输入序列的线性变换得到的矩阵,包含了每个位置或单词的信息。值矩阵的每一行对应于输入序列中的一个位置或单词,注意力机制将根据查询和键的相似度来加权平均值矩阵的行,以生成自注意力输出。
总结就是:自注意力机制通过查询矩阵和键矩阵之间的点积来计算每对位置或单词之间的相似度,然后通过 softmax 函数将这些相似度转换为注意力权重。这些注意力权重用来加权值矩阵的行,生成最终的自注意力输出,这样可以同时考虑输入序列中不同位置或单词之间的依赖关系,从而实现更有效的特征提取和建模。
4. 理解自注意力机制
4.1 第一步:计算查询矩阵 $Q$ 与键矩阵 $K^T$ 的点积
- 自注意力机制首先要计算查询矩阵 $Q$ 与键矩阵 $K^T$ 的点积,
但为何需要计算查询矩阵与键矩阵的点积呢? $Q \cdot K^T$ 到底是什么意思?下面,我们将通过细看$Q \cdot K^T$ 的结果来理解以上问题。
通过计 算两个向量的点积可以知道它们之间的相似度。
$Q \cdot K^T$ 矩阵的第一行 表示原句子 第一个单词….
因此,通过计算查询向量( $q_1$ )和键向量( $k_1$ 、 $k_2$ 、 $k_3$ )的点积,可以了解单词 I 与句子中的所有单词的相似度。
我们了解到,I 这个词与自己的关系比与 am 和 good 这两个词的关系更紧密,因为点积值$q_1 \cdot k_1$ 大于$q_1 \cdot k_2$ 和$q_1 \cdot k_3$。
4.2 第二步:将$Q \cdot K^T$ 矩阵除以键向量维度的平方根
目的主要是获得稳定的梯度.
4.3 第三步:使用 softmax 函数对其进行归一化处理
目前所得的相似度分数尚未被归一化,应用 softmax 函数将使数值分布在 0 到 1 的范围内,且每一 行的所有数之和等于 1。
为什么要归一化呢??
将得到的最终矩阵称为分数矩阵。通过这些分数,我们可以了解句子中的每 个词与所有词的相关程度。
$
\text{Attention}(Q, K) = \text{softmax} \left( \frac{Q \cdot K^T}{\sqrt{d_k}} \right) =
$
4.4 第四步:通过将分数矩阵与值矩阵$V$相乘,计算出注意力矩阵$Z$
至此,我们计算了查询矩阵与键矩阵的点积,得到了分数,然后用 softmax 函数
将分数归一化。自注意力机制的最后一步是计算注意力矩阵$Z$。
注意力矩阵包含句子中每个单词的注意力值。它可以通过将分数矩阵 $\text{softmax} \left( \frac{Q \cdot K^T}{\sqrt{d_k}} \right) $ 乘以值矩阵$V$得出
5. 计算流程图

2.2 多头注意力层
顾名思义,多头注意力是指我们可以使用多个注意力头,而不是只用一个。