Как интерпретировать лог кафе с помощью debug_info?

При столкновении с трудностями во время тренировки (nan s, потеря не сходится и т. д.) иногда полезно посмотреть более подробный журнал тренировок, установив debug_info: true в 'solver.prototxt' файл.

Журнал тренировок выглядит примерно так:

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)

Что это значит?

1 ответ

Решение

На первый взгляд вы можете увидеть этот раздел журнала, разделенный на две части: [Forward] а также [Backward], Напомним, что обучение нейронной сети осуществляется через прямое и обратное распространение:
Пример обучения (пакет) подается в сеть, и прямой проход выводит текущий прогноз.
На основании этого прогноза рассчитывается убыток. Затем вычисляется потеря, и градиент оценивается и распространяется в обратном направлении с использованием правила цепочки.

Caffe Blob структура данных
Просто быстрая перефразировка. Кафе использует Blob структура данных для хранения данных / весов / параметров и т. д. Для этого обсуждения важно отметить, что Blob имеет две "части": data а также diff, Значения Blob хранятся в data часть. diff part используется для хранения поэлементных градиентов для шага обратного распространения.

Прямой проход

Вы увидите все слои снизу вверх, перечисленные в этой части журнала. Для каждого слоя вы увидите:

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

Слой "conv1" это сверточный слой, который имеет 2 элемента param blob: фильтры и смещение. Следовательно, журнал имеет три строки. Фильтр блоб (param blob 0) имеет data

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

То есть текущая норма L2 весов фильтра свертки составляет 0,00899.
Текущий уклон (param blob 1):

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

Это означает, что в настоящее время смещение установлено на 0.

Последний, но тем не менее важный, "conv1" слой имеет выход, "top" названный "conv1" (как оригинально...). Норма L2 выхода

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

Обратите внимание, что все значения L2 для [Forward] пройти сообщается на data часть BLOB-объектов, о которых идет речь.

Потеря и градиент
В конце [Forward] пройти приходит слой потерь:

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

В этом примере потеря партии равна 2031,85, градиент потери по отношению к fc1 вычисляется и передается diff часть fc1 Blob. Величина L2 градиента составляет 0,1245.

Обратный проход
Все остальные слои перечислены в этой части сверху вниз. Вы можете видеть, что величины L2, о которых сообщалось в настоящее время, имеют diff часть BLOB-объектов (входные параметры и слои).

в заключение
Последняя строка журнала этой итерации:

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

сообщает об общих величинах L1 и L2 как данных, так и градиентов.

Что я должен искать?

  1. Если у вас есть nan s в вашей потере, посмотрите, в какой момент ваши данные или различия превращаются в nan: на каком слое? на какой итерации?

  2. Посмотрите на величину градиента, они должны быть разумными. Если вы начинаете видеть значения с e+8 ваши данные / градиенты начинают взрываться. Уменьшите скорость обучения!

  3. Видите, что diff с не ноль. Нулевые различия означают, что нет градиентов = нет обновлений = нет обучения. Если вы начали со случайных весов, рассмотрите возможность создания случайных весов с большей дисперсией.

  4. Ищите активаций (а не градиентов), стремящихся к нулю. Если вы используете "ReLU"это означает, что ваши входные данные / веса ведут вас в регионы, где ворота ReLU "не активны", что приводит к "мертвым нейронам". Рассмотрите возможность нормализации ваших входов, чтобы получить нулевое среднее, добавьте [ "BatchNorm"][6] layers, setting absolute_slope` в ReLU.

Другие вопросы по тегам