目录
6.前馈网络(Position-wise Feed-Forward Networks)
一、相关资源
论文题目:Attention Is All You Need
参考代码:https://github.com/jadore801120/attention-is-all-you-need-pytorch
二、Motivation
- RNN可以有效处理时序信息,将前面的信息放到隐藏状态里,一个个地传递下去。存在的问题就是无法并行计算。
- 在卷积网络中两个位置隔着比较远的元素如果需要融合的话需要多层卷积才能实现。但是在transformer中这种从一个变量到另一个变量操作步骤是一个恒定的,时间复杂度为O(1),尽管会降低一些分辨率。
- 自注意力机制工作:已经成功地应用于各种任务,包括阅读理解、抽象摘要、文本蕴涵与学习任务无关的句子表示等方面,为transformer的提出提供了参考。
三、技术细节
1.自注意力机制(多头)
为了让模型能够捕捉不同的特征模式,Transformer引入了多头自注意力机制。具体来说,它将自注意力层复制多次(即多个“头”),并分别进行不同的线性变换,然后将这些头的输出拼接在一起,进行最终的线性变换。这使得模型能够同时关注到输入序列的不同的特征和模式,提高了表示能力。
(1)基本原理
多头自注意力机制通过并行地使用多个自注意力头来捕捉输入序列中的不同上下文信息。每个头都会独立地对输入序列进行自注意力计算,即计算每个词元与序列中其他词元的相关性,并生成一个注意力分布,这个分布决定了该头在输入序列中各个位置的重要性。
(2)处理过程
①分割输入
输入序列的每个词向量会被分割成多个头(Head),每个头关注输入的不同部分。例如,如果输入词向量的维度是512,可以选择创建8个头,每个头的维度就是64。
②计算注意力
对于每个头,分别计算其自注意力。这意味着每个头都会生成一个注意力分布,该分布通过计算输入序列中每个词元与当前词元之前所有词元的键(Key)进行点积,并应用Softmax函数获得权重,然后根据这些权重对值(Value)向量进行加权求和,从而生成该头的输出。
③拼接输出
所有头的输出会被拼接起来,形成一个新的表示。这个表示的维度与原始输入相同,但包含了多个头关注的信息。
④线性变换
最后,通过一个输出权重矩阵对拼接后的表示进行线性变换,得到最终的输出矩阵。
2.掩码自注意力层
Masked Self-Attention Layer(掩码自注意力层)在Transformer模型的Decoder部分中扮演着关键角色,主要用于解决序列生成任务中的一些问题,特别是在训练和预测阶段。
(1)作用
①防止信息泄露
在训练阶段,Masked Self-Attention Layer确保Decoder在生成某个位置的输出时,不会看到该位置之后的信息,即防止模型“作弊”使用未来的信息。这有助于模型学习到正确的依赖关系,并生成合理的序列。
②符合自回归特性
在序列生成任务中,模型需要逐步生成序列的每个元素,而每个元素的生成都只能依赖于之前已经生成的元素。Masked Self-Attention Layer通过掩码操作实现了这一点,使得模型在生成当前位置的输出时,只能关注到之前位置的信息。
③保持预测一致性
在预测阶段,Masked Self-Attention Layer确保对于重复的输入序列,模型能够生成一致的输出序列。这有助于保持模型预测的稳定性和可靠性。
(2)实现步骤
①计算自注意力得分
首先,模型会为输入序列中的每个元素(通常是词嵌入向量)生成三个不同的表示:查询向量(Query)、键向量(Key)和值向量(Value)。然后,通过计算查询向量和键向量之间的相似度(通常是点积)+softmax操作来得到自注意力得分(上图中的alignment scores)。
②应用掩码
在得到自注意力得分(上图中的alignment scores)后,Masked Self-Attention Layer会应用一个掩码矩阵来修改这些得分。掩码矩阵的大小与自注意力得分矩阵相同,但其值通常是一个二进制矩阵,用于将未来位置的注意力权重设置为0(或非常小的负数,以确保在Softmax操作后这些位置的权重接近于0)。这样,模型在生成某个位置的输出时就不会受到该位置之后信息的影响。
③加权求和(这个就是softmax操作后的步骤了)
经过掩码处理后的自注意力得分会被用于对值向量进行加权求和,从而得到每个位置的输出表示。这个输出表示既包含了当前位置的语义信息,也包含了之前位置的信息(通过自注意力机制),但不包含未来位置的信息(由于掩码的作用)。
(3)掩码矩阵生产方式(扩展):
①在实现过程中,可以通过编程手段生成这样的掩码矩阵。
例如,在PyTorch中,可以使用torch.triu(或torch.tril的转置,取决于你想要的掩码形状)函数生成一个上三角矩阵,然后将其元素设置为负无穷大,再将其与自注意力得分矩阵相加。但是,更常见的是直接生成一个与自注意力得分矩阵形状相同的全零矩阵,然后将其下三角(包括对角线)部分设置为负无穷大。
②另一种常见的做法
是在实现多头注意力机制时,将掩码矩阵作为一个额外的参数传递给注意力层,并在注意力得分的计算过程中应用这个掩码。
3.layerNorm归一化
与batchNorm相对应,layerNorm针对样本归一化,batchNorm针对特征归一化。
为什么transformer使用layernorm?
由于序列长度变化、批次大小(模型很复杂)、计算依赖性、适应性和泛化能力方面考虑,使用layernorm。
4.自注意力计算方式
由于计算过程均为矩阵的点积运算(文章中称这种方式为“Scaled Dot-Product Attention”),所以计算可以采用并行方式,解决了RNN网络无法并行计算的问题。
5.残差连接
在Transformer模型中,残差连接被应用在其两个主要组件中:编码器(Encoder)和解码器(Decoder)内部的多个自注意力(Self-Attention)层和前馈神经网络(Feed-Forward Neural Network, FFN)层之间。
(1)编码器
(2)解码器
解码器的结构类似,但在自注意力层和编码器-解码器注意力层(Encoder-Decoder Attention Layer)之后都使用了残差连接。解码器的每个子层也是由自注意力层、编码器-解码器注意力层以及前馈神经网络层组成,这些层之间都使用了残差连接。
6.前馈网络(Position-wise Feed-Forward Networks)
本质上是一个MLP,作用在编码器和解码器的最后一个维度,注意RNN和Transformer中对MLP的使用及其具有的不同意义。
7.位置编码
Positional Encoding(位置编码)是Transformer模型中的一个重要组成部分,用于向模型提供序列中每个元素(如单词或字符)的位置信息。由于Transformer模型完全基于自注意力机制,而不像循环神经网络(RNN)或长短期记忆网络(LSTM)那样天然具有处理序列数据的能力,因此需要通过位置编码来引入序列的顺序信息。
本文采用计算方式(正弦余弦函数):
四、网络结构及参数选择
1.网络结构
(1)Transformer encoder block
(2)Transformer decoder block
2.不同种类模型对比
四种层在数据、序列计算(就是指的下一步计算要等多久才能进行)复杂度和位置信息三个方面去比较,解释得到为什么要使用自注意力层:
- 在循环神经网络中,每个单词生成都需要一个MLP(一个向量为d维),需要的时间复杂度是d维向量进行全连接操作,复杂度是d^2,生成n个单词复杂度就是n*d^2
- 关于卷积,这里是使用1D卷积来实现的,卷积核大小为k,对n个d维向量,输入输出都为d,感受野是k,那么k范围内的信息一次就可以传递,其他的不行,所以这里使用logk为底
- 由于transformer对网络的约束比较少,所以需要更大的网络才可以实现RNN、CNN训练相同的效果,所以导致transformer又大又贵
3.超参数选择
dmodel指的是 Transformer 架构中的一个关键参数,即模型的嵌入维度(embedding dimension)。这个参数定义了输入序列和输出序列中每个元素(如单词或字符)的向量表示的大小。在深度学习中,嵌入维度是一个重要的超参数,它影响模型的学习能力和泛化能力。
具体来说,在 Transformer 架构中,输入和输出都会首先被转换成一个固定大小的向量,这个向量的维度就是由 dmodel 指定的。例如,在表格中,base 模型的 dmodel 是 512,这意味着在基本模型中,每个输入元素都被转换成一个 512 维的向量。
较大的 dmodel 值可能会允许模型捕获更多的信息,但同时也会增加模型的复杂度和计算需求。因此,在实际应用中,需要权衡模型性能和资源消耗来选择合适的 dmodel 值。
五、创新点
1.自注意力机制
相比传统的循环神经网络(RNN)和长短期记忆网络(LSTM),自注意力机制能够并行处理所有输入数据,大大提高了计算效率,并且能够更好地处理长序列数据。
2.编码器-解码器结构
编码器和解码器内部都使用了多个堆叠的自注意力层和前馈神经网络层,并通过残差连接和层归一化来提高模型的训练效率和稳定性。
3.位置编码
由于自注意力机制本身并不包含序列中元素的位置信息,Transformer模型引入了位置编码来弥补这一缺陷。位置编码将每个元素的位置信息嵌入到输入序列中,使得模型能够理解元素之间的相对位置关系。
4.多头注意力
多头注意力机制允许模型在不同的表示子空间中学习不同的信息,从而提高了模型的表达能力和泛化能力。
六、评价
1.文章写作方面
文章非常简洁但是不推荐(篇幅太短,有些内容没有讲清楚)
2.模型方面
(1)在各种任务上包括语音、图像、自然语言等都有很好的表现。
(2)并且预训练模型也让我们自己训练变得更加简单。
(3)人对世界的感知是多模态的,当所有的感知都可以使用同样的架构,放到同样的语义空间内,使得文本、语音、图像等数据融合训练更好更大的模型。
(4)Attention只是transformer模型的一个点,其主要作用是把序列信息聚合起来,后面的MLP、droupout层都起到了很大的作用,都是缺一不可的,模型并不是只需要Attention。
七、启发/idea
1.文章写作方面
建议把一些不重要的东西放到附录里面,但是要在正文讲好一个故事,为什么要做这些事情,设计的理念、对问题和模型的思考
2.科研思维方面
(1)全局视角与局部细节的结合
Transformer通过自注意力机制,能够在处理每个输入元素时考虑到整个序列的信息,这体现了全局视角的重要性。然而,模型中的多头注意力机制又允许在不同的表示子空间中关注不同的局部细节。
(2)创新性的模型设计
Transformer的架构设计充满了创新性,如自注意力机制、编码器-解码器结构、位置编码和多头注意力等。这些创新点不仅解决了传统模型存在的问题,还开辟了新的研究方向和应用领域。
(3)模块化与可复用性
Transformer模型中的各个组件(如自注意力层、前馈神经网络层等)都是相对独立的模块,可以方便地进行替换、组合和扩展。这种模块化设计提高了模型的灵活性和可复用性,使得研究人员可以根据具体任务的需求对模型进行定制和优化。
(4)数据驱动与模型优化
Transformer模型的训练和优化过程高度依赖于大规模数据集和高效的优化算法。这体现了数据驱动在科研中的重要性。