在使用截断的反向传播时捕获初始模式(RNN / LSTM)


12

假设我使用RNN / LSTM进行情感分析,这是一种多对一的方法(请参阅此博客)。通过截断时间反向传播(BPTT)对网络进行训练,在该网络中,像往常一样仅在最后30个步骤中展开网络。

就我而言,我要分类的每个文本节都比展开的30个步骤(〜100个单词)长得多。根据我的知识,BPTT仅对单个文本部分运行一次,这是当BPTT遍历整个文本部分并计算了二进制分类目标,它将与损失函数进行比较以发现错误。y

这样就永远不会针对每个文本部分的第一个单词计算梯度。然后,RNN / LSTM如何仍然调整其权重以捕获仅在前几个单词内出现的特定模式?例如,假设所有标记为句子均以“我爱这个” 开头,所有标记为句子均以“我讨厌这个”开头。当RNN / LSTM到达100步长序列的末尾时,它仅在最后30步才展开时,将如何捕获呢?positivenegative


通常,缩写是TBPTT表示时间上的反向截断。
查理·帕克

Answers:


11

的确,将梯度传播限制为30个时间步将阻止它学习数据集中所有可能的信息。但是,这是否会阻止它学习关于模型特征的重要知识,在很大程度上取决于您的数据集!

在训练期间限制梯度更像是限制模型可以高置信度吸收模型的输入特征和隐藏状态的窗口。因为在测试时将模型应用于整个输入序列,所以它仍然能够将有关所有输入要素的信息合并到其隐藏状态中。在做出对句子的最终预测之前,它可能并不确切知道如何保存该信息,但是可能仍然可以建立一些(公认较弱的)联系。

首先考虑一个人为的例子。假设您的网络在输入中任何地方都有1时生成1,否则就生成0。假设您以长度为20的序列训练网络,然后将梯度限制为10步。如果训练数据集在输入的最后10个步骤中从不包含1,则网络将对任何配置的测试输入产生问题。但是,如果训练集有一些示例,例如[1 0 0 ... 0 0 0],而其他示例,例如[0 0 0 ... 1 0 0],则网络将能够从“存在的1“功能在其输入中的任何位置。

然后回到情绪分析。假设在训练过程中,您的模型遇到了很长的否定句子,例如“我讨厌这个,因为……周围……”,用省略号表示50个单词。通过将梯度传播限制为30个时间步长,模型将不会将“我讨厌这是因为”与输出标签相关联,因此该培训不会从“ I”,“恨”或“此”中选取。但是它将从句子结尾处的30个时间步内提取单词。如果您的训练集包含其他包含相同词的示例(可能还包含“仇恨”),那么它就有机会在“仇恨”和负面情绪标签之间建立联系。另外,如果您的培训示例较短,请说:“我们讨厌这样做,因为它太可怕了!” 那么您的模型就可以将“讨厌”和“此”功能连接到目标标签。如果您有足够的这些培训示例,那么该模型应该应该能够有效地学习连接。

在测试时,假设您在模型上再加上一个长长的句子,例如“我讨厌这样做,因为...在壁虎上!” 模型的输入将以“我讨厌这个”开始,它将以某种形式传递到模型的隐藏状态。该隐藏状态用于影响模型的未来隐藏状态,因此,即使句子末尾可能有50个单词,这些初始单词的隐藏状态在理论上也有可能影响输出,即使它从来没有在样本中接受过培训,样本中“我讨厌这个”和句子结尾之间的距离非常大。


0

@ Imjohns3是正确的,如果您处理长序列(大小为N)并将反向传播限制为最后K个步骤,则网络一开始将不会学习模式。

我已经处理了很长的文章,并使用了计算损耗的方法,并且每K个步骤都要进行反向传播。假设我的序列有N = 1000个令牌,我的RNN流程首先是K = 100,然后尝试进行预测(计算损失)和反向传播。接下来,在保持RNN状态的同时制动梯度链(在pytorch-> detach中),并开始另一个k = 100步。

您可以在这里找到此技术的一个很好的例子:https : //github.com/ksopyla/pytorch_neural_networks/blob/master/RNN/lstm_imdb_tbptt.py

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.