本文是根据台大李宏毅教授网课整理,主要是记笔记以供自己复习。
这里写目录标题
Transformer
是什么
Transformer其实就是一个Seq2Seq Model(输入是一个序列输出也是一个序列但是长度由机器决定)。
应用
- Seq2Seq Model的应用很多,主要用于自然语言处理。
- 比如输入一段语音,可以输出该语音对应的文字翻译。
- 但是Seq2Seq也可以用于Image处理:比如物体检测,输入一个image序列,然后输出是class label和检测出的所有bounding box。
- 还可以用与多分类问题(Multi-label classification):输入一段文本,输出对应的类别(类别数目不确定)
应用很广泛,主要就是处理输出序列长度不确定的情况下。(哈哈哈好多任务都是 硬train)
Seq2Seq架构详解
是一个Encoder和Decoder架构。
Encoder
实现,输入一个序列输出一个序列,RNN和CNN都可以实现。
总体架构如下图所示:
包含多个block块,每个block块中有多个层。
block的详细计算过程如下:
input----->Self-Attention层------>residual计算------>layer norm------>FC------>residual计算------>layer norm
对应Transformer中的Encoder结构图如下(是原始的Transformer的架构):
当然可以修改该Encoder的架构,已有的工作对该结构进行了修改,如下图所示,论文1对应图(b)将layer norm的位置进行了调整。
论文2解释了为什么要是用layer norm而不是batch norm,而且设计了power norm。
(哈哈哈这两个论文没有看呢~)
Decoder
Decoder有两种:
- Autoregressive(AT)
- Non-Autoregressive(NAT)
Autoregressive(AT)
Decoder就是实现将Encoder的输出转换为最终的结果序列。
(下面以语音辨识为例讲解:输入一段声音输出一段文字。)
一开始Decoder的输入是“begin”符号。然后Decoder输出一个vector,表征各个汉字的得分。
选取得分最高的,与begin一起做为Decoder下一步的输入,
Decoder的输入输出过程如下:
Transformer中Decoder的详细结构如下:
可以注意到在Transformer的Decoder结构中,Attention模块是Masked Multi-Head Attention。
其实使用Masked Multi-head Attention的原因很简单,思考前面Decoder的输入,是一个依序的过程,有b1之后才能得到a2.……
最重要的一个问题:机器如何知道何时结束Decoder呢?
加入一个结束符号,
期望的Decoder的运作过程变成:
Non-autoregressive(NAT)
下图是AT和NAT的比较。
NAT输入是一串Begin符号,然后直接输出结果序列。
疑问,对于NAT如何知道输出序列的长度呢?
- 另外设计一个网络输出决定序列的长度
- 将End符号加入到字符序列中,对于Decoder的输出,忽略End之后的部分。
NAT Decoder的优点:
- 并行输出:对于AT的Decoder需要从前往后一次一次的Decoder。
- 可以控制输出的长度:上面说到我们可以设计一个网络去得到Decoder的输出长度,因此我们仅需对网络输出的长度大小进行(手动)操作就可以死控制Decoder的输出。
NAT的Decoder效果通常比AT差。
那么Decoder是如何处理Encoder的输入的呢?
如图,Encoder的输出同个两个分支进入到Decoder的Masked Multi-Head Attention中。处理过程称为cross-attention。
Cross-Attention的处理过程:
类比Self-Attention的计算过程。
训练
label使用one-hot编码。
Teacher Forcing:使用ground truth作为输入。
训练时,Decoder输入为ground truth。
将输出与ground truth的one-hot编码进行计算cross entropy loss。
思考:BLEU Score(bilingual evaluation understudy)是计算两个句子语义相似程度的方法,为什么不使用该函数作为训练的Loss呢?
该函数的计算非常复杂无法微分。
exposure bias
在训练Decoder是输入是ground truth,但是在测试时使用的是Decoder的输出,因此会出现Decoder输出错误而导致错误向后传播的情况。
如何处理?
Scheduled Sampling:在训练时给Decoder的输入加些错误。
下面有些论文讲述Scheduled Sampling(没看,留坑)