Stabilizer() 块和 enable_self_stabilization 参数有什么区别?

What's the difference between Stabilizer() block and enable_self_stabilization parameter?

我什么时候应该使用一个或另一个?教程和示例使用来自 Examples/common/nn.py 的 Sequential([Stabilizer(), Recurrence(LSTM(hidden_dim))])LSTMP_component_with_self_stabilization。我尝试在 char_rnn.py 示例中用 Recurrence(LSTM(hidden_dim, enable_self_stabilization=True)) 替换前者,但结果明显更糟。

Stabilizer 层将其输入与可学习的标量相乘。这个简单的技巧已被证明可以显着提高收敛性和稳定性。它与BatchNormalization有一些相似之处。通常,当您可以使用 BatchNormalization 时,您应该先尝试一下。如果这是不可能的,特别是在循环循环中,我建议改用 Stabilizer

通常,您必须将其显式注入到您的模型中。一个特例是循环阶跃函数(例如 LSTM),其中包含 Stabilizer。使用 enable_self_stabilization=True 启用它。那些内置的 Stabilizers 只适用于内部变量。主输入必须自己插入一个Stabilizer

如果您包含显式 Stabilizer 但设置 enable_self_stabilization=False(例如作为 default_option),那么这些显式 Stabilizer 是无操作。

根据我的经验,Stabilizer 不会让事情变得更糟。提高收敛性通常是必经之路。不过,它确实会改变数值范围。因此,如果它使收敛性变差,我建议尝试不同的超参数设置,例如降低学习率。