摘要
transformer是一种新的网络架构,它放弃了传统的循环和卷积,提供了一种编码器和解码器网络结构来完成任务,主要用于翻译任务中。它的优点为:更少的训练时间,较好的泛用性。
1 介绍
循环神经网络模型包括长短期记忆(LSTM)和门控制神经网络模型,被确立为序列模型和转导问题,推动了循环语言模型和编码器-解码器架构的边界。推动了transformer的发展。
循环网路模型的输入输出是根据输入、输出序列的符号位置进行因子计算决定的。然而,这种固有的顺序没有利用训练示例的并行性,这对于较长序列长度下至关重要,因为内存约束限制了跨示例的批处理。在最近的研究中,改善这种计算方式,通过因式分解技巧和条件计算提高计算效率,也提高模型性能。这些改进也为transformer有更进一步的发展。
注意力机制已经成为序列模型和转导模型的组成部分。根据依赖关系来建立模型,而不去考虑输入、输出距离。有时候,注意力机制会与循环网络模型结合使用。
根据注意力机制,提出了transformer网络模型,它避免了循环的模型结构,对输入输出完全依赖于注意力机制,这使得翻译任务可以达到更好的结果。同时,transformer允许更多的并行化。
2 背景
减少顺序计算的目标也构成了Extended Neural GPU(可扩展的神经GPU)的基础,例ByteNet和ConvS2S都是使用卷积神经网络作为基本构建块,然而它们的任意输入或输出所需的操作数量随位置之间而增长,使得学习距离较远位置之间的依赖关系变得更加困难。注意力集中transformer使用多头注意解决了此类问题。
Self-attention自我注意,也被称为内注意,它是一种将单个序列的不同位置联系起来以计算该序列的表示的注意机制。Self-attention成功应用于学习任务无关的句子表征。如:阅读理解、抽象总结、文本蕴涵。
端到端记忆网络是基于循环注意机制,并且在简单语言问答和语言模型任务有好的表现。
transformer是第一个完全依赖Self-attention去计算它的输入和输出表示的转导模型,没有使用序列对齐(sequence-aligned)RNNs或者卷积。
3 模型架构
transformer整体架构:堆叠的自关注层和点方向层,完全连接编码器和解码器层。编码器的输入是x-z的映射,z-y是解码器的输入映射。x为编码器的输入,z为输出;z为解码器的输入,y为输出。模型的每一步都是自回归的。
3.1 编码器和解码器堆栈
编码器的结构:
编码器由N=6个相同层的堆栈组成。每一层由两个子层组成。两个子层分别为:
- 第一是多头自注意力机制(Multi-Head Attention);
- 第二为简单,位于完全连接的前馈网络(Feed Forward)。
在每一个子层周围用残差连接,然后进行层归一化。每一个子层的输出LayerNorm(x + Sublayer(x))。Sublayer(x)是子层本身实现的函数,x为残差映射。模型中的所有子层以及嵌入层产生的输出维度为512.
解码器结构:
解码器结构与编码器大致相同,也是由N=6相同层的堆栈组成。解码器的每一层由三个子层,每个子层分别为:
- 第一带有掩蔽的多头自注意机制,这种掩蔽,再加上输出嵌入被编译一个位置的事实,确保了位置i的预测只能依赖于位置小于i的已知输出;
- 第二,第三同编码器一致。第二为多头注意力机制;
- 第三位简单,位于全连接层的前馈传播。
每一个子层同样也都是用了残差函数和层归一化。
3.2 Attention
注意函数是一种映射:查询和一组键-值对到输出的映射,查询、键、值、输出都是向量。输出的结果位每个值的加权和,每个值的权重是由查询与相应键的兼容性函数计算的。注意力机制有:缩放的点积注意力、多头注意力。
3.2.1 缩放的点积注意力
由维度dk的查询和键以及维度dv的值组成输入,计算查询与所有键的点积,每个点击除以√dk(比例因子),最后应用softmax函数来获得值的权重。
Q:查询被打包成矩阵Q;K:键被打包成矩阵K;V:值被打包成矩阵V。
MatMul为函数,表示两个张量矩阵相乘。Scale为缩放,就是称那个比例因子。
加法与乘法是常见的两个注意力。特点为:
- 加法注意力:使用一个具有单个隐藏层的前馈网络来计算兼容性问题。
- 乘法注意力:使用一个比例因子1/√dk,其余与我们的算法相同。
两者在理论复杂性上相似,但是乘法注意力更快,更节省空间,因为它可以使用高度优化的矩阵乘法代码来实现。
dk不同的大小,两种注意力有不同的效果:
- dk较小时,两种注意力机制表现相似;
- dk较大时,加法注意力机制优于乘法注意力机制。
1/√dk比例因子的作用:当dk较大时,点积的大小也会变大,从而将softmax函数推入具有极小梯度的区域,为了抵消极小梯度的影响,将点积乘以1/√dk .
3.2.2 多头注意力
多头注意力机制是将查询Q、键K、值V分别以不同的、学习过的线性 投影h次线性投影到dk,dk和dv的维度,然后并行执行注意力函数,生成dv维度的输出值,将它们连接起来并再次进行投影,得到最终值。可见,多头注意力机制是多个缩放点积注意力机制并行连接的出来的结果。
多头注意力机制会允许模型在不同位置共同注意来自不同表示子空间的信息。单一注意力会平均抑制这一点。
3.2.3 注意力机制在模型中的应用
Transformer三种不同的方式使用多头注意力:
- 在编码器-解码器层中,查询来自前一个解码器层,记忆键和值来自编码器的输出。这允许解码器中的每个位置都参与输入序列中的所有位置。
- 编码器来自Self-attention,在自我注意层所有的键、值和查询都来自同一个地方,且它们是编码器中前一层的输出。编码器中的每个位置都可以处理编码器前一层的所有位置。
- 解码器中的self-attention允许解码器中的每个位置注意到解码器中的所有位置直至并包括该位置。
3.3 位置前馈神经网络
除注意子层外,编码器,解码器中每一层都包含一个完全连接的前馈网络,这个完全连接层包括两个线性变化,中间有一个ReLU激活函数.
完全连接层的线性转换在不同位置是不同的,但是它在每一层之间使用不同的参数。另一种描述线性变化的方式是两个核大小为1 * 1的卷积。
3.4 嵌入和softmax非线性激活函数
与其他序列转导模型类似,使用学习嵌入将输入tokens和输出tokens转换为维度dmodel的向量。使用通常学习的线性变换和softmax函数将解码器输出转换为预测的下一个token概率。transformer网络模型中,在两个嵌入层和pre-softmax线性变换之间共享相同的权重矩阵。在嵌入层中,将这些权重乘以√dmodel。
3.5 位置编码
解决排列问题。transformer中没有使用循环和卷积,位置编码主要为了符号排列,注入的关于符号在序列中相对或者绝对的信息,来弥补不能使用循环和卷积操作。位置编码在编码器和解码器的底部,它与嵌入的数据有相同的维数,方便求和。
位置编码与位置嵌入产生的结果几乎相同。选择正弦函数是因为它可以允许模型向外推到比训练期间遇到的序列长度更长的序列。
4 为什么使用自我注意
自我注意就是一个可变长度序列符号映射。在本节中,我们把自我注意层的各个方面与通常使用一个可变长度序列映射进行比较,这个可变序列映射长度表示序列x到另一个等长序列z的映射。
使用自我注意考虑的三个必要条件:
- 其一:每层的总计算复杂度;
- 其二:可以并行的计算量(通过所需的最小操作数来衡量);
- 其三:网络中远程依赖关系之间的路径长度(学习远程依赖关系)。
学习远程依赖关系是序列转导任务的关键,它的一个关键影响因素为,网络中向前和向后信号必须经过的路径长度。输入、输出序列之间组合路径越短,学习远程关系就越容易。
自我注意用恒定数量的顺序操作,而循环用O(n)个顺序操作。
核宽度k<n的卷积层不能连接所有的输入和输出位置。在相邻核的情况下,需要O(n/k)个卷积层的堆栈,在扩散卷积下,需要O(logk(n))个卷积层的堆栈。增加了网络任意两个位置之间最长路径的长度。卷积层比循环层成本高k倍。可分离卷积大大降低了复杂性,为O(k * n * d+n * d * d)。
自我注意可以产生更多可解释的模型。
可解释模型:我们可以从模型中检查注意力分布,并给出和讨论示例在附录中。不仅个体注意力清晰地学会执行不同的任务,许多注意力似乎表现出与句子的句法核语义结构相关的行为。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!