Intento comprender el papel de la derivada de la función sigmoidea en las redes neuronales.
Primero trazo la función sigmoide y la derivada de todos los puntos de la definición usando python. ¿Cuál es exactamente el papel de este derivado?
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def derivative(x, step):
return (sigmoid(x+step) - sigmoid(x)) / step
x = np.linspace(-10, 10, 1000)
y1 = sigmoid(x)
y2 = derivative(x, 0.0000000000001)
plt.plot(x, y1, label='sigmoid')
plt.plot(x, y2, label='derivative')
plt.legend(loc='upper left')
plt.show()
machine-learning
neural-network
lukassz
fuente
fuente
Respuestas:
El uso de derivados en redes neuronales es para el proceso de entrenamiento llamado retropropagación . Esta técnica utiliza el descenso de gradiente para encontrar un conjunto óptimo de parámetros del modelo con el fin de minimizar una función de pérdida. En su ejemplo, debe usar la derivada de un sigmoide porque esa es la activación que están usando sus neuronas individuales.
La función de pérdida
La esencia del aprendizaje automático es optimizar una función de costo de manera que podamos minimizar o maximizar alguna función objetivo. Esto generalmente se llama la función de pérdida o costo. Por lo general, queremos minimizar esta función. La función de costo, , asocia una penalización basada en los errores resultantes al pasar datos a través de su modelo en función de los parámetros del modelo.C
Veamos el ejemplo en el que intentamos etiquetar si una imagen contiene un gato o un perro. Si tenemos un modelo perfecto, podemos darle una imagen al modelo y nos dirá si es un gato o un perro. Sin embargo, ningún modelo es perfecto y cometerá errores.
Cuando entrenamos nuestro modelo para poder inferir el significado de los datos de entrada, queremos minimizar la cantidad de errores que comete. Por lo tanto, utilizamos un conjunto de entrenamiento, estos datos contienen muchas imágenes de perros y gatos y tenemos la etiqueta de verdad básica asociada con esa imagen. Cada vez que ejecutamos una iteración de entrenamiento del modelo, calculamos el costo (la cantidad de errores) del modelo. Queremos minimizar este costo.
Existen muchas funciones de costo, cada una de las cuales cumple su propio propósito. Una función de costo común que se usa es el costo cuadrático que se define como
.C=1N∑Ni=0(y^−y)2
Este es el cuadrado de la diferencia entre la etiqueta predicha y la etiqueta de verdad básica para el imágenes sobre las que hemos entrenado. Queremos minimizar esto de alguna manera.N
Minimizando una función de pérdida
De hecho, la mayoría del aprendizaje automático es simplemente una familia de marcos que son capaces de determinar una distribución minimizando alguna función de costo. La pregunta que podemos hacer es "¿cómo podemos minimizar una función"?
Minimicemos la siguiente función
Si trazamos esto, podemos ver que hay un mínimo en . Para hacer esto analíticamente podemos tomar la derivada de esta función comox = 2
Sin embargo, muchas veces encontrar un mínimo global analíticamente no es factible. Entonces, en cambio, usamos algunas técnicas de optimización. Aquí también existen muchas formas diferentes, tales como: Newton-Raphson, búsqueda de cuadrícula, etc. Entre ellas está el descenso de gradiente . Esta es la técnica utilizada por las redes neuronales.
Descenso de gradiente
Usemos una analogía famosa para entender esto. Imagine un problema de minimización en 2D. Esto es equivalente a estar en una caminata montañosa en el desierto. Desea volver a la aldea que sabe que está en el punto más bajo. Incluso si no conoce las direcciones cardinales de la aldea. Todo lo que necesitas hacer es tomar el camino más empinado hacia abajo y llegarás al pueblo. Entonces descenderemos por la superficie en función de la pendiente de la pendiente.
Tomemos nuestra función
determinaremos la para la cualX se minimiza. El algoritmo de descenso de gradiente primero dice que elegiremos un valor aleatorio para x . Inicialicemos en x = 8 . Luego, el algoritmo hará lo siguiente de forma iterativa hasta que alcancemos la convergencia.y X x = 8
donde es la tasa de aprendizaje, podemos establecer esto en el valor que queramos. Sin embargo, hay una forma inteligente de elegir esto. Demasiado grande y nunca alcanzaremos nuestro valor mínimo, y demasiado grande desperdiciaremos mucho tiempo antes de llegar allí. Es análogo al tamaño de los escalones que desea bajar por la pendiente empinada. Pequeños pasos y morirás en la montaña, nunca bajarás. Un paso demasiado grande y te arriesgas a disparar al pueblo y terminar al otro lado de la montaña. La derivada es el medio por el cual viajamos por esta pendiente hacia nuestro mínimo.ν
Iteración 1:
x n e w = 6.8 - 0.1 ( 2 ∗ 6.8 - 4 ) = 5.84 x n e w = 5.84 - 0.1 ( 2 ∗ 5.84 - 4 ) = 5.07 x ( 2 ∗ 5.07 - 4 )Xn e w= 8 - 0.1 ( 2 ∗ 8 - 4 ) = 6.8
Xn e w=6.8−0.1(2∗6.8−4)=5.84
Xnortee w= 5.84 - 0.1 ( 2 ∗ 5.84 - 4 ) = 5.07 Xn e w= 5.07 - 0.1 ( 2 ∗ 5.07 - 4 ) = 4.45
Xn e w=4.45−0.1(2∗4.45−4)=3.96
xnew=3.96−0.1(2∗3.96−4)=3.57 xnew=3.57−0.1(2∗3.57−4)=3.25 xnew=3.25−0.1(2∗3.25−4)=3.00
xnew=3.00−0.1(2∗3.00−4)=2.80
xnew=2.80−0.1(2∗2.80−4)=2.64 xnew=2.64−0.1(2∗2.64−4)=2.51
xnew=2.51−0.1(2∗2.51−4)=2.41
xnorteew= 2.41 - 0.1 ( 2 ∗ 2.41 - 4 ) = 2.32 Xn e w= 2.32 - 0.1 ( 2 ∗ 2.32 - 4 ) = 2.26
Xn e w= 2.26 - 0.1 ( 2 ∗ 2.26 - 4 ) = 2.21 Xn e w=2.21−0.1(2∗2.21−4)=2.16
xnew=2.16−0.1(2∗2.16−4)=2.13 xnew=2.13−0.1(2∗2.13−4)=2.10
xnew=2.10−0.1(2∗2.10−4)=2.08
xnew=2.08−0.1(2∗2.08−4)=2.06 xnew=2.06−0.1(2∗2.06−4)=2.05
xnew=2.05−0.1(2∗2.05−4)=2.04 xnew=2.04−0.1(2∗2.04−4)=2.03 xnew=2.03−0.1(2∗2.03−4)=2.02
xnew=2.02−0.1(2∗2.02−4)=2.02
xnew=2.02−0.1(2∗2.02−4)=2.01 xnew=2.01−0.1(2∗2.01−4)=2.01 xnew=2.01−0.1(2∗2.01−4)=2.01
xnew=2.01−0.1(2∗2.01−4)=2.00
xnew=2.00−0.1(2∗2.00−4)=2.00 xnew=2.00−0.1(2∗2.00−4)=2.00
xnew=2.00−0.1(2∗2.00−4)=2.00
xnew=2.00−0.1(2∗2.00−4)=2.00
x n e w = 4.45 - 0.1 ( 2 ∗ 4.45 - 4 ) = 3.96 x n e w = 3.96 - 0.1 ( 2 ∗ 3.96 - 4 ) = 3.57 x n e w = 3.57 - 0.1 ( 2 ∗ 3.57 - 4 )
x n e w = 3.25 - 0.1 ( 2 ∗ 3.25 x n e w =
x n e w = 3.00 - 0.1 ( 2 ∗ 3.00 - 4 ) = 2.80 x n e w = 2.80 - 0.1 ( 2 ∗ 2.80 - 4 ) = 2.64
x n e w = 2.51 - 0.1 ( 2 ∗ 2.51 - 4 ) = 2.41 x n e w = 2.41 - 0.1 ( 2 ∗ 2.41 - 4 ) = 2.32 x n e w = 2.32 - 0.1 ( 2 ∗ 2.32
x n e w = 2.26 - 0.1 ( 2 ∗ 2.26 - 4 ) = 2.21 x n e w =
x n e w = 2.16 - 0.1 ( 2 ∗ 2,16 - 4 ) = 2,13 x n
x n e w =2.10-0.1(2∗2.10-4)=2.08 x n e w =2.08-0.1(2∗2.08-4)=2.06 x n e w =2.06-0.1(
x n e w = 2.05 - 0.1 ( 2 ∗ 2.05 - 4 ) = 2.04 x n e w = 2.04 - 0.1 ( 2 ∗ 2.04 -
x n e w = 2.03 - 0.1 ( 2 ∗ 2.03 - 4 ) =
x n e w = 2.02 - 0.1 ( 2 ∗ 2.02 - 4 ) = 2.02 x n e w = 2.02 - 0.1 ( 2 ∗ 2.02 - 4 ) = 2.01 x n e w = 2.01 - 0.1 ( 2
x n e w = 2.01
x n e w = 2.01 - 0.1 ( 2 ∗ 2.01 - 4 ) = 2.00 x n e w = 2.00 - 0.1 ( 2 ∗ 2.00 - 4 ) = 2.00 x n e w = 2.00 - 0.1 ( 2 ∗ 2.00 -
x n e w = 2.00 - 0.1 ( 2 ∗ 2.00 - 4 ) = 2.00 x n e w = 2.00 - 0.1 ( 2 ∗ 2.00 - 4 ) = 2.00
¡Y vemos que el algoritmo converge en ! Hemos encontrado el mínimo.x=2
Aplicado a redes neuronales
wherew is the associated weight for each input x and we have a bias b . We then want to minimize our cost function
How to train the neural network?
We will use gradient descent to train the weights based on the output of the sigmoid function and we will use some cost functionC and train on batches of data of size N .
and we have thaty^=σ(wTx) and the derivative of the sigmoid function is ∂σ(z)∂z=σ(z)(1−σ(z)) thus we have,
So we can then update the weights through gradient descent as
whereη is the learning rate.
fuente
During the phase where the neural network generates its prediction, it feeds the input forward through the network. For each layer, the layer's inputX goes first through an affine transformation W⋅X+b and then is passed through the sigmoid function σ(W⋅X+b) .
In order to train the network, the outputy^ is then compared to the expected output (or label) y through a cost function L(y,y^)=L(y,σ(W⋅X+b)) . The goal of the whole training procedure is to minimize that cost function. In order to do that, a technique called gradient descent is performed which calculates how we should change W and b so that the cost reduces.
Gradient Descent requires calculating the derivative of the cost function w.r.tW and b . In order to do that we must apply the chain rule, because the derivative we need to calculate is a composition of two functions. As dictated by the chain rule we must calculate the derivative of the sigmoid function.
One of the reasons that the sigmoid function is popular with neural networks, is because its derivative is easy to compute.
fuente
In simple words:
For example if input is 0 or 1 or -2, the derivative (the "learning ability") is high and back-propagation will improve neuron's weights for this sample dramatically.
On other hand, if input is 20, the the derivative will be very close to 0. It means that back-propagation on this sample will not "teach" this neuron to produce a better result.
The things above are valid for a single sample.
Let's look at the bigger picture, for all samples in the training set. Here we have several situations:
If derivative is 0 for all samples in your training set AND neuron always produces correct results - it means the neuron have been studying really well and already as smart as it could (side note: this case is good but it may indicate potential overfitting, which is not good)
If derivative is 0 on some samples, non-0 on other samples AND neuron produces mixed results - it indicates that this neuron doing some good work and potentially may improve from further training (though not necessarily as it depends on other neurons and training data you have)
So, when you are looking at the derivative plot, you can see how much the neuron prepared to learn and absorb the new knowledge, given a particular input.
fuente
The derivative you see here is important in neural networks. It's the reason why people generally prefer something else such as rectified linear unit.
Do you see the derivative drop for the two ends? What if your network is on the very left side, but it needs to move to the right side? Imagine you're on -10.0 but you want 10.0. The gradient will be too small for your network to converge quickly. We don't want to wait, we want quicker convergence. RLU doesn't have this problem.
We call this problem "Neural Network Saturation".
Please see https://www.quora.com/What-is-special-about-rectifier-neural-units-used-in-NN-learning
fuente