Рискуя вас разочаровать, я считаю, что такого универсального алгоритма не существует. По моему опыту, это зависит от того, чего вы хотите достичь, какие показатели важны для вас и сколько времени вы готовы отдать на обучение.
-
Я уже наблюдал резкое увеличение потерь при проверке (признак переобучения), в то время как другие показатели (в данном случае mIoU) по-прежнему улучшались в наборе проверки. В этих случаях вам необходимо знать, что является вашей целью.
-
Возможно (хотя это и очень редко), что ваш убыток будет увеличиваться в течение значительного периода времени, прежде чем снова уменьшится и достигнет более высокого уровня, чем раньше. Это невозможно предвидеть.
-
Наконец, и это, возможно, распространенный случай, если у вас есть тонны обучающих данных, ваши потери при проверке могут постоянно уменьшаться, но делать это все медленнее и медленнее. В этом случае лучшей стратегией, если бы у вас было бесконечное количество времени, было бы позволить ему продолжать обучение бесконечно долго. На практике это невозможно, и вам нужно будет найти правильный баланс между производительностью и временем обучения.
Если вам действительно нужен алгоритм, я бы предложил этот довольно простой:
- Вычислить метрику проверки
M(i)
после каждой i
й эпохи в фиксированном подмножестве вашего набора проверки или всего набора проверки. Допустим, чем выше M(i)
, тем лучше. Исправьте k
целое число в зависимости от продолжительности одной тренировочной эпохи (k~3
должно помочь)
- Если для некоторого
n
у вас есть M(n) > max(M(n+1), ... M(n+k))
, остановите и сохраните сеть, которая была у вас в эпоху n
.
Это далеко не идеально, но для простых задач должно хватить.
[Изменить] Если вы еще не используете его, я предлагаю вам использовать TensorBoard, чтобы визуализировать эволюцию ваших показателей на протяжении всего обучения. После настройки вы сэкономите много времени.