62 序列到序列学习(seq2seq)【动手学深度学习v2】

序列到序列学习(seq2seq)

- 上图展示的是 DNA 转录,它也是一种序列到序列的学习
机器翻译
- seq2seq 最早是用来做机器翻译的,给定一个源句子,自动翻译成目标语言

- 给定一个源语言的句子,自动翻译成目标语言
- 机器翻译中的输入序列和输出序列都是长度可变的
seq2seq
编码器-解码器(encoder-decoder)架构

- seq2seq 指的是一个特定的模型,它的编码器是一个 RNN(循环神经网络),使用长度可变的序列作为输入,将其转换为固定形状的隐状态;然后将最终的隐藏状态传给解码器,隐藏状态包括了整个源句子(输入序列)的信息;解码器使用另外一个 RNN ,基于输入序列的编码信息和输出序列已经看见的或者生成的词元来预测下一个词元,从而连续生成输出序列的词元
- 编码器将长度可变的输入序列转换成形状固定的上下文变量,并且将输入序列的信息在该上下文变量中进行编码
- 编码器可以是单向的循环神经网络,其中的隐藏状态只依赖于输入子序列,这个子序列是由输入序列的开始位置到隐藏状态所在的时间步的位置(包括隐藏状态所在的时间步)组成
- 编码器也可以是双向的循环神经网络,其中隐藏状态依赖于两个输入子序列,两个子序列是由隐藏状态所在的时间步的位置之前的序列和之后的序列(包含隐藏状态所在的时间步),因此隐藏状态对整个序列的信息都进行了编码。双向不能做语言模型,但是双向可以做翻译;双向可以做编码器,但不能做解码器,解码器需要做预测,编码器不需要
- <bos> 表示序列开始词元,代表一个句子的开始,它是解码器的输入序列的第一个词元
- <eos> 表示序列结束词元,代表一个句子的结束(解码器输出的句子长度是可以变化的,一旦输出序列生成此词元,模型就会停止预测)
- RNN 做编码器可以输入任意长度的序列,最后返回最后时刻的隐藏状态,使用 RNN 编码器最终的隐状态来初始化解码器的隐状态,解码器一直输出,直到看到句子的结束标志为止
- seq2seq 也可以做可变长度到可变长度的句子之间的翻译

隐藏状态是怎么传递的?
Seq2Seq P1 - 04:44
- 编码器是没有输出的 RNN
- 编码器最后时间步的隐藏状态作为解码器的初始隐藏状态
训练

- 训练时将特定的开始词元(“<bos>”)和原始的输出序列(不包括序列结束词元“<eos>”)拼接在一起作为解码器的输入,这也称为强制教学(teacher forcing,因为原始的输出序列(词元的标签)被送入了解码器)
- 也可以将来自上一个时间步的预测得到的词元作为解码器的当前输入
- 训练和推理是不同的:编码器是相同的,但是在训练的时候,解码器是知道目标句子的,它知道真正的翻译是什么样子的,所以解码器的输入(每个 RNN 时刻的输出)所使用的实际上是真正的目标句子的输入,所以就算是在训练的时候翻译错了,下一个时刻的输入还是正确的输入,也就是说,在训练的时候所使用的是真正的目标句子来帮助训练,这样就降低了预测长句子的难度
推理

- 推理的时候没有真正的目标句子作为参考,每一个时刻只能将上一个时刻的输出作为这一时刻的输入,以此来不断地进行预测,即每个解码器当前时间步的输入都来自前一个时间步的预测词元,因此能够一个词元接一个词元地预测输出序列
- 和训练类似,序列开始词元(“<bos>”)在初始时间步就被输入到了解码器中
- 当输出序列的预测遇到序列结束词元(“<eos>”)时,预测就结束了
BLEU(bilingual evaluation understudy)
- 可以通过与真实标签序列进行比较来评估预测序列
- BLEU 最先是用于评估机器翻译的结果,但是它已经被广泛用于测量许多应用的输出序列的质量
- 原则上说,对于预测序列中的任意 n 元语法(n-grams),BLEU 的评估都是这个 n 元语法是否出现在标签序列中
- BLEU 的值越大越好,最大值为 1 ,越小的话效果越差
BLEU的定义

1、pn 表示 n-grams 的精度,它是两个数量的比值:第一个是预测序列与标签序列中匹配的 n 元语法的数量,第二个是预测序列中 n 元语法的数量的比率
Seq2Seq P1 - 08:14

- p1:考虑预测序列中所有的 1-gram,有 5 个 1-gram,即 A、B、B、C、D,所以分母为 5 ;再考虑这 5 个 1-gram ,是不是每一个 1-gram 都在标签序列中出现过(预测序列中除了第二个 B 并没有出现,因为在标签序列中 B 只出现了一次,其它都出现了,所以 p1 = 4/5)
- p2:考虑预测序列中所有的 2-gram,有 4 个 2-gram,即AB、BB、BC、CD,所以分母为 4 ;再考虑这 4 个 2-gram ,是不是每一个 2-gram 都在标签序列中出现过(预测序列中除了第二个 BB 并没有出现,因为在标签序列中 B 只出现了一次,其它都出现了,所以 p2 = 3/4)
- p3:考虑预测序列中所有的 3-gram,有 3 个 3-gram,即ABB、BBC、BCD,所以分母为 3 ;再考虑这 3 个 3-gram ,是不是每一个 3-gram 都在标签序列中出现过(预测序列中只有 BCD 在标签序列中出现了一次,其它都没有出现了,所以 p3 = 1/3)
- p4:考虑预测序列中所有的 4-gram,有 2 个 4-gram,即ABBC、BBCD,所以分母为 2 ;再考虑这 2 个 4-gram ,是不是每一个 4-gram 都在标签序列中出现过(预测序列中所有的 4-gram 都没有在标签序列中出现过,所以 p4 = 0/2)
2、len(label)、len(pred) 分别表示标签序列中的词元数和预测序列中的词元数,两个序列的词元数可以是不一样的
- 如果预测的长度比标签(真实)的长度少很多的话,len(label)/len(pred) 就会大于 1 ,整个指数项就会变成一个很小的数
- 所以说真实的标签很长,预测的长度很短的话,会导致前面的指数项比较小,因为预测的长度很短的话,就会越容易命中真实的标签,所以前半部分的指数项是为了惩罚较短的预测序列,防止预测的长度过短
3、pn 都是一个小于等于 1 的数,当预测序列和标签序列完全相同时,BLEU 为 1
- 由于 n 元语法越长则匹配难度越大,所以 BLEU 为更长的 n 元语法的精确度分配了更大的权重
总结
1、Seq2Seq 从一个句子生成另一个句子,机器翻译算是其中的一个应用场景
2、Seq2Seq 使用的是编码器-解码器的架构,编码器和解码器都是 RNN
3、将编码器最后时间隐藏状态来初始解码器隐状态来完成信息传递
4、在“编码器-解码器”训练中,强制教学方法将原始输出序列(而非预测结果)输入到解码器中
5、BLEU 是一种常用的评估方法,它通过测量预测序列和标签序列之间的 n 元语法的匹配度来衡量生成预测序列的好坏
Q&A
- 1、请问老师 PPT 里面的图是怎么制作的,直接在 PPT 里面画的,还是有其它一些工具,可以介绍一下吗,比如之前的 GRU 里面的各种门的解释图咋画的?
- QA P3 - 00:00
- 2、请问老师,encoder 输出和 decoder 的输入,拼接和按位相加起来有什么区别吗?
- QA P3 - 00:46
- 3、embedding 层是做 word2vec 吗?
- QA P3 - 01:12
- 4、encoder 的 output 和 decoder 的 output 是不是都是预测的词?encoder 的 output 是预测的英语没有使用,decoder 的 ouput 是预测的法语?
- QA P3 - 01:39
- 5、请问 valid length 是怎么选择的?Y_valid_len 是什么?
- QA P3 - 02:23
- 6、num_hiddens=32 为什么这么定义呢?
- QA P3 - 02:59
- 7、老师,现在 seq2seq 好像都用 transformer 实现了。RNN/LSTM 还有什么使用场景吗?
- QA P3 - 03:11
- 8、老师,我 bert、xlnet 这些模型都学过了,但是完全不知道 kaggle 该如何做,例如 ber 任务、信息抽取任务或者聊天机器人任务等,请问这是为什么,该如何入门呢?
- QA P3 - 04:55
- 9、实际句子的长度超过了设定的句子长度,是直接截掉不用了还是放到下一个句子?
- QA P3 - 06:05
- 10、请问老师,decoder 的输入和最终预测的输出一定是同一个东西吗?还是说二者可以不同呢?如果不同,怎么理解 decoder 学习到的是什么内容呢?此时该怎样理解 encoder 和 decoder 之间的关系?
- QA P3 - 06:48
----end----
其他参考
1、《动手学深度学习》,课程 PPT,https://courses.d2l.ai/zh-v2/assets/pdfs/part-3_9.pdf
2、《动手学深度学习》,教程,https://zh-v2.d2l.ai/chapter_recurrent-modern/seq2seq.html