如何在 CNTK 中应用自定义正则化(使用 python)?

How can I apply custom regularization in CNTK (using python)?

您知道如何将自定义正则化函数应用于 CNTK 吗?

特别是,我想将函数对输入的导数添加到损失中;像

newLoss = loss + lambda * gradient_F(inputs)

其中 F 是模型学习的函数,输入是模型的输入。

如何在 CNTK 中实现此目的?我不知道如何访问梯度 wrt 到输入,以及如何将梯度 wrt 到正则化器的权重。

CNTK 学习者只接受数字作为正则化器 (L1/L2) 值。如果你真的想添加你的自定义正则化器,你可以很容易地实现你自己的学习者。您将可以访问所需的渐变。您会找到几个关于如何实现您自己的 Learner 的示例 here

首先,梯度不是标量,因此对其进行优化意义不大。梯度范数可能会增加你的损失。为此,CNTK 必须采用梯度范数的梯度,这在撰写本文时(2017 年 7 月)不受支持。然而,这是我们希望在未来几个月内添加的一项重要功能。

更新:一种解决方法是做这样的事情 noisy_inputs = x + C.random.normal_like(x, scale=0.01) noisy_model = model.clone('share', {x: noisy_inputs}) auxiliary_loss = C.squared_error(model, noisy_model) 但是您必须针对您的问题调整噪音的大小。

这是执行此操作的代码:

    def cross_entropy_with_softmax_plus_regularization(model, labels, l2_regularization_weight):
        w_norm = C.Constant(0);
        for p in (model.parameters):
            w_norm = C.plus(w_norm, 0.5*C.reduce_sum(C.square(p)))

        return C.reduce_log_sum_exp(model.output) - 

C.reduce_log_sum_exp(C.times_transpose(labels, model.output)) + l2_regularization_weight*w_norm

和我的 http://www.telesens.co/2017/09/29/spiral_cntk/ 博客 post 关于它