B站李沐讲论文笔记Transformer
文章目录
- 理论部分:
- 摘要
- 引言
- 背景
- 模型架构
- 编码器解码器的堆叠
- 注意力
- 缩放点乘注意力
- 多头注意力
- 我们模型中注意力的应用
- 位置前馈网络
- 嵌入层和softmax
- 位置编码
- 为什么是自注意力呢
- 训练
- 结果
- 结论
- Question:
- rnn 如何时序处理:
- 这样处理带来问题:
- 本文如何解决传统rnn的重点问题的
- 卷积相对于attention的优劣
- 什么是解码器的自回归
- 为什么多头注意力并没有增加参数:
- 注意力过程是什么
- Transformer为何使用多头注意力机制?(为什么不使用一个头)
- Transformer为什么Q和K使用不同的权重矩阵生成,为何不能使用同一个值进行自身的点乘? (注意和第一个问题的区别)
- 为什么自己乘得到的矩阵会对角化
- 动手实现
研一学生笔记,若有看官,笔下留情
作者很多,且,均贡献,顺序随机,再次感叹,同行者的重要性,并且大家都很不计较的样子~nice!
Ashish Vaswani∗
Noam Shazeer∗
Niki Parmar∗
Jakob Uszkoreit∗
Llion Jones∗
Aidan N. Gomez∗ †
Łukasz Kaiser∗
Illia Polosukhin∗ ‡
理论部分:
逐段翻译+感想
摘要
如今,主要的序列转录模型是基于复杂的循环或者卷积神经网络,包括一个编码器和一个解码器,表现性能最好的模型通过注意力机制连接编码器和解码器。(1.论文摘要体现对本领域的了解程度,第一句话介绍了本领域目前情况,不得不说,22年回头看,非常精准。2.序列转录其实就是seqtoseq啦)我们提出一个叫Transformer的简单架构,他完全基于注意力机制,完全省去了循环和卷积( simple is good)实验在两个机器翻译的任务上,结果表明,这些模型在质量,并行化方面更胜一筹,并且要求更少的训练时间。(摘要第二句,我们做的是什么,他的优点是什么)我们的模型取得了balabala的成绩,超过了现有最佳结果,包括集成学习,提高了 2个 BLEU(一骑绝尘的SOTA了666) 在2014年的英法翻译任务上,8块GPU训练3.5天,得到了最先进的评分41.8,(摘要第三部分,我们的瞩目成绩)这仅仅是文献中最好模型训练代价的一小部分(笑死,这种写作风格真的很搞笑哎,os:没有内涵的意思,只是在朴实无华的列举我的强处==!)通过在大量和有限的训练数据上训练,我们得到Transformer很容易应用到其他任务(当真是一字千金了,没有一个废话,确实,后面还应用到视觉,video等领域。)
引言
循环神经网络,长短期记忆,和带有控制门的循环神经网络,事实上已经在序列模型和转录问题上建立了最优方法,像语言模型和机器翻译,从这以后,许多努力继续推动着循环神经网络和编码解码架构的边界。
循环神经网络通常沿着输入输出序列的典型位置计算因子,在计算过程校准位置,他们生成一个隐藏状态的序列ht,上一个隐藏层ht-1,和输入位置t,这种固定的序列自然除去了训练数据内的并行化,在较长的序列中很重要,因为内存不够限制了样本之间的批处理。近期的工作通过分解的技巧和算力增强在计算效率上取得了至关重要的进步,同时,算力增强也提高了模型表现。然而,序列计算的基础限制仍然存在。
注意力机制已经成为各种任务中,序列模型和转录模型不可分割的一部分,他允许对依赖部分建模,而不用考虑他们输入输出的距离。处理少数情况意外,注意力机制和循环神经网络一起使用。
我们提出了Transformer,一种规避循环神经网络的模型架构,而是完全依赖于注意机制来绘制输入和输出之间的全局依赖关系。Transformer允许明显更高的并行化,并且在8个P100 gpu上训练12小时后,在翻译质量方面可以最优水平。
背景
减少序列计算的目标也构成了扩展神经GPU的基础(??啥意思)ByteNet等使用循环神经网络作为基础构建块,并行计算所有输入输出位置的隐藏表示,在这些模型中,操作的数量要求与两个输入输出位置的信号相关,随着位置距离增长而增长。ConvS2S是线性增长,ByteNet对数增长。这使学学习远距离的依赖变得困难,在transformer中这被减少到了常量数值的操作数量,尽管,由于平均注意力加权位置而以降低有效分辨率为代价,我们使用多头注意力机制来抵消达到这种效果。(我们研究了像cnn一样的多输出,名为多头注意力,来抵消了这种由于平均注意力造成的低分辨率的影响)
自注意力机制有时候称为intra-attention 是一个联系一个序列不同位置的注意力机制为了计算得到一个编码来代表这个序列,自注意力机制已经在balabal领域应用的非常成功。
端到端内存网络是在一个循环注意力机制上建立的,而不是循环对齐序列,并且已经被证实在简单语言问题回答和语言模型任务上面表现良好。
据我们所知,然而,transformer是第一个转录模型完全依赖自注意力机制来计算他的输入输出表示,而不是使用序列对齐循环或者卷积。
模型架构
一个很好的神经序列转录模型有一个编码解码架构,本模型中编码将一个符号表示x的输入序列映射到连续表示z,拿到z之后,解码器就一次生成一个输出序列的符号,模型的每一步是自回归,当生成下一个单词的时候把之前生成的符号作为额外的输入。(这里其实就在再讲模型架构,明白模型的不用看文字。本句说明了,解码器是有额外输入的,也就是解码器模型底部的outputs,也是QKV中的V)
transformer遵循这种使用自关注和按点堆叠的大体架构
(李沐:Encoder就俩超参数:N和d,n是多少个相同层堆叠,d是输入维度。这种设计直接影响了后面各种基于Transformer的模型设计,比如BERT,GPT等等,都主要调节这两个参数。)
拜托,这里有个地方写错了,糟糕。他不是仿rnn,它摒弃的就是rnn。他是觉得cnn的多输出好,要向cnn看齐。所以图片中应该标记,多头是仿rnn的多输出。sorry~~
编码器解码器的堆叠
编码器:是由6个完全相同是层级堆叠而成,每一层有两个子层,第一层是一个多头自注意力机制,第二层是一个简单的位置技巧的全连接前馈神经网络。我们在这两个子层中使用了残差链接,随后就是层级的归一化。所以,每一个子层的输出是LayerNorm(x + Sublayer(x)),Sublayer(x)是子层他自己的实现函数。为了使残差容易,所有子层,包括embedding层,都生成维度dmodel = 512的输出。
解码器: 也一样由6个相同层级堆叠而成,除了像编码器中每个子层外,解码器还多第三个子层,他对解码器堆栈的输出执行多头注意力机制。和编码器一样,我们在每一个子层上实施的残差链接,之后就是层级归一化,在解码器堆栈中我们修改了子层自注意力机制,以防止位置参加到后续的位置。(啊??嘛呀??)这就是掩码,结合输出嵌入层偏移一个位置的事实,确保了对位置i的预测,仅仅由已知的比i少的输出(啊,,,我知道了就是掩码嘛,解码器的输入比解码器的输出少一个单词,因为掩码保证了预测新值仅仅取决于之前生成的单词,假若没有掩码机制,预测新单词取决于整句话。如图)
注意力
注意力函数可以被形容为,映射一个查询和key-value键值对到一个输出,query, keys, values, and output都是向量,输出按照这些值的权重加和计算的,其中,分配给每个值的权重是通过用相关ket查询的兼容性的函数计算的(再说嘛呀??)
缩放点乘注意力
如上图所示,输入由QKV组成,维度为dk dv,我们把查询单词和所有单词点乘(计算相似度),每个都除以根号dk,并且应用一个softmax来获得每个值的权重(其实就是这个公式啦)
事实上,我们同时地在一组查询集合上计算这个注意力函数,并把它塞到矩阵Q里,keys 和values放在KV矩阵中。
这两个最常用的注意力函数是额外注意力,点乘和我们的算法一样,除了缩放因子1/√dk ,额外注意力使用一个隐藏层的前馈神经网络计算兼容性函数(啥呀啥呀,,,)虽然这两种方法在理论上相似复杂度,但点乘更快更有效,因为,矩阵点乘可以使用高度优化好的矩阵乘法来实现。
然而,对于维度比较小的时候两种机制相似,(阿西,我好像知道他在说什么了,就是比较了两种注意力,他说他这个在维度大的时候更快更有效)对于维度较大的时候,在不使用scale的情况下,额外注意力表现优于点乘, 我们猜测,对于较大的维度,点积越来越大,使得softmax函数到一个极小梯度的地步,为了抵消这种影响,我们将点积乘以1/√dk。(啊,yaoximadei,,扫噶,他是说,scale在dk较大的时候很必要,因为点积越来越大,是得得到的词向量梯度很小,为什么会无法优化呢,因为当点积越来越大的时候,词向量编码空间越来越大,就像one-hot一样,词与词之间的关联性很小,因为编码范围太大,为了解决这个问题,加一个缩放。)
(有点乱,总结一下这一段,首先他讲了他的Scaled Dot-Product Attention计算方法。之后讲是如何选择这个方法的,因为当下最流行的两种注意力一个是additive attention另一个是 dot-product (multi-plicative) attention,后者呢和我们的很相似,除了少一个缩放,并且,这两种流行的注意力机制,点乘又快又好,因为有实现好的高效矩阵乘法代码,但是呢,维度高的时候,附加注意力优于点积,为了解决这个问题,我们在点积加了缩放,得到缩放点积注意力-Scaled Dot-Product Attention,他,又快,又方便有效,还解决了仅点积的梯度下降问题。)
多头注意力
我们发现,分批次的用不同的学习到的线性映射,将queries, keys and values成线性的h次投影到dk, dk and dv是有益的,而不是在queries, keys and values上执行单一的注意力机制。在每一个queries, keys and values投影版本上,我们并行执行注意力机制,生成dv维度的输出,这个结果将被连接起来并进行再次投影以产生最终值。
多头注意使模型能够共同关注来自不同位置的不同表示子空间的信息,如果只有一个注意力头,平均来说,会抑制这一点。
投影是参数矩阵, W Qi ∈ Rdmodel×dk, W Ki ∈ Rdmodel×dk, W Vi ∈ Rdmodel×dv and W O ∈ Rhdv×dmodel.
我们使用8平行注意力或者头部,对于每一个,使用dk = dv = dmodel/h = 6464维,由于每个头的维数减小,总的计算代价与全维的单头注意相似。(why?)
暂时理解TODO:多头的权重矩阵是原词向量矩阵/h得到,也就是他本就把词向量分成了h部分去学习各自的权重矩阵
我们模型中注意力的应用
用三种方法使用多头注意力机制
- 在编码解码注意力层,Q来自上一步的的解码层输出,并且,注意力K和V来自编码器的输出,这使得每一个解码器注意输入序列的全局位置。这种方法仿造了seqtoseq模型中典型的编码解码注意力机制。
- 编码器包含自注意力层。在自注意力层QKV同源(都是seq序列本身编码的空间转换),在本案例中,是编码器之前层级的输出。每个编码器的位置可以注意到之前编码器层级的所有位置
- 相似的,解码器中的自注意力层允许每个位置注意到解码器所有位置直到包括这个位置,We need to prevent leftward information flow in the decoder to preserve the auto-regressive property我们需要防止信息在解码器中向左流动,以保持自回归特性,(其实就是不能拿未生成的词预测正在生成的词)我们通过在缩放点积自注意力中掩盖softmax输入中对应非法连接来实现,置为-无穷。
位置前馈网络
为了观察到子层,我们的编码解码每个层级包含一个全连接前馈神经网络,这个网络独自并且相同的应用在每个位置。这包含了两个线性变换,中间有一个relu激活函数。
尽管这种线性变换在不同位置是相同的,他们层到层是不同的参数,另一种解释这个的原因就是因为两个卷积有相同的大小为1的卷积核,输入和输出维度d都是512,并且中间层有dff为2048
嵌入层和softmax
与其他序列转录模型相似的是,我们使用学习embedding来转换输入和输出的token到有d维度的向量,我们也使用常用的线性变换和softmax函数老将解码器的输出转换为预测下一个token的概率,在我们的模型中,我们在两个embedding层级和预softmax线性转换层中共享相同的权重矩阵。在embedding层中,我们乘以他的权重根号下dmodel
位置编码
为什么是自注意力呢
训练
结果
结论
Question:
以下问题仅是自己在理论层面的理解,不知道对不对,其实我也不是很懂,或者说,在我代码实现他之前可能懂不到真正的原理,但,理解嘛,总要有个过程,浅层不理解深层代码无法实现,在修正中前进,我是允许自己有这个过程的。若有错误,请指出,感谢帮助。
rnn 如何时序处理:
前面的单词记为隐藏状态ht-1,当下单词记为ht,当下单词靠ht-1和ht共同决定,所以rnn能够有效处理时序信息。
这样处理带来问题:
因为是串行的,难以并行,所以无法并发,而训练数据巨大,也无法有效利用当下GPU并发资源。
会丢失之前的信息,或者做一个较大的ht来解决,导致内存开销太大
本文如何解决传统rnn的重点问题的
纯用attention,实现并行
卷积相对于attention的优劣
卷积的视野比较小,需要多层卷积才能观察到两个相距比较远的像素块,但attention一下就能看到所有序列。但卷积有多输出通道,每个输出通道在识别不同模式(也就是从不同角度看事情,类似于ELMOseq to seq ,多输出,解决了一个单词的单词,句法,语义特征)
什么是解码器的自回归
过去时刻的输入为当前时刻的输入,在翻译t个词的时候拿到t1到t-1个词。与编码器不同,编码器能看到整个句子。
为什么多头注意力并没有增加参数:
由原文得,词向量在输入给多头的时候做了d/L维度的缩减,输给多头相当于*L,最后是多头相加,相对于参数不变
注意力过程是什么
这个图画很清楚了
Transformer为何使用多头注意力机制?(为什么不使用一个头)
举个例子,我有一个苹果——toEnglishis——i have an apple
但是,其实我想表达的是我有一个mac,你以为这里的mac是笔记本吗,漏漏漏,我想说的是我有一个mac口红,当然,也可以是我有一个麦当劳的big mac汉堡包。yeah~,so,单词和语义是两个层面,一个头提取的特征方面比较单一,多头中,每个头是一套WQ,WK,WV矩阵,可以提取多通道,多模态的信息,使提取到的词向量更能代表人类理解的单词,更有泛化能力。
Transformer为什么Q和K使用不同的权重矩阵生成,为何不能使用同一个值进行自身的点乘? (注意和第一个问题的区别)
这也很好回答,啊,,总会为简单的事情感到不安,难道我理解错啦?不管了,先记录下来。yeah~
为什么,因为生成的QK不同啊当然是,为什么不能用自身相乘呢,因为他们相同啊!。。。啊。shift。。。。不要骂不要骂,确实如此,hold on听我说。经过上面的问题“注意力过程是什么”我们得到,第一步的点乘目的实在计算相似度,so,sooooo,他要是一样的矩阵,相似度会对角化的!并不能很好的体现实际语义的相似度。在解释一下为什么会对角化 ,,算了,写不开了,咱们下一个问题回答这个问题,字太多说明概括能力差,(但其实是我老爱罗里吧嗦讲废话,没事没事,问题不大,废话太多了,重点加粗一下下,咱们继续)
为什么自己乘得到的矩阵会对角化
一开始单词的输入是one-hot编码,比如我有一个苹果,我[1,0,0,0,0,0]有[0,1,0,0,0,0],他们相乘,得到6*6矩阵,只有(1,1)(2,2)位置是1,其他都是0,只能体现“我”“我”相似,“有”“有”相似,但实际上,“我”和“有”两个单词是有关系,但(1,2)(2,1)位置都是0。即使后来词向量没有这么简单,但同理的,如果K自乘K,也是如此,只能表达单一空间的相似度,实际上transformer咱attention之前做了位置编码,对每个词向量映射到了不同空间维度,例如
这样QK就不同了,Q成了紫色,K成了黄色,这样得到的词向量再去点乘,就不会出现太多0和对象化情况了(非0,就能代表两个词语之间的关系了)
3.Transformer计算attention的时候为何选择点乘而不是加法?两者计算复杂度和效果上有什么区别?
4.为什么在进行softmax之前需要对attention进行scaled(为什么除以dk的平方根),并使用公式推导进行讲解
5.在计算attention score的时候如何对padding做mask操作?
6.为什么在进行多头注意力的时候需要对每个head进行降维?(可以参考上面一个问题)
7.大概讲一下Transformer的Encoder模块?
8.为何在获取输入词向量之后需要对矩阵乘以embedding size的开方?意义是什么?
9.简单介绍一下Transformer的位置编码?有什么意义和优缺点?
10.你还了解哪些关于位置编码的技术,各自的优缺点是什么?
11.简单讲一下Transformer中的残差结构以及意义。
12.为什么transformer块使用LayerNorm而不是BatchNorm?LayerNorm 在Transformer的位置是哪里?
13.简答讲一下BatchNorm技术,以及它的优缺点。
14.简单描述一下Transformer中的前馈神经网络?使用了什么激活函数?相关优缺点?
15.Encoder端和Decoder端是如何进行交互的?(在这里可以问一下关于seq2seq的attention知识)
16.Decoder阶段的多头自注意力和encoder的多头自注意力有什么区别?(为什么需要decoder自注意力需要进行 sequence mask)
17.Transformer的并行化提现在哪个地方?Decoder端可以做并行化吗?
19.Transformer训练的时候学习率是如何设定的?Dropout是如何设定的,位置在哪里?Dropout 在测试的需要有什么需要注意的吗?
20解码端的残差结构有没有把后续未被看见的mask信息添加进来,造成信息的泄露。
参考)https://zhuanlan.zhihu.com/p/496012402?utm_medium=social&utm_oi=629375409599549440
动手实现
B站李沐讲论文笔记Transformer相关推荐
- 李沐读论文笔记--大模型时代下做科研的四个思路
大模型时代下做科研的四个思路 0. 视频来源: 1. 提高效率(更快更小) 1.1 PEFT介绍(parameter efficient fine tuning) 1.2 作者的方法 1.3 AIM效 ...
- 【动手学深度学习v2李沐】学习笔记07:权重衰退、正则化
前文回顾:模型选择.欠拟合和过拟合 文章目录 一.权重衰退 1.1 硬性限制 1.2 柔性限制(正则化) 1.3 参数更新法则 1.4 总结 二.代码实现 2.1 从零开始实现 2.1.1 人工数据集 ...
- B站李永乐讲解傅里叶变换--笔记
笔记目录 引言 一.变换 (一)举例(图像<---->坐标) (二)标准正交基 二.傅里叶变换 (一)傅里叶级数 (二)连续傅里叶变换 (三)应用 三.总结 四.参考链接 引言 为什么不同 ...
- 李沐精读论文:ViT 《An Image Is Worth 16x16 Words: Transformers For Image Recognition At Scale》
视频:ViT论文逐段精读[论文精读]_哔哩哔哩_bilibili 代码:论文源码 使用pytorch搭建Vision Transformer(vit)模型 vision_transforme · WZ ...
- 【深度学习】ResNet残差网络 ResidualBlock残差块实现(pytorch) | 跟着李沐学AI笔记 | ResNet18进行猫狗分类
文章目录 前言 一.卷积的相关计算公式(复习) 二.残差块ResidualBlock复现(pytorch) 三.残差网络ResNet18复现(pytorch) 四.直接调用方法 五.具体实践(ResN ...
- 线性回归原理(李沐老师学习笔记)
目录 1 线性回归的定义 1.1 线性回归的基本元素 1.1.1 线性模型 1.1.2 损失函数 1.1.3 为什么传统线性回归解不能应用于深度学习 1.1.4 随机梯度下降 2 自动求导 2.1 ...
- 李沐精读论文:MAE 《Masked Autoencoders Are Scalable Vision Learners》
论文:Masked Autoencoders Are Scalable Vision Learners 别再无聊地吹捧了,一起来动手实现 MAE(Masked Autoencoders Are Sca ...
- 【机器学习】《动手学深度学习 PyTorch版》李沐深度学习笔记(Alexnet)
AlexNet 一.alexnet与lenet的区别 二.主要区别 (1)激活函数从sigmoid变成ReLu(缓解梯度消失) (2)隐层全连接层后加入了丢弃层 (3)数据增强(图像的随机翻转) 三. ...
- AI大神李沐B站走红!连博导们都在追更,还亲自带你逐段读懂论文,网友:带B站研究生吧...
明敏 梦晨 发自 凹非寺 量子位 报道 | 公众号 QbitAI 什么样的B站Up主,让AI专业的导师们纷纷推荐给学生看,甚至导师自己也追更? 又是什么样的Up主,让网友直呼"简直是做慈善& ...
- 李沐论文精读系列一: ResNet、Transformer、GAN、BERT
文章目录 一. ResNet 1.0 摘要,论文导读 1.1 导论 1.1.1 为什么提出残差结构? 1.1.2 实验验证 1.2 相关工作 1.3 实验部分 1.3.1 不同配置的ResNet结构 ...
最新文章
- Awk中调用shell命令
- Guava关于JAVA中系统组件之间交互通讯(非线程之间通讯)
- OC的项目网址(自己编写的项目)
- php smarty安装,【php】smarty安装
- Dynamic Performance Tables not accessible,Automatic Statistics...
- python对大小写敏感吗_python大小写不敏感吗
- shell脚本的学习(二)
- 接收二进制数据_漫话TCP/IP:数据链路层-以太网(1)
- 什么时候用DFS,什么时候用BFS?(DFS和BFS的特点和异同)
- 消费者原理分析-RocketMQ知识体系4
- 一种可以穿透还原卡和还原软件的代码(转)
- gd32f450 linux,GD32F450开发板初体验
- QThread 应用浅析
- 风控建模十:传统建模方法存在的问题探讨及改进方法探索
- 学习人工智能导论(3)
- itpt_TCPL 第二章:类型、运算符以及表达式
- Paul叔纯正美式发音②~发音技巧(二)
- layui向body添加html_layui使用教程 html引入layui教程-layui下载
- cad调了比例因子没反应_为什么你总混淆各种CAD命令?
- 【ospf的三类LSA sum-net】(真假ABR、区域间防环机制、vlink)