Это вопрос, который не давал покоя коллегам в прошлом и настоящем в течение достаточно долгого времени.Если я уничтожу и обучу экземпляр tenorflow и перезапущу, в документации говорится, что он возобновит работу с последней контрольной точки, сохраненной в model_dir.Обычно, однако, мы видим значительное падение в таких показателях, как AUC, logloss и т. Д. Я никогда не понимал причину такого падения.Вся соответствующая информация сохраняется в файле контрольных точек для тензорного потока, чтобы восстановить состояние до его уничтожения, за исключением, возможно, итератора входного набора данных (в рамках структуры оценки).Исторически это отговаривало меня и других от возобновления обучения тензорному потоку путем загрузки с существующих контрольных точек, потому что показатели почти гарантированно ухудшатся.
Сегодня я сделал кое-что несколько более агрессивное, подняв учебный экземпляр с 1 руководителем и 7 работниками.на одной машине, без параметров сервера.Предполагается, что это выполняется в соответствии со стратегией распространения STANDALONE, при которой руководитель создает несколько рабочих потоков.Однако, когда я прекратил обучение и перезапустился с последней контрольной точки с той же распределенной настройкой, показатели с самого начала снизились почти вдвое по сравнению со всей выигрышем!Обратите внимание, что многократные скачки на графиках тензорной доски ниже являются результатом многократного перезапуска, который я инициировал с одной и той же сохраненной контрольной точки.
Затем я начал смотреть на градиентные гистограммы / графики распределения и заметил, что градиент всех смещенийвеса, особенно последний смещение_3, значительно увеличились в дисперсии после перезапуска.Ясно, что что-то не так, но сравнение переменных в контрольных точках до и после перезапуска показывает, что значения все еще непрерывно изменяются, хотя и с скачком, превышающим нормальный.Чтобы предотвратить непреднамеренное переоснащение, я перетасовал свои входные файлы (около 100 из них) другим случайным начальным числом, чтобы перезапуск не возвращался к началу исходной эпохи обучения.В любом случае, обучение длилось более нескольких эпох, так что маловероятно, что это будет случай переобучения видимых тренировочных данных.
Кроме того, я не могу думать ни о какой причине, почему градиентыбудет испытывать такие огромные прыжки, в результате чего метрики танк.
Обновление:
Любопытно, что я обнаружил, что Adagrad вектора смещения последнего слоя моего DNN остается постоянным на уровне 0,1, хотя градиенты явно ненулевые, хотя и очень малые.Я не думаю, что это объясняет скачок после перезапуска, потому что сериализованное значение Adagrad должно быть близко к значению, хранящемуся в памяти.
python -m inspect_checkpoint --file_name model.ckpt-720730 --tensor_name bias_3/Adagrad
tensor_name: bias_3/Adagrad
[0.1]
python -m inspect_checkpoint --file_name model.ckpt-591678 --tensor_name bias_3/Adagrad
tensor_name: bias_3/Adagrad
[0.1]
Для сравнения, Adagrad of bias2, по-видимому, резко изменяется за 200k шагов (размер партии 1024).
python -m inspect_checkpoint --file_name model.ckpt-720730 --tensor_name bias_2/Adagrad
tensor_name: bias_2/Adagrad
[80.608215 1.0615484 1.1355964 89.86574 90.919426 80.83253
1.7569603 1.2538469 69.11257 77.651375 89.71191 0.7492978
...
python -m inspect_checkpoint --file_name model.ckpt-591678 --tensor_name bias_2/Adagrad
tensor_name: bias_2/Adagrad
[47.73241 1.0530229 1.1187999 50.532574 51.123966 40.66552
1.7377361 1.2532469 36.016315 45.788876 50.346928 0.7473773
...
Для полноты, я использую отсев по всему DNN, но никакой регуляризации любого рода.Нет причудливого множителя градиента, функции затухания градиента и т. Д. Просто старый Адаград.Любая помощь или предложение высоко ценится.