2017-06-25 52 views
0

您是否知道我如何将自定义正则化函数应用于CNTK?如何在CNTK中使用自定义正则化(使用python)?

特别是,我想补充损失函数的导数对输入的影响;类似于

newLoss = loss + lambda * gradient_F(inputs) 

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

如何在CNTK中实现此目的?我不知道如何访问与输入相关的梯度,以及如何将梯度与正规化器的权重进行比较。

回答

1

首先,渐变不是标量,所以对其进行优化并没有多大意义。梯度标准可能会增加您的损失。为此,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) 但你必须调整噪声的规模,为您的问题。

+0

谢谢您的回答!很显然,我的意思是渐变的规范(实际上是渐变差异的标准,正如论文中所概述的那样,但我不会涉及它)。我也想知道如何获得渐变规范的渐变,但由于它不被支持,我现在就等着。再次感谢你!你参与cntk开发吗? – Ant

+1

是的,我参与了CNTK的开发。一种逼近你想要的东西的方式是在你的数据中添加少量的随机噪声,将它们推送到你的网络的克隆版本中,并要求克隆和原始数据之间有很小的差异。查看更新后的答案。 –

0

CNTK学习者只接受数字作为正规化(L1/L2)值。如果你真的想要添加自定义调节器,你可以轻松实现自己的学习者。你将可以访问你需要的渐变。你会发现几个关于如何实施你自己的学习者的例子。

0

下面的代码来做到这一点:

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/博客文章对此

+0

嗨!我一直在寻找渐变的标准,而不是体重的标准:) – Ant

+0

好的,对不起,我没有正确地阅读原始问题。您可以通过插入实现参数更新的自定义学习者函数来访问渐变(请参阅下面的代码)。不知道如何从你的损失函数可以访问这些渐变,虽然.. ' def my_gradient_update(parameters,gradients): update_funcs = []; 为P,G在拉链(参数,梯度): gradient_scale_factor = 0.001 update_funcs.append(C.assign(P,P - gradient_scale_factor * G)) 返回C.combine(update_funcs) ' – ankur

相关问题