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

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

El registro de entrenamiento se ve más o menos así:

 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 neural network se realiza a través de la propagación hacia adelante-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 calcula un gradiente y se propaga hacia atrás utilizando la regla de la cadena .

Estructura de datos Caffe Blob
Solo un rápido recapitulación. Caffe usa la estructura de datos 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 elemento para el paso de backpropagation.

Pase adelantado

Verá todas las capas de abajo a 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 de param: los filtros y el sesgo. En consecuencia, el registro tiene tres líneas. El blob de filtro ( param blob 0 ) tiene data

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

Esa es la norma L2 actual 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 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 del lote es 2031.85, el gradiente de la pérdida wrt fc1 se calcula y pasa a la parte diff de fc1 Blob. La magnitud L2 del gradiente es 0.1245.

Pase hacia atrás
El rest 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 en su pérdida , vea en qué punto sus datos o diferencias se convierten en nan : ¿en qué capa? ¿a qué iteración?

  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. ¡Disminuya su tasa de aprendizaje!

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