17 votos

¿Cómo produce la función de activación Unidad Lineal Rectificada (ReLU) una interacción no lineal de sus entradas?

Cuando se utiliza como función de activación en redes neuronales profundas La función ReLU supera a otras funciones no lineales como tanh o sigmoide . En mi opinión, el objetivo de una función de activación es permitir que las entradas ponderadas de una neurona interactúen de forma no lineal. Por ejemplo, cuando se utiliza $sin(z)$ como la activación, la salida de una neurona de dos entradas sería:

$$ sin(w_0+w_1*x_1+w_2*x_2) $$

que se aproximaría a la función $$ (w_0+w_1*x_1+w_2*x_2) - {(w_0+w_1*x_1+w_2*x_2)^3 \over 6} + {(w_0+w_1*x_1+w_2*x_2)^5 \over 120} $$

y contienen todo tipo de combinaciones de diferentes potencias de las características $x_1$ y $x_2$ .

Aunque la ReLU también es técnicamente una función no lineal, no veo cómo puede producir términos no lineales como el $sin(), tanh()$ y otras activaciones lo hacen.

Edición: Aunque mi pregunta es similar a esta pregunta Me gustaría saber cómo incluso una cascada de ReLUs son capaces de aproximar tales términos no lineales.

27voto

user777 Puntos 10934

Supongamos que desea aproximar $f(x)=x^2$ utilizando ReLUs $g(ax+b)$ . Una aproximación podría ser $h_1(x)=g(x)+g(-x)=|x|$ .

h1(x)

Pero no es una buena aproximación. Pero se pueden añadir más términos con diferentes opciones de $a$ y $b$ para mejorar la aproximación. Una de estas mejoras, en el sentido de que el error es "pequeño" en un intervalo mayor, es que tenemos $h_2(x)=g(x)+g(-x)+g(2x-2)+g(-2x+2)$ y se pone mejor.

h2(x)

Puede continuar este procedimiento de añadir términos hasta alcanzar la complejidad que desee.

Obsérvese que, en el primer caso, la aproximación es mejor para $x\in[-1,1]$ mientras que en el segundo caso, la aproximación es mejor para $x\in[-2,2]$ .

enter image description here

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()

0voto

user2514608 Puntos 11

Piensa en ello como una función lineal a trozos. Cualquier segmento de la función que quieras modelar (suponiendo que sea suave) parece una línea si te acercas lo suficiente.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X