Transformer: Attention is all you need

news/2024/9/21 16:47:21/文章来源:https://www.cnblogs.com/xiaxuexiaoab/p/18396950

Transformer于2017年提出,最开始应用于NLP领域,随着Transformer的快速发展,在视觉领域中也越来越多的论文或应用用到了Transformer,这里记录一下自己学习的一些知识点。
PDF: 《Attention Is All You Need》
Code: attention-is-all-you-need-pytorch

一、前置知识

1.1 注意力机制

Transformer内部采用自注意力机制,注意力机制介绍可参考:https://www.cnblogs.com/xiaxuexiaoab/p/18302563

1.2 LayerNorm

不同于图像领域采用BatchNorm,NLP中每个样本的时序数据长度可能不一致,所以LayerNorm在文本处理中更常用,每个样本自己算均值和方差。LayerNorm可参考:https://www.cnblogs.com/xiaxuexiaoab/p/18325271

1.3 位置编码

将位置信息附加到原有词向量上,Transformer中采用的是正余弦函数计算绝对位置编码,更多的位置编码方式可以参考:https://0809zheng.github.io/2022/07/01/posencode.html

二、Transformer

首先对Transformer进行一个简单的认识,直接来一张论文原图。Transformer采用Encoder-Decoder架构,包含Input、Encoder、Decoder、Output几部分,其中Encoder由N个相同的模块按顺序组成,模块里面包含多头注意力、残差连接、LayerNorm以及前向推理等小模块;Decoder也由N个相同的模块组成,如果把中间一个红色子模块遮挡住(后续会介绍,先简单理解成一个模)就和Encoder一致了。

至此心里应该有个大体框架,接下来我们在进一步介绍Input、Encoder、Decoder、Output四个部分。

2.1 Input

原始输入的是句子或者一段语音,经过编码后得到词向量Input Embedding(可以编为OneHot编码,或者采用Word2Vec编码)。再通过位置编码得到位置向量Positional Encoding,最后将位置信息和原始词向量进行相加,实现位置信息附加到词向量上,能增加额外的位置信息,进而帮助模型更好地理解输入的顺序。

位置编码

论文中按照上式计算出绝对位置编码,其中pos表示词的索引,d表示词向量的维度,奇数位采用余弦值,偶数位采用正弦值。更多的编码方式可以参考:位置编码

两边输入的区别

左边Encoder的输入和上面说的一致,就是原始信息的词向量 + 位置编码。
右边是Outputs向右偏移作为输入是咋回事呢? 就是右边Decoder的输出依赖于前一个输出值。举个语音识别的例子应该就清楚了。

左边原始信息是一段语音(真实意思是机器学习),右边经过符号位BEGIN后预测得到第一概率最大的词为“机”,那么预测值“机”又会作为下一个预测时的输入,依此类推不断向右偏移,直到预测结束。

2.2 Encoder


论文中N设为6,也就是Encoder采用6个相同的模块,第一个模块词向量+位置编码作为输入,经过Multi—Head Attention后输出维度和输入一致,然后在把输出与输入通过残差连接在一起并对其进行LayerNorm,之后经过前向网络后再进行一次残差连接和LayerNorm,第二个模块以第一个模块的输出作为输入,依此类推,第6个模块的输出作为最终Encoder的输出。

Multi-Head Attention

Self Attention是考虑了所有输入向量的信息,其作用相当于权重的重新分配(输入向量越相关其对应的权重越大),输出向量数量和输入向量数量保持一致。可以参考self Attention

论文中采用的是多头注意力,就是几个注意力进行拼接,做的一点修改是除了一个key的维度。

其输出可以用下式表达:

Add & Norm

这里的Add是指残差连接,最先出现在ResNet,可以有效防止网络退化。

Norm是指LayerNorm

Feed Forward

有两个线性层组成,两个线性层之间加入ReLU激活函数。

2.3 Decoder


论文中N也是设为6,这里和Encoder不同的地方在于第一个子模块中多头注意力出现了Mask,第二个子模块中嵌入了Encoder的输出,第三个子模块和Encoder中一样。

Masked Multi-Head Attention

前面分析了Decoder的输入依赖于前一个节点的输出,因此这里不像Encoder那样可以看到所有输入信息,而是只能看到之前的信息,所以引入Mask来遮挡住后面的数值,即如果对第i个节点进行处理,这把第i个以后的输入全部不考虑(置为0即可)。

Encoder怎么和Decoder模块连接

第二个子模块连接了Encoder的输出,具体而言就是将Encoder的输出经过矩阵后生成相应的K和V,然后Decoder中子模块的输出作为Q,中间在按照注意力进行进行连接输出。这种也称作Cross Attention。还是以之前语音识别的例子来展示。

cross attention可以参考:Listen, attend and spell: A neural network for large vocabulary conversational speech recognition 以及Cross Attention Source of image

2.4 Output


这个就想对简单了,Decoder的输出经过一个线性层得到的特征向量再通过softmax激活函数得到输出的概率值。

三、相关细节

3.1 如何知道预测的长度

前面分析了Decoder的预测依赖于前面的输出,可以像一个序列一样一直延伸下去,那问题点在于在不知道结果的情况下如何确定输出的长度。通常有两种方式。

  • 通过网络预测一个输出长度
  • 给定一个上限值,再忽略掉END标志位之后的输出

第一种通常需要引入额外的网络对输出长度进行预测,这里还是以之前语音识别的例子讲下第二种,引入END标志位,当预测的标志位概率最大时停止。

3.2 训练和推理

主要区别在于训练时OutPuts是采用的真实结果,而推理时采用的是真实的预测值作为下一个的输入。那这就出现了一个问题:推理时不知道真实输出,训练采用真实输出,如何处理这中间的差异,换句话就是训练看到的是全对的,而预测有可能错,预测错一个对后续会有影响?

一个措施是采用Scheduled Sampling,也就是在训练的时候人为加入一些噪音。更多内容可以参考:

  • Original Scheduled Sampling
  • Scheduled Sampling for Transformer
  • Parallel Scheduled Sampling

3.3 并行化体现在哪里

采用自注意力机制相比于RNN一个优点是可以并行化处理数据,那这里并行化又如何体现了,Encoder里面一次性输入全部句子,所以不管训练还是推理都可以并行,但是在Decoder部分推理依赖于前面的输出,所以推理时Decoder是没办法并行处理的,而训练时采用正常值作为输入,借助Masked可以实现并行。

  • Encoder: 训练和推理都可以并行
  • Decoder: 训练时可以并行,推理时不能并行

3.3 位置编码还有哪些

位置编码的作用是将位置信息附加到原有词向量之上,提供模型额外的位置信息。

参考Transformer中的位置编码(Position Encoding)还有更多的位置编码方式。

四、参考资料

Self Attention
LayerNorm
位置编码
李宏毅 Transformer

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

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

相关文章

Falcon Mamba: 首个高效的无注意力机制 7B 模型

Falcon Mamba 是由阿布扎比的 Technology Innovation Institute (TII) 开发并基于 TII Falcon Mamba 7B License 1.0 的开放获取模型。该模型是开放获取的,所以任何人都可以在 Hugging Face 生态系统中 这里 使用它进行研究或应用。 在这篇博客中,我们将深入模型的设计决策、…

基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真

1.程序功能描述 奇异谱分析(Singular Spectrum Analysis,简称SSA)是一种强大的非线性和非参数时间序列分析方法。该方法基于奇异值分解(SVD)和轨迹矩阵的概念,用于提取时间序列中的趋势、周期性和噪声成分。在本课题中,通过SSA算法,从强干扰序列中提取其趋势线。…

英伟达硬解码错误汇总

1. 解码器报报CUDA_ERROR_NO_DEVICE驱动问题,确保驱动与CUDA版本兼容。CUDA是区分操作系统的。

优先级队列PriorityQueue(图文并茂)

介绍 优先级队列的作用是能保证每次取出的元素都是队列中权值最小(或最大)的。这里元素大小的评判可以通过元素本身的自然顺序(natural ordering),也可以通过构造时传入的比较器(Comparator)。 Java中PriorityQueue实现了Queue接口,不允许放入null元素;其通过堆实现,具体说…

DVPP问题汇总

1. aclrtSetDevice 使用不当导致内存泄露问题 对于Atlas 推理系列产品(Ascend 310P处理器),调用本接口会隐式创建默认Context,在标准形态下,该默认Context中包含2个Stream,1个默认Stream和1个执行内部同步的Stream。 参考网页:API参考-aclrtSetDevice此接口需与aclrtRes…

第十二讲 为什么表数据删掉一半,表文件大小不变?

第十二讲: 为什么表数据删掉一半,表文件大小不变? 简概:问题:表删掉了一半的数据,表文件的大小还是没变? ​ 经常会有同学来问我,我的数据库占用空间太大,我把一个最大的表删掉了一半的数据,怎么表文件的大小还是没变? InnoDB 的表回收 ​ 那么今天,我就和你聊聊数据…

动手学习深度学习

动手学习深度学习 特点:数学原理推理+代码实现 CH1 引言 引言: 学习到一种数学的直觉 ​​ 机器学习路线: ​​ 常见结构: ​​ ‍ 为什么要有机器学习: 机器学习是为了让机器学习到人类学不到的知识,人类学习的能力是有限的,只能通过简单的几种形式如语言,视频等来进行…

章10——面向对象编程(高级部分)——抽象类

介绍更多意义在于其设计意义。供子类参考的一个模板。 注意细节final、private、static与重写矛盾,不可与abstract共用! 补充说明 static方法可以被继承,不可以被重写,若父子方法名相同,则会隐藏derive类派生类方法,调用base类基类方法。静态方法时编译时绑定的,而方法重…

语义分块:改进 AI 信息检索

RAG 系统及其挑战 检索增强生成的流行是有充分理由的。它允许 AI 系统通过结合信息检索和语言生成来回答问题。标准的 RAG 管道通过摄取数据、检索相关信息并使用它来生成响应来实现这一点。 然而,随着数据变得越来越复杂,查询也越来越复杂,传统的 RAG 系统可能会 面临限制。…

DP优化——wqs二分

在看 wqs 二分前建议先去看另一篇博客——斜率优化,对凸包等知识点有所了解。 介绍 wqs 二分最初由王钦石在他的 2012 年国家集训队论文中提出,也叫"带权二分",或者"dp凸优化",而从 IOI 2016 的 Aliens 题目开始,这种方法开始逐步在竞赛圈中有了一定的…

一次Java性能调优实践【代码+JVM 性能提升70%】

这是我第一次对系统进行调优,涉及代码和JVM层面的调优。如果你能看到最后的话,或许会对你日常的开发有帮助,可以避免像我一样,犯一些低级别的错误。本次调优的代码是埋点系统中的报表分析功能,小公司,开发结束后,没有Code Review环节,所以下面某些问题,也许在Code Rev…

orangepi5plus上搭建ubuntu22.04环境

本文是参考orangepi5plus官方手册进行ubuntu22.04环境搭建:Orange Pi - Orangepi(官方手册下载官网)进去之后,选择ubuntu的官方镜像,点击下载出现百度网盘的下载内容,在众多版本里面我下载了下面的文件夹(ubuntu22.04) 该文件夹里面包含的后缀是.img就是ubuntu22.04的镜…