合成梯度 - 有什么实际好处?

数据挖掘 反向传播
2021-10-04 12:46:45

我可以看到在 RNN中使用合成梯度的两个动机:

  1. 为了加快训练,通过立即用预测梯度校正每一层
  2. 能够学习更长的序列

我看到他们两个都有问题。请注意,我真的很喜欢 Synthetic Gradients 并希望实现它们。但我需要了解我的想法在哪里不正确。

我现在将说明为什么第 1 点和第 2 点似乎没有好处,如果它们实际上是有益的,我需要你纠正我:


第 1 点:

Synthetic Gradients 告诉我们,我们可以依靠另一个“mini-helper-network”(称为 DNI)来告知我们当前层什么梯度将从上方到达,即使在 fwd prop 期间也是如此。

然而,这样的梯度只会在之后的几个操作中出现。与没有 DNI 的情况下,必须完成相同数量的 Backprop,除了现在我们还需要训练 DNI。

添加此异步性不应使层的训练速度比传统的“锁定”完整 fwdprop -> 完整后退 prop 序列更快,因为设备必须完成相同数量的计算。只是计算会及时滑动

这让我认为第 1 点)行不通。简单地在每一层之间添加 SG 不应该提高训练速度。

第 2 点:

好的,仅在最后一层添加 SG以预测“未来的梯度”如何,并且仅当它是 forward prop 期间的最后一个时间步时

这样,即使我们的 LSTM 必须停止预测并且必须反向传播,它仍然可以预测它将收到的未来梯度(在最后一个时间步的 DNI 的帮助下)。


考虑几个培训课程(课程 A、课程 B):

fwdprop timestep_1A ---> fwdprop timestep_2A ---> fwdprop timestep_3A ----> 停止和 bkprop!

fwdprop timestep_1B ---> fwdprop timestep_2B ---> fwdprop timestep_3B ----> 停止和 bkprop!

我们刚刚强制我们的网络将 6 个时间步“解析”为两半:3 个时间步,然后再次剩余 3 个时间步。

请注意,我们的 DNI 位于“会话 A”的最后,并预测“从会话 B的开始(从未来)我会得到什么梯度”。因此,timestep_3A 将配备“可能来自 timestep_1B”的梯度,因此实际上,在 A 期间进行的校正将更加可靠。

但是,嘿!这些预测的“合成梯度”无论如何都会非常小(可以忽略不计)——毕竟,这就是我们开始新的反向传播会话 B的原因。它们不是太小,我们只需在一个长的 bkprop“会话 A”中解析所有 6 个时间步。

因此,我认为第 2 点)也不应该带来好处。在 fwdprop 的最后一个时间步上添加 SG 可以有效地训练更长的序列,但消失的梯度并没有去任何地方。


行。也许我们可以在不同的机器上训练“会话 A”“会话 B” 获得好处?但是,这与简单地使用通常的 minibatch 并行训练有什么不同呢?请记住,在第 2 点中提到:sessionA预测无论如何都会消失的梯度会使事情变得更糟。

问题:请帮助我了解合成渐变的好处,因为上面的 2 点似乎没有好处

2个回答

但是,嘿!无论如何,这些预测的“合成梯度”将非常小(可以忽略不计)——毕竟,这就是我们开始新的反向传播会话 B 的原因。如果它们不是太小,我们只需在一个长的 bkprop“会话 A 中解析所有 6 个时间步长” ”。

- 这不一定是正确的。由于硬件限制,例如内存或计算速度,我们通常会截断并启动新的反向传播。Vanishing-gradient 可以通过其他方式改进,例如 Gradient Normalization - 如果梯度向量在某些层之外变得太小,则按比例放大,或者如果它即将爆炸,则按比例缩小。甚至使用批量标准化


了解如何更新任何 DNI 模块非常重要。为了清楚起见,考虑一个具有多层和 3 个 DNI 模块的网络示例:

 input
   |
   V
Layer_0 & DNI_0
Layer_1
Layer_2
Layer_3 & DNI_3
Layer_4
Layer_5 & DNI_5
Layer_6
Layer_7
   | 
   V
output

DNI_0始终使用来自 DNI_3 的合成梯度进行训练流经Layer_2,当然还有 Layer_1),位于更远的几层。

同样,DNI_3始终使用来自DNI_5的合成梯度进行训练

DNI_0DNI_3永远不会看到真正的梯度,因为真正的梯度只传递给DNI_5,而不是更早。

对于仍在努力理解它们的任何人,请阅读这篇很棒的博文,第 3 部分

较早的层必须满足于合成梯度,因为它们或它们的 DNI 永远不会见证“真正的梯度”。


关于与 minibatch 并行训练而不是通过 Synthetic Grads 并行化:

较长的序列比 minibatch 更精确,但是minibatch 增加了调节效果但是,考虑到一些防止梯度爆炸或消失的技术,训练更长的序列可以更好地洞察问题的背景。那是因为网络在考虑更长的输入序列后推断出输出,所以结果更合理。

SG 提供的好处比较参考论文第 6 页的图表,主要是能够解决更长的序列,我觉得这是最有利的(我们已经可以通过 Minibatch 进行并行化,因此 SG 不应该加速在同一台机器上执行时的过程——即使我们确实只传播到下一个 DNI)。


但是,我们拥有的 DNI 模块越多,信号的噪声就越大。因此,通过传统的反向传播来训练层和 DNI 可能是值得的,并且只有在一些 epoch 过去之后,我们才开始使用上面讨论的 DNI 引导。

这样一来,最早的 DNI 至少会在训练开始时对预期的内容有所了解。这是因为以下 DNI 自己不确定真正的梯度实际上是什么样的,当训练开始时,所以最初,他们会向比他们更早的任何人建议“垃圾”梯度。

不要忘记作者还尝试预测每一层的实际输入。


如果你的层有昂贵的反向传播(也许你有批量归一化或一些花哨的激活函数),那么一旦经过充分训练,使用 DNI 进行校正可能会便宜很多。请记住,DNI 不是免费的——它需要矩阵乘法,并且可能不会在简单的密集层上提供太多的加速。


Minibatches 为我们提供了加速(通过并行化)并为我们提供了正则化。合成梯度允许我们通过使用更长的序列和(可能)更便宜的梯度来更好地推断。总之,这是一个非常强大的系统。

合成梯度使训练更快,不是通过减少所需的 epoch 数量或通过加速梯度下降的收敛,而是通过使每个 epoch 的计算速度更快。合成梯度比真实梯度计算更快(计算合成梯度比反向传播更快),因此梯度下降的每次迭代可以计算得更快。