4.7.3 自注意力网络(Transformer)
Last updated
Last updated
自注意力网络(Transformer) 是一种基于自注意力机制(Self-Attention)的深度神经网络结构分类。最初的设计原型来自于 2015 年由 约书亚·本吉奥(Yoshua Bengio,1964~Present) 有关神经网络翻译模型优化而提出的设想 [22] 。
本吉奥 通过引入一种模拟生物在感知、学习、思考过程中自然而然产生的,主被动关注关键点的生理机制,来解决传统 机器学习(ML)编码器-解码器(Encoder-Decoder) 翻译模型(Translation Models)的 长句压缩固定长度(Fixed-Length) 特征,导致潜层语意缺失的问题。这种模拟方式,能够将长句(Long Sequence)中的信息,抽象为固定长度(Fixed-Length)向量的集合,而非 以单一向量的形式进行后续相关语意分解工作。
基于该研究,Google AI 实验室终于在 2017 年以 《Attention Is All You Need》[23] 一文,确定了基本的网络结构设计。 从此,开启了 Transformer 类型网络的快速发展之路。
自注意力机制(Self-Attention) 是 Transformer 的 核心机制。而 Transformer 网络结构,则是与自注意力机制提取特征 配套,用于达成转译目的(不一定非要是语言)的整个编解码器 系统作业流水线。
Transformer 在结构中,参考了 RNN 和早期 自编解码网络系统的特点,采用 时序上以串行元胞(Cell),而单次迭代中编解码(Encoder-Decoder)并行(Parallelization) 的方式,结合两者各自所长。
如此设计的原因,一方面来自于 Transformer 意图改善 RNN 对 序列到序列(Seq2Seq) 任务的处理能力。这便要求,其本身对输入样本的高级特征提取,能够拆解直接关联性,但却又可以保留更高维度潜藏的逻辑信息。另一方面,注意力机制只能提炼解构关联性特征,但我们需要的结果却是对原有输入的另一种未改变原意的表述,决定了必须有编解码类似的结构(至少目前为止)对高级特征进行非对称的压缩和还原。
自注意力机制,保证了前一点。整体结构,保证了后一点。而 注意力单元(Attention Unit),则是用于完成自注意力处理的组成框架的一部分(图中橙色)。
根据最精简实现,
从 注意力单元(Attention Unit) 上,Transformer 包括了两个分步主成分:
放缩点积注意力(SDPA),用于完成对于一次 Transformer 输入的单一注意力筛选;
多头注意力(MHA),通过对放缩点积的平行组合,完成对同一输入的多点注意力检测;
从 网络结构(Network Structure) 上,Transformer 包括了两个主体模块:
编码器(Encoder)模块,用于完成对样本输入的高级特征提取;
解码器(Decoder)模块,用于完成对样本输入的转译结果输出;
通俗来说,以人做类比,两者一个属于 Transformer 的“灵魂”,一个属于 Transformer 的“身躯”。从宏观角度,是互为一体的存在。这与前两节 CNN 、RNN 里,结构占相对主导地位(即框架为改进的关键)的情况有所不同。而是皆有突破。
正是这样,Transformer 才称为深度学习领域,在模型结构基本方法论上,近年来相对具有较大革新突破的工具。
刚刚我们提到的注意力单元,是对自注意力机制的实现。从上可知,Transformer 基本的一切都是围绕其运转的。那么,什么是自注意力机制(Self-Attention)呢?
自注意力机制(Self-Attention) 是 Transformer 中,一种目的用于模拟生物注意力的数学量化范式。是 一类方法的方法论。
想要能够区分轻重,最容易想到的方式便是加权了。因此,在 Transformer 中,对注意力的数值定义便是:
对输入序列元素,根据输入查询元素键值对,以求动态计算加权平均值的权重。
所以,我们计算注意力,需要的输入数据序列就必须包含三个重要的信息维度,分别是:
查询信息,即查询(Query),代表当前输入具有可能被关注(查询)的意义表征;
关键信息,即键值(Keys),代表当前输入在查询(Query)下可能提供的信息特征;
标值信息,即取值(Values),代表与键值(Key)关联的量化查询积分;
最终,由三者共同借由算法组成 输出特征(Output Fratures),即 加权平均值的权重,作为 Transformer 的神经网络内高级特征。
显然,虽然键值和取值可以按照 传统键值对(Key-Value Pair) 形式直接配对(当然也可以有复杂映射实现)。但从查询到键值还需要有一定转换方式,通过它来实现将查询可能的关注点,分散到对应的键值上,从而构成可以计算的结果。这个转换方式,就是 评分函数(Score Function)。
一般而言,评分函数可分为两类:
简单评分函数(Simple Scorer),此类以单步函数来完成粗糙的映射,如直接 Sigmod
复杂评分函数(Complex Scorer),此类用朴素神经网络或模型来完成映射,如 MLP 评分
而现有大部分 Transformer 中,采用的都是第二个类型的实现。包括基础 Transformer 的 SDPA 和 MHA 在内,皆属于此类。
当评分函数确定后,每个查询都能拆解到键值上,并获取对应积分了。此时,就需要由 输出函数(Output Function) 来将各个部分组合成最终的高级特征向量进行输出。
假设,
则有:
如此,我们便得到了 注意力量化公式。实际上,这种按序列计算的过程,常被直接 以矩阵运算代替。公式的意义更多在于原理描述。即,自注意力机制工程化的指导过程。依照上式,便可以通过构建评分函数和输出函数,来设计 Transformer 里的注意力单元了。
经典 Transformer 中,将这一步分为了两个组成。
放缩点积注意力(SDPA [Scaled Dot-Product Attention]) 被用于计算单点注意力,即只生成一个注意力高级特征输出。
如图,红框部分便是 SDPA 的评分函数,而蓝框部分则为 SDPA 的输出函数。
而输出时采用的 输出函数(Output Function),就是一个取值与评分结果的矩阵点积(Dot-Product),这也是 SDPA 名称的原因。即:
不过,我们想要的是有多个关注点的高维特征,单个注意力无法满足要求。 这就需要 MHA 了。
多头注意力(MHA [Multi-Head Attention]) 是对多个单头注意力,即放缩点积注意力(SDPA),处理的加权复合。
千万需要小心的是,正是在 MHA 中,我们引入了真正用于 持久训练 的迭代用权重参数,构成参数矩阵参与模型训练。
所以,从另一个角度来看,链接层函数就相当于 MHA 的评分函数,线性归一化则是输出函数。而 MHA 真正意义上的输入,即每个 SDPA 输入的集合。有:
上方即为 MHA 在 Transformer 中的基本算子表示。红框部分便是 MHA 的评分函数,而蓝框部分则为 MHA 的输出函数。可见,评分函数和输出函数的概念,也是相对于被选择作为参考的单元本身而言的。
调整后,MHA 的 SDPA 计算公式 化为:
使得 MHA 的评分函数(Score Function)有如下表示:
所以,MHA 的完整处理公式为:
至此,特征提取完毕。
在正式开始 Transformer 的网络结构讲解前。我们还需要了解一下,自注意力网络(Transformer)中的 其它辅助机制。
在经典结构中,Transformer 除了使用自注意力来完成特征提取外,还使用了由 ResNet 提出在当时已经相对成熟的 残差连接(Residual Connection) 技术,并使用简单 前馈控制(Feed Forward) 来修正 MHA 特征,提供非线性和引入深层次的 隐藏权重(Hidden Wight) 参与训练。
图中红框的部分,即为这两个机制起作用的位置。一般,在 Transformer 中,将其分别称为 前馈控制单元(FFU [Feed Forward Unit]) 和 加和标准化单元(ANU [Add & Norm Unit])。
而两者的 驱动公式(Core Formula),则为:
所有原件准备就绪,Transformer 网络结构就非常容易理解了。
在本节开始时提到,自注意力网络(Transformer)从结构角度分为编码器(Encoder)和 解码器(Decoder)。两者在整体上分别对同一个序列(Sequence)进行不同处理。
如图,蓝框内部分即编码器(Encoder)的构成,红框内部分则是解码器(Decoder)。
那么,以解码器输入 “</s> I am eating an apple” 为例。经过分割后,就变成了:
这个输出,才是最终参与模型迭代,用于损失函数的结果。
那么,Transformer 采用的损失函数是什么呢?
即然最终操作的对象是概率值,那么不难想到本质仍然属于分类(Classification)。 因此,Transformer 通常采用 交叉熵损失(Cross Entropy Loss)。即我们在损失函数一节中,提到过的:
同理,也可以考虑改用其他的分类项损失。
随后的过程就是深度学习网络(DNN)的通用过程了,用优化算法加速权重迭代。并持续训练,直到模型达成收敛指标。
自注意力网络(Transformer)在诞生之后,大部分都被运用在 NLP 由其是 LLM 领域。
目前上,工业界对 Transformer 的运用已经涵盖了:
自然语言处理(NLP),如:文本分析(智能输入法)、机器翻译、语音助手等;
音视频生成,如:音乐生成、视频生成、合成编辑、自动裁剪等;
而配合其他网络结构,如 CNN 的原样本特征提取能力,Transformer 在图形处理上也被大量运用,涵盖了:
图像分类,如:手势识别、动作识别、人脸识别等;
图像分割,如:背景分离、智能抠图、轮廓融合等;
语义分割,如:物体分类、车辆检测等;
语音识别,如:文本转译、同声传录、情感分析等;
时序预测,如:股票分析、气象预测、医疗诊断等;
可以说,Transformer 几乎体现在各种方面。
至此,随着经典模型结构 自注意力网络(Transformer)介绍完毕,基本理论知识也完成了初步的梳理。
从下一章开始,我们将正式步入音视频处理的实践工程领域。
以 代表查询,
以 表示输入序列,
以角标 代表所处输入序列 的位置,有 处键值 取积分 ,
以 代表经过注意力筛选后,的高级特征向量,
记评分函数为 ,输出函数为
我们记一个输入序列,其序列长度为 而查询维度为 。这里需要解释一下,什么是序列长度和查询维度。我们举个例子,如果有一条查询为 ,那么我们就称 单条查询的维度 为 ,而 总共有长度 为 条查询。即 查询维度就是一条查询所包含的参数数目,而 序列长度就是单次输入样本包含查询的数目。
当 确定,对于长度 的输入数据序列,就有 查询 、 键值 、 取值 ,即三者都是 大小的矩阵。则 SDPA 的 评分函数(Score Function) 有如下表示:
过程中 即 缩放因子(Scale Factor)。而 Mask 操作是可选的,一般过程中作用于 的 SoftMax 操作之前,已经完成点积和缩放的 这个 大小的矩阵。通过屏蔽部分数据或进行简单过滤,来进一步加工交给 Softmax 的输入。
实际操作时,可以在 编码器(Encoder) 阶段引入 Mask 层来做 部分参数优化,加速训练。而 解码器(Decoder) 需要用 Mask 来做 零值处理。即,将 结果中的部分数据标记为 0 或极小值(如 1e-12 ,避免权重消失),组成不完整数据。
在经过一系列运算后,根据矩阵点乘的特性,最终输出为具有 的大小的 单次注意力张量(Tensor)。
如图,蓝色气泡内便是 SDPA 单元。在图例中,由 个 SDPA 单元,经过链接层(Concat 为简写),和线性归一化(目的是为了保证输入输出等大),构成了最终 MHA 的输出。
我们仍然取一个输入序列(MHA 和 SDPA 都是对同一序列的操作,仅目标输出不同),其序列长度为 而查询维度为 。
记当前一个 MHA 总共有 个 SDPA 单元,每个单元按照顺序,由角标 表示序号。则,对于顺序 的 SDPA 单元输入,有查询 、 键值 、 取值 ,即三者都是 大小的矩阵。并有经过 SDPA 处理后的输出 ,简记为 交付链接。
由于采用了多组 SDPA 组合,我们不再能以固定形式,确定每个 SDPA 输入的重要程度。因此,需要对每个构成 MHA 的 SDPA 算子的输入 进行确权,来通过训练得到实际 MHA 的输入的初始关注点。
介于这一点,我们对每一组顺序 的 SDPA 单元输入进行加权。引入 输入权重(Input Wights),根据加权对象,分为 组查询权重 、 组键值权重 、 组取值权重 。 注意,加权需要用和加权对象维度转置(Transpose)的矩阵。
加权后,顺序 的 SDPA 算子的输入就变为了 。同时,这也是为什么 MHA 中,Q、K、V 需要经过一次线性归一化。即目的是为了保证每一组的输入在样本值上的价值等同。
其中,连接函数(Concat [Connection Function])是简单全链接。即,将每一个 SDPA 的输出 顺序拼接,构成 的输出。
而输出时采用的输出函数(Output Function),存在迭代的 目的权重(Target Wight) 矩阵 ,以权重代表注意力积分并参与训练(即动态的积分)。有:
其中,线性归一化算子(Linear) 其实同 MHA 的 SDPA 输入线性归一化一样,目的在于归一化 MHA 的输出以取得我们想要的多关注点高维特征,并同时让输出保持与输入相同的维度大小。即,通过 ,让原本 大小的数据,通过以 大小分块,分为 块叠加求均值,来使最终输出的 大小。
由 MHA 的输出 和权重矩阵 ,参与到 Transformer 训练的内部过程。
记两者的输入为 ,输出为 。
大部分情况下前馈控制单元的输入 都为 MHA 的输出,即 但也有例外。加和标准化单元则需要两个输入。不过,在这两个单元的处理中,我们为了保证输入前后特征张量(Tensor)的一致性,要求不论 FFU 还是 ANU,都必须实现输入输出大小相等。
所以,在整个 Transformer 中,FFU 和 ANU 都有 。
每一个 FFU 都能为我们引入一套权重 和偏移 参与训练。而 ANU 则负责通过 归一化(Normalization) 将样本数据映射到一定范围区间内,保证前级输出的统一尺度衡量,加速模型收敛。
编码器(Encoder) 接收正常顺序的序列,如:“I am eating an apple” 经过 位子编码(Positional Encoding),再以特征工程提炼出的 。
之后,交由 MHA 提取高级特征,并将提取的高级特征经过一次 ANU 归一化。最终,归一化的高级特征通过 FFU 加隐藏的核心权重和偏移,再次经由一次 ANU 归一化,完成当前时代的编码部分处理。记编码器的输出为 ,显然 有 大小。
解码器(Decoder) 接收被标记过的序列,如:“I am eating an apple” 经过标记(Shifted Right)变为 “</s> I am eating an apple” ,再由特征工程提炼出的 输入。
标记(Shifted Right) 的作用是为了区分每一个序列的起点,例子里我们采用的是 “</s>” ,当然也可以用其他标志。 之后,交由 加遮罩(Mask)的 MHA 提取高级特征,并 ANU 归一化。这里的 遮罩,就是前文中提到的 SDPA 的可选 Mask 操作,即解码器对 的零值处理。简单的 Mask 有:
即 只保留右上角数据,完成解码器对输入的第一次注意力操作。
接下来,解码器会接受编码器的同序列输出 ,作为一组键值 组合,并用前一级 MHA 的 ANU 归一化结果作为查询 ,合并为一组 作为第二个 MHA 的输入。
第二个 MHA 进行常规的 无 Mask 注意力过程。将第二个 MHA 的输出交由 FFU 加隐藏的核心权重和偏移。在 ANU 归一化后,作为解码器的最终输出。 记解码器的输出为 ,同样有 大小。
或许有心的读者已经注意到,在图例中,编解码器的核心流水线旁边都有一个数量标记 。这意味着每个编解码都是由 个这样的流水线构成的。目的是为了将 长序列(Long Sequence),拆分为顺序的单个 单词(Word),即 短序列(Short Sequence),顺序的输入处理。我们将编解码各自的一条完整流水线,称为 编码层(Encoding Layer) 和 解码层(Decoding Layer)。
总共 6 个短句。分别交由 6 个解码层处理。最终的输出也按照解码层的顺序,进行顺序拼接。相当于每一个解码层的 。而拼接后的结果仍然是 。
这样既保证了模型本身的一定范围实时感知,也解放了模型本身的训练处理机能。在 2017 经典 Transformer 中,建议取 ,平衡效率。
其实,经过之上的一系列工作,最终编码器的输出 ,还需要经过一次 线性归一化(Linear Normalization),再通过 SoftMax 输出概率预测结果 。预测 的大小为 是一组概率数组。
而部署后,预测结果 所关联的词汇,就是最终输出。