可以通过梯度校正 LSTM 中的实际单元状态吗?

数据挖掘 lstm
2022-03-17 09:05:30

为什么在 LSTM 中我们计算梯度权重,而不是细胞状态?

理论上是否可以更正单元格状态的内容,它会导致什么结果?

我知道权重就像一套“技能”,因此网络可以正确响应输入,甚至是以后的无数次迭代。细胞状态是对过去发生的事情的理解,直到当前小批量的开始。

那么为什么不更正存储在单元状态中的值呢?如果我们在小批量之间将细胞状态向前推进,那将非常有用。

https://stackoverflow.com/a/44183738/9007125]

通常建议在每个 epoch 之后重置状态,因为状态可能会增长太久而变得不稳定然而,根据我对小型数据集(20,000-40,000 个样本)的经验,在一个时期后重置或不重置状态对最终结果没有太大影响。对于更大的数据集,它可能会有所作为。

1个回答

理论上是否可以更正单元格状态的内容,它会导致什么结果?

是的。使用反向传播,可以获得影响定义明确的输出的任何值的梯度。对于训练数据,包括所有当前单元格的输出——事实上,为了获得权重的梯度,这些是作为中间步骤计算所必需的。一旦有了成本或误差函数的梯度,就可以执行梯度下降步骤,以发现一个值,该值会导致给定训练数据的误差较小。

在通常的训练场景中,您不会在使用前馈计算神经元输出后更改它们,因为这些不是模型的参数。改变神经元值(甚至输入)的典型原因是为了查看给定场景中的理想状态。如果您的状态可以通过某个解码器(甚至可能是另一个神经网络)可视化,那么这可以让您看到实际内部状态与可能更好的状态之间的差异。例如,这在错误分析中可能很有用。

那么为什么不更正存储在单元状态中的值呢?

这是因为在通常的训练场景中,您正在创建一个预测输出值的网络。您可以计算训练数据的正确校正,但不能在预测时计算,因为预测的全部目的是估计您还没有的标签。因此,您希望更改函数参数,而不是临时值。

如果我们在小批量之间将细胞状态向前推进,那将非常有用。

仅在训练期间。在预测场景中,您通常无法计算必要的梯度。您不想要的是训练一个系统,然后需要使用您在生产中没有的错误值和梯度。

在某些场景中,例如在线系统预测下一个项目xt+1在一个序列中,您可以在观察到下一个项目之后和继续预测序列之前立即根据错误进行训练xt+2,您可以使用该方法。我不确定它是否有助于提高性能,但原则上它可以如果它确实有帮助,您必须将改进与其他更简单的变化进行比较,例如网络上的不同超参数没有使用梯度校正内部状态。


总之,您的想法可能会在具有近乎即时反馈的在线系统中运行良好。在这种情况下,您可以将一组权重视为“从数据更新信念状态的规则”,而隐藏层神经元的输出是“当前信念状态”。当错误发生时,更新导致错误的规则和由早期错误规则产生的当前信念似乎是有意义的。也许值得一两次实验。主要需要注意的是,两个更新过程(权重和 LSTM 层状态)会相互作用和/或相互适应,因此与仅向层中添加更多 LSTM 单元相比,它可能不会导致明显不同的性能。