一文弄懂关于循环神经网络(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/

要设计一个基于RNN的藏头诗生成器,首先需要对唐诗数据集进行详尽的预处理。这包括下载唐诗数据集,并使用nltk或jieba等工具进行文本清洗、分词处理,建立词汇表,将每个单词转换为整数编码,这是为了让模型能够理解和学习唐诗的词汇和结构。 参考资源链接:[使用RNN构建古诗生成器](https://wenku.csdn.net/doc/645b904895996c03ac2d82fe?spm=1055.2569.3001.10343) 接下来,需要构建RNN模型。在此过程中,可以使用TensorFlow框架来构建LSTM或GRU层。这些层能够帮助模型记忆和引用先前的数据,对于生成具有连贯性和结构性的古诗尤为关键。通常,模型会包含嵌入层以实现向量化的文本输入,以及一个或多个RNN层,有时候还需要加入全连接层来进行最终的预测输出。 在训练模型时,关键步骤是定义损失函数,通常使用交叉熵损失,以及选择合适的优化器,如Adam。训练过程中,需要设置合适的批量大小和迭代次数,通过损失函数来监控训练效果,并适时调整学习率等超参数。 为了使模型能够生成藏头诗,可以为模型添加特定的输入机制,例如提供一个特定的藏头作为模型的起始输入,然后让模型逐步生成藏头诗的其余部分。在这个过程中,可以采用Teacher Forcing技术或采样技术来指导模型生成下一个字符。 最后,模型的训练效果需要通过生成的藏头诗的质量来评估。生成的文本可能需要人工校验以确保其符合古诗的格式和风格。《使用RNN构建古诗生成器》一文详细介绍了如何从零开始构建这样的模型,提供了宝贵的实践经验和理论知识,是学习如何实现该任务不可或缺的资源。 参考资源链接:[使用RNN构建古诗生成器](https://wenku.csdn.net/doc/645b904895996c03ac2d82fe?spm=1055.2569.3001.10343)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值