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
启用它。那些内置的 Stabilizer
s 只适用于内部变量。主输入必须自己插入一个Stabilizer
如果您包含显式 Stabilizer
但设置 enable_self_stabilization=False
(例如作为 default_option
),那么这些显式 Stabilizer
是无操作。
根据我的经验,Stabilizer
不会让事情变得更糟。提高收敛性通常是必经之路。不过,它确实会改变数值范围。因此,如果它使收敛性变差,我建议尝试不同的超参数设置,例如降低学习率。
我什么时候应该使用一个或另一个?教程和示例使用来自 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
启用它。那些内置的 Stabilizer
s 只适用于内部变量。主输入必须自己插入一个Stabilizer
如果您包含显式 Stabilizer
但设置 enable_self_stabilization=False
(例如作为 default_option
),那么这些显式 Stabilizer
是无操作。
根据我的经验,Stabilizer
不会让事情变得更糟。提高收敛性通常是必经之路。不过,它确实会改变数值范围。因此,如果它使收敛性变差,我建议尝试不同的超参数设置,例如降低学习率。