目录
Transformer的原始架构如下(后续也有很多改进的架构):
Transformer
——Sequence-to-sequence的model (Seq2seq)
Seq2seq: Input a sequence, output a sequence. The output length is determined by model.
Seq2seq model在NLP领域、natural language processing领域应用非常广泛。
各式各样的NLP的问题往往都可以看做是QA的问题,而QA的问题就可以用Seq2seq model来解。对多数NLP任务、语音相关任务而言,为这些任务客制化模型会得到更好的结果。
Seq2seq应用举例:
① Seq2seq for Chatbot:
② Seq2seq for Syntactic Parsing:
③ Seq2seq for Multi-lable Classification:
Seq2seq的结构如下:
Transformer的原始架构如下(后续也有很多改进的架构):
Encoder
Transformer原始架构中Encoder的架构如下,Encoder由很多个block组成,每个block都是输入一排向量,输出一排向量:
上图中每一个Block做的事情如下:
Decoder
Decoder有两种,Autoregressive (AT)和Non-autoregressive (NAT),常见的是Autoregressive (AT)。
下面以语音辨识为例,说明Autoregressive的Decoder的运作方式。
Autoregressive的Decoder的架构如下:
Decoder的架构有点像是Eecoder的架构的一个复杂版,不过Encoder中用的是Self-attention,而Decoder中用的是Masked Self-attention。Self-attention的每一个输出能看到整个输入资料,Masked Self-attention的输出只能看到当前及左边的输入资料(因为此时右边的资料还未输出,也无法看到)。下图第一张是Self-attention,第二张是Masked Self-attention。
AT v.s. NAT
NAT不是像AT一样一次产生一个字,它是一次把整个句子都产生出来。
Encoder-Dncoder
这部分介绍Encoder和Decoder之间怎么传递资讯。
Cross attention是连接Encoder和Decoder之间的桥梁。Cross attention部分有两个输入来自Encoder,有一个输入来自Decoder。
Cross attention的运作过程如下:
Cross attention可以有不同的方式,即Encoder和Decoder之间可以有不同的连接方式,如下图,原始Transformer中Cross attention的连接方式如(a):
Training
训练的时候,每一个输出都有一个Cross Entropy,训练要做的,就是minimize这个Cross Entropy。
训练的时候,Decoder的输入是正确答案,把用正确答案作为输入这件事称做Teacher Forcing。
但是在测试的时候,Decoder看到的输入是自己前面的输出,而不是正确答案。所以在测试的时候,Decoder可能会看到一些错误的东西。
当前面输出了一个错误的答案,这个答案作为Decoder的输入,让它看到了一个错误的东西,可能会导致后面的答案全部出错。
解决方向:在训练的时候,给Decoder的输入加入一些错误的东西——Scheduled Sampling。
下面介绍一些训练Seq2seq model的Tips:
① Copy Mechanism
对很多任务而言,Decoder不用自己创造输出,或只需要创造部分的输出,它需要从输入的东西中复制一些东西作为输出。
② Guided Attention
以语音合成为例,输入一串文字,在合成声音的时候,机器应该从左到右去看输入的文字,而不是随机的去看输入的文字。Guided Attention可以给Training一个限制,让机器Attention的顺序是从左到右而不是随机的。
③ Beam Search
如下图,在当前这一步,选择A比较好,但从整体来看,B才是最佳选择。在实际问题中,每一步的选择都很多,无法通过穷举来选择出最佳路径。可以用Beam Search这种演算法,通过估算找到一个不是完全精准的solution,找出一条不是完全精准的路径。
Beam Search的效果取决于任务本身的特性。
如果一个任务答案非常明确,比如语音辨识,输入一句话,只有一个固定的输出结果,Beam Search对这种任务比较有帮助。
对于一个需要创造力的任务,比如输入故事的前半部,输出故事的后半部,这时在Decoder里面加入一些随机性效果会更好,Beam Search对这种任务比较没有帮助。