30

我正在构建一个用于分类的 RNN(在 RNN 之后有一个 softmax 层)。规范化的选项有很多,我不确定是否只尝试所有选项,效果会一样吗?我在什么情况下规范化哪些组件?

组件是:

  • 内核权重(层输入)
  • 经常性权重
  • 偏见
  • 激活函数(层输出)
4

1 回答 1

73

效果最好的正则化器将取决于您的特定架构、数据和问题;像往常一样,没有一个单一的削减来统治所有,但有和(特别是)不做的,以及确定什么最有效的系统方法- 通过仔细的内省和评估。


RNN 正则化是如何工作的?

也许理解它的最好方法是基于信息的。首先,请参阅“‘学习’如何运作?” 和“RNN:深度与宽度”。要了解 RNN 正则化,必须了解 RNN 如何处理信息和学习,参考部分对此进行了描述(尽管并非详尽无遗)。现在回答这个问题:

RNN 正则化的目标是任何正则化的目标:最大化信息效用和测试损失函数的遍历。然而,根据 RNN 的循环性质,具体方法往往有很大差异——有些方法比其他方法效果更好;见下文。


RNN 正则化方法

体重衰减

  1. 一般:缩小权重矩阵的范数(“平均”)

    • 线性化,取决于激活;例如sigmoid, tanh, 但较少relu
    • 梯度提升,取决于激活;例如sigmoid,对于大的激活,tanh毕业生变得平坦-线性化使神经元能够继续学习。
  2. 循环权重:默认activation='sigmoid'

    • 优点:线性化可以帮助 BPTT(补救消失梯度),因此也可以学习长期依赖关系,因为循环信息效用增加
    • 缺点:线性化会损害表征能力——但是,这可以通过堆叠 RNN 来抵消
  3. 内核权重:对于多对一(return_sequences=False),它们的工作方式类似于典型层(例如Dense)上的权重衰减。=True但是,对于多对多(

辍学

  • 激活(内核):可以受益,但前提是有限;值通常保持低于0.2实际值。问题:往往会引入过多的噪音,并删除重要的上下文信息,尤其是在时间步长有限的问题中。
  • 循环激活( recurrent_dropout):推荐的 dropout

批量标准化

  • 激活(内核):值得一试。可以显着受益,也可以不受益。
  • 循环激活:应该工作得更好;请参阅循环批标准化。据我所知,还没有 Keras 实现,但我将来可能会实现它。

权重约束:设置权重 l2-norm 的硬上限;可能替代重量衰减。

活动限制:不要打扰;对于大多数目的,如果您必须手动限制输出,则该层本身可能学习不佳,而解决方案在其他地方。


我应该怎么办?很多信息 - 所以这里有一些具体的建议:

  1. 体重衰减:试试1e-31e-4看看哪个效果更好。不要期望相同的衰减值适用于kernelrecurrent_kernel尤其是取决于架构。检查重量形状 - 如果一个比另一个小得多,则对前者应用较小的衰减

  2. 辍学:尝试0.1。如果您看到改进,请尝试0.2- 否则,放弃它

  3. 经常性辍学:从0.2. 改进 --> 0.4。改进 --> 0.5,否则0.3

  4. 批量标准化:试试。改进->保留它-否则,废弃它。
  5. Recurrent Batchnorm:同 4。
  6. 权重约束:建议使用更高的学习率来防止梯度爆炸 - 否则使用更高的权重衰减
  7. 活动限制:可能不是(见上文)
  8. Residual RNNs:引入显着变化,伴随着正则化效果。查看IndRNN中的应用
  9. 偏差:权重衰减和约束在获得良好的反向传播特性时变得很重要;如果没有它们在偏置权重上,但在内核(K)和循环内核(RK)权重上使用它们,偏置权重可能会比后两者增长得更快,并主导转换 - 也会导致梯度爆炸。我建议权重衰减/约束小于或等于 K 和 RK 上使用的权重。此外,使用BatchNormalization,您不能 设置为“等价物” use_bias=FalseBN 适用于输出,而不是隐藏到隐藏的转换
  10. Zoneout:不知道,从未尝试过,可能有用 - 见论文
  11. 层规范化:一些人报告说它比 BN 对 RNN 的效果更好——但我的应用程序发现它不是这样;
  12. 数据洗牌:是一个强大的正则化器。还洗牌批次样本(批量样本)。查看有状态 RNN的相关信息
  13. 优化器:可以是一个固有的正则化器。没有完整的解释,但在我的应用程序中,Nadam (& NadamW) 已经超越了所有其他优化器 - 值得一试。

内省:没有这个,关于“学习”的底部部分就不值钱了;不要只看验证性能并收工 -检查调整正则化器对权重激活的影响。使用信息向底部和相关理论进行评估。

奖励:重量衰减可能很强大 - 如果做得好,效果会更强大;事实证明,像 Adam 这样的自适应优化器会损害其有效性,如本文所述。解决方案:使用 AdamW。我的 Keras/TensorFlow 实现在这里


这太多了!同意 - 欢迎来到深度学习。这里有两个提示:

  1. 贝叶斯优化;将节省您的时间,尤其是在昂贵的培训上。
  2. Conv1D(strides > 1), 对于许多时间步长 ( >1000); 削减维度,不应该损害性能(实际上可能会改善它)。

自省代码

渐变:看到这个答案

重量:看到这个答案

体重标准跟踪:请参阅此问答

激活:看到这个答案

权重see_rnn.rnn_histogramsee_rnn.rnn_heatmap(自述文件中的示例)


“学习”如何运作?

很少讨论或强调的机器学习的“终极真理”是,我们无法访问我们试图优化的函数——测试损失函数我们所有的工作都是真实损失表面的近似值——训练集和验证集。这有一些重要的含义:

  1. 训练集全局最优值可能与测试集全局最优值相差甚远
  2. 局部最优不重要,也不相关:
    • 训练集局部最优几乎总是一个更好的测试集最优
    • 对于高维问题,实际的局部最优几乎是不可能的;对于“鞍”的情况,您需要所有数百万个参数的梯度一次等于零
    • 局部吸引子更相关;然后类比从“落入坑中”转变为“被吸引到强场中”;一旦进入该字段,您的损失表面拓扑将绑定到该字段设置的拓扑,该字段定义了自己的局部最优;高 LR 可以帮助退出一个领域,很像“逃逸速度”

此外,损失函数过于复杂,无法直接分析;更好的方法是将分析定位到各个层、它们的权重矩阵以及相对于整个 NN 的角色。两个关键考虑因素是:

  1. 特征提取能力例如:深度分类器的驱动机制是,给定输入数据,通过每一层的变换来增加类可分离性。更高质量的特征将过滤掉不相关的信息,并提供输出层(例如softmax)学习分离超平面所必需的信息。

  2. 信息实用程序死神经元极端激活是信息效用差的主要原因;没有一个神经元应该主导信息传递,太多的神经元不应该无目的。稳定的激活和权重分布使梯度传播和持续学习成为可能。


正则化如何工作?先读上面

简而言之,通过最大化 NN 的信息效用,并改进对测试损失函数的估计。每种正则化方法都是独一无二的,没有两个完全相同 - 请参阅“RNN 正则化器”。


RNN:深度与宽度:不像“一个更非线性,其他工作在更高维度”那么简单。

  • RNN 宽度由 (1) # 输入通道定义;(2) # 单元格的过滤器(输出通道)。与 CNN 一样,每个 RNN 滤波器都是一个独立的特征提取器more适用于更高复杂度的信息,包括但不限于:维度、模态、噪声、频率。
  • RNN 深度由 (1) 堆叠层数定义;(2) # 时间步长。细节会因架构而异,但从信息的角度来看,与 CNN 不同,RNN 是密集的:每个时间步都会影响一层的最终输出,因此影响下一层的最终输出——所以它又不像“更多非线性”那么简单; 堆叠 RNN 同时利用空间和时间信息。

更新

以下是 170 多个时间步的近乎理想的 RNN 梯度传播示例:

这是罕见的,是通过仔细的正则化、标准化和超参数调整来实现的。通常我们会看到最后几个时间步长的梯度很大,向左急剧下降 - 就像这里一样。此外,由于模型是有状态的并且适合 7 个等效窗口,因此梯度有效地跨越了1200 个时间步长

更新 2:见 9 带新信息和更正

更新 3:添加权重规范和权重自省代码

于 2019-11-15T00:02:31.530 回答