RNN正规化:规范哪个组成部分?

时间:2018-02-09 21:34:07

标签: python keras recurrent-neural-network rnn regularized

我正在构建用于分类的RNN(在RNN之后存在softmax层)。有什么选择可以规范什么,我不确定是否只是尝试所有这些,效果是否相同?哪些组件可以规范哪种情况?

组件是:

  • 内核权重(图层输入)
  • 经常性重量
  • 偏置
  • 激活功能(图层输出)

2 个答案:

答案 0 :(得分:7)

最有效的稳压器将取决于您的特定体系结构,数据和问题;像往常一样,并没有一个统一的规则可以统治一切,但有要做和(尤其是)没有做,还有系统的手段来决定要做什么最好的工作-通过仔细的内省和评估。


RNN正则化如何工作?

也许理解它的最佳方法是基于信息。首先,请参阅“学习如何进行?”和“ RNN:深度与宽度”。要理解RNN正则化,必须了解RNN如何处理信息和学习,这将在后面的章节中介绍(尽管并不详尽)。现在回答这个问题:

RNN正则化的目标是任何正则化的目标:最大化信息实用性和遍历测试损失函数。然而,RNN的特定方法往往因其经常性而有很大不同-有些效果比其他效果更好。见下文。


RNN正则化方法

体重衰减

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

    • 线性化,具体取决于激活方式;例如sigmoidtanh,但relu
    • 梯度提升,具体取决于激活方式;例如sigmoidtanh的梯度逐渐变大以进行较大的激活-线性化可使神经元继续学习
  2. 当前权重:默认为activation='sigmoid'

    • 优点:线性化可以帮助BPTT(纠正消失的梯度),因此学习长期依赖性,因为经常性信息实用程序的增加
    • 缺点:线性化会损害表示能力-但是,可以通过堆叠RNN来抵消
  3. 内核权重:对于多对一(return_sequences=False),它们的工作原理类似于典型层上的权重衰减(例如Dense)。但是,对于多对多(=True),内核权重在每个时间步上都起作用,因此适用与上述类似的利弊。

退出

  • 活动(内核):可以受益,但仅限于有限条件;实际上,值通常保持小于0.2。问题:特别是在时间步伐有限的情况下,往往会引入过多的噪音并抹去重要的上下文信息。
  • 周期性激活recurrent_dropout):recommended dropout

批处理规范化

  • 活动(内核):值得尝试。可以从中受益,也可以没有。
  • 经常性激活:应该会更好;参见Recurrent Batch Normalization。据我所知,还没有Keras实现,但是将来可能会实现。

体重限制:在权重l2范数上设置硬上限。减轻体重的可能替代方法。

活动约束:不要打扰;在大多数情况下,如果您必须手动限制输出,则图层本身的学习可能很差,解决方案在其他地方。


我该怎么办?很多信息-因此,这里有一些具体建议:

  1. 重量衰减:尝试使用1e-31e-4,看看哪个效果更好。 期望kernelrecurrent_kernel的衰减值相同,尤其是取决于体系结构。检查砝码形状-如果一个比另一个小得多,则对前者进行较小的衰减

  2. 退出:尝试0.1。如果发现有改善,请尝试0.2-否则,将其报废

  3. 经常辍学:从0.2开始。改进-> 0.4。改进-> 0.5,否则为0.3

  4. 批处理标准化:尝试。改进->保留它-否则将其废弃。
  5. 循环批处理规范:与4相同。
  6. 体重限制:建议使用较高的学习率,以防止梯度爆炸-否则使用较高的体重衰减
  7. 活动限制:可能没有(见上文)
  8. 残余RNN :引入重大变化,并产生正则化效果。查看IndRNNs
  9. 中的应用程序
  10. 偏见:简而言之,我不知道。似乎没有人打扰他们,所以我也没有做太多尝试。但是,使用BatchNormalization,您可以设置use_bias=False
  11. 区域划分:不知道,从未尝试过,可能会起作用-请参见paper
  12. 层归一化:对于RNN,有人报告说它比BN更好地工作-但我的应用程序发现它并非如此; paper
  13. 数据改组:是强大的正则化工具。还可以随机播放批量样品(批量样品)。查看有关stateful RNNs的信息
  14. Optimizer :可以是固有的正则化器。没有完整的解释,但是在我的应用程序中,Nadam(&NadamW)重踩了其他所有优化器-值得尝试。

内省:如果没有这一点,“学习”的下半部分将不值钱;不要只看验证性能,而是称其为“天”-检查调整调节器对权重激活的影响。评估使用信息的底部和相关理论。

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


太多了!同意-欢迎使用深度学习。这里有两个提示:

  1. Bayesian Optimization;将节省您的时间,尤其是在培训费用过高的情况下。
  2. 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>。我们的工作全部与真实损失面的近似值-训练集和验证集有关。这具有一些关键的含义:

  1. 训练集的全局最优值可能离测试集的全局最优值很远
  2. 局部最优无关紧要,并且不相关:
    • 训练集局部最优几乎总是一个更好的测试集最优
    • 对于高维问题,几乎不可能实现实际的局部最优。对于“马鞍”,您需要w.r.t. 数百万个参数全部一次等于零
    • Local attractors更具相关性;然后,类比从“跌入坑中”转变为“引力入强地”。一旦进入该字段,您的损失表面拓扑就将绑定到该字段所设置的拓扑,该字段定义了它自己的局部最优值;高LR可以帮助退出野外,就像“逃逸速度”

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

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

  2. 信息实用程序死亡神经元极度激活是信息实用性差的主要原因。没有任何一个神经元应该主导信息传递,太多的神经元也不应无目的地撒谎。稳定的激活和权重分布使梯度传播和继续学习成为可能。


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

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


RNN:深度与宽度:不像“一个非线性程度更高,其他尺寸更高的作品”那样简单。

  • RNN宽度由(1)#个输入通道定义; (2)单元过滤器(输出通道)的数量。与CNN一样,每个RNN过滤器都是一个独立特征提取器 more 适用于更高复杂度的信息,包括但不限于:维数,形态,噪声,频率。
  • RNN深度由(1)#个堆叠层定义; (2)时间步数。具体细节因架构而异,但是从信息的角度来看,与CNN不同,RNN是 dense :每个时间步都会影响层的最终输出,因此会影响下一层的最终输出-因此,它不再是像“更多的非线性”一样简单;堆叠的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页就可以了解你需要知道的大部分内容。