我注意到在Keras中不再有weight_regularizer,而是有activity和kernel regularizer。
我想知道:
- kernel和activity regularizers的主要区别是什么?
- 我能否使用activity_regularizer代替weight_regularizer?
我注意到在Keras中不再有weight_regularizer,而是有activity和kernel regularizer。
我想知道:
新的内核正则化器替换了权重正则化器,虽然从文档中并不是很清楚。
从内核正则化器的定义中可以看出:
内核正则化器:应用于内核权重矩阵的正则化器函数(参见正则化器)。
以及活动正则化器:
活动正则化器:应用于层输出(其“激活”)的正则化器函数(参见正则化器)。
Important Edit: 请注意,在 Keras 的2.1.4版本之前存在一个 activity_regularizer 的错误(至少在 Tensorflow 后端中),只有在Keras 2.1.4版本中修复。实际上,在较旧的版本中,活动正则化器函数被应用于层的输入,而不是应用于输出(即层的实际激活,如预期)。因此,如果您使用的是旧版本的Keras(2.1.4之前),则活动正则化可能无法按预期工作。
您可以在GitHub上查看提交记录。
这个回答可能有点晚,但对未来的读者很有用。
正如他们所说,需要是发明之母。只有在需要时,我才理解它的重要性。
上面的回答并没有真正说明区别,因为两者都会影响权重,那么惩罚权重本身和层输出之间有什么区别呢?
以下是答案:我遇到了一个情况,网络的权重很小,范围在[-0.3]到[+0.3]之间。
所以,我真的不能惩罚它们,它们没有任何问题。核正则化器是无用的。然而,该层的输出非常大,达到100个单位。
请记住,该层的输入也很小,始终小于1。但是,这些小值与权重以某种方式交互,产生了这些巨大的输出。在这里,我意识到我需要的是一种活动正则化器,而不是核正则化器。通过这样做,我惩罚了该层的大输出,我不在乎权重本身是否小,我只是想阻止它达到这种状态,因为这使我的sigmoid激活饱和并引起大量其他问题,如消失梯度和停滞。
这个用例的Keras示例在这里:https://github.com/ageron/handson-ml3/blob/main/17_autoencoders_gans_and_diffusion_models.ipynb,书中有更详细的内容。
PyTorch中我的训练循环的草图:
autoencoder = torch.nn.Sequential(encoder, decoder)
for epoch in range(n_epochs):
for X_in in train_data:
X_recon = autoencoder(X_in)
#For a basic autoencoder, the loss is simply MSE:
mse_loss = torch.nn.MSELoss()(X_recon, X_in)
#For a sparse autoencoder using activity regularisation,
# add a loss term penalising too many active outputs:
codings = encoder(X) #get the activations from the coding layer
activity_regularisation_l1_loss = codings.abs().sum()
total_loss = mse_loss + 1e-3 * activity_regularisation_l1_loss
optimizer.zero_grad()
total_loss.backward()
optimizer.step()
kernel_regularizer
替换为weight_regularizer
吗? - Simone