训练迭代过程早期的RNN预测能力非常弱,几乎不能给出好的生成结果。如果某一个unit产生了垃圾结果,必然会影响后面一片unit的学习。
teacher forcing最初的motivation就是解决这个问题的。
其实RNN存在着两种训练模式(mode):
free-running mode就是大家常见的那种训练网络的方式: 上一个state的输入作为下一个state的输出。而Teacher Forcing是一种快速有效地训练循环神经网络模型的方法,该模型使用来自先验时间步长的输出作为输入。
所谓Teacher Forcing,就是在学习时跟着老师(ground truth)走!
它是一种网络训练方法,对于开发用于机器翻译,文本摘要,图像字幕的深度学习语言模型以及许多其他应用程序至关重要。它每次不使用上一个state的输出作为下一个state的输入,而是直接使用训练数据的标准答案(ground truth)的对应上一项作为下一个state的输入。
看一下大佬们对它的评价:
Models that have recurrent connections from their outputs leading back into the model may be trained with teacher forcing. — Page 372, Deep Learning, 2016.
译: 存在把输出返回到模型输入中的这种循环连接单元的模型可以通过Teacher Forcing机制进行训练。
这种技术最初被作为反向传播的替代技术进行宣传与开发
An interesting technique that is frequently used in dynamical supervised learning tasks is to replace the actual output y(t) of a unit by the teacher signal d(t) in subsequent computation of the behavior of the network, whenever such a value exists. We call this technique teacher forcing. — A Learning Algorithm for Continually Running Fully Recurrent Neural Networks, 1989.
译: 在动态监督学习任务中经常使用的一种有趣的技术是,在计算过程中用教师信号 d ( t ) d(t) d(t) 替换上一个单元的实际输出 y ( t ) y(t) y(t) 。我们称这种技术为Teacher Forcing。
Teacher Forcing工作原理: 在训练过程的 t t t 时刻,使用训练数据集的期望输出或实际输出: y ( t ) y(t) y(t), 作为下一时间步骤的输入: x ( t + 1 ) x(t+1) x(t+1),而不是使用模型生成的输出 h ( t ) h(t) h(t)。
Teacher forcing is a procedure […] in which during training the model receives the ground truth output y(t) as input at time t + 1. — Page 372, Deep Learning, 2016.
译: teacher forcing 是这样的一个程序: 在训练过程中接收ground truth的输出 y ( t ) y(t) y(t) 作为 t + 1 t+1 t+1时刻的输入
给定如下输入序列:
Mary had a little lamb whose fleece was white as snow
我们想要训练这样一个模型,在给定序列中前一个单词的情况下生成序列中的下一个单词。
那首先,我们得给这个序列的首尾加上起止token:
[START] Mary had a little lamb whose fleece was white as snow [END]
接下来,我们把 “[START]” 输入模型,让模型生成下一个单词。
想象下,现在模型生成了一个 “a”, 不过我们当然期望它先生成一个 “Mary”。
X X X | y ^ \hat{y} y^ |
---|---|
“[START]” | “a” |
接下来,如果把"a"输入模型,来生成序列中的下一个单词,那现在的情况就是:
X X X | y ^ \hat{y} y^ |
---|---|
“[START]” , “a” | ? |
可以看到,模型现在已经偏离正轨 ,因为生成的错误结果,会导致后续的学习都受到不好的影响,导致学习速度变慢,模型也变得不稳定。
假如现在模型生成了一个“a”,我们可以在计算了error之后,丢弃这个输出,把"Marry"作为后续的输入。如果要继续预测下一个单词的话,那么现在的情形就变成了:
X X X | y ^ \hat{y} y^ |
---|---|
“[START]” , “Marry” | ? |
以此类推,所有训练步骤情形为:
X X X | y ^ \hat{y} y^ |
---|---|
“[START]” | ? |
“[START]” , “Marry” | ? |
“[START]”, “Marry”, “had” | ? |
“[START]”, “Marry”, “had”, “a” | ? |
… | ? |
该模型将更正模型训练过程中的统计属性,更快地学会生成正确的序列。
Teacher Forcing同样存在缺点: 一直靠老师带的孩子是走不远的。
因为依赖标签数据,在训练过程中,模型会有较好的效果,但是在测试的时候因为不能得到ground truth的支持,所以如果目前生成的序列在训练过程中有很大不同,模型就会变得脆弱。
也就是说,这种模型的cross-domain能力会更差,也就是如果测试数据集与训练数据集来自不同的领域,模型的performance就会变差。
那有没有解决这个限制的办法呢?
在预测单词这种离散值的输出时,一种常用方法是对词表中每一个单词的预测概率执行搜索,生成多个候选的输出序列。
这个方法常用于机器翻译(MT)等问题,以优化翻译的输出序列。
beam search是完成此任务应用最广的方法,通过这种启发式搜索(heuristic search),可减小模型学习阶段performance与测试阶段performance的差异。
注: 本来我想翻译为课程学习,后来感觉太不对原本的意思,所以改为"有计划地学习"
如果模型预测的是实值(real-valued)而不是离散值(discrete value),那么beam search就力不从心了。
因为beam search方法仅适用于具有离散输出值的预测问题,不能用于预测实值(real-valued)输出的问题。
Curriculum Learning是Teacher Forcing的一个变种:
We propose to change the training process in order to gradually force the model to deal with its own mistakes, as it would have to during inference. — Scheduled Sampling for Sequence Prediction with Recurrent Neural Networks, 2015.
译: 我们建议改变训练过程,以便逐步迫使模型处理它自己的错误,就像它在推断过程中必须做的那样。
有计划地学习的意思就是: 使用一个概率 p p p去选择使用ground truth的输出 y ( t ) y(t) y(t)还是前一个时间步骤模型生成的输出 h ( t ) h(t) h(t)作为当前时间步骤的输入 x ( + 1 ) x(+1) x(+1)。
这个概率 p p p会随着时间的推移而改变,这就是所谓的计划抽样(scheduled sampling)
训练过程会从force learning开始,慢慢地降低在训练阶段输入ground truth的频率。
本文一部分译自: https://machinelearningmastery.com/teacher-forcing-for-recurrent-neural-networks/