Transformer学习路线
前排提示,文末有大模型AGI-CSDN独家资料包哦!
完全不懂transformer,最近小白来入门一下,下面就是本菜鸟学习路线。Transformer和CNN是两个分支!!因此要分开学习
Transformer是一个Seq2seq模型,而Seq2seq模型用到了self-attention机制,而self-attention机制又在Encoder、Decode中。
因此学习将从self-Attention->Seq2seq->Encoder-Decode->Transformer
1. 问题背景:
目前我们输入的都是一个向量,最后输出类别或者数值(例如一张图片分类或检测task)
假设现在输入变成一排向量,同时长度会改变,那该怎么解决呢?
第一个例子:
词汇序列转换:一个单词对应一个向量,一个句子就是一排长度不一的向量,如何把一个单词表示成一个向量呢?
有两种做法:one-hot Encoding和Word Embeding
one-hot Encoding缺点是每个词汇之间我们看不到任何联系
Word Embedding每个词向量是有语义顺序的,画出来就会是动物在一块(dog,cat,rabbit),植物在一块(tree,flower)等
第二个例子:
一段声音其实就是一排向量,我们取一段语音信号作为窗口,把其中的信息描述为一个向量(帧),滑动这个窗口就得到这段语音的所有向量,一分钟有6000个声音向量
第三个例子:
图论、知识图谱也是一排向量,社交网络的每个节点就是一个人,节点之间的关系用线连接。每一个人就是一个向量
输入可以是一段文字、语音、图,那么输出是什么?
输出分为三种:
- 一个单词/一小段语音对应一个label (下图第一行)
- 一整个句子/语音对应一个label (下图第二行)
- 输出多少由机器自己决定 (下图第三行)
第一种:一对一(Sequence Labeling)
文字处理:序列标注POS tagging,每个输入的单词都输出对应的词性
语音处理:一段声音信号里面有一串向量,每个向量对应一个音标
图像处理:在社交网络中,推荐某个用户商品(可能会买或者不买)
序列标注(Sequence Labeling)问题
每个输入的单词都输出对应的词性,但是!!!当同一个单词有不同词性时,需要考虑前后文的语义(eg:I saw a saw .我看见一把锯子)
解决方法:利用滑动窗口,每个向量查看窗口中相邻的其他向量的性质。(例如红色方框的window)
但是,如果语句一长,这种方法不能解决整条语句的分析问题,即语义分析。
这就引出了 Self-attention 技术。
类型二:多对一
语义分析:一整个句子的正面评价、负面评价。
语音识别:一段语音整体识别某人的音色。
图像:给出分子的结构,判断其亲水性。
类型三:由模型自定 (seq2seq)
不知道应该输出多少个标签,机器自行决定。
翻译:语言A到语言B,单词字符数目不同
语音识别等
2.Self-Attention
与滑动窗最大的区别就是,所有单词通过Self-Attention考虑整个句子的语义
原理:
self-attention最终想要什么?
本质问题就是给一个输入,输出能看到所有输入的样本信息,然后计算相关性(不同权重)选择自己的注意力点。
原理:输入一个矩阵I(I可能包含多个向量a1,a2,a3,a4),分别乘以Wq,Wv,Wk得到三个矩阵QKV,每个向量a1,a2,a3,a4内部对应分别做Q*K计算相关度A,然后经过softmax转为权重A’,A’乘以V计算加权和就得到最终的结果了,最终的结果是一个数字(相关性权重)。
(此处I就相当于一个句子,而a1,a2,a3,a4就相当于句子中的每个单词)
如何计算相关性?
两种做法:1.做内积(最常用) 2.Additive
3. Multi-head Self-Attention
multi-head相当于两个输入ai,aj并行处理,有点类似CNN中的feature map多通道
分完段,各自算,再汇总, head1的qkv算head1的, 头与头之间在计算相似度时互不打扰, 每个段独立算完,再聚合
Multi-head的优点就是多样性:简单讲就是多head 计算中,每个head 可能计算 关注点不一样所看的不一样
4. Positional Encoding
对于Self-attention来说,并没有序列中字符位置的信息。例如动词是不太可能出现在句首的,因此可以降低动词在句首的可能性,但是自注意力机制并没有该能力。因此需要加入 Positional Encoding 的技术来标注每个词汇在句子中的位置信息。
原理:只需要加一个ei在输入ai上
那么Positional Encoding怎么获取?
1.可以通过数据训练学习得到positional encoding,类似于训练学习词向量,goole在之后的bert中的positional encoding便是由训练得到
2.正余弦位置编码。位置编码通过使用不同频率的正弦、余弦函数生成,然后和对应的位置的词向量相加,位置向量维度必须和词向量的维度一致。
pos表示单词在句子中的绝对位置,pos=0,1,2…,例如:Jerry在"Tom chase Jerry"中的pos=2;dmodel表示词向量的维度,在这里dmodel=512;2i和2i+1表示奇偶性,i表示词向量中的第几维,例如这里dmodel=512,故i=0,1,2…255。
对比之前没有self-attention的应用
- 语音上
之前使用Window滑动窗的方式来读取整段语音,要么一段语音对应一个label,要么一整段语音对应一个label,若语音片段很长,则参数量十分巨大滑动窗的方式就不适用,因此引入Self-Attention。
将每个语音片段放入Self-Attention种来学习前后语音片段的语义
- 图像上
CNN中一张图片可看做一个很长的向量。它也可看做一组向量:一张5 ∗ 10的RGB图像可以看做5 ∗ 10的三个(通道)矩阵,把三个通道的相同位置看做一个三维向量。
- 图论GNN
自注意力机制的缺点就是计算量非常大,因此如何优化其计算量是未来研究的重点。
5. Self-Attention VS CNN
Self-Attention在全局中找到相关的pixel,就好像CNN中的窗口(reception field)是自动学出来的一样
例如:1的那个pixel产生query,其他的各个pixel产生key。在做inner-product的时候,考虑的不是一个小的范围,而是一整张图片。
self-attention是一种复杂化的CNN,在做CNN的时候是只考虑感受野红框里面的资讯,而感受野的范围和大小是由人决定的,但是self-attention由attention找到相关的pixel,就好像是感受野的范围和大小是自动被学出来的
参考paper: On the Relationship between Self-Attention and Convolution Layers
如果用不同的数据量来训练CNN和self-attention,会出现不同的结果。
数据量少用CNN,数据量多用Self-Attention
6. Self-Attention VS RNN
RNN没有办法平行处理,只能存在Memory里一步步来回传递
而Self-Attention每个向量做QKV,只需要不同向量间相互match就可以,可以平行处理四个输出
------------------------------------------下面更新Transform--------------------------------------
1.Seq2seq
Transformer 就是一个 Seq2seq (Sequence-to-sequence) 的模型
Seq2seq属于第三种输出类别:Input a seqence,output a sequence(The output length is determined by model) 输入一排向量,输出长度任意由机器自己决定
1.1 背景
第一个例子
语音识别。输入的语音信号就是一串向量,输出就是语音信号对应的文字。但是语音信号的长度和输出的文字个数并无直接联系,因此需要机器自行决定。机器翻译、语音翻译也是如此
同时,seq2seq也可以训练聊天机器人,输入一个‘Hi’,Seq2seq输出一长句‘Hello!How are you today’
各式各样的NLP问题,往往都可以看作QA问题,例如问答系统(QA),让机器读一篇文章,读入一个问题,就输出一个答案。而该问题就可以用 Seq2seq 的模型来解决:
第二个例子
语法剖析:
输入一段文字,机器要做的就是产生一个树状结构,告诉我们哪些文字或单词组合起来是名词,哪些组合是形容词等
第三个例子
多标签分类 (Multi-label Classification)
每个事物可以对应很多种类
比如输入一篇文章,机器帮你自己决定它属于多少个class(class9,class7,class13)
2. seq2seq原理(Encoder-Decoder)
一般Seq2seq会分成两部分:Encoder、Decoder
2.1 Encoder部分:
Encoder 要做的事情就是给一排向量,输出一排向量
Encode这部分可利用多种模型实现,如 CNN, RNN 等。(左上角图)
本文只讲Transformer 中的 Encoder ,Bert就是Transformer的Encoder,里面由多个Block组成进行不断输入输出一排向量(右上角图)
我自己简单概括就是:(左下,右下两张图)
输入一排向量和Positional Encoding位置信息------>送入Multi-head Attention----->输入的这排向量做self-attention(拿一个head举例)与输入做残差和Layer Norm-------->送入FC----->再将FC的输入和输出做残差和Layer Norm------>最终输出一排向量(多次重复Block就得到了输出)
整张图流程如下:图很重要!!!!!!!
在Transformer Encode里每一个Block具体步骤如下:
1.输入一排向量B后送入Self-Attention得到输出一排向量A,两者做残差A+B
2.将得到的A+B的结果做Layer Norm(LN与BN区别:BN是按维度计算,LN是按行计算)
3.将LN归一的结果送入FC层,并且也做残差,将FC做完残差的结果送入LN层,最后LN输出的结果就是最终Encode输出的结果
Tips:
1.残差结构是为了解决梯度消失问题,可以增加模型的复杂性。
2.batchnorm是对一批样本中进行归一化,而layernorm是对每一个样本进行一次归一化
3.Encoder的输入包含两个,是一个序列 + positional embedding,用正余弦函数对序列中的位置进行计算(偶数位置用正弦,奇数位置用余弦)
LN与BN:一个按行,一个按列
参考paper:为什么要用LN而不用BN?最后提出PowerNorm
PowerNorm:Rethinking BatchNormalization in Transformers
2.2 Decoder部分:
先假设Decoder是一个独立的块,研究它的输入和输出。
Decoder的输入分为两个:一个是Encoder部分的输出,另一个是begin token(类似于标志位,用one-hot表示)
输出是:对应位置的输出词的概率。
Decoder分为两种模式:Autoregression (AT) / Non-Autoregression (NAT),而Transformer中用的是Autoregression(AT), NAT部分可选择不看
1. Autoregressive(自归)
如果把decoder当成一个黑匣子,这个黑匣子先接受一个特殊符号start,把 Encoder 的输出先读进去,依次向decoder输入其中的向量,经过decoder产生一个向量,通过softmax得到一个向量的score,选取score最高的就是这个输出,再接着Decoder的输入将是自己前一个输出(有点类似RNN记住前一个信息),最终输出一个end Token终止符号
输入:一个是Encoder部分的输出,另一个是begin token
输出是:对应位置的输出词的概率。
但是当有一个文字输出错误,接下来Decoder就会用这个错误的结果【一步错步步错】:
而Teacher Forcing 最常见带来的问题就是 Exposure Bias,解决方法在第四点
2. Not-Autoregressive (NAT 非自归)
Autoregressive是一个一个输入一个一个输出
Not-Autoregressive是输入一排start,最后直接输出一整个句子
那么如何确定NAT decoder的输出长度呢?
1.可以用一个预测网络预测输出的长度,再进行句子的输出
2.也可以一直进行输出,然后通过end来把句子截断
NAT优点:并行处理(可以一起输入,然后一起进行输出),速度快;输出长度可控。
缺点:NAT的表现往往逊色于AT:多模态问题 Multi-modality.
可以认为AT和NAT在Encoder端是完全一样的,只是在Decoder端不同,AT在Decoder时通过此前所有时刻的结果来预测下一时刻的生成词,而NAT在Decoder时通过一个隐变量来生成每一时刻的结果,使得整个解码过程独立并行,关键就在于怎么定义这个隐变量。
实际上Decoder并不是一个独立的块,它是与Encoder连起来的,下面研究在Transformer中是怎么连接起来的,参考下面第二点的Cross Attention。
3. Transformer 中Encoder和 Decoder如何连接
下图就是Transformer具体结构,采用Encoder-Decoder架构
Transformer的Decoder与Encoder的不同在于两个地方:
1.Self-Attention变成了Masked Self-Attention
2.Decoder多一层Cross Attention
1.Self-Attention变成了Masked Self-Attention
普通的Self-Attention是整个一排向量送进去,输出是整个一排向量,而Masked Self-Attention输入是一个一个输进去,输出只能考虑先前输入向量,不考虑之后的,是一个一个输出的
例如,想要输出b2时,Masked Self-Attention只考虑a1,a2的输入,a3,a4在b2输出之后因此不考虑
2、Decoder多一层Cross Attention
Encoder和Decoder如何相互连接?
Cross Attention 位于Decoder内,是连接Encoder和Decoder的桥梁,它有三个输入,其中两个来自于Encoder,一个来自Decoder。
两个encoder的输出+一个decoder的输入送到Multi-head self-Attention中
Cross Attention 跨越注意力
Cross Attention 机制不是 Transformer,其先于 Transformer 出现,后来出现了 Self-attention 才有了 Transformer
Decoder这边输入Start到Masked Self-Attention中产生一个Q,这个Q与Encoder部分做self-Attention后产生的K计算相关性得到α,α再和v做点乘后得到的结果送入FC
4. 训练和推理
Transformer的Decoder需要分为_训练部分和推理部分_来讨论。
Encoder模块的执行过程相同,Encoder可以并行计算,一次性Encoding出来.
Decoder模块的执行过程不同,训练流程是一次输出b个序列中所有的单词的预测结果,而推理流程则是一次生成b个序列中一个单词的预测,需要多步来预测序列中所有的单词。
自己理解就是训练时的输入是Ground Truth,预测的输入是上一时刻的输出,训练使用 Teacher Forcing 并行训练,推理时串行
1.训练部分
Decoder在训练时会输入Groud Truth,叫做Teacher Forcing
Train类似于分类,输出类别最大的,引入交叉熵cross entropy记录预测的字和真实label
2.推理部分:
Decoder在推理时会输入上一次Decode的输出
Decoder推理不是一次把所有序列解出来的,而是一个一个解出来的,因为要用上一个位置的输出当作attention的Q
举例子:训练和推理阶段
Step 1:
初始输入: 起始符start + Positional Encoding(位置编码)
中间输入:Encoder Embedding
最终输出:产生预测“机”
Step 2:
初始输入:起始符start + “机”+ Positonal Encoding
中间输入:Encoder Embedding
最终输出:产生预测“器”
Step 3:
初始输入:起始符start + “机”+ “器”+ Positonal Encoding
中间输入:Encoder Embedding
最终输出:产生预测“学”
Step 4:
初始输入:起始符start + “机”+ “器”+ “学” +Positonal Encoding
中间输入:Encoder Embedding
最终输出:产生预测“习”
训练阶段相当于step1-4可以同时进行,因为我们知道最终输出是“机器学习”,而在推理阶段只能一步一步进行,只能根据上一步来预测下一步,因为不知道最终输出是什么
5. Tips
1.Copy Mechanism 复制机制
对很多任务而言,也许Decoder无需产生输出,也许是从输出里面“复制”一些东西出来。
例如在聊天机器人中,对于用户输入的某人名字,机器无需进行处理,直接输出即可(比如库洛洛);或者复述一段不能识别的文字;亦或是提取大量文章中的摘要
参考paper: Get To The Point: Summarization with Pointer-Generator Networks
2.Guided Attention 语音识别
常用于语音识别、语音合成
机器连读四个单词可能发音没有问题,单独读一个单词可能会产生漏读,因此就需要Guided Attention,要求机器在做Attention时是有固定方式的
例如:要求语音合成时,机器是从左向右而不是乱序的
具体做法: Monotonic Attention , Location-aware attention
3. Beam Search 束搜索
每次找分数最高的,连成的红色路径叫做Greedy Decoding
若稍微损失点最开始的输入,但最终结果是绿色路径比红色好,因此这个技术叫Beam Search
4.Exposure Bias
Teacher Forcing 最常见的问题就是 Exposure Bias
当Train时,Decoder看到Ground Truth ,而在test时,Decoder看到错误的东西,这种不一致的现象叫做 Exposure Bias
如何解决 Teacher Forcing 带来的问题?
————Scheduled Sampling
在train中加一些错误就好了,类似“加入扰动”的方式来解决——scheduled sampling(定时采样),这种方式会影响Transformer的并行化。
读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用
对于0基础小白入门:
如果你是零基础小白,想快速入门大模型是可以考虑的。
一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。
包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!
标签:输出,transformer,模型,Attention,Encoder,路线,输入,Decoder,向量 From: https://blog.csdn.net/lvaolan168/article/details/143868508