Pregunta

¿Alguien puede recomendar un sitio web o dame un breve de cómo se implementa propagación hacia atrás en un NN? Entiendo el concepto básico, pero estoy seguro de cómo hacer para escribir el código.

Muchas de las fuentes que he encontrado simplemente mostrar ecuaciones sin dar ninguna explicación de por qué lo están haciendo, y los nombres de las variables hacen que sea difícil de averiguar.

Ejemplo:

void bpnn_output_error(delta, target, output, nj, err)
double *delta, *target, *output, *err;
int nj;
{
  int j;
  double o, t, errsum;

  errsum = 0.0;
  for (j = 1; j <= nj; j++) {
    o = output[j];
    t = target[j];
    delta[j] = o * (1.0 - o) * (t - o);
    errsum += ABS(delta[j]);
  }
  *err = errsum;

}

En este ejemplo, alguien puede explicar el propósito de

delta[j] = o * (1.0 - o) * (t - o);

Gracias.

¿Fue útil?

Solución

El objetivo de

  

delta [j] = o * (1,0 - O) * (t - o);

es encontrar el error de un nodo de salida en una red de retropropagación.

O representa la salida del nodo, t es el valor esperado de la salida para el nodo.

El término, (o * (1.0 -. O), es la derivada de una función de transferencia común usado, la función sigmoide (Otras funciones de transferencia no son infrecuentes, y requerirían una reescritura del código que tiene la sigmoide primera derivado en su lugar. a falta de coincidencia entre la función y el derivado probablemente significar que la formación no sería converger.) el nodo tiene un valor de "activación" que se alimenta a través de una función de transferencia para obtener la salida o, como

  

o = f (activación)

Lo más importante es que retropropagación utiliza descenso de gradiente, y el error se propaga hacia atrás por aplicación de la regla de la cadena. El problema es uno de asignación de crédito o la culpa si se quiere, para los nodos ocultos cuya producción no es directamente comparable con el valor esperado. Empezamos con lo que se conoce y comparables, los nodos de salida. El error se toma para ser proporcional a la primera derivada de los tiempos de salida el valor de error en bruto entre la salida esperada y la salida real.

Así que más simbólicamente, nos escribimos esa línea

  

delta [j] = f '(activation_j) * (t_j - o_j)

donde f es su función de transferencia, y f' es la primera derivada de la misma.

Más atrás en las capas ocultas, el error en un nodo es su contribución estimada a los errores encontrados en la capa siguiente. Por lo que los deltas de la capa de éxito se multiplican por los pesos de conexión, y esos productos se suman. Esa suma se multiplica por la primera derivada de la activación del nodo oculto para obtener el delta para un nodo oculto, o

  

delta [j] = f '(activation_j) * Sum (delta [k] * w_jk)

donde j ahora referencia a un nodo oculto y k un nodo en una capa subsiguiente.

Otros consejos

(t-o) es el error en la salida de la red desde t es la salida de destino y o es la salida real. Está siendo almacenado en una forma normalizada en la matriz delta. El método utilizado para normalizar depende de la aplicación y de la o * ( 1.0 - o ) parece estar haciendo que (puedo estar equivocado acerca de ese supuesto).

Este error normalizada se acumula para todo el conjunto de entrenamiento para juzgar cuando la formación está completa:. Por lo general cuando errsum está por debajo de algún umbral objetivo

En realidad, si conoce la teoría, los programas deben ser fáciles de entender. Puede leer el libro y hacer algunas muestras simples utilizando un lápiz para averiguar los pasos exactos de propagación. Este es un principio general para la implementación de programas numéricos, es necesario conocer los detalles muy pequeños en los casos.

Si conoce Matlab, les gustaría sugerir a leer algo de código fuente de Matlab (por ejemplo, aquí ), que es fácil de entender que C.

En el código en su pregunta, los nombres son bastante explica por sí mismo, el resultado puede ser la matriz de su predicción, el objetivo puede ser el conjunto de etiquetas de formación, delta es el error entre los valores de predicción y verdaderos, sino que también sirve como el valor que se actualiza en el vector de peso.

En esencia, lo que hace es Backprop funcionamiento de la red en los datos de entrenamiento, observe la salida, y luego ajustar los valores de los nodos, al pasar de los nodos de salida de nuevo a la entrada de nodos de forma iterativa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top