LSTM NN:前向传播

Posted

技术标签:

【中文标题】LSTM NN:前向传播【英文标题】:LSTM NN: forward propagation 【发布时间】:2016-04-09 15:47:56 【问题描述】:

我是神经网络的新手,正在从头开始创建 LSTM。我有前向传播工作......但我对在训练模型、反向传播和内存管理的上下文中的前向传播中的移动部分有一些疑问。

所以,现在,当我运行前向传播时,我将新列 f_t, i_t, C_t, h_t, etc 堆叠在它们对应的数组上,因为我为 bptt 梯度计算积累了先前的位置。

我的问题是 4 部分:

1) 我需要回溯多长时间才能保留合理的长期记忆?(我的系统可能需要回溯 20-40 个时间步长的记忆(虽然我可以从更长的时间段中受益——这只是获得体面性能的最低要求——我现在只是在争取最低限度,所以我可以让它工作

2) 一旦我认为我的模型“经过训练”,我是否有任何理由让我保持超过 2 个时间步长,我需要计算下一个 C 和 @ 987654323@ 值?(其中C_t 是 Cell 状态,h_t 是 LSTM 网络的最终输出)在这种情况下,我需要多个版本的前向传播函数

3) 如果我要训练的时间序列数据有限,并且我想训练我的模型,那么当我在训练数据上训练它时,我的模型的性能是否会收敛一遍又一遍(相对于在一些最大平均性能附近振荡)?如果我实施 dropout,它会收敛吗?

4) 我需要考虑多少渐变分量?当我计算各种矩阵的梯度时,我在时间步 t 得到主要贡献,从时间步 t-1 得到次要贡献(并且计算一直递归到 t=0)?(在换句话说:主要贡献是否在梯度计算中占主导地位 - 由于次要分量导致的斜率变化是否足以保证在我反向传播时间步长时实现递归......)

【问题讨论】:

【参考方案1】:

    正如您所观察到的,它取决于数据中的依赖关系。但是如果我们不重置单元格和隐藏状态,即使我们只反向传播几个时间步长,LSTM 也可以学习学习更长期的依赖关系。

    没有。给定 c_t 和 h_t,您可以确定下一个时间步的 c 和 h。由于不需要反向传播,因此可以丢弃 c_t(如果您只对最终 LSTM 输出感兴趣,甚至可以丢弃 h_t)

    如果重新开始拟合,您可能会收敛。使用 Dropout 肯定有助于避免这种情况,尤其是在提早停止的情况下。

    h_t 将有 2 个梯度分量 - 一个用于当前输出,一个用于下一个时间步长。添加两者后,您无需担心任何其他组件

【讨论】:

以上是关于LSTM NN:前向传播的主要内容,如果未能解决你的问题,请参考以下文章

深入理解RNN与LSTM

深入理解RNN与LSTM

从NN到RNN再到LSTM: 循环神经网络RNN简介及计算

深度学习系列经典博客收藏

pytorch1.0 搭建LSTM网络

前向传播和反向传播