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

如何在CNTK中应用自定义正则化(使用python)?,python,machine-learning,backpropagation,cntk,regularized,Python,Machine Learning,Backpropagation,Cntk,Regularized,您知道如何将自定义正则化函数应用于CNTK吗 特别是,我想将functino wrt对输入的导数添加到损失中;差不多 newLoss = loss + lambda * gradient_F(inputs) 其中F是模型学习的函数,输入是模型的输入 如何在CNTK中实现这一点?我不知道如何将梯度wrt访问到输入,以及如何将梯度wrt访问到正则化器的权重 CNTK学习者只接受数字作为正则化器(L1/L2)值。如果您真的想添加自定义正则化器,您可以轻松实现自己的学习者。您将可以访问所需的渐变。您将

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

特别是,我想将functino wrt对输入的导数添加到损失中;差不多

newLoss = loss + lambda * gradient_F(inputs)
其中F是模型学习的函数,输入是模型的输入


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

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

首先,梯度不是标量,因此优化它没有多大意义。梯度标准可能是增加你损失的一件有趣的事情。为此,CNTK必须采用梯度标准的梯度,在撰写本文时(2017年7月),该标准不受支持。不过,这是我们希望在未来几个月增加的一项重要功能

更新:一种解决方法是这样做

噪声输入=x+C.随机。正常(x,比例=0.01)
noise_model=model.clone('share',{x:noise_inputs})
辅助损耗=C.平方误差(模型、噪声模型)

但您必须针对您的问题调整噪音的大小。

以下是执行此操作的代码:

    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

还有我的博客帖子

谢谢你的回答!是的,很明显,我指的是梯度的范数(实际上是梯度差的范数,正如一篇论文中所概述的……但我不想讨论它)。我还想知道如何得到梯度范数的梯度,但由于它不受支持,我现在就等着。再次感谢你!你参与cntk开发吗?是的,我参与cntk开发。一种近似您想要的方法是向数据中添加少量随机噪声,将它们推送到网络的克隆版本中,并要求克隆输出与原始输出之间存在微小差异。查看更新的答案。嗨!我在寻找梯度的标准值,而不是重量的标准值:)啊,好的,对不起,我没有正确阅读原始问题。通过插入实现参数更新的自定义学习器函数,可以访问渐变(请参见下面的代码)。但不确定如何从损失函数中访问这些梯度def my_gradient_update(参数、渐变):update_funcs=[];对于zip(参数,渐变)中的p,g:gradient_scale_factor=0.001 update_funcs.append(C.assign(p,p-gradient_scale_factor*g))返回C.combine(update_funcs)`