初探 transformer

news2024/11/17 21:52:37

大部分QA的问题都可以使用seq2seq来实现。或者说大多数的NLP问题都可以使用seq2seq模型来解决。

但是呢最好的办法还是对具体的问题作出特定的模型训练。

概述

Transformer就是一种seq2seq模型。

我们先看一下seq2seq这个模型的大体框架(其实就是一个编码器和一个解码器):

image-20211110011108154

编码器

我们先看编码器(并结合transformer)这个部分

image-20211110011238315

我们将这个encode进行细化,看看里面是什么样子的,下图就是encode的内部:

image-20211110011445224

可以看出encode里面是有若干个Block模块构成的,而这个模块是由transformer来构成的。

**注意:**上述Block的self-attention的实现在原始的模型不是那么简单的,而是更加复杂,实现的结果如下图所示:

image-20211110012024616

那么transformer的encode部分又可以重新定义如下(对add和norm部分作出了解释,就是上图中提到的):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g0DVomf0-1686470176975)(null)]

进步一了解这个模型上的一些小改动

image-20211110012251512

解码器

解码器主要是有两种形式,一种是Autoregressive。

Autoregressive

先放一个动画:

https://vdn3.vzuu.com/SD/cf255d34-ec82-11ea-acfd-5ab503a75443.mp4?disable_local_cache=1&auth_key=1636876035-0-0-1b8200d56431047742a6772de99b7384&f=mp4&bu=pico&expiration=1636876035&v=tx

参考: https://www.zhihu.com/question/337886108/answer/893002189

简单介绍

这里我们直接从encode的输出来看结果是什么样子的或者说如何输出结果的,这里以翻译为例:

image-20211110215515474

Begin是用于判断输入的开始的,这样可以便于定位。

接下来我们来看输出的结果是什么:

image-20211111172332837

根据不同的语言,输出的结果就是一个字点集向量(如果是中文,我们可以输出2000个常用词;如果是英文,那么输出的结果既可以是26个英文字母,也可以是常见的词汇;因此要因情况而定)。


那么接下来就来看看下一步的输出是怎么得到的——是将前面的输出作为下一步的输入(也就是当前的输入是前一步的输出):

image-20211111172612970

说到这里,这种处理方法存在一个问题:如果前一步的翻译结果是错误的,那么不就是后面的每一步都是错误的吗,也就是一步错步步错?那么这种情况该怎么解决呢?

这个问题我们先忽略掉,后面再讲这个问题


内部结构

那么我们接下来看这个Decoder的里面是什么样子的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xhyXKXRL-1686470177458)(null)]

与Encode的对比

image-20211111175849366

根据上图可以看出,Decoder和Encoder不同的地方在于多了一个阴影遮挡的地方,并且还在第一个多头注意力的地方添加了一个Masked 。那么这个是什么呢?

Masked

下面这张图是我们前面讨论的Self-attention机制的处理:

image-20211111180212444

下面是所谓的Masked Self-attention的处理方法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fIp6fTKf-1686470176987)(null)]

从图中可以看出,与Self- attention不同的地方在于,Masked Self-attention是只考虑前面的数据,而不是像Self-attention一样将全部的输入一起考虑来输出的。

讲得更具体一点,接下来进步一看看如何计算的:

这是原来的,我们需要将下面的框起来的地方给去掉:

image-20211111181027388

现在就变成了下面的这个样子:

image-20211111181103063


那么问题来了,为什么这样做?为什么要做一个Masked?

可以从Decode的实现过程来考虑分析这个问题。

因为在Decode的输出过程中,是靠着一个个的前面的输出作为下一步的输入来考虑的,这也就是说,当前的输出仅需要考虑前面的输出既可,也就不用再考虑全部的输入了。

如何停止

现在我们思考这样的问题——输出如何停止呢?

因为Self-attention是靠前面的输出来作为输入的,也就是说,如果输出不停止,输入也就不会停止,那么最后就会一直输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8OCsVnFj-1686470176965)(null)]

解决的方法就是在输出的字典里面添加一个结束字段——"Stop Token"

image-20211111181910958

通过这个Token,可以很好地解决输出的问题了,这样就可以以一定的概率来判断是否是可以停止输出了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-efOOqnv0-1686470176941)(null)]

Non-Autoregressive

先直接上图,看Autoregressive和Non-Autoregressive两个的区别:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gx2m5eqV-1686470176954)(null)]

从图上可以看出,Autoregressive是一个接着一个的输出,但是Non-Autoregressive的输出是根据全部的输入一起输出而得到最好的结果。

那么NAT如何确定输出的长度的呢?有下面两种方法:

  • 将Decoder的输入内容输入一个predictor,通过这个predictor来判断最后的输出长度;
  • 将所有的输入送入到Decoder中,然后根据输出结果里面有没有“Stop token”,如果有一个的话,就将后面的输出全部舍弃。

那么NAT的优点是什么呢?

  • 可以并行计算;
  • 可以控制输出的长度;

另外,NAT现在是一个研究的热门方向,这里就不做详细的阐述了。

编码器和解码器的连接

至此可以考虑如何连接了,先从宏观的角度上来看一下解码器和编码器的连接情况:

image-20211111191132605

从上图中可以看出,encoder的输出是在第二阶段作为了decoder的收入。

接下来具体来看是Cross attention是如何工作的:

下图是一开始的处理,先收入一个Begin Token用于输出第一个单词

image-20211111192539255

接下来是第二个输出:

image-20211111193121693

这里插一句,Cross Attention其实早在Self- attention之前就已经存在了,并且还已经实际应用在预测当中。

扩展问题

前面在提到Decoder的输出是按照前面的输出作为输入的,因此这里会出现问题就是——一步错,步步错: image-20211111235516449

处理方法就是上图中使用的方法——不仅仅给模型正确的输入,还要给错误的输入,这样可以让模型学得更好。

下面就是这个方法(Scheduled Samping)的论文依据:

image-20211111235906211

补充资料

  • 这里不得不提一下最经典,也是我目前看到最好的一篇博客,题目叫做《The Illustrated Transformer》。这样说可能大家不清楚,但是如果我放置下面这几张图,可能大家就知道很多地方都有他的身影:

​ 我个人认为这篇博客看懂了,几乎就看懂了transformer了;这里我也有一个[PPT的中文](https://pan.baidu.com/s/1LovEFd4Fswwk0jr8wIKkvA?pwd=ajh9 提取码:ajh9)内容很好地阐述了该博客的技术。

  • 还有HuggingFace的介绍——Transformers 是如何工作的里面的内容也不错,并且很简洁,内容是中文的。

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

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

相关文章

OpenGL 光照贴图

1.简介 现实世界中的物体通常并不只包含有一种材质,而是由多种材质所组成。想想一辆汽车:它的外壳非常有光泽,车窗会部分反射周围的环境,轮胎不会那么有光泽,所以它没有镜面高光,轮毂非常闪亮。 2.漫反射…

Baumer工业相机堡盟工业相机如何使用BGAPISDK对两个万兆网相机进行触发同步(C#)

Baumer工业相机堡盟工业相机如何使用BGAPISDK对两个万兆网相机进行触发同步(C#) Baumer工业相机Baumer工业相机BGAPISDK和触发同步的技术背景Baumer工业相机使用BGAPISDK进行双相机主从相机触发1.引用合适的类文件2.使用BGAPISDK设置主相机硬件触发从相机…

ReentrantLock 底层原理

目录 一、ReentrantLock入门 二、AQS原理 1、AQS介绍 2、自定义锁 三、ReentrantLock实现原理 1、非公平锁的实现 加锁流程 释放锁流程 2、可重入原理 3、可打断原理 4、公平锁原理 5、条件变量原理 await流程 signal流程 一、ReentrantLock入门 相对于synchron…

对测试外包的一些粗略看法

什么叫外包,外包最直接理解就是让别人做事;外包其中一项目的就是降低企业经营成本。 从外包的含义和目的来看,就是我们帮人做事、听人指挥,当企业经济不好的时候,我们就成为了降低成本的最佳方案。说这些是让大家比较…

高并发编程:线程池

一、概述 线程池首先有几个接口先了解第一个是Executor,第二个是ExecutorService,在后面才是线程池的一个使用ThreadPoolExecutor。 二、Executor Executor看它的名字也能理解,执行者,所以他有一个方法叫执行,那么执…

JVM原理:JVM垃圾回收算法(通俗易懂)

目录 前言正文垃圾标记算法引用类型强引用软引用弱引用虚引用 引用计数法循环引用问题 根可达性分析法虚拟机栈(栈帧的局部变量表)中的引用方法区中类静态属性引用方法区中常量引用本地方法栈(Native方法)引用 垃圾回收算法标记清…

Java语法进阶及常用技术(八)--线程池

初识线程池 什么是“池” ---- 软件中的“池”,可以理解为计划经济。 我们的资源是有限的,比如只有十个线程,我们创造十个线程的线程池,可能我们的任务非常多,如1000个任务,我们就把1000个任务放到我们十个…

shell脚本学习记录(流程控制)

前言: 在shell脚本中,()、{}、[]都是用来表示命令或者变量的范围或者属性。它们的具体区别如下: ():表示命令在子shell中运行。括号中的命令会在一个子shell中运行,并且该子shell拥符有自己的环境变量和文件描述&#…

【youcans动手学模型】DenseNet 模型-CIFAR10图像分类

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans 【youcans动手学模型】DenseNet 模型-CIFAR10图像分类 1. DenseNet 神经网络模型1.1 模型简介1.2 论文介绍1.3 改进方法与后续工作1.4 分析与讨论 2. 在 PyTorch 中定义 DenseNet 模型类2.1 DenseBlo…

性能测试实战——登录接口的性能测试(超详细总结)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 在实际业务场景中…

python:六个模块,概括全书(上万字最详细版)

拍摄于——无锡南长街 文章目录 模块一:基础知识1、python语言2、常见数字类型3、字符串4、数字类型转换5、标识符命名6、常见关键字7、运算符与表达式(1)算术运算符(2)关系运算符(3)逻辑运算符…

循序渐进,搞懂什么是动态规划

循序渐进,搞懂什么是动态规划 写在前面 温馨提示,本文的篇幅很长,需要花很长的时间阅读。如果要完全理解所有内容,还需要花更多的时间学习。如果打算认真学习动态规划,又不能一次看完,建议您收藏本文以便后…

《深入理解计算机系统》(6)存储器层次结构

1、存储技术 随机访问存储器,分为两类: RAM,同时也是易失性存储器,也分为两类: - SRAM:静态随机访问存储器,速度快,价格高。多用来作为高速缓存存储器。 - DRAM:动态随机…

WinDbg安装入坑1(C#)

由于作者水平有限,如有写得不对的地方,请指正。 使用WinDbg的过程中,坑特别的多,对版本要求比较严格,如: 1 32位应用程序导出的Dump文件要用32位的WinDbg打开,想要没有那么多的问题&#xff…

chatgpt赋能python:Python删除内容:掌握三种删除方式

Python删除内容:掌握三种删除方式 删除变量中的值 删除变量中的值是Python编程中常见的操作。Python提供了del语句用于删除变量中的值: x "Hello World" del x上述代码中,del x语句将删除变量x中的值。如果我们在执行print(x)时…

从C语言到C++_18(stack和queue的常用函数+相关练习)力扣

目录 1. stack 1.1 栈的概念 1.2 stack 的介绍和使用 2. queue 2.1 队列的概念 2.2 queue 的介绍和使用 3. 栈和队列的相关选择题 答案: 4. 栈和队列的相关OJ题 155. 最小栈 - 力扣(LeetCode) 解析代码: 剑指 Offer 3…

python学习-代码调试器

目录 为什么学习调试器Pycharm Debugger示例所用代码布局调试工具栏 Debug Bar程序控制工具栏 pdb查看源代码 l list查看当前函数源代码 ll longlist打印变量 p查看调用栈w where向上移动当前帧 u up向上移动当前帧 d down运行当前行代码,在第一个可以停止的位置停下 s step继续…

Selenium基础篇之八大元素定位方式

文章目录 前言一、如何进行元素定位?1.右击元素-检查2.F12-选择工具点击元素3.借助selenium IDE 二、八大元素定位方式1.ID1.1 方法1.2 举例1.3 代码1.4 截图 2.NAME2.1 方法2.2 举例2.3 代码2.4 截图 3.CLASS_NAME3.1 方法3.2 举例3.3 代码3.4 截图 4.TAG_NAME4.1 …

再也不用担心组件跨层级的数据共享和方法驱动了

文章目录 兄弟组件的传值和方法调用多个独立组件的数据共享和方法调用多个组件内的方法和数据互相驱动:eventBus多个组件的数据共享以及数据修改:vuex 项目中关于组件的使用经常会碰到这种情况:父子组件传和方法调用、兄弟组件的传值和方法调…

Selenium该如何实现微博自动化运营:关注、点赞、评论

目录 前言: Selenium 是什么? 一、核心代码 二、步骤分解 三、自动化运营常用工具 前言: 使用 Selenium 实现微博自动化运营,可以提高效率、减少工作量,下面讲解如何使用 Selenium 实现微博的关注、点赞和评论功…