Transformer论文解读

目录

写在前面

一、Transformer要解决的问题

1.长距离依赖问题

2.序列处理瓶颈

二、整体结构

三、自注意力机制

1.Scaled Dot-Product Attention

2.Multi-Head Attention

四、Position-wise Feed-Forward Networks(FFN)

五、位置编码

六、总结


写在前面

        Transformer有多牛逼不用多说,时隔7年我们再来看看论文原文,看看这篇深刻改变世界的文章都说了什么。当然逐字逐句解读已经意义不大,我们只列考点。

        Transformer是文章"Attention is All You Need"中提出的一种新的神经网络架构,最初用在机器翻译,该论文由当时谷歌的Vaswani 等7人(截止2024年的今日,7人已经全部离职)于 2017 年在 NeurIPS 2017 上发表的。

        Transformer分两半。encoder延伸出判别模型BERT(Bidirectional Encoder Representations from Transformers),作者谷歌,主攻文本分类、NER、摘要等判别工作;另一半decoder延伸出生成模型GPT(Generative Pre-trained Transformer),由OpenAI开发,GPT从1演变到3,进而到现在的ChatGPT,已经家喻户晓。

        现在的LLM基础架构GPT,当然此外还有最近很火的mamba和昙花一现的rwkv,但都还没有形成气候。在可见的未来,GPT仍然会统治LLM相当长的时间。

一、Transformer要解决的问题

1.长距离依赖问题

        传统序列模型的循环结构造成了“遗忘”的发生,简单地说,越靠后的token权重越大。为了解决这个问题,Attention机制诞生了。它在每个解码步中计算注意力分数并聚合输入序列的相关信息,attention机制可以减轻RNN的长期依赖问题。

        Attention机制并不是Transformer发明的,比如Seq2Seq就就可以使用Attention机制。

图1

        在传统Seq2Seq结构中,encoder把所有的输入序列都编码成一个统一的语义向量Context,然后再由Decoder解码。

        由于context包含原始序列中的所有信息,它的长度就成了限制模型性能的瓶颈。如机器翻译问题,当要翻译的句子较长时,一个Context可能存不下那么多信息,“遗忘”就发生了,造成精度的下降。

        使用了Attention机制后,“遗忘”的问题得到了缓解,但只是缓解,不是解决。因为循环的结构,模型不可能平等的看待序列中每一个token。而且注意力主要用于解码阶段,即每个解码步时,根据注意力分数计算hidden states,编码时还是RNN结构,因此这种注意力机制并不彻底。

2.序列处理瓶颈

        无论怎么修改,传统的序列模型都是基于循环的(RNN、LSTM、seq2seq等),这种循环形式可以将token的位置与时间进行对齐,天然的带有位置信息,但是不能并行,在处理较长的序列时变得很慢,处理速冻成为模型的瓶颈。

        为了解决上述两个问题,Transformer做了如下工作。

二、整体结构

        结构图再熟悉不过:

图2

1.模型不使用循环结构,输入Inputs是整个的token序列,输出也是直接的结果。模型可以并行,解决了序列处理瓶颈的问题。

2.Transformer使用了编解码结构,encoder将输入的token序列(x1,...,xn)映射到一个连续表示的序列z,decoder根据z输出结果序列(y1,...,ym)。

3.encoder和decoder全都使用attention机制,堆叠Self-attention和全连接层,它们分别由6个结构相同的层组成;

4.encoder每个层有两个子层,第一层是一个多头自注意机制,第二层是一个全连接。两个子层使用残差连接,然后进行层归一化。也就是说,每个子层的输出是LayerNorm(x +子层(x)),其中子层(x)是由子层本身实现的函数。为了方便这些剩余的连接,模型中的所有子层以及嵌入层都会产生尺寸数据模型= 512的输出。

5.decoder每个层有三个子层,前两个和encoder结构非常相似。第三个子层对encoder的输出执行多头注意。与编码器类似,我们在每个子层周围使用剩余连接,然后进行层归一化。第三层的自注意子层使用掩码,以防止位置关注后续的位置,确保了对位置i的预测只能依赖于小于i的位置的已知输出。

三、自注意力机制

        为了解决传统Attention机制的不足(不能并行和“遗忘”),Transformer发明了Self-Attention机制。Self-Attention是并行的,而且能够在一个步骤中计算整个输入序列中任意两个位置之间的依赖关系,通过直接捕捉全局依赖关系(不依赖逐步传播),同时在encoder中也使用了注意力机制,提高了捕捉长距离依赖的能力。有效的解决了上述两个问题。

1.Scaled Dot-Product Attention

        输入经过三个全连接分别得到QKV,然后计算具有所有K和Q的点积,将每个键除以\sqrt{d_k},并用一个softmax函数来获得这些值的权重,得到的就是注意力分数。再讲注意力分数施加到值向量(V),得到注意力的输出,公式如下:

Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V

        对于维度较大的大值,点积的结果会越来越大,将softmax函数推到具有极小梯度的区域。为了抵消这种效应,作者除以\sqrt{d_k}来缩放点积。关于Scaled Dot-Product Attention的更多信息,请看这里。

2.Multi-Head Attention

        多头注意可以让模型同时关注来自不同位置的不同表示子空间的信息。从而提高模型的表达能力、增加鲁棒性。

        类比多层卷积更好理解,多层卷积网络中,每个卷积层提取不用的特征。多头就相当于多个卷积层,每个头相当于每个卷积层。示意图如下,可以看到多头的数量h,默认64:

四、Position-wise Feed-Forward Networks(FFN)

        encoder和decoder的每个层都包含FFN,通常由两个线性变换和一个激活函数(如ReLU)组成。公式如下:

FFN(x)=max(0,xW_1+b_1)W_2+b_2

        FNN可以独立处理每个位置的特征:因为它是逐位置(position-wise)应用的,相当于每个token都会有对应的一套FFN(默认64个),它在序列中的每个位置独立地应用同一个全连接网络。这意味着FFN不会在不同位置之间引入交互,这种独立处理方式有助于模型保持位置之间的独立性,同时增强每个位置上的特征表示。

        增强表示能力:FFN通过非线性变换来增强模型的表示能力。每个位置上的表示都会经过一系列非线性函数的变换,从而提升模型在该位置上的特征表达能力。

        引入非线性特征变换:由于FFN包含激活函数(如ReLU),它引入了非线性变换。这种非线性变换有助于模型学习更复杂的模式和特征,而不仅仅是线性变换所能捕捉到的简单模式。

五、位置编码

由于Transformer不是循环结构的,为了使模型具有序列的特性,必须注入关于序列中token的相对或绝对位置的信息。为此,我们在encoder和decoder的底部向输入嵌入中添加“位置编码”。公式如下:
PE_{(pos,2i)}=sin(pos/10000^{2i/d_{model}})
PE_{(pos,2i+1)}=cos(pos/10000^{2i/d_{model}})
其中pos是位置,i是维度。也就是说,位置编码的每个维度都对应于一个正弦曲线。波长形成了一个从2π到10000·2π的几何级数。根据题的介绍请看 这里。

六、总结

        Transformer不是循环结构,是端到端的。

        Transformer是encoder和decoder结构的。

        重点是Transformer使用了Self-Attention机制。

        Self-Attention机制是并行的,同时在encoder中也使用了注意力机制,提高了捕捉长距离依赖的能力。

        Self-Attention的核心是点积注意力(Scaled Dot-Product Attention);并且使用Multi-Head增加了模型的表示能力。

        使用了基于三角函数的位置编码。

        Transformer这篇论文就简单介绍到这里,关注不迷路(*^▽^*)

关注订阅号了解更多精品文章

交流探讨、商务合作请加微信

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

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

相关文章

数组双指针经典习题

合并两个有序数组 class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int p1m-1,p2n-1;int p3nums1.length-1;while(p1>0&&p2>0){//放完一个数组if(nums1[p1]>nums2[p2]){nums1[p3--]nums1[p1];p1--;}else{nums1[p3--]nums2[p2];p…

iOS调整collectionViewCell顺序

效果图 原理 就是设置collectionView调整顺序的代理方法,这里要注意一点 调整过代理方法之后,一定要修改数据源,否则导致错乱。 还有就是在collectionView上面添加一个长按手势,在长按手势的不同阶段,调用collectionV…

第18篇 Intel FPGA Monitor Program的使用<一>

Q:Intel FPGA Monitor Program开发工具可以支持Terasic的FPGA开发板使用吗? A:Intel FPGA Monitor Program 是Intel提供的适用于 ARM* Cortex*-A9 处理器和 Nios II 处理器的完整软件开发环境,它包括编译工具以及完整的调试功能&…

全国电力变压器数据

全国共10330个电力变压器 属性部分并不是很全,比如说一次电压,二次电压只有200条是全的 不过以我做电力采集时的经验,其实变压器的数量和位置是最难采集的数据,反而电压、电流、功率这些专业数据可以直接找设备台账补充或利用移动…

log4j日志打印导致OOM问题

一、背景 某天压测,QPS压到一定值后机器就开始重启,出现OOM,好在线上机器配置了启动参数-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/**/**heapdump.hprof。将dump文件下载到本地,打开Java sdk bin目录下的jvisualvm工具&a…

35、matlab设置字体、查看工具包版本、窗口默认布局和程序发布

1、matlab设置字体 1)找到预设并点击预设 2)设置流程:字体——>自定义——>编辑器——>选择字体及格式——>确定 如图序号所示 2、matlab查看工具包版本:ver命令 1)命令行窗口输入命令 即可查看工具包…

如何使用前端表格控件实现数据更新?

前言 小编之前分享过一篇文章叫《如何使用前端表格控件实现多数据源整合?》。今天,继续为大家介绍如何使用前端表格控件来更新已连接的数据源信息。 环境准备 SpreadJS在线表格编辑器: SpreadJS 前端表格控件新版本新增了一款报表插件&am…

Python altair库:轻松打造高颜值数据可视化图表

更多Python学习内容:ipengtao.com Altair是一个基于Vega和Vega-Lite构建的Python数据可视化库。它提供了一个简单且直观的API,能够生成具有交互性的统计图表。Altair的设计理念是通过声明式的语法定义图表,从而简化了复杂图表的创建过程。本文…

VUE脚手架更新

用vue命令创建命令时发现提示需要更新vue-cli 卸载原脚手架 npm uninstall vue-cli -g 升级 npm install -g vue/cli 检查版本 vue -V 注意是大写的v

【PowerDesigner】创建和管理CDM之新建和使用域

目录 🌊1. PowerDesigner简介 🌍1.1 常用模型文件 🌍1.2 PowerDesigner使用环境 🌊2. 创建和管理CDM 🌍​​​​​​2.1 新建CDM 🌍2.2 新建和使用域 🌊3. 研究心得 🌊1. Pow…

pxe自动装机:

pxe自动装机: 服务端和客户端 pxe c/s模式,允许客户端通过网络从远程服务器(服务端)下载引导镜像,加载安装文件,实现自动化安装操作系统。 无人值守 无人值守,就是安装选项不需要人为干预&am…

最全面又最浅显易懂的Langchain快速上手教程(下)

最全面又最浅显易懂的Langchain快速上手教程(下) 三. 深入Langchain 1. 架构设计 从上文知道Langchain在架构上使用了从抽象、到具体、再到整合适配的三层架构,这种一层一层逐渐具体的设计最大可能性的保证了架构的可扩展性和维护性。同时…

【Vue】封装api接口 - 图片验证码接口

**1.目标:**将请求封装成方法,统一存放到 api 模块,与页面分离 2.原因:以前的模式 页面中充斥着请求代码 可阅读性不高 相同的请求没有复用请求没有统一管理 3.期望: 请求与页面逻辑分离相同的请求可以直接复用请求…

17个有用的CLI命令

作为前端开发工程师,我们需要了解哪些命令?如果您熟悉这些命令,它们将大大提高您的工作效率。 1. tree 你们知道如何列出一个目录的文件结构吗?它在显示文件之间的目录关系方面做得很好 commands ├── a.js ├── b.js ├── …

NOS II - Timer定时器

NOS II-Time定时器 简单回忆NIOS II中定时器的使用。 一、定时器的框图 二、定时器寄存器的描述 定时器的寄存器都是16bit的, 偏移量寄存器名称R/W15bit…4bit3bit2bit1bit0bit0Status - 状态寄存器R/W - 可读可写*****runTO1Control - 控制寄存器R/W***stopsta…

2024年高考作文考人工智能,人工智能写作文能否得高分

前言 众所周知,今年全国一卷考的是人工智能,那么,我们来测试一下,国内几家厉害的人工智能他们的作答情况,以及能取得多少高分呢。由于篇幅有限,我这里只测试一个高考真题,我们这里用百度的文心…

【最新鸿蒙应用开发】——总结ArkUI生命周期

鸿蒙ArkUI相关的生命周期都有哪些? 1. UIAbility生命周期 onCreate、onWindowStageCreate、onForeground、onBackground、onWindowStageDestroy、onDestroy。 onCreate:Create状态为在应用加载过程中,UIAbility实例创建完成时触发,系统会调…

Spring Boot 分片上传、断点续传、大文件上传、秒传,应有尽有

文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,…

APP需要做等保吗?

在数字化时代,APP已成为我们生活中不可或缺的一部分,它们如同无形的桥梁,连接着现实世界与虚拟世界,为我们提供了前所未有的便利。然而,随着APP的普及,其背后潜藏的安全风险也日益凸显。近年来,…

Java面向对象-Object类的toString方法、equals方法

Java面向对象-Object类的toString方法、equals方法 一、toString二、equals三、总结 一、toString Object的toString方法。 方法的原理: 现在使用toString方法的时候,打印出来的内容不友好。 现在想要知道对象的信息。 出现的问题:子类Stu…