transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

Transformer学习路线

完全不懂transformer,最近小白来入门一下,下面就是本菜鸟学习路线。Transformer和CNN是两个分支!!因此要分开学习
Transformer是一个Seq2seq模型,而Seq2seq模型用到了self-attention机制,而self-attention机制又在Encoder、Decode中。
因此学习将从self-Attention->Seq2seq->Encoder-Decode->Transformer

1. 问题背景:

目前我们输入的都是一个向量,最后输出类别或者数值(例如一张图片分类或检测task)
假设现在输入变成一排向量,同时长度会改变,那该怎么解决呢?
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

第一个例子:
词汇序列转换:一个单词对应一个向量,一个句子就是一排长度不一的向量,如何把一个单词表示成一个向量呢?
有两种做法:one-hot Encoding和Word Embeding
one-hot Encoding缺点是每个词汇之间我们看不到任何联系
Word Embedding每个词向量是有语义顺序的,画出来就会是动物在一块(dog,cat,rabbit),植物在一块(tree,flower)等
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

第二个例子:
一段声音其实就是一排向量,我们取一段语音信号作为窗口,把其中的信息描述为一个向量(帧),滑动这个窗口就得到这段语音的所有向量,一分钟有6000个声音向量
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

第三个例子:
图论、知识图谱也是一排向量,社交网络的每个节点就是一个人,节点之间的关系用线连接。每一个人就是一个向量
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

输入可以是一段文字、语音、图,那么输出是什么?

输出分为三种:

  • 一个单词/一小段语音对应一个label (下图第一行)
  • 一整个句子/语音对应一个label (下图第二行)
  • 输出多少由机器自己决定 (下图第三行)
    transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

第一种:一对一(Sequence Labeling)

transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder
文字处理:序列标注POS tagging,每个输入的单词都输出对应的词性
语音处理:一段声音信号里面有一串向量,每个向量对应一个音标
图像处理:在社交网络中,推荐某个用户商品(可能会买或者不买)

序列标注(Sequence Labeling)问题

每个输入的单词都输出对应的词性,但是!!!当同一个单词有不同词性时,需要考虑前后文的语义(eg:I saw a saw .我看见一把锯子)
解决方法:利用滑动窗口,每个向量查看窗口中相邻的其他向量的性质。(例如红色方框的window)
但是,如果语句一长,这种方法不能解决整条语句的分析问题,即语义分析。
这就引出了 Self-attention 技术。
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

类型二:多对一

transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder
语义分析:一整个句子的正面评价、负面评价。
语音识别:一段语音整体识别某人的音色。
图像:给出分子的结构,判断其亲水性。

类型三:由模型自定 (seq2seq)

不知道应该输出多少个标签,机器自行决定。
翻译:语言A到语言B,单词字符数目不同
语音识别等

2.Self-Attention

与滑动窗最大的区别就是,所有单词通过Self-Attention考虑整个句子的语义
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

原理:

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就相当于句子中的每个单词)
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

具体步骤参考:self-attention

如何计算相关性?
两种做法:1.做内积(最常用) 2.Additive
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

数学推导:动手推导Self-Attention

3. Multi-head Self-Attention

multi-head相当于两个输入ai,aj并行处理,有点类似CNN中的feature map多通道

分完段,各自算,再汇总, head1的qkv算head1的, 头与头之间在计算相似度时互不打扰, 每个段独立算完,再聚合

Multi-head的优点就是多样性:简单讲就是多head 计算中,每个head 可能计算 关注点不一样所看的不一样
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

4. Positional Encoding

对于Self-attention来说,并没有序列中字符位置的信息。例如动词是不太可能出现在句首的,因此可以降低动词在句首的可能性,但是自注意力机制并没有该能力。因此需要加入 Positional Encoding 的技术来标注每个词汇在句子中的位置信息。
原理:只需要加一个ei在输入ai上
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder
那么Positional Encoding怎么获取?
1.可以通过数据训练学习得到positional encoding,类似于训练学习词向量,goole在之后的bert中的positional encoding便是由训练得到
2.正余弦位置编码。位置编码通过使用不同频率的正弦、余弦函数生成,然后和对应的位置的词向量相加,位置向量维度必须和词向量的维度一致。
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder
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种来学习前后语音片段的语义38e48eba9154f2af7632f62.png)

– 图像上

CNN中一张图片可看做一个很长的向量。它也可看做一组向量:一张5 ∗ 10的RGB图像可以看做5 ∗ 10的三个(通道)矩阵,把三个通道的相同位置看做一个三维向量。
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder
– 图论GNN
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

自注意力机制的缺点就是计算量非常大,因此如何优化其计算量是未来研究的重点。

5. Self-Attention VS CNN

Self-Attention在全局中找到相关的pixel,就好像CNN中的窗口(reception field)是自动学出来的一样

例如:1的那个pixel产生query,其他的各个pixel产生key。在做inner-product的时候,考虑的不是一个小的范围,而是一整张图片。
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

self-attention是一种复杂化的CNN,在做CNN的时候是只考虑感受野红框里面的资讯,而感受野的范围和大小是由人决定的,但是self-attention由attention找到相关的pixel,就好像是感受野的范围和大小是自动被学出来的
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder
参考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就可以,可以平行处理四个输出
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

 
 
 
 
 

——————————————下面更新Transform————————————–

1.Seq2seq

Transformer 就是一个 Seq2seq (Sequence-to-sequence) 的模型

Seq2seq属于第三种输出类别:Input a seqence,output a sequence(The output length is determined by model) 输入一排向量,输出长度任意由机器自己决定

1.1 背景

第一个例子
语音识别。输入的语音信号就是一串向量,输出就是语音信号对应的文字。但是语音信号的长度和输出的文字个数并无直接联系,因此需要机器自行决定。机器翻译、语音翻译也是如此
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder
同时,seq2seq也可以训练聊天机器人,输入一个‘Hi’,Seq2seq输出一长句‘Hello!How are you today’
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder各式各样的NLP问题,往往都可以看作QA问题,例如问答系统(QA),让机器读一篇文章,读入一个问题,就输出一个答案。而该问题就可以用 Seq2seq 的模型来解决:
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

第二个例子
语法剖析:
输入一段文字,机器要做的就是产生一个树状结构,告诉我们哪些文字或单词组合起来是名词,哪些组合是形容词等
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

第三个例子
多标签分类 (Multi-label Classification)
每个事物可以对应很多种类
比如输入一篇文章,机器帮你自己决定它属于多少个class(class9,class7,class13)
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

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模型学习路线 self-attention、seq2seq、Encoder、Decoder

在Transformer Encode里每一个Block具体步骤如下:
1.输入一排向量B后送入Self-Attention得到输出一排向量A,两者做残差A+B
2.将得到的A+B的结果做Layer Norm(LN与BN区别:BN是按维度计算,LN是按行计算)

transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder
3.将LN归一的结果送入FC层,并且也做残差,将FC做完残差的结果送入LN层,最后LN输出的结果就是最终Encode输出的结果
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder
Tips:
1.残差结构是为了解决梯度消失问题,可以增加模型的复杂性。
2.batchnorm是对一批样本中进行归一化,而layernorm是对每一个样本进行一次归一化
3.Encoder的输入包含两个,是一个序列 + positional embedding,用正余弦函数对序列中的位置进行计算(偶数位置用正弦,奇数位置用余弦)

LN与BN:一个按行,一个按列
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

参考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
输出是:对应位置的输出词的概率。
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder
但是当有一个文字输出错误,接下来Decoder就会用这个错误的结果【一步错步步错】:
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder
而Teacher Forcing 最常见带来的问题就是 Exposure Bias,解决方法在第四点

2. Not-Autoregressive (NAT 非自归)
Autoregressive是一个一个输入一个一个输出
Not-Autoregressive是输入一排start,最后直接输出一整个句子
那么如何确定NAT decoder的输出长度呢?
1.可以用一个预测网络预测输出的长度,再进行句子的输出
2.也可以一直进行输出,然后通过end来把句子截断
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder
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模型学习路线 self-attention、seq2seq、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输出之后因此不考虑
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

2、Decoder多一层Cross Attention
 
Encoder和Decoder如何相互连接?
 
Cross Attention 位于Decoder内,是连接Encoder和Decoder的桥梁,它有三个输入,其中两个来自于Encoder,一个来自Decoder。
两个encoder的输出+一个decoder的输入送到Multi-head self-Attention中
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder
Cross Attention 跨越注意力
Cross Attention 机制不是 Transformer,其先于 Transformer 出现,后来出现了 Self-attention 才有了 Transformer
Decoder这边输入Start到Masked Self-Attention中产生一个Q,这个Q与Encoder部分做self-Attention后产生的K计算相关性得到α,α再和v做点乘后得到的结果送入FC
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

4. 训练和推理

Transformer的Decoder需要分为训练部分推理部分来讨论。

Encoder模块的执行过程相同,Encoder可以并行计算,一次性Encoding出来.
Decoder模块的执行过程不同,训练流程是一次输出b个序列中所有的单词的预测结果,而推理流程则是一次生成b个序列中一个单词的预测,需要多步来预测序列中所有的单词。

自己理解就是训练时的输入是Ground Truth,预测的输入是上一时刻的输出,训练使用 Teacher Forcing 并行训练,推理时串行
 

1.训练部分
Decoder在训练时会输入Groud Truth,叫做Teacher Forcing
Train类似于分类,输出类别最大的,引入交叉熵cross entropy记录预测的字和真实label
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

2.推理部分:
Decoder在推理时会输入上一次Decode的输出
Decoder推理不是一次把所有序列解出来的,而是一个一个解出来的,因为要用上一个位置的输出当作attention的Q

举例子:训练和推理阶段
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder
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可以同时进行,因为我们知道最终输出是“机器学习”,而在推理阶段只能一步一步进行,只能根据上一步来预测下一步,因为不知道最终输出是什么

transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

详细参考:哪位大神讲解一下Transformer的Decoder的输入输出都是什么?能解释一下每个部分都是什么?

5. Tips

1.Copy Mechanism 复制机制
对很多任务而言,也许Decoder无需产生输出,也许是从输出里面“复制”一些东西出来。
例如在聊天机器人中,对于用户输入的某人名字,机器无需进行处理,直接输出即可(比如库洛洛);或者复述一段不能识别的文字;亦或是提取大量文章中的摘要
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder
参考paper: Get To The Point: Summarization with Pointer-Generator Networks

2.Guided Attention 语音识别
常用于语音识别、语音合成
机器连读四个单词可能发音没有问题,单独读一个单词可能会产生漏读,因此就需要Guided Attention,要求机器在做Attention时是有固定方式的
例如:要求语音合成时,机器是从左向右而不是乱序的
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder
具体做法: Monotonic Attention , Location-aware attention

3. Beam Search 束搜索
每次找分数最高的,连成的红色路径叫做Greedy Decoding
若稍微损失点最开始的输入,但最终结果是绿色路径比红色好,因此这个技术叫Beam Search
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

4.Exposure Bias
Teacher Forcing 最常见的问题就是 Exposure Bias
当Train时,Decoder看到Ground Truth ,而在test时,Decoder看到错误的东西,这种不一致的现象叫做 Exposure Bias
transformer模型学习路线 self-attention、seq2seq、Encoder、Decoder

如何解决 Teacher Forcing 带来的问题?
————Scheduled Sampling
在train中加一些错误就好了,类似“加入扰动”的方式来解决——scheduled sampling(定时采样),这种方式会影响Transformer的并行化。

参考paper:
1.Scheduled Sampling for Sequence Prediction with Recurrent Neural Networks
2. Scheduled Sampling for Transformers
3.Bridging the Gap between Training and Inference for Neural Machine Translation

Related:

1.李宏毅《深度学习》- Self-attention 自注意力机制
2.三篇助你理解Transformer 中的 Query、Key 与 Value
3.动手推导Self-Attention
4.史上最小白之Transformer详解
5.Vision Transformer , Vision MLP 超详细解读 (原理分析+代码解读) (目录)
6.关于Teacher Forcing 和Exposure Bias的碎碎念
7.哪位大神讲解一下Transformer的Decoder的输入输出都是什么?能解释一下每个部分都是什么?

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2022年5月27日 下午4:41
下一篇 2022年5月27日 下午4:45

相关推荐