*注:本博客参考李宏毅老师2020年机器学习课程. 视频链接
本节可参考原文:Attention Is All You Need.
在上一节中提到,模型的输入和输出有多种不同的类型,我们使用Self-Attention来处理输入和输出都是定长序列的情况。对于输入和输出都是不定长序列的问题,称为Seq2seq,这一届我们将会讲到如何处理这样的问题。以下是一些典型的Seq2seq问题:
Seq2seq问题的解决方案一般都有Encoder和Decoder两个部分,Encoder接收输入数据,处理后传递给Decoder,Decoder再次对数据进行处理产生输出数据。
Encoder要做的事情,就是输入一排向量,输出一排同样长的向量。因此可以使用Self-Attention来完成,此外,CNN、RNN也都能够胜任这件事情。在Transformer中使用到的就是Self-Attention。但是除此之外,Transformer还是用了一些其他的结构。
(图1,来自李宏毅2021春机器学习课程)
在图1中描述了Transformer的Encoder中的block的结构,从下往上依次进行:
整个块可能会重复n次。
(图2,来自李宏毅2021春机器学习课程)
上述网络结构是Attention Is All You Need原文中的结构,实际上我们设计网络结构不一定完全遵循上述结构,修改结构,调整参数,调换各个层之间的顺序,也许能得到更好的结果。深度学习的模型就是如此玄学。下面的一些文章中对Transformer的结构做了一些调整,得到了更好的结果:
常见的Decoder结构包括Autoregressive(AT)和Non Autoregressive(NAT)两种。
AT结构的Decoder产生输出的过程如图3,我们假设有一个语音识别模型需要识别一段包含“机器学习”的语音片段。
上述步骤中有3个问题:
我们先来看第一个问题。对于文字的输入和输出,一种常见的作法是,设置一个one-hot编码,将每一个字作为一个分量,例如我们希望模型能够识别常用的4000个汉字,那么我们需要设置一个长为4000的向量,假设“机”是第i个字,那么将该向量的第i个分量设置为1,其余为0.
对于Seq2seq的问题,由于输出长度的不确定性,让模型有能力输出不同长度的结果是很有必要的。我们可以在one-hot编码中规定一个特殊的分量,表示终止计算,当Decoder输出了这一特殊变量,就停止输出。
由于AT产生输出是依赖于上一个输出的,为了避免上一个错误的输出对于后来输出的影响,在训练模型时,可以手动添加一些错误的数据(noise),增强模型的健壮性。
(图4,来自李宏毅2021春机器学习课程)
Decoder的网络结构与Encoder相似,如图4,图中与Encoder不同的地方在于:
NAT最大的特点在于它能够并行产生输出,只需要一次输入就能够同时产生所有的输出,如图6.
对于NAT Decoder,输入 n n n个BEGIN,就会产生 n n n个输出,由于使用了位置编码,所以不必担心同样的输入会产生同样的输出的情况。
使用NAT的问题在于,如何确定需要输入多少个BEGIN才能产生合适的数量的输出呢?
注:所谓的输出长度可控,意指NAT能够通过手动改变分类器输出值来控制输出的长度,在TTS中表现为说话速度加快或减慢。
训练时,将BEGIN和正确的输出(ground truth)依次输入Decoder,再将Decoder的输出与ground truth计算交叉熵,通过梯度下降算法最小化该损失函数。注意:由于Decoder需要输出END来结束计算,因此计算交叉熵时,应该在ground truth中添加一个END。
将ground truth作为输入来训练模型的方法称为Teacher Forcing。
训练时,使用交叉熵作为损失函数。测试时,使用BLEU score作为挑选模型的依据。BLEU score比较模型输出与ground truth,得出一个相似度的分数,这种计算无法微分,因此难以用作损失函数。
但是可以使用强化学习(Reinforcement Learning)的方法,将BLEU score作为award来优化模型,参考:Sequence Level Training with Recurrent Neural Networks.
在某些任务中,模型需要复制输入中的一些内容,而不是创造它。例如在人机对话任务中,对于用户的姓名、讨论的事件、专有名词等;此外,在摘要任务中,复制是一件经常发生的事情,参考:Get To The Point: Summarization with Pointer-Generator Networks.
Incorporating Copying Mechanism in Sequence-to-Sequence Learning:这篇文章中描述了如何为实现这样的复制机制。
有时模型训练完成之后会出现一些异常情况,例如对于语音生成任务,模型并没有从左到右使用到所有的数据,这时需要引导模型按照我们想要的方向去运作,就需要使用到Guided Attention技术。
由于在AT的Decoder中,输出是按序依次产生的,每次输出模型都需要在若干个可能的输出中选择一个。这种贪心算法可能无法取得全局的最优值(即全局的soft max 概率最高),Beam Search就是用来解决这种情况的。
然而,并非对于所有的任务来说,全局最优都是最好的结果,有时贪心算法能够取得更好的结果。
先线性增加学习速率,再以平方根减少学习速率,这样能够再早期的训练轮次中稳定训练效果。
训练文本翻译模型时,可以同时训练一个逆翻译模型,将目标文本重新转化为外文,再次将这个数据作为翻译模型的输入。