Transformer

Transformer本质上是一个Sequence-to-sequence模型,他与self-attention和BERF都有很大的关联。

Sequence-to-sequence (Seq2seq)

要了解Transfermer,首先需要对Seq2seq有一些了解。

Sequence-to-sequence字如其名,就是输入是一个sequence,输出也是一个sequence的模型。且输出sequence的长度是未知的,需要机器学习的。

举例来说,Seq2seq一个很好的应用就是 语音识别输入跟输出的长度,当然是有一些关係,但是却没有绝对的关係输出的长度由机器自己决定

image-20210429093940488

除此之外,Seq2seq还有很多应用场景

Seq2seq的应用

语音翻译

image-20210429100418127

机器把他听到的英文的声音讯号翻译成中文文字。

TTS语音合成

image-20210429105644179

我们如果是一个模型,输入语音 ,输出中文的文字,那就是语音识别,反过来 输入文字 输出声音讯号,就是语音合成

Chatbot聊天机器人

聊天机器人就是你对它说一句话,它要给你一个回应,输入输出都是文字,文字就是一个vector Sequence。

在NLP的领域,其实很多natural language processing的任务,都可以想成是question answering,QA的任务

image-20210429163745845

值得注意的是,对多数NLP的任务,或对多数的语音相关的任务而言,往往為这些任务自定义模型,你会得到更好的结果

Syntactic Parsing 语法解析

image-20210429202108751

机器要做的事情是產生,一个文法的剖析树 告诉我们,deep加learning合起来,是一个名词片语,very加powerful合起来,是一个形容词片语,形容词片语加is以后会变成,一个动词片语,动词片语加名词片语合起来,是一个句子。

image-20210429202417748

事实上一个树状的结构,可以硬是把他看作是一个Sequence

这个树状结构可以对应到一个,这样子的Sequence,从这个Sequence裡面,你也可以看出

  • 这个树状的结构有一个S,有一个左括号,有一个右括号
  • S裡面有一个noun phrase,有一个左括号跟右括号
  • NP裡面有一个左括号跟右括号,NP裡面有is
  • 然后有这个形容词片语,他有一个左括号右括号

这一个Sequence就代表了这一个tree 的structure

Object Detection 目标追踪

image-20210429204527490

object detection就是给机器一张图片,然后它把图片裡面的物件框出来。

如此处的斑马一样。

多分类与多标签分类问题

多标签(multi-label)的分类问题可以通过seq2seq’s model来解决。意思是说同一个东西,它可以属于多个class,而这些class就可以通过sequence表示输出。

image-20210429203936697

多标签问题不同于多分类问题只输出一个类别,可以输出多个类别。输出多少类别由机器决定。

举例来说,我把这些文章丢到一个classifier里

  • 本来classifier只会输出一个答案,输出分数最高的那个答案 — 多分类问题
  • 我现在就输出分数最高的前三名,看看能不能解,multi-label的classification的问题 — 多标签分类问题

Encoder-Decoder

怎么做seq2seq这件事,一般的seq2seq’s model,它会分成两块 一块是Encoder,另外一块是Decoder。

image-20210429205404198

input一个sequence有Encoder,负责处理这个sequence,再把处理好的结果丢给Decoder,由Decoder决定,它要输出什麼样的sequence。

Encoder

seq2seq model中 Encoder要做的事情,就是给一排向量,输出另外一排向量

image-20210429205911444

给一排向量、输出一排向量这件事情,很多模型都可以做到,可能第一个想到的是,我们刚刚讲完的self-attention,其实不只self-attention,RNN CNN 其实也都能够做到,input一排向量,output另外一个同样长度的向量。

在transformer裡面,transformer的Encoder,用的就是self-attention。

现在的Encoder裡面,会分成很多很多的block

image-20210429210126607

需要注意的是每一个block 其实,并不是neural network的一层每一个block裡面做的事情,是好几个layer在做的事情

image-20210429210257652

  • 先做一个self-attention,input一排vector以后,做self-attention,考虑整个sequence的资讯,Output另外一排vector.
  • 接下来这一排vector,会再丢到fully connected的feed forward network裡面,再output另外一排vector,这一排vector就是block的输出。

transformer裡面,self-attention做的事情是更复杂的

residual connection

在之前self-attention的时候,我们说 输入一排vector,就输出一排vector,这边的每一个vector,它是考虑了 所有的input以后,所得到的结果。

image-20210429210831750

但现在,在transformer裡面,它加入了一个设计,我们不只是输出这个vector,我们还要把这个vector加上它的input,它要把input拉过来 直接加给输出,得到新的output (类似于残差网络,将前面层网络的结果输入后面层网络)这样的设计叫做 residual connection ,它会把input直接跟output加起来,得到新的vector

layer normalization

layer normalization做的事情,比bacth normalization更简单一点。

image-20210429211313025

输入一个向量 输出另外一个向量,不需要考虑batch,它会把输入的这个向量,计算它的mean跟standard deviation

但是要注意一下,batch normalization是对不同example,不同feature的同一个dimension,去计算mean跟standard deviation

layer normalization,它是对同一个feature,同一个example裡面,不同的dimension,去计算mean跟standard deviation

FC network

得到layer normalization的输出以后,它的这个输出 才是FC network的输入

image-20210429211858981

FC network这边,也会对输出进行 residual connection,然后再对结果进行 layer normalization。

如此得到的输出,才是residual network裡面,一个block的输出

Encoder流程总结

Transfermer就是经过很多次block后计算的seq2seq模型。

image-20210819115242729

每一次block的流程如下:

  • 首先 你有self-attention,其实在input的地方,还有加上positional encoding,我们之前已经有讲过,如果你只光用self-attention,你没有未知的资讯,所以你需要加上positional的information,然后在这个图上,有特别画出positional的information
  • Multi-Head Attention,这个就是self-attention的block,这边有特别强调说,它是Multi-Head的self-attention
  • Add&norm,就是residual加layer normalization,我们刚才有说self-attention,有加上residual的connection,加下来还要过layer normalization,这边这个图上的Add&norm,就是residual加layer norm的意思
  • 接下来,要过feed forward network
  • fc的feed forward network以后再做一次Add&norm,再做一次residual加layer norm,才是一个block的输出,
  • 然后这个block会重复n次,这个复杂的block,其实在之后会讲到的,一个非常重要的模型BERT裡面,会再用到 BERT,它其实就是transformer的encoder

Encoder

Encoder 做的事情,就是输入一个 Vector Sequence,输出另外一个 Vector Sequence

Decoder其实有两种,接下来会介绍比较常见的 Autoregressive Decoder这个Decoder,是怎麼运作的。

语音识别,来当作例子来说明,语音识别就是输入一段声音,输出一串文字

image-20210505192814682

Encoder 做的事情,就是输入一个 Vector Sequence,输出另外一个 Vector SequenceDecoder 要做的事情就是产生输出,也就是產生语音识别的结果

Decoder如何生成一段文字

给它一个特殊的符号,代表开始,如:start,在NLP中是一个One-Hot 的 Vector 来表示。

image-20210505193652691

接下来Decoder 会吐出一个向量,这个 Vector 的长度很长,跟你的 Vocabulary 的 Size 是一样的

Vocabulary Size 就是实现考虑好的 Decoder 输出的大小,如:5000个汉字….

每一个中文的字,都会对应到一个数值,因為在產生这个向量之前,你通常会先跑一个 Softmax,分数最高的一个中文字,它就是最终的输出

image-20210505195003941

其流程很简单,类似RNN。第一个输入是begin标识符,然后将其输出作为下一个的输入。以此类推,直到输入end标识符使机器决定输出Sequence 的长度),输出最终结果。

image-20210505203437172

但是容易犯一个Error Propagation的问题,即:一步错,步步错。

Encoder 与 Decoder 对比

image-20210505204215642

大体上两个结构是雷同的,只是Decoder更加复杂一点:多了中间的一块结果、结果要做softmax、Block里用的是 Masked Multi-Head Attention

Masked Multi-Head Attention:只是在原来的基础上做了一点限制,有点RNN的意思,就是每次只考虑左边几个向量的相关性,如q2时只考虑k1,k2,不考虑右边的。

image-20210505205618457

这个就是 Autoregressive Decoder 的运作的方式。

Encoder 与 Decoder 通讯

image-20210506103314101

刚才没有介绍的Decoder中间多的一块叫做:Cross Attention,它是连接 Encoder 跟 Decoder 之间的桥樑。可以发现中间层的输入除了来自上一层,还有来自Encoder的输出,即Decoder 可以读到 Encoder 的输出。

image-20210506105155338

Encoder 输入一排向量 $a^1 a^2 a^3$,Decoder 先吃 BEGIN 输出输入一个向量并乘上一个矩阵,得到一个 Query 叫做 q。

相当于Encoder负责提供K、V,而Decoder负责Query。把这个 q 跟 $k^1 k^2 k^3$,去计算 Attention 的分数,得到 $α_1 α_2 α_3$,接下来再把 $α_1 α_2 α_3$,就乘上 $v^1 v^2 v^3$,再把它 Weighted Sum 加起来会得到 v。

image-20210506105352521

这一个 V,接下来会丢到 Fully-Connected ,Network 做接下来的处理,那这个步骤就是 q 来自於 Decoder,k 跟 v 来自於 Encoder,这个步骤就叫做 Cross Attention

Training

image-20210506121209178

其训练过程其实类似于分类问题,Decoder最后已经通过softmax处理了,结果放在一个One-Hot 的 Vector里。我们通过 Cross Entropy(交叉熵) 来衡量他们之间的差距,其值越小越好。

image-20210506123013981

在输入的时候给它正确的答案,那这件事情叫做 Teacher Forcing

但是在测试的时候,没有答案,所以可能会出现 Mismatch 的问题。

Decoder – Non-autoregressive (NAT)

Non-Autoregressive ,通常缩写成 NAT,所以有时候 Autoregressive 的 Model,也缩写成 AT。

Autoregressive 的模型是,先输入 BEGIN,然后出现 w1,然后把 w1 当做输入,输出 w2,直到输出 END 為止

image-20210505213259792

NAT 不是依次产生,去除了类似RNN的前后依赖关系,一次把整个句子都产生出来,NAT 的 Decoder可能吃的是一整排的 BEGIN,让它一次输出一排 word 就结束了。

image-20210505214100885

但是如何知道Begin该设置多少个?我们应该输出几个字?

  • 另外learn一个 Classifier 输入Encoder 的 Input, 输出 Decoder 应该要输出的长度。
  • 给一个很大的输出空间,看他自己什么时候没有输出就结束了。

NAT很明显的优势就并行化,充分利用self-attention的优势。

NAT的Decoder也可以更好的控制它输出的长度

NAT的缺点也很明显,NAT的表现通常不如AT。

Tips

不限于 Transformer ,讲一些训练这种 Sequence To Sequence Model 的Tips。

Copy Mechanism

就是说也许 Decoder 没有必要自己创造输出出来,它需要做的事情,也许是从输入的东西裡面复製一些东西出来。

比如说:聊天机器人会用到上文中出现的一些词语。

image-20210506160219468

Summarization

对于如:生成一篇文章的摘要这种工作,也许我们只是需要从输入中复制东西的能力。

Guided Attention (引导注意力)

够强迫机器,一定要把输入的每一个东西通通看过一遍。

Guiding Attention 要做的事情就是,要求机器它在做 Attention 的时候,是有固定的方式的

比如语音识别中,我们想像中的 Attention,应该就是由左向右

image-20210506163030902

Beam Search (波束搜索)

举例说明:假设我们现在的这个 Decoder就只能產生两个字,一个叫做 A 一个叫做 B。Decoder 每一步在 A B 裡面决定一个,然后决定了 A 以后,再把 A 当做输入, 然后再决定 A B 要选哪一个以此类推。

image-20210506163652097

如果我们每次都选分数最高的一步走(贪心),叫做:Greedy Decoding

如果我们使用一种近似找到预估的结果最好的路线,这个就是:Beam Search

但是需要注意的是:这算法有时候有用,有时候没有用

Scheduled Sampling (计划采样)

上面我们在training的时候讲到,可能会出现训练跟测试居然是不一致的现象。

在训练的时候,Decoder 看到的是完全正确的,但是测试时不一致的现象叫做:Exposure Bias

其原因可能是测试时,一步错,步步错。

解决也很简单,我们在训练的时候就故意给Decoder加一些错误的输入,其测试结果可能更好。这一招就叫做:Scheduled Sampling。

参考:

https://www.bilibili.com/video/BV1Wv411h7kN?p=34

https://github.com/unclestrong/DeepLearning_LHY21_Notes