一文弄懂关于循环神经网络(RNN)的Teacher Forcing训练机制


我看到有些seq2seq模型训练过程中使用了这个机制,一时搜不到适合我的中文教程资源,寥寥一两篇翻译国外大神的,不过那翻译质量个人觉得还是差,那就自己动手写下这个学习笔记吧。

一 RNN在训练过程中的问题

训练迭代过程早期的RNN预测能力非常弱,几乎不能给出好的生成结果。如果某一个unit产生了垃圾结果,必然会影响后面一片unit的学习。
teacher forcing最初的motivation就是解决这个问题的。

二 RNN的两种训练模式

其实RNN存在着两种训练模式(mode):

  1. free-running mode
  2. teacher-forcing mode

free-running mode就是大家常见的那种训练网络的方式: 上一个state的输出作为下一个state的输入。而Teacher Forcing是一种快速有效地训练循环神经网络模型的方法,该模型使用来自先验时间步长的输出作为输入。

三 什么是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时刻的输入

四 Free-Running vs Teacher Forcing 实例

给定如下输入序列:

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]” 输入模型,让模型生成下一个单词。

4.1 Free-running 训练过程

想象下,现在模型生成了一个 “a”, 不过我们当然期望它先生成一个 “Mary”。

X X X y ^ \hat{y} y^
“[START]”“a”

接下来,如果把"a"输入模型,来生成序列中的下一个单词,那现在的情况就是:

X X X y ^ \hat{y} y^
“[START]” , “a”?

可以看到,模型现在已经偏离正轨 ,因为生成的错误结果,会导致后续的学习都受到不好的影响,导致学习速度变慢,模型也变得不稳定。

4.2 Teacher-Forcing 训练过程

假如现在模型生成了一个“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的缺点及其解决办法

5.1 Teacher Forcing的缺点

Teacher Forcing同样存在缺点: 一直靠老师带的孩子是走不远的。
因为依赖标签数据,在训练过程中,模型会有较好的效果,但是在测试的时候因为不能得到ground truth的支持,所以如果目前生成的序列在训练过程中有很大不同,模型就会变得脆弱。
也就是说,这种模型的cross-domain能力会更差,也就是如果测试数据集与训练数据集来自不同的领域,模型的performance就会变差。
那有没有解决这个限制的办法呢?

5.2 集束搜索(Beam Search)

在预测单词这种离散值的输出时,一种常用方法是对词表中每一个单词的预测概率执行搜索,生成多个候选的输出序列。
这个方法常用于机器翻译(MT)等问题,以优化翻译的输出序列。
beam search是完成此任务应用最广的方法,通过这种启发式搜索(heuristic search),可减小模型学习阶段performance与测试阶段performance的差异。

5.3 有计划地学习(Curriculum Learning)

注: 本来我想翻译为课程学习,后来感觉太不对原本的意思,所以改为"有计划地学习"
如果模型预测的是实值(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/

  • 105
    点赞
  • 217
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
RNN循环神经网络)是一种在序列数据上进行训练和预测的神经网络模型。它具有一种循环结构,可以在处理序列数据时考虑到先前的信息。 要训练RNN,首先需要准备输入数据和目标数据。输入数据可以是一个或多个序列,例如文本、音频或时间序列数据。目标数据则是对应于输入序列的预测结果。 一般来说,训练RNN的过程包括以下几个步骤: 1. 数据预处理:对输入数据进行标准化、归一化或者编码处理,以便于神经网络对其进行学习和处理。 2. 定义模型结构:选择适当的神经网络模型结构,并确定RNN的层数、每层的单元数等超参数。常见的RNN模型包括基本的RNN、LSTM和GRU等。 3. 初始化模型参数:为神经网络模型的权重和偏置项进行初始化。 4. 前向传播:将输入数据通过神经网络模型进行前向传播,得到预测结果。 5. 计算损失函数:将预测结果与目标数据进行比较,计算损失函数来衡量预测结果与真实结果之间的差异。 6. 反向传播:使用反向传播算法计算损失函数对于模型参数的梯度,以便于更新模型参数。 7. 更新模型参数:根据计算得到的梯度信息,使用优化算法(如梯度下降)来更新模型参数。 8. 重复上述步骤:重复执行前向传播、计算损失函数、反向传播和更新模型参数的步骤,直到达到预定的训练迭代次数或者满足停止准则。 RNN训练过程可以使用各种深度学习框架来实现,如TensorFlow、PyTorch等。这些框架提供了丰富的API和工具,使得训练过程更加简洁高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值