我正在构建用于分类的RNN(在RNN之后存在softmax层)。有什么选择可以规范什么,我不确定是否只是尝试所有这些,效果是否相同?哪些组件可以规范哪种情况?
组件是:
答案 0 :(得分:7)
最有效的稳压器将取决于您的特定体系结构,数据和问题;像往常一样,并没有一个统一的规则可以统治一切,但有有要做和(尤其是)没有做,还有系统的手段来决定要做什么最好的工作-通过仔细的内省和评估。
RNN正则化如何工作?
也许理解它的最佳方法是基于信息。首先,请参阅“学习如何进行?”和“ RNN:深度与宽度”。要理解RNN正则化,必须了解RNN如何处理信息和学习,这将在后面的章节中介绍(尽管并不详尽)。现在回答这个问题:
RNN正则化的目标是任何正则化的目标:最大化信息实用性和遍历测试损失函数。然而,RNN的特定方法往往因其经常性而有很大不同-有些效果比其他效果更好。见下文。
RNN正则化方法:
体重衰减
常规:缩小权重矩阵的范数(“平均值”)
sigmoid
,tanh
,但relu
sigmoid
,tanh
的梯度逐渐变大以进行较大的激活-线性化可使神经元继续学习 当前权重:默认为activation='sigmoid'
内核权重:对于多对一(return_sequences=False
),它们的工作原理类似于典型层上的权重衰减(例如Dense
)。但是,对于多对多(=True
),内核权重在每个时间步上都起作用,因此适用与上述类似的利弊。
退出:
0.2
。问题:特别是在时间步伐有限的情况下,往往会引入过多的噪音并抹去重要的上下文信息。recurrent_dropout
):recommended dropout 批处理规范化:
体重限制:在权重l2范数上设置硬上限。减轻体重的可能替代方法。
活动约束:不要打扰;在大多数情况下,如果您必须手动限制输出,则图层本身的学习可能很差,解决方案在其他地方。
我该怎么办?很多信息-因此,这里有一些具体建议:
重量衰减:尝试使用1e-3
,1e-4
,看看哪个效果更好。 不期望kernel
和recurrent_kernel
的衰减值相同,尤其是取决于体系结构。检查砝码形状-如果一个比另一个小得多,则对前者进行较小的衰减
退出:尝试0.1
。如果发现有改善,请尝试0.2
-否则,将其报废
经常辍学:从0.2
开始。改进-> 0.4
。改进-> 0.5
,否则为0.3
。
BatchNormalization
,您可以设置use_bias=False
内省:如果没有这一点,“学习”的下半部分将不值钱;不要只看验证性能,而是称其为“天”-检查调整调节器对权重和激活的影响。评估使用信息的底部和相关理论。
奖励:体重减轻可能很有效-如果做得好,重量减轻甚至会更有效;事实证明,如this paper中所述,像Adam那样的自适应优化器可能会损害其有效性。 解决方案:使用AdamW。我的Keras / TensorFlow实现here。
太多了!同意-欢迎使用深度学习。这里有两个提示:
Conv1D(strides > 1)
,持续许多时间(>1000
);降低尺寸,不应损害性能(实际上可能会改善性能)。自省代码:
渐变:请参见this answer
重量:请参见this answer
权重为l2范数
rnn_weights = rnn_layer.get_weights() # returns [kernel, recurrent_kernel, bias], in order
kernel_l2norm = np.sqrt(np.sum(np.square(rnn_weights[0]), axis=0, keepdims=True))
recurrent_l2norm = np.sqrt(np.sum(np.square(rnn_weights[1]), axis=0, keepdims=True))
max_kernel_l2norm = np.max(kernel_l2norm) # `kernel_constraint` will check this
max_recurrent_l2norm = np.max(recurrent_l2norm) # `recurrent_constraint` will check this
激活:请参见this answer
重量:使用.get_weights()
,按门数组织直方图。尚无代码,但可能会与我将来的问答联系起来。
“学习”如何工作?
很少讨论或强调的机器学习的“最终真理”是,我们无法访问我们要优化的功能-测试损失功能< / em>。我们的工作全部与真实损失面的近似值-训练集和验证集有关。这具有一些关键的含义:
此外,损失函数太复杂而无法直接分析;更好的方法是将分析本地化到各个层,权重矩阵以及相对于整个NN的角色。两个关键考虑因素是:
功能提取功能。 Ex :深度分类器的驱动机制是,在给定输入数据的情况下,随着每一层的转换,提高类的可分离性。更高质量的功能将过滤掉不相关的信息,并提供输出层(例如softmax)学习单独的超平面所必需的内容。
信息实用程序。 死亡神经元和极度激活是信息实用性差的主要原因。没有任何一个神经元应该主导信息传递,太多的神经元也不应无目的地撒谎。稳定的激活和权重分布使梯度传播和继续学习成为可能。
正则化如何工作?请先阅读上文
简而言之,通过最大化NN的信息实用程序并改进对测试损失函数的估计。每个正则化方法都是唯一的,并且没有两个完全相同的方法-请参阅“ RNN正则化器”。RNN:深度与宽度:不像“一个非线性程度更高,其他尺寸更高的作品”那样简单。
答案 1 :(得分:1)
正则化旨在防止过度拟合,这意味着您的模型对输入数据中的微小变化很敏感。通常,您试图让您的模型过度拟合您的训练数据,然后应用正则化技术。
神经网络中的偏差始终为1,因此通常没有必要使其权重正常化。
对于其他权重,您可以将它们规范化,例如使用L1或L2正则化。这尤其有助于防止爆炸的梯度。然而,对于RNN,这种类型的正则化还可以限制模型将信息保存在其存储器中的能力。为了防止爆炸渐变,渐变剪裁是一种流行的技术。我可以推荐阅读"On the difficulty of training recurrent neural networks" (Pascanu,Mikolov和Bengio,2013年):
对复发权重使用L1或L2惩罚有助于爆发渐变。假设权重被初始化为小值,则Wrec的最大奇异值λ1可能小于1.L1 / L2项可以确保在训练期间λ1保持小于1,并且在该状态下梯度不会爆炸。此方法将模型限制为原点处的单点吸引子,其中插入模型中的任何信息以指数方式快速消失。这可以防止模型学习生成器网络,也不会出现长期的内存跟踪。
通过“正规化层输出”,我想你的意思是辍学,这是一种流行的随机正则化技术。我可以推荐Hinton的"Dropout: A Simple Way to Prevent Neural Networks from Overfitting",它只需要30页就可以了解你需要知道的大部分内容。