【论文精读】Transformer:Attention Is All You Need

《动手学深度学习》关于Transformer和注意力机制的笔记

李沐《动手学深度学习》注意力机制

文章目录

  • 《动手学深度学习》关于Transformer和注意力机制的笔记
  • 一、文章概览
    • (一)摘要
    • (二)结论部分
    • (三)引言
    • (四)相关工作
  • 二、模型细节
    • (一)整体架构
    • (二)编码器和解码器块
    • (三)注意力层
    • (四)Position-wise Feed-Forward Networks层
    • (五)Embeddings and Softmax层
    • (六)Positional Encoding
  • 三、注意力机制与CNN、RNN的对比


一、文章概览

(一)摘要

序列转录模型(sequence transduction models):序列转录也就是序列到序列的生成。input一个序列,output一个序列。e.g. 机器翻译:输入一句中文,输出一句英文。

研究背景: 主流的序列转录模型一般是基于包括encoder 和decoder的 RNN 或者 CNN 架构。性能最好的模型还通过注意力机制连接编码器和解码器。

主要工作:

  • 提出了一种新的简单网络架构——Transformer
  • Transformer完全基于注意力机制,完全不需要递归和卷积。

在这里插入图片描述

(二)结论部分

  • Transformer是第一个完全基于注意力的序列转换模型,用多头自注意力取代了编码器-解码器架构中最常用的循环层。
  • 对于翻译任务,Transformer 的训练速度明显快于基于循环层或卷积层的架构。
  • 未来可以将Transformer 扩展到涉及文本以外的输入和输出模式的问题,并研究局部的、受限的注意力机制,以有效地处理图像、音频和视频等大型输入和输出。

(三)引言

在2017年时,时序模型的常用方法有RNN, LSTM, GRU。(语言模型、编码器-解码器架构)

RNN的特点:从左往右一步一步计算,对第 t 个状态 ht,由 ht-1(历史信息)和 当前词 t 计算。

RNN的缺点:

  • 难以并行,时序信息是一步一步往后传递的;
  • 过早的历史信息可能被丢掉;
  • 一个大的 ht 存历史信息。每一个 计算步都需要存储,内存开销大。

attention在RNN的应用:在这篇文章之前,attention已经被成功的用在编码器-解码器里了,主要是用在怎么把 encoder 的信息有效的传给 decoder,它允许对依赖关系进行建模,而不考虑它们在输入或输出序列中的距离。

Transformer的优点:

  • Transformer是一种避免重复的模型架构,完全依赖注意力机制来绘制输入和输出之间的全局依赖关系。
  • Transformer 可实现显着更高的并行化,并且在 8 个 P100 GPU 上进行短短 12 个小时的训练后,可以在翻译质量方面达到新的水平。

(四)相关工作

使用卷积神经网络替换循环神经网络从而减少时序计算:

  • 缺点:对于较长的序列难以建模
  • 优点:可以输出多个通道,每个通道可以识别不同的模式。

Transformer的注意力机制每一次可以看到所有的像素,一层能够看到整个序列。
Transformer 的 多头注意力机制(multi-head self-attention)模拟 CNNs 多通道输出的效果。

二、模型细节

(一)整体架构

序列模型里目前比较好的是编码器-解码器架构:

  • 编码器:将原始输入(x1, x2, … , xn)映射成 (z1, z2, …, zn)(机器学习可以理解的向量)

i.e., 一个句子有 n 个词,xt 是第 t 个词,zt 是第 t 个词的向量表示。

  • 解码器:将解码器的输出z生成一个长为 m 的序列(y1, y2, … , ym)

n和m可以一样,也可以不一样,比如说中英文互译,得到的句子不一定是相同的长度

Transformer 使用了 encoder-decoder架构,堆叠的 stacked self-attention and point-wise, fully-connected layers:

  • 左侧为编码器,右侧为解码器
  • Inputs是编码器的输入,解码器在做预测的时候是没有输入的,Outputs(Shifted right)指的是解码器在之前时刻的输出作为此时的输入,一个一个往右移。
  • Inputs ---- Input Embedding :输入经过一个 Embedding层转化成向量,得到的向量值和 Positional Encoding相加。
  • Encoder 的核心架构是N个 Transformer 的 block 叠在一起。其中Transformer 的block主要包括多头注意力机制、残差连接、normalization和前馈神经网络MLP。
  • encoder 的输出作为 decoder 的输入,decoder相对于encoder来说多了一个 Masked Multi-Head Attention
  • decoder的输出进入一个 Linear 层,做一个 softmax,得到最后的输出。

Linear + softmax: 一个标准的神经网络的做法

Transformer与标准的解码器编码器结构之间的区别:encoder、decoder 内部结构不同,encoder 的输出 如何作为 decoder 的输入有一些不一样。

在这里插入图片描述

(二)编码器和解码器块

Encoder:可以理解为6 个layer的重复,其中每个layer有 2 个 sub-layers

  • 第一个 sub-layer 是 multi-head self-attention
  • 第二个 sub-layer 是 simple, position-wise fully connected feed-forward network, 简称 MLP
  • 每个 sub-layer 的输出做 残差连接 和 LayerNorm,公式表达为LayerNorm( x + Sublayer(x) )
  • 残差联接需要输入输出维度一致,不一致需要做投影。简单起见,固定每一层的输出维度dmodel = 512

Decoder:可以理解为6 个layer的重复,其中每个layer有 3 个 sub-layers

  • 第一个 sub-layer 是 masked multi-head self-attention

带掩码 masked 的注意力机制:decoder 是 auto-regressive 自回归。当前时刻的输入是之前一些时刻的输出,做预测时,decoder 不能看到 之后时刻的输出。

  • 第二个 sub-layer 是 multi-head self-attention
  • 第三个 sub-layer 是 simple, position-wise fully connected feed-forward network, 简称 MLP
  • 每个 sub-layer 的输出做 残差连接 和 LayerNorm

(三)注意力层

注意力函数 是一个将一个 query 和一些 key - value 对映射成一个输出的函数,其中所有的 query、key、value 和 output 都是一些向量。

o u t p u t (输出) = v a l u e 的加权和 输出的维度 = v a l u e 的维度 v a l u e 的权重 = 查询 q u e r y 和对应的 k e y 的相似度 output(输出)=value的加权和\\ 输出的维度=value的维度\\ value的权重=查询 query 和对应的 key 的相似度 output(输出)=value的加权和输出的维度=value的维度value的权重=查询query和对应的key的相似度

缩放点积注意力机制:
查询 Q Q Q、键 K K K和值 V V V的缩放点积注意力:
s o f t m a x ( Q K T d k ) V softmax(\frac{QK^T}{\sqrt{d_k}})V softmax(dk QKT)V
为什么要除以 d k {\sqrt{d_k}} dk :防止softmax函数的梯度消失。

  • dk不是很大的时候,除不除以都行。
  • dk 比较大时 (2 个向量的长度比较长的时候),点积的值会比较大或者会比较小。当值比较大的时候,相对的差距会变大,导致最大值 softmax会更加靠近于1,剩下那些值就会更加靠近于0。值就会更加向两端靠拢,算梯度的时候,梯度比较小。
    在这里插入图片描述

怎么做mask:
把 t 时刻以后 Qt 和 Kt 的值换成一个很大的负数,如 1 ( − 10 ) 1 ^ (-10) 1(10),进入 softmax 后,权重为0。因此和 V 矩阵做矩阵乘法时,没看到 t 时刻以后的内容,只看 t 时刻之前的 key - value pair。

多头注意力机制:

投影其实就是一个输出维度比输入更小的线性层

原始的 value、key、query进入一个线形层,线形层把 value、key、query 投影到比较低的维度。然后再做一个 scaled dot product,执行 h 次会得到 h 个输出,把 h 个 输出向量全部合并 concat 在一起,最后做一次线性的投影 Linear,得到最终的输出。
在这里插入图片描述

为什么要做多头注意力机制:
先投影到低维,投影的 w 是可以学习的,multi-head attention 给 h 次机会去学习 不一样的投影的方法,使得在投影进去的度量空间里面能够去匹配不同模式需要的一些相似函数,然后把 h 个 heads 拼接起来,最后再做一次投影。有点像 CNN 多个输出通道的感觉。
在这里插入图片描述

Transformer在多头注意力机制的应用:

  • encoder 的注意力层:

    • 自注意力机制,key、value 和 query 其实就是一个东西
    • 不考虑 multi-head 和 有投影的情况:输出是输入的加权和,其权重来自每个向量与其它向量的相似度。
    • 考虑multi-head 和 有投影的情况:学习 h 个不一样的距离空间,使得输出变化。
  • decoder 的 masked multi-head attention层:

    • masked 体现在,看不到 t 时刻以后的输入
  • decoder 的 multi-head attention层:

    • 不再是 self-attention
    • key - value 是来自 encoder 的输出,query 是来自 decoder 里 masked multi-head attention 的输出
    • 实际上就是把编码器的输出根据我想要的东西给它拎出来

(四)Position-wise Feed-Forward Networks层

实际上就是作用在最后一个维度的 MLP,Point-wise的含义就是把一个 MLP 对每一个词 (position)作用一次,对每个词作用的是同样的 MLP。

单隐藏层的 MLP,中间 W1 扩维到4倍 2048,最后 W2 投影回到 512 维度大小,便于残差连接:
F F N = L i n e a r + R e L U + L i n e a r FFN= Linear + ReLU + Linear FFN=Linear+ReLU+Linear
在这里插入图片描述

RNN和Transformer的对比:

  • 不同点在于如何传递序列的信息:

    • RNN 是把上一个时刻的信息输出传入下一个时候做输入。
    • Transformer 通过一个 attention 层,去全局的拿到整个序列里面信息,再用 MLP 做语义的转换。
  • 相同点在于语义空间的转换及关注点

    • 都是用一个线性层 or 一个 MLP 来做语义空间的转换。
    • 关注点都是怎么有效的去使用序列的信息。

(五)Embeddings and Softmax层

embedding:将输入的一个词、词语 token 映射成 为一个长为 d 的向量,利用学习到的长为 d 的向量 来表示整个词、词语 token。

(六)Positional Encoding

attention 不会有时序信息,所以需要一个记录了时序信息的positional encoding,通过在嵌入层相加 的方式把时序信息加进数据。

三、注意力机制与CNN、RNN的对比

  • 每层计算复杂度:越低越好

    • 自注意力:O(n^2 *d) 主要是矩阵乘法,并行度高,Q(n * d) K(m * d)=Q * KT (n * m),因为自注意力的query、key 相同(m = n), 复杂度为O(n^2 * d)
    • 循环层:序列长度为 n ,一个 dense layer * 一个长为 d 的输入,然后要做 N 次,所以是 N 乘 D 平方
    • 卷积层:k 比较小,CNN与RNN的复杂度差不多
    • 严格的自注意力:query 只跟 最近的 r 个邻居计算
  • 序列运算量:(下一步计算,必须要等前面多少步计算完成) 越少,并行度越高

    • 自注意力:O(1),矩阵乘法的并行度高
    • 循环层:一步一步做运算,当前时刻的词 需要等待前面所有时刻计算完成,O(n),并行上是比较吃亏的
    • 卷积层:并行度高
  • maximum path length:(一个信息从一个数据点走到另外一个数据点要走多少步)越短越好

    • 自注意力:O(1),一个 query 和所有的 key 做运算。输出是所有 value 的加权和。任何 query 和任意一个很远的 key-value pair,只要一次就能过来

在这里插入图片描述

参考:Transformer论文逐段精读【论文精读】

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

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

相关文章

java基础2-常用API

常用API Math类 帮助我们进行数学计算的工具类。 里面的方法都是静态的。 3.常见方法如下: abs:获取绝对值 absExact:获取绝对值 ceil:向上取整 floor:向下取整 round:四舍五入 max:获取最大值 …

第十四届蓝桥杯蜗牛

蜗牛 线性dp 目录 蜗牛 线性dp 先求到达竹竿底部的状态转移方程 求蜗牛到达第i根竹竿的传送门入口的最短时间​编辑 题目链接:蓝桥杯2023年第十四届省赛真题-蜗牛 - C语言网 关键在于建立数组将竹竿上的每个状态量表示出来,并分析出状态转移方程 in…

游泳防水耳机排名,高性价比国际游泳耳机品牌排行榜前十名

随着科技的飞速发展,运动游泳耳机已经成为当代运动时尚和游泳爱好者的必备装备之一。在游泳训练或是户外运动时,一款高性价比的游泳耳机不仅能带给我们高品质的音乐体验,还能有效防水防汗,陪伴我们享受运动带来的乐趣。为了帮助大…

视频素材网站哪个好?推荐几个高清无水印的短视频素材网

小伙伴们,如果你也是短视频的狂热爱好者,想要制作出优质满分的短视频作品,但苦于不知道从哪儿搞来那些高清无水印的素材,那今天你就来对地方啦!我这里有几个绝佳的素材网站推荐给你,让你的创作源源不断。 …

Kamailio的SIP服务的性能

官方的性能报告: Kamailio (OpenSER) 1.2.0 - Transaction Module and User Location Performance Tests 如下的提取的性能参数也是基于官方的性能报告,信令走的UDP,作为做系统方案的参照,Kamailio的性能还是非常,非常…

代码学习记录18

随想录日记part18 t i m e : time: time: 2024.03.13 主要内容:今天的主要内容是二叉树的第七部分,主要涉及二叉搜索树的最近公共祖先 ;二叉搜索树的最近公共祖先;删除二叉搜索树中的节点 。 23…

Java Lambda和方法引用

一、Lambda Lambda表达式,即函数式编程或者匿名函数,Java是从Java8开始支持的,这个概念并不是Java特有的,很多语言(比如JS)都有这个概念,它允许将一系列行为封装后作为参数传递,并可…

JOSEF约瑟 JY8-32B无辅源静态电压继电器整定范围15-130VAC过电压

JY-11电压继电器;JY-11A电压继电器; JY-11B电压继电器;JY-12电压继电器; JY-12A电压继电器;JY-12B电压继电器; JY-21电压继电器;JY-21A电压继电器; JY-21B电压继电器&#xff1b…

[MYSQL数据库]--表内操作(CURD)

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、表的 Cre…

「哈哥赠书活动 - 50期」-『AI赋能写作:AI大模型高效写作一本通』

⭐️ 赠书 - 《AI赋能写作:AI大模型高效写作一本通》 ⭐️ 内容简介 本书以ChatGPT为科技行业带来的颠覆性革新为起点,深入探讨了人工智能大模型如何为我们的创作提供强大支持。本书旨在帮助创作者更好地理解AI的价值,并充分利用其能力提升写…

ARM 汇编指令:(五)CMP指令

目录 1.CMP比较指令 2.指令条件码 cond 1.CMP比较指令 CMP指令是计算机指令集中的一种比较指令,用于比较两个操作数的大小关系或相等性,并根据比较结果设置或更新条件码寄存器(或程序状态字)的标志位。 指令格式:C…

Redis实现计数统计

介绍 计数器大量应用于互联网上大大小小的项目,你可以在很多场景都能找到计数器的应用范畴,单纯以技术派项目为例,也有相当多的地方会有计数相关的诉求,比如 文章带赞数 收藏数 评论数 用户粉丝数 ...... 技术派中有两种查询…