Transformer架构概述(二)

news2024/10/6 2:28:48

目录

1. Transformer架构概述

1.1 《Attention is All You Need》论文概述

1.2 Transformer的模块组成

1.3 Encoder 和 Decoder 的区别与联系

2. Transformer的并行计算效率相对于RNN的提升

2.1 RNN中的顺序处理问题

2.2 Transformer中的并行化优势

3. Self-Attention机制及其公式

3.1 Self-Attention机制简介

3.2 Self-Attention公式解析

3.3 Attention的工作过程

3.4 Self-Attention的计算过程举例

4. Multi-head Attention的扩展

4.1 Multi-head Attention的工作原理

5. Transformer的实现建议


1. Transformer架构概述

1.1 《Attention is All You Need》论文概述

Transformer模型是Vaswani等人在2017年提出的,旨在通过完全摆脱传统RNN和CNN的结构,依赖于全新的Self-Attention机制来处理序列数据。论文的核心观点是,序列处理不再依赖递归结构(如RNN中的逐步处理),而是通过注意力机制并行处理输入序列。这使得模型在处理长序列时能更有效地捕获全局依赖关系,同时显著提升并行计算的效率。

1.2 Transformer的模块组成

Transformer的整体架构分为Encoder-Decoder结构,每个模块又由多个层级叠加而成。我们首先从整体结构开始,逐步解析其细节:

  1. Encoder部分

    • 由6个完全相同的子层(layer)堆叠组成,每个子层包含:
      1. Self-Attention层:对输入序列中的每个位置,分别计算该位置与其他所有位置的相关性。
      2. 前馈神经网络(Feed Forward Network, FFN):对每个位置的注意力输出单独进行非线性变换。
    • 每个子层在Attention和FFN之前都使用了残差连接(Residual Connection)Layer Normalization,从而避免梯度消失并加速训练。
  2. Decoder部分

    • 同样由6个子层组成,但与Encoder不同的是,Decoder的每个子层包含了三个模块:
      1. Self-Attention层:和Encoder的Self-Attention相似,但额外加入了mask机制,防止模型看到未来的位置信息(即防止未来词影响当前词的生成)。
      2. Encoder-Decoder Attention层:该模块负责将Decoder的输出与Encoder的输出进行匹配,使生成的词能够参考输入序列的上下文。
      3. FFN:和Encoder一样,使用前馈神经网络进行非线性变换。
  3. 位置编码(Positional Encoding):由于Transformer结构不具备序列信息,模型需要额外的位置信息。Positional Encoding通过正弦和余弦函数为序列中的每个位置编码,这样可以让模型理解序列的顺序。

1.3 Encoder 和 Decoder 的区别与联系

Encoder和Decoder的功能有所区别,前者主要负责编码输入序列的上下文信息,而后者则将这些上下文信息转化为目标输出序列。两者的联系在于:Decoder中的Encoder-Decoder Attention模块,它能够让Decoder的每一步输出参考Encoder对输入序列的编码结果,从而生成符合上下文的输出。这样一来,Decoder能够生成与输入相关的翻译、摘要等输出。


2. Transformer的并行计算效率相对于RNN的提升

2.1 RNN中的顺序处理问题

传统的RNN(包括LSTM、GRU等)在处理序列数据时,必须逐步处理输入序列中的每一个元素。这意味着RNN模型的计算是串行的,即只能处理当前时间步的数据,等到当前步处理完后才能处理下一个时间步。这种顺序依赖导致了两个问题:

  1. 并行化困难:由于每一步的计算依赖于前一步的结果,难以进行并行处理。
  2. 长程依赖问题:RNN在处理长序列时容易出现梯度消失或梯度爆炸,导致模型无法有效捕捉序列中的长程依赖信息。
2.2 Transformer中的并行化优势

Transformer的设计从根本上解决了RNN的串行问题。在Transformer中,序列中的每个位置都是独立处理的,通过Self-Attention机制并行计算每个位置与其他位置的相关性。具体表现为:

  1. 自注意力机制的并行计算:Attention计算不依赖于前后顺序,而是直接计算输入序列中所有位置之间的相关性。这使得输入序列的所有元素可以在同一时间步并行处理,大大提高了计算效率。
  2. 更好的长程依赖处理:Self-Attention能够在同一层中捕捉输入序列的全局依赖信息,而不是像RNN那样逐步传递信息。因此,Transformer能够更加有效地处理长序列。

3. Self-Attention机制及其公式

3.1 Self-Attention机制简介

Self-Attention机制是Transformer的核心,它通过计算输入序列中的每个位置与其他所有位置的相似度,来捕捉序列中任意位置之间的依赖关系。相比传统的卷积操作(只能处理局部邻域信息)和RNN的递归计算,Self-Attention能够一次性计算整个序列的全局依赖,这使得模型在处理长序列时更为高效。

在Self-Attention中,每个输入向量都会被映射成三个不同的向量:

  • Query (Q):用于“询问”其他词的信息。
  • Key (K):用于表示其他词的特征。
  • Value (V):包含实际的词向量信息。

Attention机制通过计算Query和Key的相似度来决定如何加权各个Value的贡献。公式如下:

3.2 Self-Attention公式解析

Self-Attention的计算公式如下:

3.3 Attention的工作过程
  1. Query与Key的相似度计算: 每个位置的Query会与其他位置的Key进行点积,计算出相似度得分。得分越高,表示Query与该位置的Key越相关,模型在生成输出时就会更多地参考该位置的Value。

  2. Softmax标准化: 相似度得分通过Softmax函数转化为权重,确保所有得分的和为1。这样模型就能够在生成输出时对所有位置进行加权平均,而不是只关注一个位置。

  3. 加权Value: 最后,Attention机制使用这些权重对Value进行加权平均,生成该位置的输出表示。通过Self-Attention机制,模型能够将输入序列中所有位置的信息整合到每个位置的输出表示中。

3.4 Self-Attention的计算过程举例

假设我们有一个简单的输入序列 ["The", "cat", "is", "on", "the", "mat"]。模型会首先为每个词生成对应的Query, Key, 和 Value向量。接下来,Attention机制会计算序列中每个词与其他词之间的相似度:

  • Query("cat") 与所有其他词的Key进行点积,得到每个词的相似度得分。
  • 使用Softmax函数将这些相似度得分转化为权重。
  • 使用这些权重对每个词的Value进行加权平均,最终生成"cat"这个词的上下文表示。

这个过程会对序列中的每个词重复进行,从而使每个词都能捕捉到整个序列的信息。


4. Multi-head Attention的扩展

Self-Attention虽然能够捕捉序列中的全局依赖关系,但单头的Attention可能会局限于特定的子空间。为了解决这一问题,Transformer引入了Multi-head Attention机制,它能够在多个子空间中并行计算Self-Attention。

4.1 Multi-head Attention的工作原理

Multi-head Attention将输入的Query, Key, 和 Value向量分成多个头,每个头独立地计算Attention,并在最后将所有头的输出拼接起来。这样,模型能够从多个不同的角度来捕捉序列中的信息。

公式如下:

 

5. Transformer的实现建议

通过这部分的学习,你应该已经对Transformer的整体架构和Self-Attention机制有了深刻的理解。接下来,你可以尝试自己实现一个简化版的Transformer模型。以下是一些实现步骤的建议:

  1. 实现Self-Attention

    • 使用PyTorch或者NumPy实现Self-Attention,逐步测试不同模块的输出。
  2. 实现Multi-head Attention

    • 在实现Self-Attention的基础上,扩展为Multi-head Attention,确保每个头的输出能够正确拼接。
  3. 实现Encoder模块

    • 实现带有残差连接和Layer Normalization的完整Encoder层,并测试其性能。

通过这种方式,逐步理解并实现Transformer的核心组件,你将对这一架构有更加深入的掌握,帮助你在后续的学习中更加游刃有余。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2190962.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot框架下的大学生就业招聘平台

5系统详细实现 5.1 用户模块的实现 5.1.1 求职信息管理 大学生就业招聘系统的用户可以管理自己的求职信息,可以对自己的求职信息添加修改删除操作。具体界面的展示如图5.1所示。 图5.1 求职信息管理界面 5.1.2 首页 用户登录可以在首页看到招聘信息展示也一些求职…

setTimeout,setInterval ,requestAnimationFrame定时器

setTimeout,setInterval ,requestAnimationFrame定时器 定时器函数通常用于执行定时任务,也就是说你做了一个功能放在定时器函数里,它可以在特定的时间去执行你的指令,或者说隔多长时间(单位时间内—毫秒为…

为什么每个人都要学习项目管理?

在这个已然到来的超级个体时代,项目管理这项技能,不仅仅是项目经理才需要掌握的,而是每个想要独当一面之人的必备技能。 所谓的独当一面,就是从一个人做好自己的事,到带领一群人从头到尾把事做成。而学习项目管理&…

路由器的工作机制

在一个家庭或者一个公司中 路由器的作用主要有两个(①路由–决定了数据包从来源到目的地的路径 通过映射表决定 ②转送–通过路由器知道了映射表 就可以将数据包从路由器的输入端转移给合适的输出端) 我们可以画一张图来分析一下: 我们好好来解析一下这张图&#x…

Chromium 搜索引擎功能浅析c++

地址栏输入:chrome://settings/searchEngines 可以看到 有百度等数据源,那么如何调整其顺序呢,此数据又存储在哪里呢? 1、浏览器初始化搜索引擎数据来源在 components\search_engines\prepopulated_engines.json // Copyright …

el-pagination组件封装

组件使用 源代码&#xff1a; <script setup> import Pagination from /components/pagination/index.vue import {ref} from "vue";const pageNum ref(1) const pageSize ref(10) const total ref(120)function loadData() {// 加载数据 } </script>…

C++教程一口气讲完!(万字讲解)( ̄y▽ ̄)╭ Ohohoho... 下

C 常量 常量是固定值&#xff0c;在程序执行期间不会改变。这些固定的值&#xff0c;又叫做字面量。 常量可以是任何的基本数据类型&#xff0c;可分为整型数字、浮点数字、字符、字符串和布尔值。 常量就像是常规的变量&#xff0c;只不过常量的值在定义后不能进行修改。 …

【设计模式】软件设计原则——开闭原则里氏替换单一职责

开闭原则内容引出 开闭原则 定义&#xff1a;一个软件实体&#xff0c;类&#xff0c;函数&#xff0c;模块&#xff1b;对扩展开放&#xff0c;对修改关闭。用抽象构建框架&#xff0c;用实现扩展细节。可以提高软件的可复用性和可维护性。 开发新功能时&#xff0c;尽量不修…

Redis实现每日签到(大数据量)

PHP语言使用Redis NoSQL服务器二进制数据类型实现大数据情况下签到功能 目录 问题 解决方式 封装签到类 功能调用 总结 问题 实现用户每日签到功能不难&#xff0c;但随着用户量上升之后&#xff0c;不论是存储还是判断对数据量来说都很麻烦&#xff1b;假如每天有100万用…

pytorch 与 pytorch lightning, pytorch geometric 各个版本之间的关系

主要参考 官方的给出的意见&#xff1b; 1. pytorch 与 pytorch lightning 各个版本之间的关系 lightning 主要可以 适配多个版本的 torch; https://lightning.ai/docs/pytorch/latest/versioning.html#compatibility-matrix&#xff1b; 2. pytorch 与 pytorch geometric 各…

深度学习-----------------------------束搜索

目录 贪心搜索&#xff08;一般来说计算最快的&#xff09;穷举搜索&#xff08;一般来说是最好的&#xff0c;但可能算不动&#xff09;束搜索&#xff08;Beam Search&#xff09; 总结 贪心搜索&#xff08;一般来说计算最快的&#xff09; 在seq2seq中使用贪心搜索来预测序…

软考数据库部分 ---- (概念数据库模型,三级模式,两级映像,事物管理)

文章目录 一、概念数据库模型二、结构数据库模型三、三级模式四、两级映像五、关系模式基本术语六、关系模式七、关系的数学定义八、数据定义语言九、SQL访问控制十、视图十一、索引十二、关系模式十三、范式十四、数据库设计十五、事物管理&#xff08;ACID&#xff09;十六、…

基于SPI协议的Flash扇区擦除实验

当一块Flash芯片中的不同的扇区烧录了不同的程序&#xff0c;而我们只想擦除某个扇区的程序保留其他程序时&#xff0c;Flash的全擦除是不能满足要求的&#xff0c;这时候就需要扇区擦除来实现这一功能。扇区擦除可以对Flash芯片中的某一扇区进行擦除而不改变其他扇区中的存储数…

2.3MyBatis——插件机制

2.3MyBatis——插件机制 1.基本用法2.原理探究2.1加载过程2.2执行过程2.2.1 插件的执行点2.2.2 SQL执行的几个阶段2.2.3 如何梳理出执行流程 插件机制是一款优秀框架不可或缺的组成部分&#xff0c;比如spring、dubbo&#xff0c;还有我们要聊的Mybatis等等。所谓插件&#xff…

【AI大模型】使用Embedding API

一、使用OpenAI API 目前GPT embedding mode有三种&#xff0c;性能如下所示&#xff1a; 模型每美元页数MTEB得分MIRACL得分text-embedding-3-large9,61554.964.6text-embedding-3-small62,50062.344.0text-embedding-ada-00212,50061.031.4 MTEB得分为embedding model分类…

Linux驱动开发(速记版)--printctl子系统

第102章 pinctrl 子系统的引入 Linux中的 pinctrl子系统是管理和配置GPIO引脚的框架&#xff0c;提供标准化方法以适应不同硬件。 它遵循 Linux内核设备模型&#xff0c;分为设备、驱动等部分。 本章节从设备和驱动角度介绍 pinctrl子系统。 102.1 pinctrl 设备树 在设备树中&a…

旅游心动盲盒:开启个性化旅行新体验

嘿&#xff0c;宝子们&#xff01;在如今这个数字化时代呀&#xff0c;文心智能体可是给咱们的生活带来了超多便利和创新呢。今天呀&#xff0c;我来给大家介绍一款超棒的智能体——旅游心动盲盒&#xff0c;它肯定能给你的旅行带来全新的惊喜和超个性化的体验哟。 一、项目背…

基于H3C环境的实验——OSPF

目录 实验设备和环境 实验设备 实验环境 实验记录 1、单区域 OSPF基本配置 步骤1:搭建实验环境并完成基本配置 步骤2:检查网络连通性和路由器路由表。 步骤3:配置OSPF 步骤4:检查路由器OSPF邻居状态及路由表 实验设备和环境 实验设备 三台路由器、两台PC、电源线、两…

GO网络编程(四):海量用户通信系统2:登录功能核心【重难点】

目录 一、C/S详细通信流程图二、消息类型定义与json标签1. 消息类型定义2. JSON标签3.结构体示例及其 JSON 表示&#xff1a;4.完整代码与使用说明 三、客户端发送消息1. 连接到服务器2. 准备发送消息3. 创建 LoginMes 并序列化4. 将序列化后的数据嵌入消息结构5. 序列化整个 M…

java 数据存储方式

1. 变量存储 这是最基本的数据存储方式&#xff0c;通过声明变量来存储数据。变量可以是基本数据类型&#xff08;如int、float、char等&#xff09;&#xff0c;也可以是引用数据类型&#xff08;如对象、数组等&#xff09;。变量存储的数据通常存储在内存中&#xff0c;随着…