图解 Transformer(超详细完整版)

图解 Transformer

image-20241007170226786
高层视角

我们首先从将模型看作一个整体的黑箱开始。在机器翻译的应用中,Transformer 接受一种语言的句子作为输入,并输出翻译后的另一种语言的句子。

Transformer 作为黑箱

展开 Transformer 后,我们可以看到它由编码器和解码器两个部分组成,并通过它们之间的连接相互通信。

编码器和解码器组成

编码器部分由一系列编码器单元堆叠而成(论文中提到的版本使用了六个,但六这个数值并非特别,其他数量的堆叠也可以尝试)。解码器部分也是由相同数量的解码器单元堆叠组成。

编码器和解码器的堆叠

每个编码器的结构相同(但它们并不共享权重)。每个编码器由两个子层组成:

编码器的结构

编码器的输入首先通过一个自注意力层,这个层帮助编码器在编码某个特定词时关注输入句子中的其他词。我们将在后面详细讨论自注意力机制的细节。

接着,自注意力层的输出会传递给一个前馈神经网络。同样的前馈网络独立地作用于每个位置。

解码器的结构与编码器类似,但在其中增加了一个额外的注意力层,使解码器能够聚焦于输入句子的相关部分,这类似于序列到序列模型中的注意力机制。

张量的流动过程

在了解了 Transformer 的整体结构后,我们来探索输入向量/张量是如何在各个组件之间流动的,从而将训练数据中的输入转换为输出。

与许多自然语言处理应用相似,我们首先将每个输入词转化为向量表示(通常是通过嵌入算法实现)。

每个词被嵌入到一个 512 维的向量中

嵌入操作只发生在最底层的编码器中。所有的编码器共有的抽象概念是它们接受一个向量列表,每个向量的维度为 512。在最底层的编码器中,这些向量是词嵌入,而在其他编码器中,它们是下方编码器输出的结果。向量列表的长度是一个超参数,通常与我们训练数据中最长句子的长度相等。

在对输入句子的词语进行嵌入之后,它们会依次通过编码器的各个层。

img

这里展示了 Transformer 的一个关键特性:每个词在编码器中的流动路径是独立的。自注意力层中,多个位置的向量之间存在依赖关系,而在前馈神经网络中则没有这种依赖,因此可以并行处理每个向量。

接下来,我们将用一个更短的句子举例,看看编码器的各个子层如何处理它。

编码过程

正如前面提到的,编码器接受一组向量作为输入。它通过将这些向量传递给自注意力层,然后传递给前馈神经网络,并将输出传递到下一个编码器,来处理这组向量。

编码器中的每个词都通过自注意力和前馈网络

自注意力机制概述

假设我们要翻译以下句子:

“The animal didn’t cross the street because it was too tired”

在这个句子中,“it”指的是“动物”还是“街道”?对于人类来说,这个问题不难解答,但对于算法来说,却需要特殊的机制来处理。

当 Transformer 处理到单词“it”时,自注意力机制帮助模型将“it”与“animal”关联起来。

当模型处理句子中的每个词(即每个位置)时,自注意力机制允许模型查看输入序列中的其他位置,以寻找有助于生成更好表示的信息。

如果你熟悉 RNN,可以将其与 RNN 维护的隐藏状态进行类比。RNN 会将之前处理过的单词的表示与当前单词的表示结合起来,而自注意力机制则是 Transformer 用于将其他相关词的信息融入当前词表示中的方法。

编码器中的注意力机制

在编码器#5(顶部编码器)中编码单词“it”时,注意力机制的部分注意力聚焦于“The animal”,并将该词的一部分表示融入“it”的编码中。

自注意力机制详解

自注意力机制的第一步是为编码器的每个输入向量(即每个词的嵌入向量)生成三个新的向量:查询(Query)、键(Key)和值(Value)向量。这些向量是通过将嵌入向量与我们训练得出的三个权重矩阵相乘得到的。

这些新向量的维度比嵌入向量更小。嵌入向量的维度是 512,而这些向量的维度是 64。降低维度的目的是为了让多头注意力的计算能够更加高效。

生成查询、键、值向量

将 x1 乘以 WQ 权重矩阵得到 q1,即与该词关联的“查询”向量。最终,我们对输入句子中的每个词都创建了一个“查询”、一个“键”和一个“值”的投影。

“查询”、“键”和“值”向量是什么?

它们是用于计算和思考注意力的抽象概念。一旦你继续阅读下面关于注意力如何计算的内容,你就会基本了解这些向量各自所扮演的角色。

计算自注意力的第二步是计算一个分数。假设我们正在计算此示例中第一个词“Thinking”的自注意力。我们需要对输入句子中的每个词与这个词进行评分。该分数决定了在我们编码某个位置的词时,应将多少注意力放在输入句子的其他部分上。

分数是通过将查询向量与正在评分的相应词的键向量进行点积计算得出的。因此,如果我们正在处理位置#1 的词的自注意力,第一个分数将是 q1 和 k1 的点积,第二个分数将是 q1 和 k2 的点积。

计算注意力分数

接着,将分数除以键向量维度的平方根(通常是 8)以获得更稳定的梯度,然后通过 softmax 操作将分数归一化,使其全部为正且总和为 1。

softmax 归一化

该 softmax 分数决定了每个词在此位置的表达程度。显然,此位置的词将具有最高的 softmax 分数,但有时关注与当前词相关的另一个词也是有用的。

第五步是将每个值向量乘以 softmax 分数(为求和做准备)。这里的直觉是保持我们想要关注的词的值不变,并通过乘以极小的数值(例如 0.001)来淹没无关词。

第六步是将加权值向量相加。这产生了自注意力层在此位置的输出(针对第一个词)。

计算自注意力输出

以上便是自注意力机制的基本计算过程,最终得到的向量会传递给前馈神经网络。不过在实际应用中,所有这些计算都是以矩阵的形式进行的,以提高计算效率。

针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()👈

自注意力机制的矩阵计算

首先,通过将输入的嵌入向量打包成矩阵 X,然后将其分别与三个权重矩阵(WQ、WK、WV)相乘,得到查询、键和值矩阵。

矩阵计算过程

最终,由于我们处理的是矩阵,可以将步骤二至六压缩为一个公式,用于计算自注意力层的输出。

自注意力输出公式

多头注意力

Transformer 的自注意力层通过引入“多头注意力”机制进行了进一步优化,这种改进从两个方面提升了表现:

  • 它扩展了模型同时关注多个位置的能力。例如在翻译句子“The animal didn’t cross the street because it was too tired”时,不同的注意力头可以分别关注“animal”和“tired”,帮助模型更好地理解“it”指代的含义。

  • 它为注意力层提供了多个“表示子空间”,每个注意力头都有自己的查询、键和值矩阵,能够从不同的角度理解输入句子。

多头注意力机制

每个注意力头会计算独立的自注意力输出,最后将这些输出拼接在一起,并通过一个线性层将其映射回原始维度。

多头注意力的拼接与映射

多头自注意力的完整流程如下图所示:

多头注意力的整体结构

在编码过程中,不同的注意力头可以关注句子中的不同部分。例如,在编码单词“it”时,一个注意力头可能集中在“animal”上,另一个注意力头则可能集中在“tired”上。

不同注意力头的聚焦

如果将所有注意力头的结果叠加在一起,整体的注意力分布会变得更加复杂:

所有注意力头的叠加

位置编码

目前为止的描述中,Transformer 还缺少一种处理词语顺序的方法。为了解决这个问题,Transformer 为每个输入词添加了一个位置编码向量。这些位置编码向量遵循某种特定的模式,帮助模型理解词语在序列中的相对位置。

位置编码的示意图

为了让模型理解单词的顺序,我们添加了位置编码向量——其数值遵循特定的模式。

假设嵌入的维度是 4,位置编码的实际形式如下:

位置编码的示例

位置编码遵循的模式如下图所示:

位置编码的模式

一个真实的位置编码示例,针对 20 个词(行)和 512 维嵌入大小(列)。可以看到它似乎在中心处被分成了两半。这是因为左半部分的值由一个函数生成(使用正弦函数),而右半部分的值由另一个函数生成(使用余弦函数)。然后将它们连接起来形成每个位置编码向量。

位置编码的公式在论文中有所描述(第 3.5 节)。您可以在 get_timing_signal_1d() 中查看生成位置编码的代码。这并非位置编码的唯一可能方法。然而,它具有一个优势,即能够扩展到未见过的序列长度(例如,当我们的训练模型被要求翻译比训练集中任何句子都长的句子时)

残差连接和层归一化

编码器架构中,每个子层(自注意力层和前馈神经网络层)都有一个残差连接,随后紧跟一个层归一化步骤。

残差连接和层归一化

如果我们可视化自注意力与层归一化的操作,图示如下:

自注意力与层归一化

解码器中的每个子层也同样包含残差连接和层归一化。如果我们设想一个包含两个编码器和两个解码器的 Transformer,结构图会如下:

两层编码器和解码器的 Transformer

解码过程

现在我们已经了解了编码器端的主要概念,基本上也理解了解码器的工作原理。接下来,我们看看它们是如何协同工作的。

首先,编码器处理输入序列,得到输出张量。这些输出张量会被转换为注意力向量 K 和 V,供每个解码器在“编码器-解码器注意力”层中使用,帮助解码器聚焦于输入序列的相关部分:

解码阶段的张量流动

解码阶段中,每一步都会输出目标句子的一个词。

每个时间步的输出会作为输入传递到下一层解码器,并且与编码器的输出结合,逐层处理。与编码器类似,解码器的输入也会进行嵌入并添加位置编码,以表示词语的位置。

解码器的嵌入和位置编码

在解码器中,自注意力层只允许关注到生成序列中的较早位置。这通过对未来位置进行掩码处理(设置为 -inf),防止解码器在预测下一个词时看到未来的词。

“编码器-解码器注意力”层的工作原理与多头自注意力机制类似,只是查询矩阵来自解码器,键和值矩阵则来自编码器的输出。

最终线性层与 softmax

解码器堆栈的输出是一个浮点数向量。为了将其转换为具体的词,需要经过一个线性层和一个 softmax 层。

线性层是一个全连接神经网络,将解码器的输出向量映射到一个更大维度的向量,称为 logits 向量。假设模型的输出词汇表包含 10,000 个单词,那么 logits 向量的长度也是 10,000,每个单元格对应一个单词的得分。

接着,softmax 层将这些分数转换为概率(所有概率均为正数,且总和为 1)。选择概率最高的单元格,其对应的词就是解码器在这一时间步的输出。

线性层和 softmax 过程

解码器堆栈的输出经过线性层和 softmax 层,生成最终的输出词。

训练

既然我们已经探讨了经过训练的 Transformer 的前向传递过程,那么简要了解它的训练过程也很有帮助。

在训练过程中,模型经历相同的前向传递,但我们有带标签的训练数据,因此可以将模型的输出与实际的正确输出进行比较,从而计算误差。

为了形象化这一过程,假设我们的输出词汇表只有六个单词:“a”“am”“i”“thanks”“student”“”(表示句子结束的符号)。

输出词汇表

在训练之前,我们首先为词汇表中的每个单词生成独热编码。例如,单词“am”可以表示为以下向量:

独热编码

损失函数

在训练过程中,模型的输出应该尽可能接近实际的正确输出。例如,对于输入“merci”,我们希望模型输出“thanks”的概率最大。

输出分布

如何比较两个概率分布?我们只需将其中一个减去另一个。欲了解更多详情,请参阅交叉熵和KL散度。

但请注意,这是一个过度简化的例子。更现实地,我们会使用一个比单个词更长的句子。例如——输入:“je suis étudiant”,预期输出:“i am a student”。这实际上意味着,我们希望我们的模型能依次输出概率分布,其中:

  • 每个概率分布由一个宽度为 vocab_size 的向量表示(在我们的示例中为 6,但更现实地是像 30,000 或 50,000 这样的数字)

  • 第一个概率分布在关联于单词“我”的单元格处具有最高概率

  • 第二个概率分布在关联单词“am”的单元格处具有最高概率

  • 以此类推,直到第五个输出分布指示‘ ’符号,该符号同样关联着来自 10,000 元素词汇表中的一个单元格。

期望输出的分布

经过足够长时间的训练,模型的输出分布会逐渐趋于我们期望的正确翻译。

训练后的输出分布

模型的生成过程是逐个词地生成输出,因此有多种策略可供选择。最常见的一种策略是选择每个时间步概率最高的词(称为贪婪解码)。另一种策略是束搜索,它保留多个可能的部分翻译,并在每一步选择最有可能的路径。

如何学习AI大模型?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

想正式转到一些新兴的 AI 行业,不仅需要系统的学习AI大模型。同时也要跟已有的技能结合,辅助编程提效,或上手实操应用,增加自己的职场竞争力。

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高

那么针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()👈

学习路线

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

Transformers是一种用于自然语言处理和其他相关领域的深度学习模型。它是通过编码器-解码器结构实现的。编码器将输入序列转换为一系列隐藏状态,而解码器则根据编码器的输出和之前的上下文生成输出序列。 关于图解transformer,引用中提到的图显示了Transformer的位置编码方法,其中将两个信号交织在一起。这个图可以帮助我们更好地理解位置编码的实现方式。 此外,引用中还展示了一个包含两个堆叠编码器和解码器的Transformer结构的图示。这个图可以帮助我们了解多层Transformer的组织结构。 最后,引用中提到的训练模型的直觉可以帮助我们更好地理解Transformer的工作原理。这个直觉的图示可能显示了一些与训练有关的信息,可以帮助我们更好地理解整个前向传递过程。 综上所述,通过引用中提到的图示,我们可以更好地理解Transformer模型的一些关键概念和操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【Transformer图解 Transformer](https://blog.csdn.net/sikh_0529/article/details/128968765)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值