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 正则化方法:
体重衰减
常规:缩小权重矩阵的范数(“平均”)
线性化,取决于激活;例如sigmoid
,tanh
,但不那么relu
梯度提升,取决于激活;例如sigmoid
、tanh
grads 在大激活时变得平坦 - 线性化使神经元能够继续学习
循环权重:默认activation='sigmoid'
内核权重:对于多对一 (return_sequences=False
),它们的工作方式类似于典型层上的权重衰减(例如 Dense
)。然而,对于多对多 (=True
),内核权重在每个时间步上运行,因此将适用类似于上述的优缺点。
辍学:
激活(内核):可以受益,但仅限于有限;实际上,值通常保持小于0.2
。问题:往往会引入过多的噪音,并删除重要的上下文信息,尤其是在时间步长有限的问题中。
循环激活 (recurrent_dropout
):recommended dropout
批量标准化:
Activations(内核):值得一试。可以显着受益,也可以不受益。 循环激活:应该会更好;见Recurrent Batch Normalization。据我所知,目前还没有 Keras 实现,但我可能会在未来实现它。权重约束:设置权重 l2-norm 的硬上限;可能替代重量衰减。
活动限制:不要打扰;在大多数情况下,如果您必须手动限制输出,则层本身可能学习不佳,而解决方案在别处。
我应该怎么做?很多信息 - 所以这里有一些具体的建议:
体重衰减:试试1e-3
、1e-4
,看看哪个效果更好。 不要期望相同的衰减值适用于kernel
和recurrent_kernel
,尤其是取决于架构。检查权重形状 - 如果一个比另一个小得多,则对前者应用较小的衰减
辍学:试试0.1
。如果您看到改进,请尝试 0.2
- 否则,放弃它
Recurrent Dropout:以0.2
开头。改进 --> 0.4
。改进 --> 0.5
,否则 0.3
。
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_histogram
或 see_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 正则化:要正则化哪个组件?的主要内容,如果未能解决你的问题,请参考以下文章