Transformer 结构

目录

  • 一、Transformer 的整体结构
  • 二、Input Encoding
  • 三、Transformer Block
    • 3.1 Encoder
      • 3.1.1 Attention
      • 3.1.2 Self-attention
      • 3.1.3 Multi-head Attention
    • 3.2 Decoder
      • 3.2.1 Masked Multi-head Attention
  • 四、Transformer 的优缺点

遇到看不明白的地方,欢迎在评论中留言呐,一起讨论,一起进步!
在这里插入图片描述
前提知识:注意力机制
本文参考:
【清华NLP】刘知远团队大模型公开课全网首发|带你从入门到实战
【官方双语】Transformer模型最通俗易懂的讲解,零基础也能听懂!
全网最透彻的注意力机制的通俗原理与本质【推荐】
【Transformer系列(2)】注意力机制、自注意力机制、多头注意力机制、通道注意力机制、空间注意力机制超详细讲解

之前我们已经了解了 RNN,它是一个顺序计算模型无法并行处理。这就导致了计算机的并行资源被浪费。而 RNN 变体 GRU 或者 LSTM 仍然需要注意力机制。RNN 这样“笨”,那我们是否能不要它呢?答案是肯定的,论文 Attention is all you need (NeurIPS 2017) 给了我们答案。在这篇文章中,作者提出了一个非常强大的模型结构来进行机器翻译的任务,这个结构就是接下来要介绍的 Transformer。

一、Transformer 的整体结构

Transformer 同样是一个编码器-解码器的模型。下图中的红色框表示编码器(encoder)部分,蓝色框表示解码器(decoder)部分。
在这里插入图片描述


我们现在从下往上来看这个过程。首先第一层(下图红框内容)是输入层,输入层需要将文本序列切分成一个个小的单元(这个单元我们叫 token),然后通过 Embedding 转换为向量表示。
在这里插入图片描述
这里有两点不同于 RNN:
1、Transformer 会使用 byte pair encoding(BPE) 的方式来对文本进行切分。
2、在每个位置会加上一个 token 的位置向量,即 positional encoding,用来表示 token 在文本序列中的一个位置。


我们再来看 Transformer 的主体部分(下图红框内容),它是由多个 encoder blocks(编码器块)和多个 decoder blocks(解码器块)堆叠而成的。

在 encoder blocks 和 decoder blocks 之间,存在一些差异。然而,不同的 encoder block 之间和不同的 decoder block 之间的结构完全一致,只有参数有所不同。
在这里插入图片描述


最后来看模型的输出层,其实就是通过一个线性层的变换和一个 Softmax 来输出一个在词表上的概率分布。这与之前 RNN 输出层基本是一致的。在训练过程中,我们也是通过在词表这样一个维度通过计算交叉熵来计算 loss。
在这里插入图片描述
以上就是 Transformer 的整体结构,接下来我们逐个部分进行讲解。

二、Input Encoding

在这里插入图片描述

输入层使用 Byte-Pair Encoding 对输入进行切分,具体细节可以参考之前的博客 BPE (Byte-Pair Encoding) Tokenization 。

我们知道一个 token 出现在文本中的位置是非常重要的。
在这里插入图片描述

Transformer 提出了一个显式建模位置关系的一个方法:通过在原有的 embedding 上加上一个位置向量来让同一个单词在不同位置有不同的表示,进而让模型进行区分。

我们首先假设通过 BPE 和 embedding 得到的向量的维度为 d d d,而位置编码也需要一个维度为 d d d 向量。
在这里插入图片描述

Transformer 采用了一个基于三角函数的一个方法来得到对应的一个位置向量:

在这里插入图片描述
p o s pos pos 表示当前 token 在句子中的位置,是一个从 0 0 0 到 序列长度之间的数。
i i i 表示当前这个位置在 embedding 中的 index,是一个从 0 0 0 d / 2 d/2 d/2 之间的数。

下图展示的是一个长度为 10 10 10 个 token,编码向量维度 d = 64 d=64 d=64 的位置编码可视化。我们可以看到相同维度的编码(就是每个竖线)其实是一个周期的正弦或者余弦函数,而相同位置的编码(就是每个横线)对应着不同周期的正弦和余弦函数。
在这里插入图片描述

根据三角函数的性质我们知道,不同位置的位置编码向量之间的差别取决于它们之间的相对位置。

我们最终就是将 BPEPE 按照位置相加得到的向量输入到 Transformer 主体部分中。
在这里插入图片描述

三、Transformer Block

3.1 Encoder

在这里插入图片描述

Encoder 整体是由两大块组成的,分别是 Multi-Head Attention 网络(下面橙色部分)和 Feed-Forward 网络(上面蓝色部分,本质上是一个带激活函数的两层 MLP 全连接,大家应该比较熟悉了)。

图中的 Nx 表示 N 个模块(block)可以堆叠在一起组成一个更深的神经网络,在原始论文中, Encoder 端一共堆叠了 6 个模块。

除此之外,这里附加了两个小技巧:

1、残差连接(Residual connection)(如图左侧的两个箭头)

残差连接主要用于解决深层神经网络中的梯度消失和梯度爆炸问题。它通过在网络中添加跨层的直接连接,将上一层的输出与下一层的输入相加,从而将梯度从较深的层传递到浅层,使得网络更易于训练。具体而言,残差连接可以使用以下公式表示:
y = F ( x ) + x y = F(x) + x y=F(x)+x其中, x x x 代表上一层的输入, F ( x ) F(x) F(x) 代表上一层经过一系列操作后的输出, y y y 代表当前层的输出。通过将 x x x 直接添加到 F ( x ) F(x) F(x) 上,实现了梯度的直接传递。
残差连接最早被引入到深度残差网络(ResNet)中,该网络在 2015 年的 ImageNet 比赛中取得了优秀的成绩。自此以后,残差连接成为了深度学习中的重要组件,被广泛用于各种网络结构的设计中,例如DenseNet、Highway Network等。
深入了解可以参考论文:
Deep residual learning for image recognition. He et al. CVPR 2016.

2、层归一化(Layer normalization)(见图中两处黄色部分)

Layer normalization 的主要思想是对每个神经网络层的输入进行归一化,使得其均值为 0,方差为
1。具体而言,给定一个输入向量 x x x,Layer normalization 的计算公式如下: LayerNorm ( x ) = scale ⋅ ( x − mean variance + epsilon ) + bias \text{{LayerNorm}}(x) = \text{{scale}} \cdot \left(\frac{{x - \text{{mean}}}}{{\sqrt{{\text{{variance}} + \text{{epsilon}}}}}}\right) + \text{{bias}} LayerNorm(x)=scale(variance+epsilon xmean)+bias其中,mean 和
variance 分别表示输入向量 x x x 的均值和方差,epsilon 是一个小的正数防止除以零的情况,scale 和 bias
是可学习的参数。 通过将输入向量 x x x 进行归一化,Layer normalization 可以使得每个神经网络层的输入具有类似的分布。
深入了解可以参考论文:
Layer normalization. Ba et al. arXiv 2016.

我们主要关注 Multi-Head Attention 部分,下面我们对这部分详细介绍一下。

3.1.1 Attention

我们先回顾一下前讲的注意力机制:给定一个 query 向量和一组 value 向量,注意力机制基于 query 向量对 value 向量进行一个加权平均。

而 Transformer 给定的是一个 query 向量和一组 key-value 向量对。其中,query 向量和 key 向量的维度都是 d k d_k dk,而 value 向量的维度是 d v d_v dv

不同于之前用 query 向量和 value 向量来计算注意力分数,我们这里采用 query 向量和 key 向量的点积来计算注意力分数

这里的输出同样是对 value 向量进行一个加权平均。
A ( q , K , V ) = ∑ i e q ⋅ K i ∑ j e q ⋅ K j V i = softmax ( q K T ) V A(q,K,V)=\sum_i{\frac{e^{q\cdot K_i}}{\sum_j{e^{q\cdot K_j}}}V_i}=\text{softmax}(qK^T)V A(q,K,V)=ijeqKjeqKiVi=softmax(qKT)V

大家可以借助淘宝的例子来进行理解:

在这里插入图片描述

而多个 query 向量可以通过矩阵 Q Q Q 来表示:
A ( Q , K , V ) = softmax ( Q K T ) V A(Q,K,V)=\text{softmax}(QK^T)V A(Q,K,V)=softmax(QKT)V

为了控制注意力权重的大小和梯度的稳定性,这里进一步通过 query 向量的长度 d k d_k dk 进行缩放(scale):
A ( Q , K , V ) = softmax ( Q K T d k ) V A(Q,K,V)=\text{softmax}(\frac{QK^T}{\sqrt{d_k}})V A(Q,K,V)=softmax(dk QKT)V


在这里插入图片描述
上图完整地展示了 attention 的一个过程:

  • 首先 Q Q Q V V V 进行一个矩阵乘法,得到对应的一个注意力分数;
  • 然后通过缩放系数 1 d k \frac{1}{\sqrt{d_k}} dk 1 对注意力分数进行放缩
  • Mask 这个部分我们将在 decoder 部分使用
  • 接着再通过 SoftMax 函数将注意力分数转换为一个概率分布
  • 随后通过与对应的 V V V 矩阵进行一个矩阵乘法就可以对 V V V 实现加权平均,得到我们最后的输出

3.1.2 Self-attention

自注意力机制希望每个 token 能够自主地选择应该关注这句话中的哪些 token 并进行信息的整合,对应的 Q 、 K 、 V Q、K、V QKV 三个矩阵其实都是通过文本的表示向量乘上一个变换矩阵得到的。

对于第一层的 Transformer Block 来说,文本的表示向量其实就是我们前面提到的词表向量和对应位置编码的一个求和。

而对于非第一层的 Transformer Block 来说,文本的表示向量其实就是前面一层的输出。

自注意力机制的关键点在于, Q 、 K 、 V Q、K、V QKV 是同一个东西,或者三者同源,不是输入语句和输出语句之间的注意力机制,而是输入语句内部元素之间或者输出语句内部元素之间发生的注意力机制。

注意力机制的 Q Q Q K K K 是不同来源的。 例如,在 Encoder-Decoder 模型中, K K K是 Encoder 中的元素,而 Q Q Q 是 Decoder 中的元素。
自注意力机制的 Q Q Q K K K 则都是来自于同一组元素。 例如,在 Encoder-Decoder 模型中, Q Q Q K K K 都是 Encoder 中的元素,相互之间做注意力汇聚。

3.1.3 Multi-head Attention

在上述单个 attention 的基础上,Transformer 为了进一步增强模型的一个表示能力,采用了多个结构相同但参数不同的注意力模块,组成了一个多头的注意力机制,其中每个注意力头的计算方式都和前面介绍的完全一致,只不过每个头都有一个自己的权重矩阵 W i Q W_i^Q WiQ W i K W_i^K WiK W i V W_i^V WiV(分别对应下图下方的 Linear 位置)。
在这里插入图片描述
每个注意力头通过前面介绍的方式得到自己的输出:
h e a d i = A ( Q W i Q , K W i K , V W i V ) head_i=A(QW_i^Q,KW_i^K,VW_i^V) headi=A(QWiQ,KWiK,VWiV)
然后我们将这些输出在维度层面进行一个拼接,然后通过一个线性层进行整合就得到了 Multi-head Attention 的一个输出。
MultiHead ( Q , K , V ) = Concat ( h e a d 1 , . . . , h e a d h ) W O \text{MultiHead}(Q,K,V)=\text{Concat}(head_1,...,head_h)W^O MultiHead(Q,K,V)=Concat(head1,...,headh)WO

最后这个输出就会通过残差连接和正则化之后输入到后面的前馈神经网络(2-layer feed-forward network)。

在这里插入图片描述

3.2 Decoder

在这里插入图片描述

对于 Decoder 端,大体上和 Encoder 端是一致的,但是有两个简单的修改:

1、最开始并不是 Multi-head Attention,而是 Masked Multi-head Attention
掩码操作可以避免模型在预测当前位置时使用未来位置的信息。具体而言,模型在预测第 i i i 个位置时,将第 i i i 个位置及其后续位置的注意力权重设置为一个很小的值,表示这些位置的信息被遮盖。

2、Multi-head Attention 的输入 Q Q Q 来自 Decoder,即 Masked Multi-head Attention 的输出向量经过残差连接和正则化之后的输出,而 K K K V V V 来自于 Encoder 最后一层的输出
这个部分类似于我们最开始讲的端到端模型中的注意力机制,它是为了帮助 Decoder 端每一步的生成都可以关注和整合每个 Encoder 端每个位置的信息。

和 Encoder block 一样,这样的 Decoder block 也可以进行堆叠,如上图我右方标记了“Nx”。在原论文中,Decoder block 也是一共堆叠了 6 层。

3.2.1 Masked Multi-head Attention

Multi-head Attention 的基础上, Masked Multi-head Attention 在注意力分数矩阵上进行了掩码操作,即将这个矩阵的左对角线的上三角部分(不包括对角线)设置为 − ∞ -∞
在这里插入图片描述
这样的操作能让我们在计算 SoftMax 之后 − ∞ -∞ 对应的位置会变为 0,然后通过矩阵乘法我们会发现:第 i i i 个输出(即 Output 的第 i i i 行)只考虑了前 i i i 个 value 向量(即 V 的前 i i i 行)
在这里插入图片描述
这样的操作就保证了 Decoder 端在文本生成的时候是顺序生成的,不会出现我们在生成第 i i i 个位置的时候参考了第 i + 1 i+1 i+1 个输入位置的信息。

四、Transformer 的优缺点

优点:

  • Transformer 是一个功能强大的模型,在许多自然语言处理 (NLP) 任务中已被证明是有效的。
  • Transformer 模型适用于并行计算,可以在大规模数据上进行高效的训练和推理。
  • Transformer 的注意力机制被证明是一种有效的建模方法,在处理不同位置之间的关系时表现出色。
  • Transformer 模型的出现为最近的 NLP 进展提供了启示,如 BERT 和 GPT,这些模型基于 Transformer 的架构取得了显著的突破。

缺点:

  • 模型本身对于参数非常敏感,优化过程非常困难
  • 处理复杂度为 O ( n 2 ) O(n^2) O(n2),导致对于也别长的文本束手无策,通过设置 512 为最大输入长度。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spring boot 3.0.1多模块项目使用nacos动态配置

根pom文件增加&#xff0c;spring-cloud-alibaba包管理&#xff0c;注意版本spring-boot 3.0.3&#xff0c;spring-cloud-alibaba 2022.0.0.0-RC1 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0…

Redis--18--Redis Desktop Manage下载与安装

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Redis Desktop Manage1.官网下载https://redis.io/insight/ 2.安装方法3.使用方法3.1.进入RedisDesktopManager的主界面3.2 新建连接3.3 支持操作 Redis Desktop Ma…

RocketMQ快速入门:linux安装rocketmq并配置开机自启(十一)

目录 0. 引言1. 下载安装包1.1 高版本直接下载安装包1.2 下载源码包进行编译 2. namesrv和broker安装2.1 安装2.2 放开服务器端口2.3 测试 3. 配置开机自启3.1 配置namesrv开机自启3.2 配置broker开机自启 0. 引言 之前我们针对本机电脑安装rocketmq进行了讲解&#xff0c;同时…

QT在visual studio环境打开控制台窗口

明确需求 在VS环境中开发QT应用&#xff0c;有时遇到BUG想看日志&#xff0c;但是默认VS环境没有显示控制台窗口可看日志。 解决方法 对工程名单击右键。 点击属性&#xff0c;在打开界面按照如下图操作。 设置完成后弹出的控制台窗口如下图。

五线谱与简谱有什么区别 五线谱简谱混排怎么打 吉他谱软件哪个好

五线谱与简谱作为音乐记谱领域的两大主流系统&#xff0c;各自承载着深厚的历史渊源与独特的表现力&#xff0c;并在全球范围内被不同程度地接受和应用。尽管两者都是为了记录音乐作品中的音高和节奏信息&#xff0c;但其内在机制、适用范围以及学习曲线存在显著差别。下面我们…

Qt | windows Qt6.5.3安卓环境搭建成功版(保姆级教程)

01、第一章 Qt6.5.3安装 资源 Qt 国内下载地址清华大学开源软件镜像站https://mirrors.tuna.tsinghua.edu.cn/qt/archive/online_installers/Qt 阿里云盘下载Qt 安卓开发https://www.alipan.com/s/kNaues6CHaG点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极…

专业报考628

目录 掌上高考相关专业两步走 研招网、软科最后 刚才看了&#xff0c;挺有用的育 就是一点&#xff0c; 查找相关专业 掌上高考 如果不知道喜欢什么专业&#xff0c;直接查大学&#xff0c;就查那个大学有什么不是物化强行绑定的 看**招生计划**一栏 如果有明确目标&#xf…

Hi3861 OpenHarmony嵌入式应用入门--轮询按键

本篇介绍使用轮询方式读取gpio状态来判断按键状态。 原理图如下 GPIO API API名称 说明 hi_u32 hi_gpio_init(hi_void); GPIO模块初始化 hi_u32 hi_io_set_pull(hi_io_name id, hi_io_pull val); 设置某个IO上下拉功能。 hi_u32 hi_gpio_set_dir(hi_gpio_idx id, hi_gpi…

【shell脚本速成】python安装脚本

文章目录 案例需求应用场景解决问题脚本思路案例代码 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f388;欢迎踏入我的博客世界&#xff0c;能与您在此邂逅&#xff0c;真是缘分使然&#xff01;&#x1f60a; &#x1f338;愿您在此停留的每一刻&#xff0c;都沐…

面对.rmallox勒索病毒:如何有效防范及应对

引言&#xff1a; 在当今数字化社会&#xff0c;网络安全问题日益严重&#xff0c;勒索病毒成为企业和个人不可忽视的威胁之一。最近出现的.rmallox勒索病毒更是给全球各地的用户带来了严重的数据安全问题。本文将探讨.rmallox勒索病毒的特点、感染方式及应对策略&#xff0c;…

【UE5.3】笔记6-第一个简单小游戏

打砖块小游戏&#xff1a; 1、制造一面砖块组成的墙 在关卡中放置一个cube&#xff0c;放这地面上&#xff0c;将其转换成蓝图类,改名BP_Cube&#xff0c;更换砖块的贴图&#xff0c;按住alt键进行拷贝&#xff0c;堆出一面墙&#xff0c;复制出来的会很多&#xff0c;全选移动…

Java学习笔记(一)Java内容介绍、程序举例、DOS命令、Java跨平台特性的本质、课后练习

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍Java内容介绍、程序举例、DOS命令、Java跨平台特性的本质还有几道课后练习详细介绍以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习记录获,友友们有任何问题可以在评论区留言 …

JavaScript:实现内容显示隐藏(展开收起)功能

一、场景 点击按钮将部分内容隐藏&#xff08;收起&#xff09;&#xff0c;再点击按钮时将内容显示&#xff08;展开&#xff09;出来。 二、技术摘要 js实现实现内容显示隐藏js动态给ul标签添加li标签js遍历数组 三、效果图 四、代码 js_block_none.js代码 var group1 doc…

MySQL高级-SQL优化-小结

文章目录 1、insert 优化2、主键优化3、order by 优化4、group by 优化5、limit 优化6、count 优化7、update 优化 1、insert 优化 insert&#xff1a;批量插入、手动控制事务、主键顺序插入 大批量插入&#xff1a;load data local infile 2、主键优化 主键长度尽量短、顺序插…

webpack【实用教程】

基础配置 配置的拆分和合并 通常 webpack 的配置文件会有3个 webpack.common.js 公共配置&#xff08;会被另外两个配置文件导入并合并&#xff09;webpack.dev.js 开发环境的配置webpack.prod.js 生产环境的配置 开发环境的本地服务 在 webpack.dev.js 中配置 devServer:…

探索未来的AI革命:GPT-5的即将登场

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

柔性数组(flexible array)

柔性数组从C99开始支持使用 1.柔性数组的概念 概念&#xff1a; 结构体中&#xff0c;结构体最后一个元素允许是未知大小的数组&#xff0c;这就叫[柔性数组]的成员 struct S {int n;char arr[]; //数组大小未知(柔性数组成员) }; 柔性数组的特点&#xff1a; 结构体中柔性…

右键新建没有TXT文本文档的解决办法

电脑右键新建&#xff0c;发现没有txt了&#xff0c;我查网上办法都有点复杂&#xff0c;诸如注册表的&#xff0c;但是其实很简单&#xff0c;重启windows资源管理器就可以了。 点击重新启动&#xff0c;之后新建就有txt文档了。

Windows server 由于没有远程桌面授权服务器可以提供许可证,远程会话连接已断开。

问题现象&#xff1a; 解决办法 临时远程方式1: 打开 mstsc 时带上 /admin 等参数&#xff0c;如下图所示&#xff1a; 使用“mstsc /admin /v:目标ip”来强制登录服务器&#xff0c;但只能是管理员身份。 远程方式2&#xff1a; 通过VM远程登陆系统后&#xff0c;运行输入R…

安卓速度下载v1.0.5/聚合短视频解析下载

功能特色 短视频下载与高级管理 – 支持短视频下载&#xff0c;为您提供一系列高级视频管理功能包括视频内容提取、智能防重复技术、视频体积压缩以及视频转换成GIF图片等&#xff1b; 磁-力链接下载升级 – 现支持磁力链接下载&#xff0c;实现边下载边播放的便捷体验&#x…