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

机器算法验证 神经网络 深度学习 自然语言 反向传播
2022-03-03 20:35:43

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

就我而言,我想要分类的每个文本部分都比展开的 30 个步骤(约 100 个单词)长得多。根据我的知识,BPTT 仅针对单个文本部分运行一次,即当它通过整个文本部分并计算二进制分类目标时,y,然后将其与损失函数进行比较以找到错误。

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

2个回答

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

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

首先考虑一个人为的例子。假设您的网络将在其输入中的任何位置生成 1,否则生成 0。假设您在长度为 20 的序列上训练网络,然后将梯度限制为 10 步。如果训练数据集在输入的最后 10 步中从未包含 1,那么网络将在任何配置的测试输入中出现问题。但是,如果训练集有一些像 [1 0 0 ... 0 0 0] 和其他像 [0 0 0 ... 1 0 0] 的例子,那么网络将能够接受“存在输入中任何位置的 1" 特征。

然后回到情绪分析。假设在训练过程中,您的模型遇到了一个很长的否定句,例如“我讨厌这个,因为......周围和周围”,省略号中有 50 个单词。通过将梯度传播限制为 30 个时间步,模型不会将“我讨厌这个因为”连接到输出标签,因此它不会从这次训练中获取“我”、“讨厌”或“这个”例子. 但它会从句子末尾开始 30 个时间步内提取单词。如果您的训练集包含其他包含这些相同单词的示例,可能还有“仇恨”,那么它就有机会发现“仇恨”和负面情绪标签之间的联系。此外,如果您有较短的训练示例,请说:“我们讨厌这个,因为它太糟糕了!” 那么您的模型将能够将“仇恨”和“这个”特征连接到目标标签。如果你有足够多的这些训练示例,那么模型应该能够有效地学习连接。

在测试时,假设您向模型展示另一个长句,例如“我讨厌这个,因为......在壁虎上!” 模型的输入将以“我讨厌这个”开头,它将以某种形式传递到模型的隐藏状态。这种隐藏状态用于影响模型的未来隐藏状态,因此即使在句子结束之前可能有 50 个单词,这些初始单词的隐藏状态在理论上也有可能影响输出,即使它从来没有在“我讨厌这个”和句子结尾之间包含如此大距离的样本上进行训练。

@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