Transformer就是一个sequence-to-sequence(Seq2seq
)的module
语音辨识:输入声音,输出中文 就是语言辨识。(例如谷歌的pixel4
,使用 N N N to N N N 的神经网络,使用RNN transducer
)
语音合成:输入中文,输出声音就是语音合成。 (音标—>语音 (使用seq2seq model
))
Seq2seq
在NLP
有很多应用,很多问题可以看成QA
:Seq2seq
硬解,例如文法剖析(Grammar as Foreign Language(14年文章)),例如Muti-label Classification(多标签分类,机器自己决定多少个class)、目标检测等。Seq2seq 结构会分为俩块:Encoder
、Decoder
input一个sequence由Encoder
负责处理,将处理好的结果丢到Decoder
决定输出什么样的sequence(起源:14年9月提出用于翻译(Sequence to Sequence Learning with Neural Networks) )
Encoder
:给一排向量输出另外一排向量。(CNN、RNN、Self-attention都可以做到)
注:在 Transformer 的
Encoder
中用的就是Self-attention
。
Encoder
中会分为很多个Block
,每一个Block
都是给一排向量输出另外一排向量(每一个Block
是好几个 layer 在处理)
Block
中是:给一排向量先做Self-attention
,再做FC
,再输出另外一排向量。
在原来 Transformer 中
Block
更为复杂:
给一排向量先做Self-attention
,再加上input(a+b)
(称为residual),再做 Layer normalization
(计算输入向量的mean和standard deviation,做normalize),再做FC
(也做residual),再做 Layer normalization
,再输出。
Add&Norm :意思就是加上residual + Layer norm
注:Bert 中也会再用到,Bert 其实就是
Transformer
中的Encoder
注:原始的
transformer
架构并不一定是最好的,做Layer normalization
再做residual
更换顺序。(文章On Layer Normalization in the Transformer Architecture、PowerNorm:Rethinking Batch Normalization in Transformers)。
下图(a)是原始的transformer架构,(b)是更换顺序的架构
Decoder
有俩种:Autoregressive Decoder
(AT)、Non-autoregressive
(NAT)
使用语音辨识做例子(输入一段声音,输出文字)
Encoder:输入一段声音向量,输入另外一排向量 ——> Decoder 产生语音辨识的结果。
Decoder流程:
BEGIN
或者BOS
(begin of seqence)(special token)(one-hot编码) ——>(softmax
)中文每一个字对应一个数值(也包括END
)——>例如输出“机”
字概率最高输出“机”字
—— >
把“机”
做Decoder
新的 input(one-hot 编码)和BEGIN
——>输出“器”
——>BEGIN、"机"、"器"
做 input —— > 输出"学"
——>…
Decoder 看到的输入其实是它在前一个时间点自己的输出。Decoder 需自己决定输出sequence的长度。
(其中"机"
会被变成 one-hot 的向量"机"
是 1 其他都是 0 ,Decoder
输出是一个几率的分布,会让这二者越接近越好,所以会计算Ground truth
和distribution
的cross entropy越小越好)
注:每一次
Decoder
在产生一个中文字的时候,其实就是做了一次分类的问题。Decoder
的输入就是sequence正确的答案,也称为Teacher Forcing
。
transformer Decoder
中的Block
:
Masked Muti-Head attention——> Add&Norm ——>
(Cross attention
是 Encoder 和 Decoder 之间的桥梁)两个输入来自 Encoder,Decoder 提供一个输入——>Muti-Head attention——>Add&Norm——>Feed Forward——>Add&Norm
注:其中
Masked Muti-Head attention
指:
之前 Self-sattention 产生 b 1 b^1 b1 是考虑了 a 1 a^1 a1 ~ a 4 a^4 a4 ,现在只能考虑左边的,例如 b 1 b^1 b1 能考虑 a 1 a^1 a1 , b 2 b^2 b2只能考虑 a 1 a^1 a1, a 2 a^2 a2
Cross attention
中:
q q q来自 Decoder , k k k 和 v v v 来自 Encoder。
Cross attention
一开始来自 Seq2seq 模型(文章 Listen,attend and spell做语音辨识ICASS2016),那时候的 Encoder 和 Decoder 都还是使用LSTM
,但是Cross attention
已经有了,Cross attention
比先Self-attention
早诞生。
在原始 Transformer 中: Encoder 和 Decoder 都有很多层, Decoder 无论哪一层都是拿 Encoder 的最后一层的输出。
但是也有很多不同Cross attention
的方式:
Autoregressive Decoder(AT)
、Non-autoregressive Decoder (NAT)
区别:
NAT是一个步骤产生一整个句子。
Non-autoregressive (NAT)把一堆一排的BEGIN 的Token都丢给它,让它产生一排Token就结束了(一个步骤完成句子的生成)。
NAT如何解决输出的长度:
一种解决方法:用另外一个 Classifier 由 Encoder 的输出来预测一个 Decoder 需输出的长度——>多少个BEGIN
另外一种解决方法:或者输入很多BEIGIN
,在输出的时候定一个END
,右边的舍弃。
NAT
是由 Transformer 以后有 Self-attention 的 Decoder 以后才有的,以前是LSTM
或者RNN
就算给一排BEGIN
也无法同时产生全部的输出,需一个一个产生。
语音合成现在都可以使用Seq2seq的模型来做,Tacotron
是AT
的 Decoder ,FastSpeech
是NAT
的 Decoder。
NAT
的Performance往往都不如AT
的 Decoder (Muti-Modality问题
)
训练 Sequence To Sequence Model(不局限 Transformer )的Tips:
之前讨论中都要求 Decoder 自己产生输出,对很多任务来说 Decoder 可能没有必要自己创造输出,而是从输出复制一些(例如对话机器人、摘要)
注:最早有从输入复制东西能力的模型:
Pointer Network
后来有变形的Copy Network
(文章Incorporating Copyting Mechanism in Sequence-to-Sequence Learning)
Seq2seq可能会犯低级的错误,例如漏字了(例如语音辨识,语音合成TTS)
要求机器去 Guide 领导这个 attention 的过程,要求在做 attention 的时候有固定的方式
解决方法方法例如:Monotonic Attention
、Location-aware attention
每次 Decoder 输出那个分数最高的 Token ,找分数最高的字 称为 Greedy Decoding ,但是可能不是最好的。
Beam Search
为了找一个 Approximate,找一个估测的 Solution。(可能不是特别精准的 Solution )
注:有时候对 Decoder 来说,
Beam Search
不一定就是好的(文章The Curious Case of Neural Text Degeneration),没有找出分数最高的路反而结果可能好(跟任务本身特性有关,答案明确的任务例如 语音辨识Beam Search
比较有帮助,需要创造力例如TTS语音合成比较差)
BLEU score
: Decoder 产生一个完整句子后,再跟正确答案一整句做比较。
在训练的时候我们是使用 minmize cross entropy
,但是不一定可以 maximize BLEU score
。
所以在验证集中应该使用BLEU score
。
能否训练就使用
BLEU score
?
答:在训练过程使用BLEU score
乘负号作为 loss 不太能实现,因为BLEU score不能微分,BLEU score本身复杂,每一个中文字计算cross entropy才能做
测试的时候 Decoder 看到自己的输出,所以可能会看到错误的输出,例如“机”“气”(一步错,步步错),训练的时候看到是完全正确的,例如“机”“器”。
不一致的现象称为Exposure bias
。
解决方法:给 Decoder 的输入加入错误的东西,不要都是正确的(技术:Schedule Sampling
(2015年提出,在LSTM
就已经有,文章Original Scheduled Sampling、Scheduled Sampling for Transformer、Paraller Scheduled Sampling),但是会伤害 Transformer 平行化的能力)。