RNN的输出层的渐变是否应该削减?

Rehaan Ahmad |

我目前正在为时间序列预测培训LSTM RNN。我了解,惯例是在RNN超过某个阈值时修剪RNN的梯度。但是,我不清楚它是否包括输出层。

如果我们调用RNN h的隐藏层,则输出为sigmoid(connected_weights * h + bias)。我知道用于确定隐藏层的权重的梯度已被裁剪,但是输出层也一样吗?

换句话说,connected_weights的梯度是否也在梯度修剪中被修剪?

脱骨

虽然没有什么可以阻止您剪辑它们,但是没有理由这样做。一篇有理由的好论文在这里,我将尽力概述。

我们正在尝试通过梯度裁剪解决的问题是爆炸梯度:假设您的RNN层是这样计算的:

 h_t = sigmoid(U * x + W * h_tm1 + b)

所以忘记了非线性一会儿,你可以说,当前状态h_t取决于一些早期状态h_{t-T}h_t = W^T * h_tmT + input因此,如果矩阵W使隐藏状态膨胀,则旧的隐藏状态的影响将随着时间呈指数增长。当您反向传播渐变时,也会发生同样的情况,从而导致渐变很可能使您到达参数空间中的某个无用的点。

另一方面,在向前和向后通过过程中仅应用一次输出层,因此虽然可能会使学习复杂化,但仅取决于“恒定”因素,与时间展开无关。

为了进一步提高技术性:决定是否得到爆炸梯度的关键量是的最大特征值W如果它大于1(或小于-1,则很有趣:-)),那么您将得到爆炸的渐变。相反,如果小于1,则梯度消失,从而难以学习长期依赖关系。您可以在这里找到有关这些现象的精彩讨论,并提供指向古典文学的指导。

如果将S型曲面带回图片中,则爆炸梯度将变得更加困难,因为在通过它反向传播时,梯度会被衰减至少4倍。但是,仍然有一个大于4的特征值,您会冒险:-)仔细初始化非常重要,第二篇文章给出了一些提示。使用时tanh,几乎没有衰减在零附近,并且ReLU只是通过传播梯度,因此它们很容易发生梯度爆炸,因此对初始化和梯度剪切敏感。

总体而言,LSTM普通RNN具有更好的学习性能。关于消失的梯度。尽管根据我的经验,通常也需要使用梯度剪切。

编辑:什么时候剪辑?就在权重更新之前,即您不改变反向支撑。事实是,梯度裁剪是一种肮脏的技巧。您仍然希望梯度尽可能精确,因此最好不要在反向传播器的中间使其变形。只是如果您看到渐变变得非常大,就说不,这闻起来。我最好走一小步。剪裁是一种简单的方法(可能只有渐变的某些元素爆炸了,而其他元素仍然表现良好且提供了信息)。对于大多数工具包,您还是没有选择,因为反向传播是原子发生的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否可以将CNN的平坦层的输出用作RNN的输入?

了解RNN的softmax输出层

TF/Keras 中输入和输出长度不等的 RNN 层

将输出从tensorflow dynamic_rnn馈送到后续层

如何削减grep命令的输出?

在GPU上训练RNN-我应该使用哪个tf.keras层?

削减是否确定了较低的界限?

使用Lambda层作为输出时如何获得关于参数的渐变

是否应该从应用程序层抛出域异常?

是否应该在域层或应用层检查聚合根中的重复值?

如何从“ diff”输出中“削减”“小于”符号?

是否可以打印张量流模型特定层的输出?

在 drawInRect 中绘制渐变层

在UIBezierPath图上应用渐变层

pytorch 中通过带有线性输出层的 RNN 发送的填充批次的掩蔽和计算损失

我应该使用 float 还是 classes 作为神经网络中最后一层的输出?

是否应该在API层,应用程序层或同时在两者上进行锁定?

Keras自定义softmax层:是否有可能基于零作为输入层中的数据在softmax层的输出中将输出神经元设置为0?

当输入/输出的范围不同时,学习率是否应该改变?

二进制输出是否应该与 ASCII 输入相同?

使用神经网络,学习率是否应该与隐藏层的大小成比例?他们应该互相影响吗?

服务层是否应该接受控制器的DTO或自定义请求对象?

我是否应该考虑将DTO用于Spring Rest Controller层而不是实体?

预定义的 MVC ApplicationDbContext 是否应该移动到不同的层、域或存储?

是否应该将实体转换为Repository对象中的DTO并将其返回到服务层?

Lambda层没有要传播的渐变

带有渐变层的 TableViewCell -> 布局问题

渐变层未显示在UIButton上

Keras:在特定层之后停止渐变