Pregunta

Primero una pregunta teórica y luego una práctica.

Las redes neuronales de respaldo, ¿es el cálculo de los derivados de los pesos o el cálculo de los nuevos pesos (es decir, los pesos originales menos las derivadas de peso, la velocidad de aprendizaje, simplificada)?

Bien puede ser un problema de semántica, pero es importante, sin embargo.

Además, si alguien está familiarizado con la clase de antorcha, nn

gradInput = module:backward(input, gradOutput)

¿Es Gradinput el peso establecido para el siguiente pase hacia adelante o son las derivadas de los pesos del pase hacia adelante anterior?

¡Gracias!

¿Fue útil?

Solución

He estado usando antorcha durante unos meses, pero lo intentaré (disculpas si es incorrecta).

Sí, un peso $ W $ se actualiza de la siguiente manera;

$$ w_ {nuevo} = w_ {viejo} - gamma parcial e/ parcial w_ {old} $$

donde $ gamma $ es su tasa de aprendizaje y $ e $ es el error calculado usando algo como criterion:forward(output,target). El criterio podría ser, por ejemplo, nn.MSECriterion().

Para calcular $ parcial e/ parcial w $ necesitas $ parcial e/ parcial y $ gradOutput = criterion:backward(output,target)(respeto de gradiente a la salida) así como la entrada input a la red, es decir, su $ x $ (por ejemplo, datos de imagen) para generar el conjunto recursivo de ecuaciones que se multiplican con gradOutput.

model:backward(input, gradOutput) Por lo tanto, sirve para actualizar los pesos para que estén listos para el próximo model:forward(input) ya que genera un gran tensor de derivados $ de/dw_ {old} $.

Esto luego se combina con un optimizador como optim.sgd usando optimMethod y los viejos pesos $ w_ {viejos} $ para generar los nuevos pesos en la primera ecuación. Por supuesto, puede actualizar los pesos sin un optimizador con model:updateParameters(learningRate) Pero extrañas cosas útiles como impulso, descomposición de peso, etc.

Me rastrearon un poco allí, pero espero que esto ayude.

Otros consejos

En la visión más simple, tal vez esto será suficiente: el backward() El método se utiliza para entrenar una red neuronal con backpropagation; Calcular la salida y entrada dada x Usando su red forward() método, luego descubra el error de la salida de su objetivo utilizando el criterion Definiste (por ejemplo, la probabilidad de registro negativo, etc.). Ahora, si solo hubiera una capa de red, simplemente podría usar esos errores entre la capa de salida y el objetivo para actualizar los pesos en esa sola capa. Cuando tiene más de una capa (o una estructura más compleja), puede actualizar las capas una a la vez, cada vez que calcula el error en que Capa (ya no la capa de salida), luego usando ese error para actualizar los pesos para una capa anterior. Eso es backpropogation. Para esto, obviamente necesita alguna forma de mapear el error en la salida $ delta y $ en $ delta x $ usando el mismo estado (también conocido como el estado del modelo y la entrada $ x $). Por lo tanto, la backward() El método está esencialmente en la forma: $$ f: (x, delta y) rectarrow delta x $$

Para la misma integridad, un forward() El método se puede representar como: $$ f: x rectarrow y $$ Alternativamente, si el estado anterior de y persiste, entonces todo lo que necesita calcular es $ delta y $, por lo tanto, de manera equivalente, un forward() También se puede representar como: $$ f: (x, y) rectarrow delta y $$

Esta forma se puede comparar fácilmente con el backward() Método, y es fácil ver por qué se llama como tal.

Licenciado bajo: CC-BY-SA con atribución
scroll top