Как интерпретировать лог кафе с помощью 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 как данных, так и градиентов.
Что я должен искать?
Если у вас есть
nan
s в вашей потере, посмотрите, в какой момент ваши данные или различия превращаются вnan
: на каком слое? на какой итерации?Посмотрите на величину градиента, они должны быть разумными. Если вы начинаете видеть значения с
e+8
ваши данные / градиенты начинают взрываться. Уменьшите скорость обучения!Видите, что
diff
с не ноль. Нулевые различия означают, что нет градиентов = нет обновлений = нет обучения. Если вы начали со случайных весов, рассмотрите возможность создания случайных весов с большей дисперсией.Ищите активаций (а не градиентов), стремящихся к нулю. Если вы используете
"ReLU"
это означает, что ваши входные данные / веса ведут вас в регионы, где ворота ReLU "не активны", что приводит к "мертвым нейронам". Рассмотрите возможность нормализации ваших входов, чтобы получить нулевое среднее, добавьте ["BatchNorm"][6] layers, setting
absolute_slope` в ReLU.