Transformer
Transformer
Transformer本质上是一个Sequence-to-sequence模型,他与self-attention和BERF都有很大的关联。
Sequence-to-sequence (Seq2seq)
要了解Transfermer,首先需要对Seq2seq有一些了解。
Sequence-to-sequence字如其名,就是输入是一个sequence,输出也是一个sequence的模型。且输出sequence的长度是未知的,需要机器学习的。
举例来说,Seq2seq一个很好的应用就是 语音识别,输入跟输出的长度,当然是有一些关係,但是却没有绝对的关係,输出的长度由机器自己决定。
除此之外,Seq2seq还有很多应用场景。
Seq2seq的应用
语音翻译
机器把他听到的英文的声音讯号翻译成中文文字。
TTS语音合成
我们如果是一个模型,输入语音 ,输出中文的文字,那就是语音识别,反过来 输入文字 输出声音讯号,就是语音合成。
Chatbot聊天机器人
聊天机器人就是你对它说一句话,它要给你一个回应,输入输出都是文字,文字就是一个vector Sequence。
在NLP的领域,其实很多natural language processing的任务,都可以想成是question answering,QA的任务。
值得注意的是,对多数NLP的任务,或对多数的语音相关的任务而言,往往為这些任务自定义模型,你会得到更好的结果。
Syntactic Parsing 语法解析
机器要做的事情是產生,一个文法的剖析树 告诉我们,deep加learning合起来,是一个名词片语,very加powerful合起来,是一个形容词片语,形容词片语加is以后会变成,一个动词片语,动词片语加名词片语合起来,是一个句子。
但事实上一个树状的结构,可以硬是把他看作是一个Sequence。
这个树状结构可以对应到一个,这样子的Sequence,从这个Sequence裡面,你也可以看出
- 这个树状的结构有一个S,有一个左括号,有一个右括号
- S裡面有一个noun phrase,有一个左括号跟右括号
- NP裡面有一个左括号跟右括号,NP裡面有is
- 然后有这个形容词片语,他有一个左括号右括号
这一个Sequence就代表了这一个tree 的structure。
Object Detection 目标追踪
object detection就是给机器一张图片,然后它把图片裡面的物件框出来。
如此处的斑马一样。
多分类与多标签分类问题
多标签(multi-label)的分类问题可以通过seq2seq’s model来解决。意思是说同一个东西,它可以属于多个class,而这些class就可以通过sequence表示输出。
多标签问题不同于多分类问题只输出一个类别,可以输出多个类别。输出多少类别由机器决定。
举例来说,我把这些文章丢到一个classifier里
- 本来classifier只会输出一个答案,输出分数最高的那个答案 — 多分类问题
- 我现在就输出分数最高的前三名,看看能不能解,multi-label的classification的问题 — 多标签分类问题
Encoder-Decoder
怎么做seq2seq这件事,一般的seq2seq’s model,它会分成两块 一块是Encoder,另外一块是Decoder。
input一个sequence有Encoder,负责处理这个sequence,再把处理好的结果丢给Decoder,由Decoder决定,它要输出什麼样的sequence。
Encoder
seq2seq model中 Encoder要做的事情,就是给一排向量,输出另外一排向量
给一排向量、输出一排向量这件事情,很多模型都可以做到,可能第一个想到的是,我们刚刚讲完的self-attention,其实不只self-attention,RNN CNN 其实也都能够做到,input一排向量,output另外一个同样长度的向量。
在transformer裡面,transformer的Encoder,用的就是self-attention。
现在的Encoder裡面,会分成很多很多的block。
需要注意的是每一个block 其实,并不是neural network的一层。每一个block裡面做的事情,是好几个layer在做的事情。
- 先做一个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以后,所得到的结果。
但现在,在transformer裡面,它加入了一个设计,我们不只是输出这个vector,我们还要把这个vector加上它的input,它要把input拉过来 直接加给输出,得到新的output (类似于残差网络,将前面层网络的结果输入后面层网络)这样的设计叫做 residual connection ,它会把input直接跟output加起来,得到新的vector。
layer normalization
layer normalization做的事情,比bacth normalization更简单一点。
输入一个向量 输出另外一个向量,不需要考虑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的输入
而FC network这边,也会对输出进行 residual connection,然后再对结果进行 layer normalization。
如此得到的输出,才是residual network裡面,一个block的输出。
Encoder流程总结
Transfermer就是经过很多次block后计算的seq2seq模型。
每一次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,是怎麼运作的。
用语音识别,来当作例子来说明,语音识别就是输入一段声音,输出一串文字。
Encoder 做的事情,就是输入一个 Vector Sequence,输出另外一个 Vector Sequence,Decoder 要做的事情就是产生输出,也就是產生语音识别的结果。
Decoder如何生成一段文字
给它一个特殊的符号,代表开始,如:start,在NLP中是一个One-Hot 的 Vector 来表示。
接下来Decoder 会吐出一个向量,这个 Vector 的长度很长,跟你的 Vocabulary 的 Size 是一样的。
Vocabulary Size 就是实现考虑好的 Decoder 输出的大小,如:5000个汉字….
每一个中文的字,都会对应到一个数值,因為在產生这个向量之前,你通常会先跑一个 Softmax,分数最高的一个中文字,它就是最终的输出。
其流程很简单,类似RNN。第一个输入是begin标识符,然后将其输出作为下一个的输入。以此类推,直到输入end标识符(使机器决定输出Sequence 的长度),输出最终结果。
但是容易犯一个Error Propagation的问题,即:一步错,步步错。
Encoder 与 Decoder 对比
大体上两个结构是雷同的,只是Decoder更加复杂一点:多了中间的一块结果、结果要做softmax、Block里用的是 Masked Multi-Head Attention。
Masked Multi-Head Attention:只是在原来的基础上做了一点限制,有点RNN的意思,就是每次只考虑左边几个向量的相关性,如q2时只考虑k1,k2,不考虑右边的。
这个就是 Autoregressive Decoder 的运作的方式。
Encoder 与 Decoder 通讯
刚才没有介绍的Decoder中间多的一块叫做:Cross Attention,它是连接 Encoder 跟 Decoder 之间的桥樑。可以发现中间层的输入除了来自上一层,还有来自Encoder的输出,即Decoder 可以读到 Encoder 的输出。
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。
这一个 V,接下来会丢到 Fully-Connected ,Network 做接下来的处理,那这个步骤就是 q 来自於 Decoder,k 跟 v 来自於 Encoder,这个步骤就叫做 Cross Attention。
Training
其训练过程其实类似于分类问题,Decoder最后已经通过softmax处理了,结果放在一个One-Hot 的 Vector里。我们通过 Cross Entropy(交叉熵) 来衡量他们之间的差距,其值越小越好。
在输入的时候给它正确的答案,那这件事情叫做 Teacher Forcing。
但是在测试的时候,没有答案,所以可能会出现 Mismatch 的问题。
Decoder – Non-autoregressive (NAT)
Non-Autoregressive ,通常缩写成 NAT,所以有时候 Autoregressive 的 Model,也缩写成 AT。
Autoregressive 的模型是,先输入 BEGIN,然后出现 w1,然后再把 w1 当做输入,再输出 w2,直到输出 END 為止。
NAT 不是依次产生,去除了类似RNN的前后依赖关系,一次把整个句子都产生出来,NAT 的 Decoder可能吃的是一整排的 BEGIN,让它一次输出一排 word 就结束了。
但是如何知道Begin该设置多少个?我们应该输出几个字?
- 另外learn一个 Classifier 输入Encoder 的 Input, 输出 Decoder 应该要输出的长度。
- 给一个很大的输出空间,看他自己什么时候没有输出就结束了。
NAT很明显的优势就并行化,充分利用self-attention的优势。
NAT的Decoder也可以更好的控制它输出的长度。
NAT的缺点也很明显,NAT的表现通常不如AT。
Tips
不限于 Transformer ,讲一些训练这种 Sequence To Sequence Model 的Tips。
Copy Mechanism
就是说也许 Decoder 没有必要自己创造输出出来,它需要做的事情,也许是从输入的东西裡面复製一些东西出来。
比如说:聊天机器人会用到上文中出现的一些词语。
Summarization
对于如:生成一篇文章的摘要这种工作,也许我们只是需要从输入中复制东西的能力。
Guided Attention (引导注意力)
够强迫机器,一定要把输入的每一个东西通通看过一遍。
Guiding Attention 要做的事情就是,要求机器它在做 Attention 的时候,是有固定的方式的
比如语音识别中,我们想像中的 Attention,应该就是由左向右。
Beam Search (波束搜索)
举例说明:假设我们现在的这个 Decoder就只能產生两个字,一个叫做 A 一个叫做 B。Decoder 每一步在 A B 裡面决定一个,然后决定了 A 以后,再把 A 当做输入, 然后再决定 A B 要选哪一个以此类推。
如果我们每次都选分数最高的一步走(贪心),叫做:Greedy Decoding
如果我们使用一种近似找到预估的结果最好的路线,这个就是:Beam Search
但是需要注意的是:这算法有时候有用,有时候没有用
Scheduled Sampling (计划采样)
上面我们在training的时候讲到,可能会出现训练跟测试居然是不一致的现象。
在训练的时候,Decoder 看到的是完全正确的,但是测试时不一致的现象叫做:Exposure Bias
其原因可能是测试时,一步错,步步错。
解决也很简单,我们在训练的时候就故意给Decoder加一些错误的输入,其测试结果可能更好。这一招就叫做:Scheduled Sampling。
参考: