当前位置: 首页 > news >正文

Transformer 模型详解

目录

Transformer 概览

引入张量

Self-Attention 详解

多头注意力机制(Multi-head Attention)


2017 年,Google 在论文 Attention is All you need 中提出了 Transformer
模型,其使用 Self-Attention 结构取代了在 NLP 任务中常用的 RNN 网络结
构。相比 RNN 网络结构,其最大的优点是可以并行计算。Transformer 的整
体模型架构如图 1

Transformer 概览

首先,让我们先将 Transformer 模型视为一个黑盒,如图 所示。在机 器翻译任务中,将一种语言的一个句子作为输入,然后将其翻译成另一种语言的一个句子作为输出。
Transformer 本质上是一个 Encoder-Decoder 架构。因此中间部分的 Transformer 可以分为两个部分:编码组件和解码组件。
其中,编码组件由多层编码器(Encoder)组成(在论文中作者使用了 6 层编码器,在实际使用过程中你可以尝试其他层数)。解码组件也是由相同层数的 解码器(Decoder)组成(在论文也使用了 6 层)
每个编码器由两个子层组成:Self-Attention 层(自注意力层)和 Position-wise Feed Forward Network(前馈网络,缩写为 FFN)如图所 示。每个编码器的结构都是相同的,但是它们使用不同的权重参数
编码器的输入会先流入 Self-Attention 层。它可以让编码器在对特定词进行编码时使用输入句子中的其他词的信息(可以理解为:当我们翻译一个词时, 不仅只关注当前的词,而且还会关注其他词的信息)。后面我们将会详细介绍 Self-Attention 的内部结构。然后,Self-Attention 层的输出会流入前馈网络。解码器也有编码器中这两层,但是它们之间还有一个注意力层(即 Encoder-Decoder Attention),其用来帮忙解码器关注输入句子的相关部分(类 似于 seq2seq 模型中的注意力)。

引入张量

现在我们已经了解了模型的主要组成部分,让我们开始研究各种向量/张量,以及他们在这些组成部分之间是如何流动的,从而将输入经过已训练的模型转换 为输出。 和通常的 NLP 任务一样,首先,我们使用词嵌入算法(Embedding)将每个词转换为一个词向量。在 Transformer 论文中,词嵌入向量的维度是 512。
每个词被嵌入到大小为 512 的向量中。我们将用这些简单的框代表这些向量。嵌入仅发生在最底层的编码器中。所有编码器都会接收到一个大小为 512的向量列表——底部编码器接收的是词嵌入向量,其他编码器接收的是上一个编码器的输出。这个列表大小是我们可以设置的超参数——基本上这个参数就是训练数据集中最长句子的长度。 对输入序列完成嵌入操作后,每个词都会流经编码器的两层
接下来,我们将换一个更短的句子作为示例,来说明在编码器的每个子层中 发生了什么。 上面我们提到,编码器会接收一个向量作为输入。编码器首先将这些向量传递到 Self-Attention 层,然后传递到前馈网络,最后将输出传递到下一个编码器。
Self-Attention(自注意力Self-Attention 概览
首先我们通过一个例子,来对 Self-Attention 有一个直观的认识。假如,我们要翻译下面这个句子: The animal didn’t cross the street because it was too tired 这个句子中的 it 指的是什么?是指 animal 还是 street ?对人来说,这是一个简单的问题,但是算法来说却不那么简单。 当模型在处理 it 时,Self-Attention 机制使其能够将 it 和 animal 关联起来。
当模型处理每个词(输入序列中的每个位置)时,Self-Attention 机制使得模型不仅能够关注当前位置的词,而且能够关注句子中其他位置的词,从而可以更好地编码这个词。如果你熟悉 RNN,想想如何维护隐状态,使 RNN 将已处理的先前词/向量 的 表 示 与 当 前 正 在 处 理 的 词 / 向 量 进 行 合 并 。 Transformer 使 用 Self-Attention 机制将其他词的理解融入到当前词中
当我们在编码器 #5(堆栈中的顶部编码器)中对单词”it“进行编码时,有一部分注意力集中在”The animal“上,并将它们的部分信息融入到”it“的编码中。
下面我们来看一下 Self-Attention 的具体机制。其基本结构如图
对于 Self Attention 来讲,Q(Query),K(Key)和 V(Value)三个矩阵均来自同一输入,并按照以下步骤计算:
首 先 计 算 Q 和K 之 间 的 点 积 , 为 了 防 止 其 结 果 过 大然后利用 Softmax 操作将其结果归一化为概率分布,再乘以矩阵 V 就得到权重求和的表示。

Self-Attention 详解

下面通过一个例子,让我们看一下如何使用向量计算 Self-Attention。计算Self-Attention 的步骤如下:
第 1 步:对编码器的每个输入向量(在本例中,即每个词的词向量)创建三个 向量:Query 向量、Key 向量和 Value 向量。它们是通过词向量分别和 3 个矩阵相乘得到的,这 3 个矩阵通过训练获得。 请注意,这些向量的维数小于词向量的维数。新向量的维数为 64,而 embedding 和编码器输入/输出向量的维数为 512。新向量不一定非要更小,这是为了使多头注意力计算保持一致的结构性选择。
什么是 Query,Key 和 Value 向量?
它们是一种抽象,对于注意力的计算和思考非常有用。继续阅读下面的注意力计算过程,你将了解这些向量所扮演的角色。
第 2 步:计算注意力分数。假设我们正在计算这个例子中第一个词 “Thinking” 的自注意力。我们需要根据 “Thinking” 这个词,对句子中的每个词都计算一个分数。这些分数决定了我们在编码 “Thinking” 这个词时,需要对句子中其他位置的每个词放置多少的注意力。
第 3 步:将这些分数进行 Softmax 操作。Softmax 将分数进行归一化处理,使得它们都为正数并且和为 1。
这些 Softmax 分数决定了在编码当前位置的词时,对所有位置的词分别有多少的注意力。很明显,当前位置的词汇有最高的分数,但有时注意一下与当前位置的词相关的词是很有用的。
第 4 步:将每个 Softmax 分数分别与每个 Value 向量相乘。这种做法背后的 直觉理解是:对于分数高的位置,相乘后的值就越大,我们把更多的注意力放在它们身上;对于分数低的位置,相乘后的值就越小,这些位置的词可能是相关性不大,我们就可以忽略这些位置的词。
第 5 步:将加权 Value 向量(即上一步求得的向量)求和。这样就得到了自注意力层在这个位置的输出。
这样就完成了自注意力的计算。生成的向量会输入到前馈网络中。但是在实际实现中,此计算是以矩阵形式进行,以便实现更快的处理速度。下面我们来看看如何使用矩阵计算。
使用矩阵计算 Self-Attention
矩阵 X 中的每一行,表示输入句子中的每一个词的词向量(长度为512,在图中为 4 个方框)。矩阵 Q,K 和 V 中的每一行,分别表示 Query向量,Key 向量和 Value 向量(它们的长度都为 64,在图中为 3 个方框)。
第 2 步:计算自注意力。由于这里使用了矩阵进行计算,可以将前面的第 2 步到第 6 步压缩为一步。

多头注意力机制(Multi-head Attention)

在 Transformer 论文中,通过添加一种多头注意力机制,进一步完善了自注意力层。具体做法:首先,通过 h hh 个不同的线性变换对 Query、Key 和 Value 进行映射;然后,将不同的 Attention 拼接起来;最后,再进行一次线性变换。基本结构如图
现在让我们重新回顾一下前面的例子,看看在对示例句中的“it”进行编码时,不同的注意力头关注的位置分别在哪
当我们对“it”进行编码时,一个注意力头关注“The animal”,另一个注意力头关注“tired”。从某种意义上来说,模型对“it”的表示,融入了“animal” 和“tired”的部分表达。 Multi-head Attention 的本质是,在参数总量保持不变的情况下,将同样的 Query,Key,Value 映射到原来的高维空间的不同子空间中进行 Attention的计算,在最后一步再合并不同子空间中的 Attention 信息。这样降低了计算每个 head 的 Attention 时每个向量的维度,在某种意义上防止了过拟合;由于 Attention 在不同子空间中有不同的分布,Multi-head Attention 实际上是寻找了序列之间不同角度的关联关系,并在最后拼接这一步骤中,将不同子空间中捕获到的关联关系再综合起来。
http://www.dtcms.com/a/353947.html

相关文章:

  • [Sync_ai_vid] 唇形同步评判器 | 图像与视频处理器 | GPU测试
  • 为什么 “int ” 会变成 “int”?C++ 引用折叠的原理与本质详解
  • nacos2.4.1版本开启鉴权
  • SmartMediakit视角构建低空经济的超低延迟视频基础设施
  • git学习 分支管理(branching)合并分支
  • 鸿蒙清楚本地缓存
  • AI大语言模型助力:国自然/省级基金项目撰写(如何高效准备申请材料?如何精准把握评审标准?从申请者和评审者的不同角度全解
  • 【单例模式】
  • CUDA的编译与调试
  • Mac 上录制视频有几种常见方式
  • 基于springboot的校园资料分享平台(源码+论文+PPT答辩)
  • 网络安全监控中心
  • 【笔记】Windows 安装 Triton 的工作记录(之二)
  • IDR的RWA金融逻辑RWA:全球金融革命的底层协议
  • 数学建模——马尔科夫链(Markov Chain Model)
  • 集成学习之 Stacking(堆叠集成)
  • django配置多个app使用同一个static静态文件目录
  • 使用openCV(C ++ / Python)的Alpha混合
  • 【高级机器学习】 2. Loss Functions(损失函数)
  • 一、快速掌握Python 中的文件操作知识体系
  • mysql zip包安装步骤
  • 2025(秋)中国国际健康产业(成都)博览会:探索健康未来辉煌
  • TCP 并发服务器构建
  • 场外期权能做套利吗?
  • 二叉树的工程实践与高频问题(续):从LeetCode真题到系统设计的深度剖析
  • centos7 安装指定版本的fastfds
  • 了解CDC(变更数据捕获)如何革新数据集成方式
  • Linux 系统调优工具与实践指南
  • 个人博客系统系统---测试报告
  • HarmonyOS布局实战:用声明式UI构建自适应电商卡片