una tutorial redes recurrente paso neuronales neuronal inteligencia hacer ejemplos construccion como artificial python numpy machine-learning neural-network sigmoid

python - tutorial - ¿Por qué multiplicar el error por la derivada del sigmoide en redes neuronales?



redes neuronales python pdf (1)

En primer lugar, esta línea es correcta:

l1_delta = l1_error * nonlin(l1, True)

El error total de la capa siguiente l1_error se multiplica por la derivada de la capa actual (aquí considero un sigmoide una capa separada para simplificar el flujo de retropropagación). Se llama una regla de cadena .

La cita sobre "confianza de la red" puede ser confusa para un principiante. Lo que quieren decir aquí es la interpretación probabilística de la función sigmoidea . Sigmoid (o en general, softmax ) es muy a menudo la última capa en problemas de clasificación: sigmoide saca un valor entre [0, 1] , que puede verse como una probabilidad o confianza de clase 0 o clase 1 .

En esta interpretación, sigmoid=0.001 es alta confianza de clase 0 , que corresponde a gradiente pequeño y pequeña actualización de la red, sigmoid=0.999 es alta confianza de clase 1 y sigmoid=0.499 es baja confianza de cualquier clase.

Tenga en cuenta que en su ejemplo, sigmoid es la última capa, por lo que puede ver esta red como haciendo una clasificación binaria, por lo tanto, la interpretación anterior tiene sentido.

Si considera una activación sigmoidea en las capas ocultas, la interpretación de la confianza es más cuestionable (aunque uno puede preguntar qué tan segura es una neurona en particular ). Pero la fórmula de propagación de error aún se mantiene, porque la regla de la cadena se cumple.

Seguramente sería mejor l1_error el l1_error si quisieras enfatizar el error.

Aquí hay una nota importante. El gran éxito de las redes neuronales en los últimos años se debe, al menos parcialmente, al uso de ReLu en lugar de sigmoide en las capas ocultas, exactamente porque es mejor no saturar el gradiente. Esto se conoce como un problema de gradiente de fuga . Por lo tanto, por el contrario, generalmente no desea enfatizar el error en backprop.

Aquí está el código:

import numpy as np # sigmoid function def nonlin(x,deriv=False): if(deriv==True): return x*(1-x) return 1/(1+np.exp(-x)) # input dataset X = np.array([ [0,0,1], [0,1,1], [1,0,1], [1,1,1] ]) # output dataset y = np.array([[0,0,1,1]]).T # seed random numbers to make calculation # deterministic (just a good practice) np.random.seed(1) # initialize weights randomly with mean 0 syn0 = 2*np.random.random((3,1)) - 1 for iter in xrange(10000): # forward propagation l0 = X l1 = nonlin(np.dot(l0,syn0)) # how much did we miss? l1_error = y - l1 # multiply how much we missed by the # slope of the sigmoid at the values in l1 l1_delta = l1_error * nonlin(l1,True) # update weights syn0 += np.dot(l0.T,l1_delta) print "Output After Training:" print l1

Aquí está el sitio web: http://iamtrask.github.io/2015/07/12/basic-python-network/

La línea 36 del código, el l1 error se multiplica por la derivada de la entrada punteada con los pesos. No tengo idea de por qué se hace esto y he pasado horas tratando de resolverlo. Acabo de llegar a la conclusión de que esto está mal, pero algo me dice que probablemente no sea correcto, teniendo en cuenta cuántas personas recomiendan y utilizan este tutorial como punto de partida para el aprendizaje de redes neuronales.

En el artículo, dicen que

¡Mira la imagen sigmoidea otra vez! Si la pendiente era realmente poco profunda (cerca de 0), entonces la red tenía un valor muy alto o muy bajo. Esto significa que la red estaba bastante segura de una manera u otra. Sin embargo, si la red adivinó algo cercano a (x = 0, y = 0.5), entonces no es muy seguro.

No puedo entender por qué la alteza o baja de la entrada a la función sigmoide tiene algo que ver con la confianza. Seguramente no importa cuán alto sea, porque si la producción pronosticada es baja, entonces realmente no estará seguro, a diferencia de lo que dijeron acerca de que debería ser seguro solo porque es alto.

Seguramente sería mejor l1_error el l1_error si quisieras enfatizar el error.

Esto es una verdadera decepción ya que hasta ese momento parecía que había encontrado una manera prometedora de comenzar a aprender intuitivamente sobre redes neuronales, pero una vez más me equivoqué. Si tiene un buen lugar para comenzar a aprender donde puedo entender realmente fácilmente, se lo agradecería.