RNN正则化:应该对哪个组件进行正则化?

32

我正在构建一个用于分类的RNN(在RNN之后有一个softmax层)。关于正则化,有很多选项,我不确定是否应该尝试所有选项,效果会是一样的吗?哪些组件应该针对何种情况进行正则化?

这些组件包括:

  • 核权重(层输入)
  • 循环权重
  • 偏置
  • 激活函数(层输出)

1
我不确定迁移是如何工作的,但这个问题可能在交叉验证上更好地解决。 - Ben Ogorek
@BenOgorek 的确;我想知道问题的统计数据(投票、浏览量)是否能够转移 - 否则最好还是在这里保留它。 - OverLordGoldDragon
2
@BenOgorek 太老了无法迁移; 好吧,这很不利于生产力。我还是会标记它进行迁移。此外,统计数据也将被保留。 - OverLordGoldDragon
1个回答

85

最适合的正则化方法将取决于您具体的架构、数据和问题;通常情况下,并不存在一种万能的方法,但是有些做法是正确的,而且还有通过仔细的内省和评估确定最佳方法的系统性手段。


RNN 正则化如何工作?

了解 RNN 正则化的最佳方法或许是基于 信息 的。首先,参考「学习是如何进行的?」和「RNN:深度 vs. 宽度」。要理解 RNN 正则化,必须了解 RNN 如何处理信息和学习,这些部分有所描述(但不详尽)。现在来回答问题:

RNN 正则化的目标与任何正则化的目标相同:最大化信息效用和测试损失函数的遍历。然而,具体的 方法 由于 RNN 的循环性质而有所不同,并且一些方法比其他方法更好;请参见下面的内容。


RNN正则化方法

权重衰减

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

    • 线性化,取决于激活函数;例如,sigmoidtanh,但对于relu来说不那么明显
    • 梯度提升,取决于激活函数;例如,sigmoidtanh的梯度在大激活时会变平 - 线性化使神经元能够持续学习
  2. 循环权重:默认activation='sigmoid'

    • 优点:线性化有助于BPTT(纠正消失梯度),因此也有助于学习长期依赖关系,因为循环信息效用增加了
    • 缺点:线性化可能损害表示能力 - 但是,这可以通过堆叠RNN来抵消
  3. 核权重:对于多对一(return_sequences=False),它们的工作方式类似于典型层(例如Dense)上的权重衰减。对于多对多(=True),但是,核权重在每个时间步操作,因此优缺点类似于上述情况。

Dropout

  • 激活函数(核):如果限制得当,可能会有益处;实践中通常将值保持在小于 0.2。问题是,它往往会引入过多的噪声,并抹掉重要的上下文信息,特别是在时间步长有限的问题中。
  • 循环激活函数recurrent_dropout):推荐使用dropout

批量标准化

  • 激活函数(核):值得尝试。可能会有显著的好处,也可能没有。
  • 循环激活函数:应该效果更好;请参见循环批量标准化。据我所知,目前还没有Keras实现,但我将来可能会实现。

权重约束:对权重L2范数设置硬上限;是权重衰减的可能替代方案。

活动约束:不必费心;对于大多数目的而言,如果您必须手动约束输出,则该层本身的学习可能很差,解决方法在其他地方。


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

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

  2. Dropout:尝试使用0.1。如果有改进,尝试0.2——否则放弃它。

  3. 循环 Dropout:从0.2开始。有改进→0.4。有改进→0.5,否则0.3

  4. 批量归一化:尝试使用。有改进→保留它,否则放弃它。
  5. 循环批量归一化:与4相同。
  6. 权重约束:建议在较高的学习率下使用,以防止梯度爆炸——否则使用更高的权重衰减。
  7. 活动约束:可能不需要(见上文)。
  8. 残差 RNNs:引入显著的变化,具有正则化效果。在IndRNNs中查看应用程序。
  9. 偏置:在达到良好的反向传播属性时,权重衰减和约束变得重要;如果没有它们对偏置权重进行操作,但是在核心(K)和循环核心(RK)权重上使用它们,偏置权重可能比后两者增长得快得多,并且主导转换——也会导致梯度爆炸。我建议将权重衰减/约束小于或等于K和RK上使用的值。此外,对于BatchNormalization,您不能将use_bias=False设置为“等效”;BN适用于输出,而不是隐藏到隐藏的转换。
  10. Zoneout:不清楚,从未尝试过,可能有效——请参见paper
  11. 层归一化:一些人报告它对于RNNs的工作比BN更好——但我的应用程序发现相反;paper
  12. 数据洗牌:是一个强大的正则化器。还要对批次样本(批次中的样本)进行洗牌。在stateful RNNs上查看相关信息。
  13. 优化器:可以是内在的正则化器。没有完整的解释,但在我的应用程序中,Nadam(&NadamW)已经压倒了其他所有优化器——值得一试。

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

奖励:权重衰减可能非常有用 - 当正确执行时甚至更加强大;结果发现,像Adam这样的自适应优化器会损害其有效性,如此论文所述。 解决方案:使用AdamW。我的Keras / TensorFlow实现在此处


这太多了!同意 - 欢迎进入深度学习。这里有两个提示:
  1. 贝叶斯优化;可以节省时间,特别是在训练成本高昂的情况下。
  2. Conv1D(步长>1),对于许多时间步骤(>1000);降低维数,不应该影响性能(实际上可能会改善它)。

反思代码:

梯度: 参见这个答案

权重: 参见这个答案

跟踪权重范数: 参见这个问答

激活函数: 参见这个答案

权重: see_rnn.rnn_histogramsee_rnn.rnn_heatmap (README中有示例)


“学习”是如何工作的?

机器学习中很少被讨论或强调的“终极真相”是,我们无法访问我们试图优化的函数 - 测试损失函数。我们所有的工作都是在对真实损失曲面的近似上进行的 - 包括训练集和验证集。这有一些关键的影响:

  1. 训练集全局最优可能与测试集全局最优相差非常远
  2. 局部最优点并不重要,也不相关:
    • 训练集局部最优几乎总是更好的测试集最优
    • 实际局部最优对于高维问题来说几乎是不可能的;对于“鞍点”的情况,你需要梯度相对于数百万个参数同时等于零
    • 局部吸引子更加相关;那么类比就从“掉进坑里”变成了“被强大的力场吸引”;一旦进入该场,你的损失曲面拓扑结构就被该场定义的自身局部最优所限制;高LR可以帮助逃离场,就像“逃逸速度”一样

此外,损失函数过于复杂,无法直接分析;更好的方法是将分析局部化到单个层、它们的权重矩阵以及相对于整个神经网络的作用。两个关键考虑因素是:

3. 特征提取能力。例如:深度分类器的驱动机制是,在给定输入数据的情况下,通过每个层次的变换来增加类别可分性。更高质量的特征将过滤掉无关信息,并传递必要的信息给输出层(例如softmax),以便学习一个分离超平面。
4. 信息效用。死神经元和极端激活是信息效用不佳的主要原因;没有单一神经元应该主导信息传输,也不应该有太多神经元无意义。稳定的激活和权重分布可以实现梯度传播和持续学习。

正则化是如何工作的?请先阅读上文。

简而言之,通过最大化神经网络的信息效用,改善测试损失函数的估计。每种正则化方法都独特,没有两种完全相同-请参见“RNN 正则化器”。


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

更新:

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

这是罕见的成果,通过仔细的正则化、归一化和超参数调整实现。通常我们会看到最后几个时间步长的梯度很大,向左急剧下降 - 如此处。此外,由于模型是有状态的,并且适合7个等效窗口,梯度有效地跨越1200个时间步长更新2: 查看9个新信息和更正 更新3: 添加权重规范化和权重内省代码

1
@BenOgorek 梯度内省 已实现;权重接下来 - OverLordGoldDragon
2
恭喜 @OverLordGoldDragon 在 see-rnn 上的成就。我已经收藏了这个代码库,会密切关注你的进展。确实需要一些可视化这些层的方法! - Ben Ogorek
1
@BenOgorek 同意,黑盒子不好玩,深度学习应该不仅仅是“不断尝试看哪个有效” - 谢谢你的支持。 - OverLordGoldDragon
1
@BenOgorek 权重已完成,其他也都完成了 - 单元测试可以很...“有趣”。请注意,v0.90的方法已经发生了重大变化,因此现有的使用代码需要进行一些修改 - 但不是太多。-- 如果您有更多的可视化想法,我欢迎任何建议 - 尽管我可能不会很快再次在该存储库上工作。 - OverLordGoldDragon
1
视觉效果很棒!希望我能在接下来的几周里有时间仔细研究一下。 - Ben Ogorek
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接