整流线性单元 (ReLU) 激活函数如何产生其输入的非线性交互?

机器算法验证 神经网络
2022-02-17 02:08:18

当用作深度神经网络中的激活函数时,ReLU 函数优于其他非线性函数,如 tanh 或 sigmoid。在我的理解中,激活函数的全部目的是让神经元的加权输入非线性交互。例如,当使用作为激活时,两个输入神经元的输出将是:sin(z)

sin(w0+w1x1+w2x2)

这将近似函数

(w0+w1x1+w2x2)(w0+w1x1+w2x2)36+(w0+w1x1+w2x2)5120

的不同幂的各种组合 x1x2

尽管 ReLU 在技术上也是一个非线性函数,但我看不出它如何产生像和其他激活函数那样的非线性项。sin(),tanh()

编辑:虽然我的问题与这个问题相似,但我想知道即使是级联的 ReLU 也能够逼近这种非线性项。

2个回答

假设您想使用 ReLU一种近似可能看起来像.f(x)=x2g(ax+b)h1(x)=g(x)+g(x)=|x|

h1(x)

但这不是一个很好的近似值。但是您可以添加更多具有不同选择的项来改进近似值。一个这样的改进,在更大的区间内误差是“小”的,是我们有,它变得更好。abh2(x)=g(x)+g(x)+g(2x2)+g(2x+2)

h2(x)

您可以继续此过程,将术语添加到您喜欢的复杂程度。

请注意,在第一种情况下,近似值最适合,而在第二种情况下,近似值最适合x[1,1]x[2,2]

在此处输入图像描述

x <- seq(-3,3,length.out=1000)
y_true <- x^2
relu <- function(x,a=1,b=0) sapply(x, function(t) max(a*t+b,0))

h1 <- function(x) relu(x)+relu(-x)
png("fig1.png")
    plot(x, h1(x), type="l")
    lines(x, y_true, col="red")
dev.off()

h2 <- function(x) h1(x) + relu(2*(x-1)) + relu(-2*(x+1))
png("fig2.png")
    plot(x, h2(x), type="l")
    lines(x, y_true, col="red")
dev.off()

l2 <- function(y_true,y_hat) 0.5 * (y_true - y_hat)^2

png("fig3.png")
    plot(x, l2(y_true,h1(x)), type="l")
    lines(x, l2(y_true,h2(x)), col="red")
dev.off()

将其视为分段线性函数。如果放大得足够远,要建模的函数的任何部分(假设它是平滑的)看起来都像一条线。