machine-learning neural-network deep-learning caffe gradient-descent

machine learning - ¿Cómo interpretar el registro de caffe con debug_info?



machine-learning neural-network (1)

Cuando se enfrentan dificultades durante el entrenamiento ( nan s , la pérdida no converge , etc.) a veces es útil mirar un registro de entrenamiento más detallado configurando debug_info: true en el archivo ''solver.prototxt'' .

El registro de entrenamiento se ve algo así como:

I1109 ...] [Forward] Layer data, top blob data data: 0.343971 I1109 ...] [Forward] Layer conv1, top blob conv1 data: 0.0645037 I1109 ...] [Forward] Layer conv1, param blob 0 data: 0.00899114 I1109 ...] [Forward] Layer conv1, param blob 1 data: 0 I1109 ...] [Forward] Layer relu1, top blob conv1 data: 0.0337982 I1109 ...] [Forward] Layer conv2, top blob conv2 data: 0.0249297 I1109 ...] [Forward] Layer conv2, param blob 0 data: 0.00875855 I1109 ...] [Forward] Layer conv2, param blob 1 data: 0 I1109 ...] [Forward] Layer relu2, top blob conv2 data: 0.0128249 . . . I1109 ...] [Forward] Layer fc1, top blob fc1 data: 0.00728743 I1109 ...] [Forward] Layer fc1, param blob 0 data: 0.00876866 I1109 ...] [Forward] Layer fc1, param blob 1 data: 0 I1109 ...] [Forward] Layer loss, top blob loss data: 2031.85 I1109 ...] [Backward] Layer loss, bottom blob fc1 diff: 0.124506 I1109 ...] [Backward] Layer fc1, bottom blob conv6 diff: 0.00107067 I1109 ...] [Backward] Layer fc1, param blob 0 diff: 0.483772 I1109 ...] [Backward] Layer fc1, param blob 1 diff: 4079.72 . . . I1109 ...] [Backward] Layer conv2, bottom blob conv1 diff: 5.99449e-06 I1109 ...] [Backward] Layer conv2, param blob 0 diff: 0.00661093 I1109 ...] [Backward] Layer conv2, param blob 1 diff: 0.10995 I1109 ...] [Backward] Layer relu1, bottom blob conv1 diff: 2.87345e-06 I1109 ...] [Backward] Layer conv1, param blob 0 diff: 0.0220984 I1109 ...] [Backward] Layer conv1, param blob 1 diff: 0.0429201 E1109 ...] [Backward] All net params (data, diff): L1 norm = (2711.42, 7086.66); L2 norm = (6.11659, 4085.07)

Qué significa eso?


A primera vista, puede ver esta sección de registro dividida en dos: [Forward] y [Backward] . Recuerde que el entrenamiento de la red neuronal se realiza mediante propagación hacia adelante y hacia atrás:
Un ejemplo de entrenamiento (lote) se alimenta a la red y un pase hacia adelante genera la predicción actual.
En base a esta predicción, se calcula una pérdida. Luego se deriva la pérdida y se estima y propaga un gradiente hacia atrás utilizando la regla de la cadena .

Estructura de datos de Caffe Blob
Solo una nueva tapa rápida. Caffe utiliza la estructura de datos de Blob para almacenar datos / pesos / parámetros, etc. Para esta discusión, es importante tener en cuenta que Blob tiene dos "partes": data y diff . Los valores de Blob se almacenan en la parte de data . La parte diff se usa para almacenar gradientes de elementos sabios para el paso de retropropagación.

Pase adelantado

Verá todas las capas de abajo hacia arriba enumeradas en esta parte del registro. Para cada capa verás:

I1109 ...] [Forward] Layer conv1, top blob conv1 data: 0.0645037 I1109 ...] [Forward] Layer conv1, param blob 0 data: 0.00899114 I1109 ...] [Forward] Layer conv1, param blob 1 data: 0

La capa "conv1" es una capa de convolución que tiene 2 blobs param: los filtros y el sesgo. En consecuencia, el registro tiene tres líneas. El filtro blob ( param blob 0 ) tiene data

I1109 ...] [Forward] Layer conv1, param blob 0 data: 0.00899114

Esa es la norma actual L2 de los pesos del filtro de convolución es 0.00899.
El sesgo actual ( param blob 1 ):

I1109 ...] [Forward] Layer conv1, param blob 1 data: 0

lo que significa que actualmente el sesgo se establece en 0.

Por último, pero no menos importante, la capa "conv1" tiene una salida, "top" llamada "conv1" (qué original ...). La norma L2 de la salida es

I1109 ...] [Forward] Layer conv1, top blob conv1 data: 0.0645037

Tenga en cuenta que todos los valores de L2 para el pase [Forward] se informan en la parte de data de los Blobs en cuestión.

Pérdida y gradiente
Al final del pase [Forward] viene la capa de pérdida:

I1109 ...] [Forward] Layer loss, top blob loss data: 2031.85 I1109 ...] [Backward] Layer loss, bottom blob fc1 diff: 0.124506

En este ejemplo, la pérdida por lotes es 2031.85, el gradiente de la pérdida wrt fc1 se calcula y pasa a la parte diff de fc1 . La magnitud L2 del gradiente es 0.1245.

Pase hacia atrás
Todo el resto de las capas se enumeran en esta parte de arriba a abajo. Puede ver que las magnitudes L2 informadas ahora son de la parte diff de los Blobs (parámetros y entradas de capas).

Finalmente
La última línea de registro de esta iteración:

[Backward] All net params (data, diff): L1 norm = (2711.42, 7086.66); L2 norm = (6.11659, 4085.07)

informa las magnitudes totales L1 y L2 de datos y gradientes.

¿Que debería buscar?

  1. Si tiene nan s en su pérdida , vea en qué punto sus datos o diff se convierten en nan : ¿en qué capa? en que iteracion?

  2. Mire la magnitud del gradiente, deberían ser razonables. SI está comenzando a ver valores con e+8 sus datos / gradientes están comenzando a explotar. ¡Disminuye tu tasa de aprendizaje!

  3. Ver que las diff no son cero. Las diferencias de cero significan sin gradientes = sin actualizaciones = sin aprendizaje. Si comenzó con pesos aleatorios, considere generar pesos aleatorios con mayor varianza.

  4. Busque activaciones (en lugar de gradientes) que van a cero. Si está utilizando "ReLU" esto significa que sus entradas / pesos lo llevan a regiones donde las puertas de ReLU están "no activas" y conducen a "neuronas muertas" . Considere normalizar sus entradas para tener una media cero, agregue [ "BatchNorm"][6] layers, setting negative_slope` en ReLU.