transformer系列2---transformer架构详细解析

transformer详细解析

  • Encoder
    • 1 输入
      • 1.1 Embedding 词嵌入
        • 1.1.1 Embedding 定义
        • 1.1.2 几种编码方式对比
        • 1.1.3 实现代码
      • 1.2 位置编码
        • 1.2.1 使用位置编码原因
        • 1.2.2 位置编码方式
        • 1.2.3 位置编码代码
    • 2 注意力 Attention
      • 2.1 自注意力self-attention
        • 2.1.1 QKV含义
        • 2.1.2 自注意力公式
        • 2.1.3 自注意力计算流程
      • 2.2 多头注意力 Multi-Head Attention
        • 2.2.1 多头注意力公式
        • 2.2.2 多头注意力计算流程
      • 2.3 模型使用的三种注意力
    • 3 前馈神经网络
    • 4 残差连接和归一化
  • Decoder
    • 1 输入
    • 2 mask 多头自注意力
    • 3 多头交叉注意力
    • 4 前馈神经网络
    • 5 输出

请添加图片描述

Transformer是一个序列到序列的模型,包含一个encoder和一个decoder,每个encoder或decoder均由 H个相同的结构堆叠而成。编码器模块主要包含:多头自注意力模块和前馈神经网络,同时采用残差连接增加网络深度,采用layerNorm进行归一处理。解码器模块基本结构和编码器模块相同,只是使用mask的多头注意力模块,然后增加一个交叉注意力模块,再输入逐点前馈网络,最后经过一个全连接层和一个Softmax,得到输出结果,每个输出结果又会作为下一轮decoder的输入,因此,transformer属于自回归。整体结构如上图所示,下面对每个模块进行详细解读。

Encoder

1 输入

输入部分

1.1 Embedding 词嵌入

1.1.1 Embedding 定义

首先介绍一下常见的几种编码方式:

  1. 整数编码:用一种数字来代表一个词
  2. one-hot 编码:用一个序列向量表示一个词,该向量只有词汇表中表示这个单词的位置是1,其余都是0,序列向量长度是预定义的词汇表中单词数量。
  3. word embedding 词嵌入编码:将词映射或者嵌入(Embedding)到另一个数值向量空间(常常存在降维),它以one hot的稀疏矩阵为输入,经过一个线性变换(查表)将其转换成一个密集矩阵的过程。Embedding的原理是使用矩阵乘法来进行降维,节约存储空间。例如下图,一个2×6的矩阵,乘以6×3的矩阵,得到2×3的矩阵。虽然矩阵的变小,但数字蕴藏的信息没有改变,只是按照某一种映射关系将矩阵映射到一个新的维度的矩阵。每个单词都表示为一个3维的浮点值向量。可以将其理解为“查找表”,通过查找表查找密集矩阵中的值,得到每个单词进行编码。比如下面的第一个词,查找密集矩阵中第一行即可得到新的表示
    在这里插入图片描述
1.1.2 几种编码方式对比

下表是对几种编码方式的对比
在这里插入图片描述

1.1.3 实现代码
class Embeddings(nn.Module):def __init__(self, d_model, vocab):super(Embeddings, self).__init__()self.lut = nn.Embedding(vocab, d_model)self.d_model = d_modeldef forward(self, x):return self.lut(x) * math.sqrt(self.d_model)

1.2 位置编码

1.2.1 使用位置编码原因

由于句子中的每个词语同时通过Transformer的编码器/解码器,模型本身对于每个词语的位置/顺序没有任何概念。因此,需要将词语的顺序融入到模型中,使模型能够获取词语的位置信息,也就是位置编码。位置编码需要满足以下条件:

  1. 词语在句子中的每个位置应输出一个唯一的编码。
  2. 不同长度的句子之间的任意两个位置之间的距离应保持一致。
  3. 模型应能适应更长的句子,其取值应该受到限制。
  4. 它必须是确定值。
1.2.2 位置编码方式
  1. 固定位置编码

  2. 可学习的位置编码

1.2.3 位置编码代码

2 注意力 Attention

在这里插入图片描述

2.1 自注意力self-attention

2.1.1 QKV含义
2.1.2 自注意力公式

在这里插入图片描述
dk代表矩阵K的维度,这里进行归一化计算,假设q和k的分量是独立的随机变量,均值为0,方差为1。那么它们的点积在这里插入图片描述的均值为0,方差为dk,点积会变大,因此需要归一化计算。

2.1.3 自注意力计算流程
  1. 对于输入的序列a1,a2,a3,a4,通过Wq,Wk,Wv三个矩阵,将其转换为q1,k1,v1,q2,k2,v2,q3,k3,v3,q4,k4,v4。
    请添加图片描述

  2. q1和k1—k4分别计算相似性,得到相似性系数在这里插入图片描述

  3. 计算soft-max,得到在这里插入图片描述
    在这里插入图片描述
    该步骤

  4. 将上一步得到的注意力分数与v1,v2,v3,v4相乘,求和,得到。
    具体流程如下图:
    请添加图片描述

  5. 总结:上述流程用矩阵表示为:
    请添加图片描述

2.2 多头注意力 Multi-Head Attention

2.2.1 多头注意力公式

在这里插入图片描述
这里在这里插入图片描述在这里插入图片描述

2.2.2 多头注意力计算流程

顾名思义,多头注意力就是用H个不同参数的 QKV注意力结构对输入的 Dk维度的 query,key和 value进行计算;然后将所有输出结果进行拼接,并将N*d_v维度映射回 D_m维,注意,这里的H个head是并行计算的,而不是一个一个head串行。
在这里插入图片描述

2.3 模型使用的三种注意力

  1. 自注意力 self attention
    在 Transformer编码器中使用,Q=K=V=X, X为输入或前一层的输出
  2. 掩码自注意力 masked self attention
    在Transformer解码器中使用,此时自注意力限制为:每个位置的 Query只注意到该位置和之前的所有 Key-Value值。具体实现为:对位归一化的注意力矩阵进行掩码操作,即当 i<j时,设置 A_ij 为负无穷。这种自注意力也称之为自回归(autogress)或因果(causal)注意力。
  3. 交叉注意力 cross Attention
    Q,K,V的来源不同,其中 Q(query)来自于输入或上一层的输出,而 K和 V则来自于编码器的输出。

3 前馈神经网络

逐点前馈网络(Position-wise Feed-Forward Networks)为全连接(通常为两层)前馈结构,对特征图每个点进行逐点计算,计算公式为:
在这里插入图片描述
x是多头注意力的输出,第一层全连接结构经过RELU激活函数后,再计算一次全连接,W1,W2,b1,b2为可学习的参数。

4 残差连接和归一化

Transformer结构在每个模块中采用了残差连接,并对连接后的张量进行归一化操作可以表示为:
LN(X)= LayerNorm(x + Sublayer(x))

Sublayer表示当前层的操作,比如当前层计算多头注意力,这里就是Multihead(x),若是逐点前馈网络,就是FFN(x),LayerNorm表示层归一化操作。残差连接和归一化主要用于构建更深的网络结构,减缓梯度消失问题。

Decoder

1 输入

Decoder的输入部分与Encoder类似,都是将输入先经过embedding转换,然后增加位置编码,区别是,这里的输入是Decoder上一轮的输出结果,因此,transformer是自回归。

2 mask 多头自注意力

Decoder也有多头自注意力(MHA)模块,不过这里需要对当前单词和之后的单词做mask,也就是模型只会看到当前位置之前的内容,这样,才能确保预测仅依赖于已生成的输出单词。

3 多头交叉注意力

交叉注意力也成为跨注意力,这里的K和V是来源于encoder的输出,Q是来源于Decoder的Mask MHA,而解码器自注意力中,Q、K和V都来自上一个解码器层的输出。

4 前馈神经网络

这部分和encoder相同,不再赘述

5 输出

经过decoder后,网络再经过全连接层和softmax,即可得到输出结果

参考内容:
感谢李宏毅老师的视频讲解,文章中的图来源于李老师的PPT。

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

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

相关文章

Innodb底层原理与Mysql日志机制

MySQL内部组件结构 Server层 主要包括连接器、词法分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务功能&#xff0c;以及所有的内置函数&#xff08;如日期、时间、数学和加密函数等&#xff09;&#xff0c;所有跨存储引擎的功能都在这一层实现&#xff0c…

【Vue】路由与Node.js下载安装及环境配置教程

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Vue快速入门》。&#x1f3af;&#x1f3af; &…

无涯教程-JavaScript - COUNT函数

描述 COUNT函数计算包含数字的单元格的数量,并计算参数列表中的数字。使用COUNT函数获取在数字范围或数字数组中的数字字段中的条目数。 语法 COUNT (value1, [value2] ...)争论 Argument描述Required/Optionalvalue1The first item, cell reference, or range within whic…

React TypeScript | 快速了解 antd 的使用

1. 安装&#xff1a; 就像安装其他插件库一样&#xff0c;在项目文件夹下执行&#xff1a; npm install antd --save如果你安装了 yarn&#xff0c;也可以执行&#xff1a; yarn add antd2. 引用 import { Button, Tooltip } from "antd"; import "antd/dis…

第三、四、五场面试

第三场 共享屏幕做题&#xff08;三道简单题&#xff09; 替换空格成%20&#xff08;双指针&#xff09; 删除升序链表中的重复元素&#xff08;指针&#xff09;有效的括号&#xff08;栈&#xff09; 第四场、第五场 自我介绍 项目拷打 整个项目架构rpc模块的情况分析的数…

云渲染是怎么做到不排队的

云渲染排队严重影响了用户的使用体验&#xff0c;还会导致用户的流失&#xff0c;因此解决渲染不排队的问题对于云渲染平台来说是非常重要的。而作为云渲染平台&#xff0c;自己的机器基本都是固定的&#xff0c;哪如何解决用户渲染排队的问题呢&#xff1f;我们一起来看看全国…

@Nullable

Nullable 是一种用于标记方法参数、方法返回值以及字段的注解&#xff0c;用于表示这些元素可以为null。它主要用于静态代码分析工具、IDE或其他工具来检测潜在的空指针异常问题。 在 Java 中&#xff0c;Nullable 注解通常是使用 javax.annotation.Nullable 或 edu.umd.cs.fi…

JOSEF约瑟 剩余电流继电器PFR-5 PFE-W-20 国产化改造ZLR-G81 ZCT-45

系列型号&#xff1a; PFR-003剩余电流继电器 PFR-03剩余电流继电器 PFR-5剩余电流继电器 PFR-W-105互感器 PFR-W-140互感器 PFR-W-20互感器 PFR-W-210互感器 PFR-W-30互感器 PFR-W-35互感器 PFR-W-70互感器 一、用途 PFR剩余电流继电器&#xff08;以下简称继电器…

蓝桥杯 题库 简单 每日十题 day3

01 约数个数 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 1200000 有多少个约数&#xff08;只计算正约数&#xff09;。 解题思路 枚举&#xff0c;从1开始一直到1200000本身都作为1200000的除数&#xff0c;…

机器学习——奇异值分解(未完)

开坑&#xff0c;刚看完书&#xff0c;已经有些窒息了 先把坑挖了&#xff0c;再慢慢填&#xff0c;避免自己划水跳过 我爱线代&#xff0c;线代爱我&#xff0c;阿弥陀佛 为什么要学奇异值分解&#xff1f; 因为书本倒数第二章专门提到的&#xff0c;想必一定很重要&#xff…

GitHub无法访问的解决方法

每次刚装完系统我们访问GitHub就会出现无法访问的情况&#xff0c;此时只需要修改host文件将可访问的dns解析地址写入进去即可。 查询DNS 使用dns监测查询工具 https://tool.chinaz.com/dns https://dnsdaquan.com/ 输入无法访问的IP github.com 进行检测 查询到可访问的i…

iOS“超级签名”绕过App Store作弊解决方案

一直以来&#xff0c;iOS端游戏作弊问题都是游戏行业的一大痛点。在当下游戏多端互通的潮流下&#xff0c;游戏作为一个整体&#xff0c;无论哪一端出现安全问题&#xff0c;都会造成更加严重的影响。因此&#xff0c;iOS端游戏安全保护也同样十分重要。 iOS独特的闭源生态&am…

使用yum进行软件安装的基础命令

在Linux系统中&#xff0c;特别是基于Red Hat、CentOS或Fedora的系统&#xff0c;yum&#xff08;Yellowdog Updater Modified&#xff09;是一个非常常用的包管理工具&#xff0c;用于自动下载和安装软件包以及其依赖关系。 首先&#xff0c;请确保您的系统中已经安装了yum。…

HOOPS Visualize 2023 SP2 U1 Crack-HOOPS Visualize

HOOPS Visualize 是一个以工程为中心的高性能图形库&#xff0c;用于在桌面、移动和 AR/VR 设备上渲染 3D CAD 模型。该 3D 图形库具有线程安全的 C 和 C# 接口以及 OpenGL 和 DirectX 驱动程序&#xff0c;并由响应迅速的专业图形专家提供支持。通过访问最新的 3D GPU 功能&am…

函数模板的概念和意义

问题 C 中有几种交换变量的方法&#xff1f; 交换变量的方法 定义宏代码块 优点&#xff1a;代码复用&#xff0c;适合所有类型缺点&#xff1a;编译器不知道宏的存在&#xff0c;缺少类型检查 定义函数 优点&#xff1a;真正的函数调用&#xff0c;编译器对类型进行检查缺…

【人工智能】企业如何使用 AI与人工智能的定义、研究价值、发展阶段的深刻讨论

前言 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。 它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是新一轮科技革命和产业变革的重要驱动力量。 &#x1f4d5;作者简介&#x…

8.反悔贪心

文章目录 反悔贪心[630. 课程表 III](https://leetcode.cn/problems/course-schedule-iii/)[2813. 子序列最大优雅度](https://leetcode.cn/problems/maximum-elegance-of-a-k-length-subsequence/)[871. 最低加油次数](https://leetcode.cn/problems/minimum-number-of-refuel…

爬虫项目(四):抓取网页所有图片

文章目录 一、书籍推荐二、完整代码三、运行结果 一、书籍推荐 推荐本人书籍《Python网络爬虫入门到实战》 &#xff0c;详细介绍见&#x1f449;&#xff1a; 《Python网络爬虫入门到实战》 书籍介绍 二、完整代码 原理&#xff1a;抓取该链接中所有的图片格式。基于seleni…

c++ 模版元编程 基于条件的编译

基于条件的编译是指根据不同的条件选择是否编译某段代码或选择不同的代码路径。在 C 的模板元编程中&#xff0c;我们可以利用模板特化和 std::enable_if 技术来实现基于条件的编译。 通过基于条件的编译&#xff0c;我们可以在编译期间根据类型特征或其他条件&#xff0c;决定…

SpringBoot+MyBatis flex实现简单增删改查

一&#xff1a;创建SpringBoot项目 SpringBoot版本选择2.7.15 勾选相关的选项&#xff0c;并点击Create 项目创建完成 二.pom文件添加相关的依赖 <dependencies><dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starte…