【学习资源】How Transformers work in deep learning and NLP: an intuitive introduction
目录
1 Representing the input sentence 输入句子的表示
1.1 Sets and Tokenization 集和标记
2 Fundamental concepts of the Transformer Transformer的基本概念
2.1 Feature-based attention: The Key, Value, and Query 基于特性的注意:Key、Value和Query
2.2 Vector similarity in high dimensional spaces 高维空间中的向量相似性
3 Self-Attention: The Transformer encoder 自我注意:Transformer编码器
4 Short residual skip connections 短跳跃连接
7 The core building block: Multi-head attention and parallel implementation 核心构建块:多头关注和并行实现
8 Sum up: the Transformer encoder
9 Transformer decoder: what is different?
9.1 Masked Multi-head attention
9.2 Encoder-Decoder attention: where the magic happens
11 Self-attention VS linear layers VS convolutions
随着2017年《Attention is all you need》的发表,我们对attention的思考发生了巨大的变化:在足够的数据集的情况下,可以通过矩阵乘法、线性层和层归一化,实现最先进的机器翻译。
但是(Nonetheless),2020年绝对是Transformer胜年!从自然语言到计算机视觉任务。
- How did we go from attention to self-attention? 如何从attention到self-attention?
- Why does the transformer work so damn well? 为什么Transformer工作得这么好?
- What are the critical components for its success? 它成功的关键因素是什么?
实际上,Transformer还是比较容易理解的(Transformers are not so hard to grasp)。所有相关概念的混合会带来混淆,尤其是attention,那就一步一步的理解吧!
利用递归神经网络(RNN’s),我们习惯于按顺序处理序列,以保持句子的顺序。为了满足这种设计,每个RNN组件(层)都需要前面的(隐藏的)输出。因此,依次进行堆叠LSTM计算。
直到Transformer出来!Transformer的基本组成部分是self-ateention。首先,我们需要明白
- Sequential processing 顺序处理
- Recurrency 递归
- LSTM 长期记忆网络
1 Representing the input sentence 输入句子的表示
1.1 Sets and Tokenization 集和标记
Transformer革命始于一个简单的问题:
- Why don’t we feed the entire input sequence? 为什么我们不输入整个输入序列?
- 隐藏状态之间没有依赖关系!
Tokenization的过程如下,这是将输入到模型前的三步骤之首。显而易见,现在是一个集合Set,而不是一个元素序列。
Set集合是不同元素的集合,其中元素在集合中的排列无关紧要。将输入集合进行标记,则序列的元素为一个个token。
Tokenization之后,将words投影到分布几何空间(a distributed geometrical space)或者简单地构建单词嵌入(word embeddings)。
1.2 Word Embeddings 单词嵌入
嵌入Embedding是符号symbol(单词、字符、句子)在连续值向量分布的低维空间中的表示。
单词Word不是离散的符号。它们之间有很强的相关性。这就是为什么当我们把它们投射到连续的欧几里得空间时我们能找到它们之间的联系。然后,根据任务的不同,我们可以把单词嵌入推得更远,也可以把它们紧密地放在一起。
理想情况下,嵌入通过在嵌入空间中紧密地放置语义相似的输入来捕获输入的语义。
在自然语言中,可以找到相似的词的意思,甚至相似的句法结构。在任何情况下,当将它们投射到2D或3D空间时,可以直观地识别一些集群。感受以下动图对其的可视化效果:
Word Embedding之后,需要提供集合里一些顺序概念(notion of order),得知到它在哪里哇!
1.3 Positional encodeings
将一个序列转换为一个集合(标记化)时,会失去了顺序信息。或许能从“Hello I love you”的序列中找出单词(符号)的顺序,但是如果是很多个个无序的单词呢?但是,机器学习是关于Scale的。神经网络当然不能理解集合中的任何顺序。
因为Transformer将序列处理为集合,因此,在理论上它们是置换不变permutation invariant的。
因此,可以将embedding建立在位置信息上,来获得顺序的感知。根据官方的说法,位置编码是一组小常数,它们被添加到单词嵌入向量的第一层self-attention之前。这样,如果同一个单词出现在不同的位置,实际的表现形式将略有不同,这是因为它在输入句子中的位置不同。在Transformer的论文中,作者提出了正弦函数的位置编码,正弦函数告诉模型注意一个特定的波长λ,在例子中,λ将依赖于句子中的位置。用于区分奇数和偶数位置。
这与循环Recurrent模型相反,在循环模型中,有一个顺序,但很难注意到不够接近的token。
2 Fundamental concepts of the Transformer Transformer的基本概念
2.1 Feature-based attention: The Key, Value, and Query 基于特性的注意:Key、Value和Query
Key-value-query概念来源于信息检索系统,因此,从一个在影视平台上搜索视频的例子开始:
- 当搜索(query)一个特定的视频时,搜索引擎会将你的查询(query)映射到与可能存储的视频相关的一组键keys(视频标题、描述等)。然后算法会为你呈现最佳匹配的视频(value)。这是基于内容/特性的查找(feature-based lookup)的基础。
在单个视频检索中,attention是选择相关度最大的视频。但是我们可以放宽这个想法。为此,Attention系统和retrieval系统的主要区别在于,我们引入了更抽象、更流畅的“检索retrueving”对象的概念。通过定义表示(视频)之间的相似度(权重),我们可以对查询Query进行权重Weight。
我们现在关注的是我们想要看的内容,而不是根据序列中的位置来选择看哪里!因此,通过向前移动一步,我们进一步将数据分割为键值对(key-value pairs)。
使用键Key来定义关注权重Attention Weight查看数据,并将值Value作为我们实际获得的信息。
对于所谓的映射,需要量化相似度Quantify similarity。
2.2 Vector similarity in high dimensional spaces 高维空间中的向量相似性
在几何中,内向量积被解释为向量投影。定义向量相似性的一种方法是计算归一化内积。
我们可以通过计算比例点积,即角度的余弦,来关联代表任何事物(如动物)的向量之间的相似性。
在Transformer中,这是最基本的操作,由Self-Attention层来处理。
3 Self-Attention: The Transformer encoder 自我注意:Transformer编码器
What is self-attention?
- 自我注意,有时也被称为内部注意,是一种将单个序列的不同位置联系起来的注意机制。
- 目的是计算出序列的表示。
自我注意使我们能够发现输入的不同单词之间的关联,表明句子的句法和上下文结构。
以输入序列“Hello I love you”为例。一个训练有素的自我注意层会把“love”和“I”联系在一起,而“you”的权重比“Hello”高。从语言学的角度,我们知道这些词有一种主谓宾的关系,这是一种直观的方式来理解自我注意会捕捉到什么。
实际上,Transformer使用了3种不同的表示:嵌入矩阵的Queries、Keys和Values。这可以通过将输入乘以三个不同的权重矩阵。本质上,它只是原始单词“嵌入”中的一个矩阵乘法。
有了Query、Value和Key矩阵,我们现在可以将自我关注层应用为:
在原文中,我们选取了比例化的点积注意力作为评分函数,来表示两个词之间的相关性(注意力权重)。注意,我们还可以利用另一个相似函数,这里只是一个比例因子来确保向量不会爆炸。
按照我们前面介绍的database-query范例,这个术语只是查找与数据库中的条目相似的搜索查询。最后,我们应用softmax函数得到最终的注意力权重作为一个概率分布。
注意力矩阵看作是去Where看,而Value矩阵是真正想要得到的。
Notice any differences between vector similarity?
- 利有矩阵而不是向量,结果是矩阵乘法。
- 不按向量的大小缩放而是按矩阵的大小,也就是一个句子的字数,句子大小不一!
What would we do next?
Normalization归一化和Short skip connections短跳跃连接,类似于处理一个张量后卷积或递归。
4 Short residual skip connections 短跳跃连接
在语言方面,有一个重要的概念,即对世界有更广泛的理解,以及我们结合思想的能力。人类广泛地利用这些自上而下的影响(我们的期望)在不同的语境中组合单词。以一种非常粗糙的方式,跳过连接赋予Transformer一种微小的能力,允许不同处理级别的表示进行交互。
随着多路径的形成,我们可以将对最后一层的更高层次的理解“pass”到之前的层。这使我们能够重新调整我们对输入的理解。这和人类自上而下的理解是一样的,也就是期望。
5 Layer Normalization 层归一化
在层归一化(LN),计算跨通道和空间维度的平均值和方差。在语言中,每个单词都是一个向量。因为我们处理的是向量,所以只有一个空间维度。
在应用层归一化并形成残差跳跃连接后:
尽管这可能是一个独立的构建块,但Transformer的创建者在其顶部添加了另一个线性层,并将其与另一个跳跃连接重新规范化。
6 The linear layer 线性层
线性变换层。有很多有趣的方法来描述可训练矩阵乘法:线性层(PyTorch)、密集层(Keras)、前馈层(old ML books)、全连接层。在本教程中,我们将简单地使用线性层,即:
import torch.nn as nn
dim = 512
dim_linear_block = 512*4
linear = nn.Sequential(
nn.Linear(dim, dim_linear_block),
nn.ReLU,
nn.Dropout(dropout),
nn.Linear(dim_linear_block, dim),
nn.Dropout(dropout))
主要的直观是它们将自我注意的输出投射到一个更高维度的空间(本文中为X4)。这解决了糟糕的初始化bad initializations和rank崩溃rank collapse。我们将在图中简单地描述为线性。
实际上这几乎是Transformer的编码器。有一点不同是多头的注意Multi-head attention。
7 The core building block: Multi-head attention and parallel implementation 核心构建块:多头关注和并行实现
在原论文中,作者将self-attention的概念扩展为Multi-head attentio。从本质上说,就是反复使用注意机制。每次,我们将Key, Query, Value矩阵的独立集合映射到不同的低维空间,并计算那里的注意力(输出称为“head”)。这个映射是通过将每个矩阵与一个单独的权重矩阵相乘来实现的。为了补偿额外的复杂性,输出向量大小除以头的数量。由于头是相互独立的,我们可以在不同的worker上并行执行自我注意计算:
But why go through all this trouble?
多头注意力背后的直觉是,它允许我们每次以不同的方式关注序列的不同部分。这实际上意味着:
- 该模型可以更好地捕捉位置信息,因为每个头将关注输入的不同部分。它们的组合将给我们一个更健壮的表示。
- 通过以独特的方式将单词关联起来,每个头部也会捕捉不同的上下文信息。
- 原文:“多头注意允许模型共同注意来自不同位置的不同表示子空间的信息。对于一个注意力头,平均会抑制这种情况。”
我们将在我们的图中描述多头自我注意:
8 Sum up: the Transformer encoder
To process a sentence we need these 3 steps要处理一个句子,我们需要以下三个步骤:
-
Word embeddings of the input sentence are computed simultaneously.同时计算输入句子的词嵌入。
-
Positional encodings are then applied to each embedding resulting in word vectors that also include positional information.然后将位置编码应用于每个嵌入,从而得到也包含位置信息的单词向量。
-
The word vectors are passed to the first encoder block.单词向量被传递给第一个编码器块。
Each block consists of the following layers in the same order每个块都由下列相同顺序的层组成:
-
A multi-head self-attention layer to find correlations between each word:一个多头自我注意层来发现每个词之间的相关性
-
A normalization layer 归一化层
-
A residual connection around the previous two sublayers 在前两个子层周围的残差连接
-
A linear layer 一个线性层
-
A second normalization layer 第二个归一化层
-
A second residual connection 第二个残差连接
请注意,上面的块可以被复制几次以形成编码器。在原论文中,编码器由6个相同的块组成。
9 Transformer decoder: what is different?
该解码器由上述所有组件和两个新组件组成。像以前一样:
-
The output sequence is fed in its entirety and word embeddings are computed 输出序列全部输入,并计算单词嵌入
-
Positional encoding are again applied 再次应用位置编码
-
And the vectors are passed to the first Decoder block 量被传递给第一个解码器块
每个解码器块包括:
-
A Masked multi-head self-attention layer
-
A normalization layer followed by a residual connection
-
A new multi-head attention layer (known as Encoder-Decoder attention)
-
A second normalization layer and a residual connection
-
A linear layer and a third residual connection
解码器块再次出现6次。最终输出通过最终线性层进行转换,输出概率通过标准softmax函数计算。
输出概率预测输出语句中的下一个标记。如何?从本质上说,我们给法语中的每个单词分配一个概率,然后我们只保留得分最高的那个。
9.1 Masked Multi-head attention
如果您没有意识到,在解码阶段,我们预测一个单词(标记)接一个单词(标记)。在机器翻译等自然语言处理问题中,序列标记预测是不可避免的。因此,需要对自我注意层进行修改,以便只考虑到目前为止生成的输出语句。
在我们的翻译示例中,解码器在第三次传递中的输入将是“Bonjour”,“je”... ...。
如你所见,这里的区别是我们不知道整个句子,因为它还没有被制造出来。这就是为什么我们需要忽略未知的单词。
随着指数的增长,0会变成1,而∞会变成0。
这实际上与删除相应的连接具有相同的效果。其余的原则与编码器的注意完全相同。同样,我们可以并行地实现它们来加速计算。显然,每计算一个新令牌,掩码就会改变。
9.2 Encoder-Decoder attention: where the magic happens
这实际上是解码器处理编码表示的地方。编码器生成的注意矩阵与前一个maked多头注意块的结果一起传递给另一个注意层。
编码器-解码器注意层背后的直觉是将输入和输出句子结合起来。编码器的输出封装了输入语句的最后嵌入,它就像我们的数据库。因此,我们将使用编码器输出来生成Key和Value矩阵。另一方面,mask多头注意块的输出包含到目前为止生成的新语句,并在注意层以查询矩阵的形式表示。同样,它是数据库中的“搜索”。
编码器-解码器的注意力被训练成将输入的句子与相应的输出词相关联。它最终将确定每个英语单词与法语单词之间的关系。这就是英语和法语之间的映射发生的地方。
请注意,编码器的最后一个块的输出将用于每个解码器块。
10 关于为什么Transformer工作得这么好?
1.每个块的分布式独立表示:每个transformer块有h=8h=8上下文化表示。直观地说,您可以将其看作卷积层的多个特征映射,从图像中捕获不同的特征。卷积的不同之处在于,在这里我们对其他空间有多个视图(线性重投影)。这当然可以通过最初将单词表示为欧几里得空间中的向量(而不是离散符号)来实现。
2.词的意思很大程度上取决于语境:这正是自我关注的意义所在!我们将注意力权重表示的单词表示法之间的关系联系起来。不存在局部性的概念,因为我们自然地让模型进行全局关联。
3.多个编码器和解码器块:有更多的层,模型更抽象的表示。类似于叠加递归或卷积块,我们可以叠加多个Transformer块。第一个块关联词向量对,第二个块关联词向量对,第三个块关联词向量对,以此类推。平行地,多个头部集中在对的不同部分。这类似于接受场,但是基于成对的分布式表示。
4.高级别和低级别信息的组合:当然是通过跳跃连接!它们使自顶向下的理解能够通过反向流动的多个梯度路径回流。
11 Self-attention VS linear layers VS convolutions
注意力和前馈层有什么区别?难道线性层对输入向量所做的操作与注意力所做的操作完全相同吗?
如果深入研究这些概念,答案是否定的。可以看到,自我注意权重的值是动态计算的。它们是依赖于数据的动态权值,因为它们会根据数据动态更改(快速权值)。例如,翻译序列中的每个单词(Bonjour, je t’aime)对于输入的作用是不同的。另一方面,在随机梯度下降时,前馈(线性)层的权值变化非常缓慢。在卷积中,我们进一步将(慢)权值限制为固定大小,即内核大小。
@article{adaloglou2021transformer,
title = "Transformers in Computer Vision",
author = "Adaloglou, Nikolas",
journal = "https://theaisummer.com/",
year = "2021",
howpublished = {https://github.com/The-AI-Summer/self-attention-cv},
}