我正在构建一个用于分类的RNN(在RNN之后有一个softmax层)。关于正则化,有很多选项,我不确定是否应该尝试所有选项,效果会是一样的吗?哪些组件应该针对何种情况进行正则化?
这些组件包括:
- 核权重(层输入)
- 循环权重
- 偏置
- 激活函数(层输出)
我正在构建一个用于分类的RNN(在RNN之后有一个softmax层)。关于正则化,有很多选项,我不确定是否应该尝试所有选项,效果会是一样的吗?哪些组件应该针对何种情况进行正则化?
这些组件包括:
最适合的正则化方法将取决于您具体的架构、数据和问题;通常情况下,并不存在一种万能的方法,但是有些做法是正确的,而且还有通过仔细的内省和评估确定最佳方法的系统性手段。
RNN 正则化如何工作?
了解 RNN 正则化的最佳方法或许是基于 信息 的。首先,参考「学习是如何进行的?」和「RNN:深度 vs. 宽度」。要理解 RNN 正则化,必须了解 RNN 如何处理信息和学习,这些部分有所描述(但不详尽)。现在来回答问题:
RNN 正则化的目标与任何正则化的目标相同:最大化信息效用和测试损失函数的遍历。然而,具体的 方法 由于 RNN 的循环性质而有所不同,并且一些方法比其他方法更好;请参见下面的内容。
RNN正则化方法:
权重衰减
一般:缩小权重矩阵的范数(“平均值”)
sigmoid
、tanh
,但对于relu
来说不那么明显sigmoid
、tanh
的梯度在大激活时会变平 - 线性化使神经元能够持续学习循环权重:默认activation='sigmoid'
核权重:对于多对一(return_sequences=False
),它们的工作方式类似于典型层(例如Dense
)上的权重衰减。对于多对多(=True
),但是,核权重在每个时间步操作,因此优缺点类似于上述情况。
Dropout:
0.2
。问题是,它往往会引入过多的噪声,并抹掉重要的上下文信息,特别是在时间步长有限的问题中。recurrent_dropout
):推荐使用dropout。批量标准化:
权重约束:对权重L2范数设置硬上限;是权重衰减的可能替代方案。
活动约束:不必费心;对于大多数目的而言,如果您必须手动约束输出,则该层本身的学习可能很差,解决方法在其他地方。
我该怎么办? 信息很多 - 所以这里有一些具体的建议:
权重衰减:尝试使用1e-3
、1e-4
,看哪个效果更好。不要期望相同的衰减值适用于kernel
和recurrent_kernel
,特别是取决于架构。检查权重形状——如果一个比另一个小得多,则对前者应用更小的衰减。
Dropout:尝试使用0.1
。如果有改进,尝试0.2
——否则放弃它。
循环 Dropout:从0.2
开始。有改进→0.4
。有改进→0.5
,否则0.3
。
BatchNormalization
,您不能将use_bias=False
设置为“等效”;BN适用于输出,而不是隐藏到隐藏的转换。内省:如果没有这个“学习”部分的底部部分,它就不值得一提了;不要只看验证性能并结束 - 检查调整正则化器对权重和激活的影响。使用底部信息和相关理论进行评估。
奖励:权重衰减可能非常有用 - 当正确执行时甚至更加强大;结果发现,像Adam这样的自适应优化器会损害其有效性,如此论文所述。 解决方案:使用AdamW。我的Keras / TensorFlow实现在此处。
Conv1D(步长>1)
,对于许多时间步骤(>1000
);降低维数,不应该影响性能(实际上可能会改善它)。反思代码:
梯度: 参见这个答案
权重: 参见这个答案
跟踪权重范数: 参见这个问答
激活函数: 参见这个答案
权重: see_rnn.rnn_histogram
或 see_rnn.rnn_heatmap
(README中有示例)
“学习”是如何工作的?
机器学习中很少被讨论或强调的“终极真相”是,我们无法访问我们试图优化的函数 - 测试损失函数。我们所有的工作都是在对真实损失曲面的近似上进行的 - 包括训练集和验证集。这有一些关键的影响:
此外,损失函数过于复杂,无法直接分析;更好的方法是将分析局部化到单个层、它们的权重矩阵以及相对于整个神经网络的作用。两个关键考虑因素是:
3. 特征提取能力。例如:深度分类器的驱动机制是,在给定输入数据的情况下,通过每个层次的变换来增加类别可分性。更高质量的特征将过滤掉无关信息,并传递必要的信息给输出层(例如softmax),以便学习一个分离超平面。正则化是如何工作的?请先阅读上文。
简而言之,通过最大化神经网络的信息效用,改善测试损失函数的估计。每种正则化方法都独特,没有两种完全相同-请参见“RNN 正则化器”。
更新:
以下是一个近乎理想的RNN梯度传播170+时间步长的示例: