transformer就是一个seq2seq的模型。

1.什么是seq2seq呢?

输入是一个序列,输出是一个序列,且输出序列的长度由模型来决定。

一个模型,输入台语、输出中文文字,就是语音辨识;
一个模型,输入文字,输出语音讯号,就是语音合成。

Seq2Seq在NLP的领域使用相当广泛,其实很多自然语言处理的任务都可以当作是QA任务。所谓的QA就是给机器一段文字,希望它能够给你一个正确的答案。而很多可能我们觉得和QA没什么关系的任务都可以想象成是QA。比如翻译,机器读入的是一段英文句子,那么问题就是这个句子的中文翻译是什么;比如文本摘要,机器读入的是文档,那么问题就是这段文字的摘要是什么;比如情感分析,输入一段句子,那么问题就是这个句子的情感是正面的还是负面的。

NLP的问题可以看作是QA的问题,而QA的问题可以用Seq2Seq来解决。硬train一发!
image.png
Seq2Seq还能用来处理多标签分类问题。多标签分类问题和多分类不一样。多分类是,输出的结果只属于一个class,多标签分类问题是输出的结果可以有多个标签。
image.png
现在我们提到Seq2Seq,首先想到的都是Transformer。它由两个部分构成,一个encoder,一个decoder。
image.png

2.Encoder

Encoder做的事情是input一排向量,输出等长的一排向量。这件事可以用Self-Attention、RNN、CNN,都可以。
Transformer的设计中到处都是ResNet的痕迹。Bert其实就是Transformer的Encoder。

像论文中介绍的,由于Transformer中没有循环以及卷积结构,为了使模型能够利用序列的顺序,作者们需要插入一些关于tokens在序列中相对或绝对位置的信息。因此,作者们提出了“Positional Encoding”(位置编码)的概念。
image.png
image.png
image.png
image.png

3.Decoder

1.Autoregressive Decoder—-自回归的Decoder

Decoder的输入有Encoder的输出和BEGIN这个特殊符号,表示句子的开头。
后面Decoder的输入是前一个时间点自己的输出。
image.png
image.png
Masked Self-attention与Self-attention的区别是,只看前面的序列。比如,在计算b2时,我们只知道a1和a2的key和a2的query,然后用它来计算attention。也就是说,后续序列不可见。

因为Decoder输入是一个一个的,输出的东西也是一个一个产生的,所以,它没有办法考虑右边的东西, 要用masked Self-attention。而Self-Attention的输入是一整个序列。

image.png
因为Seq2Seq模型的输出长度是由模型自己决定的,所以,我们希望机器能够习得什么时候应该结束。那,我们把END符号也加入到词汇表中,当然,我们可以把END和BEGIN用同一个符号表示。我们希望当输出END的时候,结束序列输出。
image.png

2.Non-Autoregressive Decoder NAT

AT和NAT的比较:

  • NAT是输入一排的BEGIN,然后产生一排的输出,使用的是Self-Attention。
    • 那么如何决定输出的长度呢?
      • 可以将Encoder的输出输入一个Classifier,用来预测句子的长度。
      • 可以设置一个句子长度的最大值,如300,然后,对于输出句子截取到END符号出现。
  • NAT的优点是:可以并行处理,且能够控制输出的长度(BEGIN个数)
  • NAT的表现一般没有AT的好。

image.png

4.Encoder和Decoder之间的信息传递

Encoder先用Self-Attention处理输入,产生一排等长输出;同时Decoder用Masked Self-Attention处理BEGIN这个特殊的符号,产生一个输出。Decoder产生的输出经过一个transform得到q,q与Encoder的输出做Self-Attention,得到v。(案例上没有让q与自己的key进行结合),然后交给一个FC处理。这个步骤叫做Cross Attention。
image.png
当然,Encoder和Decoder之间的信息传递的方式还有很多。
image.png

5.训练

当我们输入一段“机器学习”的语音,我们希望经过模型处理后能够得到“机器学习END”五个字,也就是说,END也是要学习的。其中,每一个字的学习都可以当作是一个多分类的问题,然后我们要求所有字加起来的交叉熵损失最小。

注意,我们看到decoder的输入是什么?是正确答案。 在训练的时候,我们会给decoder看正确的答案。这个训练方式叫做Teacher Forcing,使用真实值作为输入。
(也不能都用正确答案,要人为地添加一些错误的东西,要不然的话,一旦有一个字错了,就会步步错。要让decoder看一些错误的东西,可能表现效果更好。)

而在测试的时候,显然没有正确答案给Decoder看,所以存在数据的不匹配问题。
image.png

训练时的Tips:

1.Copy Mechanism 复制机制

之前我们都是要求Decoder自己产生输出,也许Decoder没必要自己创造输出,它需要做的事情也许是从输入中复制一些东西出来。

这种机制可能在聊天机器人任务中使用。
image.png
也可能在文本摘要中使用。

6.Non-Autoregressive Sequence Generation 非自回归句子生成

像条件语句生成任务,如语音辨识、看图说话、机器翻译等等。
image.png
自回归模型(Decoder用的masked Self-Attention)。像机器翻译使用RNN,先把输入的句子Encode成一排vector,然后在解码时,后一个字依赖于前一个字,属于自回归模型。这种自回归模型的缺点是,如果我们要解码的句子很长,解码的时间就和句子的长度成正比。
image.png
image.png
引入Transformer之后,如果用自回归模型,相比于RNN来说,只是Encode操作变成了parallel的,但是Decode过程和RNN一样,一个接一个。

image.png

多模态问题(multi modality problem):同一个输入,可能对应很多不同模式的output。
image.png
这就是Non-Autoregressive可能遇到的问题,因为它的输出是并行产生的,所以,就会出现每个位置输出的随机组合问题。这个问题在Autoregressive中不存在。

一种解决这种问题的方法是,预测输入的每个字对应输出的字的个数,提前规划好输出的结构。
image.png

1.Mask-predict

  • 首先用一个Encoder来预测句子翻译后的长度,然后得到一版比较烂的翻译。

image.png

  • 然后把这一版烂的翻译作为decoder下一轮的输入,同时,要先把概率比较低的n个词用mask替换,然后解码之后的结果就比较好,因为它可以看到旁边已经生成的字长什么样子。
  • image.png

问:n怎么取?
decoder次数越多,n越小。也就是说,刚开始mask的单词数多点,后面少点。
image.png
image.png