梯度检查 LSTM - 如何跨时间步获得成本变化?

数据挖掘 梯度下降
2021-09-26 06:09:22

我正在为我的 LSTM 执行梯度检查,它有 4 个时间步长。LSTM 如下所示:

   01       01       01       01
   ^        ^        ^        ^
  LSTM --> LSTM --> LSTM --> LSTM
   ^        ^        ^        ^
   11       11       11       11

因此,在每个时间步,我们都输入向量 {1,1} 并期望输出为 {0,1}。

假设我扰乱了 LSTM 内部的权重,然后执行 4 个前向 props - 每个时间步一个 - 我现在如何获得这个单一扰动引起的成本函数的增量?

我是否可以简单地将所有 4 个时间步的成本变化加起来,将其视为导数估计?


另外,我是否应该为 LSTM 执行如下操作:

  1. 向上扰动单个权重
  2. 前向道具 4 个时间步长
  3. 向下扰动重量
  4. 前向道具 4 个时间步长
  5. 获得 4 个增量
  6. 将 4 个增量相加得到成本的总变化

或者

  1. 设置 N=0
  2. 向上扰动重量
  3. 特定时间步长 N 的正向道具
  4. 向下扰动重量
  5. 在特定时间步长 N 的正向道具
  6. 获取单个增量,将其存储起来
  7. 增量 N
  8. 直到 N 不等于 4 返回步骤 2)
  9. 将 4 个增量相加得到成本的总变化

第二种方法似乎更正确,因为 LSTM 将具有隐藏状态..这是正确的直觉还是无关紧要?

2个回答

有趣的问题。

与标准反向传播一样,[通过时间的反向传播] 包括重复应用链式法则。微妙之处在于,对于循环网络,损失函数取决于隐藏层的激活,不仅通过它对输出层的影响,还通过它在下一个时间步对隐藏层的影响。

看起来这两种方法都会有相似的结果,但是粒度不同(在不同级别添加噪声),这是因为反向传播并没有真正受到这种添加的干扰,因为它仍然从最后一个时间步链接到第一个时间步。因此,正如本文第 IIIC 和 IV 部分所述,它归结为您实际上想要添加噪声的原因。

几个月后回答我自己的问题(在阅读@SanjayKrishna 的答案后)。

我的“方法 1”似乎更正确,但造成的麻烦比实际需要的要多。

不要忘记成本是均方误差。在我的具体情况下,它是每个时间步的错误的平均值。正是这个 MSE 让我们看到了“增量”。

C=小号=1=0=(一个C一个l-w一个ned)2

因此,我们应该做到以下几点:

  1. peturb 一个重量向上
  2. 执行完整的前向道具(例如,15 个时间步),cost_a从您的 MSE 获取。它应该只是一个标量值。
  3. 向下移动重量
  4. 重做完整的 fwd 道具以cost_b从您的 MSE 获取另一个标量值。
  5. cost_a通过减去计算增量(只是一个标量值)cost_b
  6. 将增量与在 BackPropThroughTime 期间计算的梯度进行比较(根据所有时间步估计的特定权重的梯度)

编辑

我实际上使用的是“平均 SoftMaxedCrossEntropy”之类的东西,而不是 MSE。但想法是一样的:将每个时间步的误差相加,除以这就是我的成本。