文章目录
摘要
本周跟着李宏毅老师学习了Transformer,从序列到序列模型引入学习Transformer,Transformer 是一个基于自注意力的序列到序列模型,与基于循环神经网络的序列到序列模型不同,其可以能够并行计算。学习了Transformer的结构:编码器和解码器,和编码器-解码器注意力;学习了Transformer 的训练过程以及序列到序列模型的训练技巧。
Abstract
This week, I followed Mr. Li Hongyi to learn Transformer, and introduced the sequence-to-sequence model to learn Transformer. Transformer is a serial-to-sequence model based on self-attention, which is different from the serial-to-sequence model based on recurrent neural network, and can be calculated in parallel. Learned the structure of Transformer: encoder and decoder, and encoder-decoder attention; I have learned the training process of Transformer and the training skills of sequence-to-sequence model.
1.Transformer的结构
1.1 序列到序列(Seq2seq)的模型
序列到序列模型输入和输出都是一个序列,输入与输出序列长度之间的关系有两种情况。
- 输入跟输出的长度一样
- 机器决定输出的长度.
序列到序列的常见应用:
对于语音翻译为什么不使用语音识别和机器翻译相结合,因为有些语言是没有具体文字的,所以需要对这些语言做语音翻译,直接将其翻译成文字。
- 多标签分类(multi-label classification)
例如:有些文章属于多个分类,但是每个文章对应的类别的数量根本不一样,因此需要用序列到序列模型来做(让机器来决定输出几个类别)。
多分类问题(multi-class classification)是指分类的类别数大于 2。是可以给定一个阈值,只输出概率最高的几个类别
1.2 Transformer 结构
Transformer 是一个基于自注意力的序列到序列模型,与基于循环神经网络的序列到序列模型不同,其可以能够并行计算。
一般的序列到序列模型会分成编码器和解码器
编码器负责处理输入的序列,再把处理好的结果“丢”给解码器,由解码器决定要输出的序列。
1.2.1 Transformer 编码器(Encoder)
Transformer的编码器使用的是自注意力,输入一排向量,输出另外一个同样长度的向量。
编码器里面会分成很多的块(block),每一个块都是输入一排向量,输出一排向量。输入一排向量到第一个块,第一个块输出另外一排向量,以此类推,最后一个块会输出最终的向量序列
Transformer 的编码器的每个块并不是神经网络的一层,每个块的结构如下图右边所示。(在每个块里面,输入一排向量后做自注意力,考虑整个序列的信息,输出另外一排向量。接下来这排向量会“丢”到全连接网络网络里面,输出另外一排向量,这一排向量就是块的输出)
Transformer 里面加入了残差连接(residual connection)
例如:输入向量b到自注意力层后得到向量a并输出,输出向量 a 加上其输入向量 b 得到新的输出,得到残差的结果以后,再做层归一化(layer normalization)。
层归一化是对同一个特征、同一个样本里面不同的维度去计算均值跟标准差,接着做个归一化
对于Transformer的编码器,首先,在输入的地方需要加上位置编码。如果只用自注意力,没有未知的信息,所以需要加上位置信息。多头自注意力就是自注意力的块。经过自注意力后,还要加上残差连接和层归一化。接下来还要经过全连接的前馈神经网络,接着再做一次残差连接和层归一化,这才是一个块的输出,这个块会重复 N 次。
1.2.2 Transformer解码器(Decoder)
- 自回归(autoregressive)解码器
以语音识别为例:
输入语音“机器学习”通过Encoder输出一排向量,接下来解码器产生语音识别的结果,解码器把编码器的输出先“读”进去。要让解码器产生输出,首先给定一个特殊的标识符表示开始。
解码器会输出一个向量(该长度跟词表vocabulary的大小一样),在产生这个向量之前,跟做分类一样,通常会先进行一个 softmax 操作。这个向量里面的分数是一个分布,该向量里面的值全部加起来总和是 1。这个向量会给每一个中文字一个分,分数最高的中文字就是最终的输出。
如:解码器第一个输出的向量中,“机”的分数最高,所以“机”作为第一个输出
把“机”和标识符BEGIN继续作为输入,解码器继续输出下一个向量,“器”的分数最高,解码器拿“器”作为输出。
self-attention
原来的自注意力输入一排向量,输出另外一排向量,这一排中每个向量
都要看过完整的输入以后才做决定。
Masked Self-attention
Decoder使用掩蔽自注意力(masked self-attention),其通过一个掩码(mask)来阻止每个位置选择其后面的输入信息。
对于Decoder而言,先有
a
1
a^1
a1才有
a
2
a^2
a2,才有
a
3
a^3
a3才有
a
4
a^4
a4;而原来的自注意力机制中
a
1
到
a
4
a^1到a^4
a1到a4是一次整个输入到模型中。
同时,实际应用中输入跟输出长度的关系是非常复杂的,无法从输入序列的长度知道输出序列的长度,因此解码器必须决定输出的序列的长度。给定一个输入序列,机器可以自己学到输出序列的长度
解码器就要加上输出特殊标识符END。产生“习”之后,再把“习”作为解码器的输入,解码器就要输出END,整个解码器产生序列的过程就结束。
- 非自回归(non-autoregressive)解码器
非自回归不是一次产生一个字,它是一次把整个句子都产生出来。。非自回归的解码器可以输入一整排的特殊标识符BEGIN,一次产生产生一排词元(个数等于输入的标识符BEGIN的个数)。因为输出的长度是未知的,所以当做非自回归解码器输入的 BEGIN 的数量也是未知的,因此有如下两个做法。
- 用分类器来解决这个问题。用分类器“吃”编码器的输入,输出是一个数字,该数字代表解码器应该要输出的长度。
- 给编码器一堆输入BEGIN,假设输出有上限,但当输出标识符END时,后面再有输出就当他没输出。
1.2.3 编码器-解码器注意力(encoder-decoder attention)
编码器和解码器通过编码器-解码器注意力(encoder-decoder attention)传递信息,编码器-解码器注意力是连接编码器跟解码器之间的桥梁。
如图:解码器中编码器-解码器注意力的键和值来自编码器的输出,查询来自解码器中前一个层的输出。
编码器输入一排向量,输出一排向量
a
1
,
a
2
,
a
3
a^1,a^2,a^3
a1,a2,a3,首先解码器输入标识符BEGIN,经过掩蔽自注意力得到一个向量,把这个向量乘上一个矩阵,做一个变换(transform),得到一个查询 q,
a
1
,
a
2
,
a
3
a^1,a^2,a^3
a1,a2,a3也都产生键:
k
1
,
k
2
,
k
3
k^1,k^2,k^3
k1,k2,k3,把q跟
k
1
,
k
2
,
k
3
k^1,k^2,k^3
k1,k2,k3计算注意力分数得到
α
1
,
α
2
,
α
3
\alpha_1,\alpha_2,\alpha_3
α1,α2,α3,接下来做 softmax,得到
α
1
′
,
α
2
′
,
α
3
′
\alpha_1',\alpha_2',\alpha_3'
α1′,α2′,α3′,通过
v
=
α
1
′
×
v
1
+
α
2
′
×
v
2
+
α
3
′
×
v
3
v=\alpha_1'×v^1+\alpha_2'×v^2+\alpha_3'×v^3
v=α1′×v1+α2′×v2+α3′×v3得加权和
v
v
v,再作为输入到全连接网络。这个步骤 q 来自于解码器,k 跟 v 来自于编码器
1.3 Transformer 的训练过程
- Teacher Forcing:把标准答案(Ground Truth)作为输入。
计算标准答案(Ground Truth)跟分布之间的交叉熵(cross entropy),希望该交叉熵的值越小越好。每一次解码器在产生一个中文字的时候做了一次类似分类的问题。
1.4 sequence到sequence Model的训练技巧
- 复制机制(copy mechanism)
对很多任务而言,解码器没有必要自己创造输出,其可以从输入的东西里面复制一些东西。
- 引导注意力(Guided Attention)
引导注意力会强迫注意力有一个固定的样貌,注意力的位置都应该由左向右,不如就直接把这个限制放进训练里面,要求机器学到注意力就应该要由左向右。
- 束搜索(Beam Search)
这种每次找分数最高的词元来当做输出的方法称为贪心搜索(greedy
search),其也被称为贪心解码(greedy decoding)。红色路径就是通过贪心解码得到的路径。
但贪心搜索不一定是最好的方法,第一步可以先稍微舍弃一点东西,比较下红色路径与绿色路径,红色路径第一步好,但全部乘起来是比较差的,绿色路径一开始比较差,但最终结果其实是比较好的。
- 加入噪声
在训练的时候会加噪声,让机器看过更多不同的可能性,这会让模型比较棒,比较能够对抗它在测试的时候没有看过的状况
- 使用强化学习训练
训练的时候看cross entropy最低,再实际评估的时候看BLEU score
- 计划采样(scheduled sampling)
给解码器的输入加一些错误的东西,不要给解码器都是正确的答案,偶尔给它一些错的东西,它反而会学得更好
总结
学习了Transformer的相关结构以及理论,但是只是进行了简单的学习,后面我会继续深入学习。