LSTM NN:前向传播

LSTM NN: forward propagation

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

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

我的问题是4部分:

1) 为了保留合理的长期记忆,我需要向后传播多远的时间?(记忆回溯 20-40 个时间步长可能是什么我需要我的系统(尽管我可以从更长的时间段中获益——这只是获得良好性能的最低限度——我现在只争取最低限度,所以我可以得到它工作)

2) 一旦我考虑我的模型 "trained," 是否有 任何 理由让我保留超过我需要的 2 个时间步长计算下一个Ch值?(其中C_t是Cell状态,h_t是LSTM网络的最终输出)在这种情况下,我需要多个版本的前向传播函数

3) 如果我要训练的时间序列数据有限,并且我想训练我的模型,那么我的模型的性能 收敛我一遍又一遍地在训练数据上训练它(相对于围绕一些最大平均性能波动)?如果我实现 dropout,它会收敛吗?

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

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

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

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

  4. h_t 将有 2 个梯度分量 - 一个用于当前输出,一个来自下一个时间步长。一旦你添加了两者,你就不必担心任何其他组件