R中的“神经网络”包,整流线性单元(ReLU)激活函数?

Posted

技术标签:

【中文标题】R中的“神经网络”包,整流线性单元(ReLU)激活函数?【英文标题】:Package ‘neuralnet’ in R, rectified linear unit (ReLU) activation function? 【发布时间】:2016-04-04 15:01:26 【问题描述】:

我正在尝试使用 R 包神经网络中预先实现的“logistic”和“tanh”以外的激活函数。具体来说,我想使用整流线性单元 (ReLU) f(x) = maxx,0。请在下面查看我的代码。

如果由(例如)定义,我相信我可以使用自定义函数

custom <- function(a) x*2

但如果我设置 max(x,0) 而不是 x*2 则 R 告诉我“最大值不在导数表中”,对于“>”运算符也是如此。因此,我正在寻找一种合理的解决方法,因为我认为在这种情况下 max 的数值积分不会成为问题。

nn <- neuralnet(
  as.formula(paste("X",paste(names(Z[,2:10]), collapse="+"),sep="~")),
  data=Z[,1:10], hidden=5, err.fct="sse",
  act.fct="logistic", rep=1,
  linear.output=TRUE)

有什么想法吗?我有点困惑,因为我认为 neuralnet 包不会进行分析微分。

【问题讨论】:

如果您的问题已得到回答,请选择最适合您的问题,以便将问题标记为已关闭。 【参考方案1】:

可以用可微函数逼近max函数,如:

custom <- function(x) x/(1+exp(-2*k*x))

变量 k 决定了近似的精度。

其他近似值可以从“解析近似值”部分中的方程式推导出来:https://en.wikipedia.org/wiki/Heaviside_step_function

【讨论】:

谢谢你,效果很好,通过 k 的精度控制也很好。一个【参考方案2】:

neuralnet 包的内部将尝试区分提供给act.fct 的任何功能。可以看源码here。

在第 211 行,您会发现以下代码块:

if (is.function(act.fct)) 
    act.deriv.fct <- differentiate(act.fct)
    attr(act.fct, "type") <- "function"

differentiate 函数是deriv 函数的更复杂用法,您也可以在上面的源代码中看到它。因此,目前无法将max(0,x) 提供给act.fct。它需要在代码中放置一个异常来识别 ReLU 并知道导数。获取源代码,将其添加并提交给维护人员以进行扩展(但这可能有点多)将是一个很好的练习。

但是,关于一个合理的解决方法,您可以使用 softplus function,它是 ReLU 的平滑近似。您的自定义函数如下所示:

custom <- function(x) log(1+exp(x))

您也可以在 R 中查看此近似值:

softplus <- function(x) log(1+exp(x))
relu <- function(x) sapply(x, function(z) max(0,z))

x <- seq(from=-5, to=5, by=0.1)
library(ggplot2)
library(reshape2)

fits <- data.frame(x=x, softplus = softplus(x), relu = relu(x))
long <- melt(fits, id.vars="x")
ggplot(data=long, aes(x=x, y=value, group=variable, colour=variable))+
  geom_line(size=1) +
  ggtitle("ReLU & Softplus") +
  theme(plot.title = element_text(size = 26)) +
  theme(legend.title = element_blank()) +
  theme(legend.text = element_text(size = 18))

【讨论】:

感谢您解释问题出现的原因和位置(现在说得通),也感谢您的解决方法(附上图表!)。将看看我是否设法调整源代码并了解衍生品,但与此同时,解决方法就像做梦一样。谢谢!一个 @AJGronevelt,很高兴它有效。如果您确实修改了源代码,请尝试提交给维护者。 ReLU 很容易访问。如果这完全满足您的问题,请务必接受,以便问题结束。

以上是关于R中的“神经网络”包,整流线性单元(ReLU)激活函数?的主要内容,如果未能解决你的问题,请参考以下文章

神经网络中的激活函数

浅谈神经网络中的激活函数

具有整流线性单元的 1-hidden layer 神经网络

神经网络与深度学习笔记激活函数与参数初始化

吴恩达 Deep learning 第一周 深度学习概论

深度学习基础之激活函数