自己的误差函数包括R中神经网络的权重

时间:2016-04-05 11:46:14

标签: r neural-network

我的问题与此问题非常相关:https://stackoverflow.com/questions/25510960/how-to-implement-own-error-function-while-using-neuralnet-package-in-r#=要求在R的Neuralnet包中提供自定义错误函数的一般语法。

虽然问题及其答案对我有帮助,因为我也想使用自定义错误功能。但是,在我的错误函数中,我想包含每次迭代的权重。例如。我想添加lamda*(weights)^2,我选择的常量lambda会影响优化选择较大/较小的权重。关于如何实现这一点的任何想法?

谢谢!

2 个答案:

答案 0 :(得分:1)

我很确定使用当前的neuralnet代码是不可能的。你可以看一下here

相关部分从第350行开始

result <- rprop(weights = weights, threshold = threshold, 
    response = response, covariate = covariate, learningrate.limit = learningrate.limit, 
    learningrate.factor = learningrate.factor, stepmax = stepmax, 
    lifesign = lifesign, lifesign.step = lifesign.step, act.fct = act.fct, 
    act.deriv.fct = act.deriv.fct, err.fct = err.fct, err.deriv.fct = err.deriv.fct, 
    algorithm = algorithm, linear.output = linear.output, 
    exclude = exclude, learningrate.bp = learningrate.bp)
startweights <- weights
weights <- result$weights
step <- result$step
reached.threshold <- result$reached.threshold
net.result <- result$net.result
error <- sum(err.fct(net.result, response))
if (is.na(error) & type(err.fct) == "ce") 
    if (all(net.result <= 1, net.result >= 0)) 
        error <- sum(err.fct(net.result, response), na.rm = T)

在这里,您可以看到内部err.fct仅显式传递了网络的result,而不是权重。如果要传递权重和lambda参数,则需要更改源代码。虽然可能不是因为“内心虚弱”,但这确实是可能的,因为您可以随时下载源并开始修改它。

答案 1 :(得分:0)

我想放手一搏。所以我下载了neuralnet.r并对其进行了编辑:

  1. 将第364行从第{{I}}行更改为error <- err.fct(net.result, response)
  2. 将第367行从第{{I}}行更改为error <- caseweights %*% err.fct(net.result, response)
  3. 将第554行从第{{I}}行更改为error <- sum(err.fct(net.result, response), na.rm = T)
  4. 将第588行从第{{I}}行更改为error <- caseweights %*% sum(err.fct(net.result, response), na.rm = T)
  5. 我还将err.deriv <- err.deriv.fct(result$net.result, response)添加到适当的函数参数,也添加到Neuralnet,并重命名了一些函数,因此我不会意外地使用标准库函数。

    不确定这是否有效。一个简单的测试似乎有效,但更复杂的测试很难收敛 - 很难设置大小写,以便它们不会太小或太大。