RNN 正则化:要正则化哪个组件?

Posted

技术标签:

【中文标题】RNN 正则化:要正则化哪个组件?【英文标题】:RNN Regularization: Which Component to Regularize? 【发布时间】:2018-07-20 17:31:24 【问题描述】:

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

组件是:

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

【问题讨论】:

我不确定迁移是如何工作的,但这个问题在 Cross Validated 上可能会更好。 @BenOgorek 确实;我想知道问题统计信息(投票、意见)是否会转移 - 否则最好保留在这里 @BenOgorek Too old to migrate;嗯,这适得其反。无论如何,我都会将其标记为迁移。此外,还会保留统计信息 【参考方案1】:

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


RNN 正则化如何工作?

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

RNN 正则化的目标是任何正则化的目标:最大化信息效用和测试损失函数的遍历。然而,特定的方法对于 RNN 来说往往会因它们的循环性质而存在很大差异——有些方法比其他方法效果更好;见下文。


RNN 正则化方法

体重衰减

    常规:缩小权重矩阵的范数(“平均”)

    线性化,取决于激活;例如sigmoidtanh,但不那么relu 梯度提升,取决于激活;例如sigmoidtanh grads 在大激活时变得平坦 - 线性化使神经元能够继续学习

    循环权重:默认activation='sigmoid'

    优点:线性化可以帮助 BPTT(补救消失梯度),因此也可以学习长期依赖关系,因为循环信息效用增加了 缺点:线性化会损害表征能力 - 但是,这可以通过堆叠 RNN 来抵消

    内核权重:对于多对一 (return_sequences=False),它们的工作方式类似于典型层上的权重衰减(例如 Dense)。然而,对于多对多 (=True),内核权重在每个时间步上运行,因此将适用类似于上述的优缺点。

辍学

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

批量标准化

Activations(内核):值得一试。可以显着受益,也可以不受益。 循环激活:应该会更好;见Recurrent Batch Normalization。据我所知,目前还没有 Keras 实现,但我可能会在未来实现它。

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

活动限制:不要打扰;在大多数情况下,如果您必须手动限制输出,则层本身可能学习不佳,而解决方案在别处。


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

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

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

    Recurrent Dropout:以0.2 开头。改进 --> 0.4。改进 --> 0.5,否则 0.3

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

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

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


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

    Bayesian Optimization;将节省您的时间,尤其是昂贵的培训。 Conv1D(strides > 1),对于许多时间步长 (>1000);削减维度,不应该损害性能(实际上可能会提高它)。

自省代码

渐变:见this answer

权重:见this answer

体重标准跟踪:见this Q & A

激活:见this answer

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


“学习”如何运作?

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

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

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

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

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


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

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


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

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

更新

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

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

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

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

【讨论】:

@BenOgorek 梯度自省implemented;权重下一个 恭喜,@OverLordGoldDragon,see-rnn。我已为存储库加注星标,我将密切关注您的进度。绝对需要可视化这些层的方法! @BenOgorek 同意,黑匣子并不好玩,DL 应该不仅仅是“继续拍摄,看看有什么好”——感谢星星 @BenOgorek Weights done,其他一切也是如此——单元测试可以是……“有趣”。请注意,v0.90 方法发生了显着变化,因此现有的使用代码将需要一些修改 - 但不是很多。 -- 如果您有进一步的可视化想法,我欢迎任何建议 - 尽管我可能不会很快再次处理 repo。 视觉效果看起来很棒!希望我能在接下来的几周内有时间解决这个问题。

以上是关于RNN 正则化:要正则化哪个组件?的主要内容,如果未能解决你的问题,请参考以下文章

正则化详解

[Deep Learning] 正则化

AI数学基础18——常见的正则化方法

机器学习-正则化+回归与分类辨析

机器学习正则化(L1正则化L2正则化)

简单解释一下正则化