【问题标题】:Own error function including weights for neuralnet in R自己的误差函数,包括 R 中神经网络的权重
【发布时间】:2016-04-05 11:46:14
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: r neural-network


    【解决方案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 参数,则需要更改源代码。虽然可能不适合“胆小鬼”,但这确实是可能的,因为您可以随时下载源代码并开始修改它。

    【讨论】:

    • 谢谢!这有帮助!因为我是许多 coursera 机器学习的孩子之一,我想我宁愿将我的 octave 代码翻译成 R 来构建我自己的函数,然后我可以完全理解并完全控制而不是弄乱这个包..再次感谢!
    【解决方案2】:

    我想试一试。于是我下载了 neuralnet.r 并对其进行了编辑:

    1. 将第 364 行从行 error &lt;- err.fct(net.result, response) 更改为 error &lt;- caseweights %*% err.fct(net.result, response)
    2. 将第 367 行从行 error &lt;- sum(err.fct(net.result, response), na.rm = T) 更改为 error &lt;- caseweights %*% sum(err.fct(net.result, response), na.rm = T)
    3. 将第 554 行从行 err.deriv &lt;- err.deriv.fct(result$net.result, response) 更改为 err.deriv &lt;- caseweights * err.deriv.fct(result$net.result, response)
    4. 将第 588 行从行 err.deriv &lt;- err.deriv.fct(result$net.result, response) 更改为 err.deriv &lt;- caseweights * err.deriv.fct(result$net.result, response)

    我还将caseweights 添加到适当的函数参数以及神经网络,并重命名了一些函数,这样我就不会意外使用标准库的函数。

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

    【讨论】:

      猜你喜欢
      • 2017-11-06
      • 2014-10-20
      • 2018-08-28
      • 1970-01-01
      • 2017-06-20
      • 1970-01-01
      • 2018-05-30
      • 2011-10-31
      • 1970-01-01
      相关资源
      最近更新 更多