Недавно при обучении сети классификации я обнаружил, что потери не сходятся, проблем с каждой частью сети не было, вход и выход были нормальными, но потери сети не сходились, начальная потеря кросс-энтропии была около 6, до После 50 эпох потеря все еще около 5, а карта и ранг 1 очень хлопотны.
После анализа было обнаружено, что значения, отправленные сетью окончательной классификации, были слишком малы, поэтому вероятность каждой категории после softmax не сильно отличалась.Чтобы решить эту проблему, результаты, отправленные сетью классификации, были отправлено в перекрестную энтропию.Перед функцией потерь просто добавьте температуру.
1. Следующий код представляет собой псевдокод, который не сходится.После того, как классификационная сеть отправляется, она напрямую отправляется в функцию перекрестной энтропийной потери, и результат не сходится
prob = self.classifier(x)
loss = self.crossentropyloss(prob,label)
2. Следующий код сходится.После отправки сети классификации разделите выходные данные на температурный коэффициент, чтобы отрегулировать разницу выходных данных softmax, что эквивалентно повышению резкости распределения softmax.
prob = self.classifier(x)
prob = prob / self.temp
loss = self.crossentropyloss(prob,label)
Я выставил temp 0.1, сколько стоит, можете выставить сами
Общая формула для расчета кросс-энтропии выглядит следующим образом:
Однако формулу для расчета перекрестной энтропии для распределения 0-1 можно упростить следующим образом:
Сначала я не понимал, почему его изменили. Я думал, что в нем есть какие-то глубокие понятия и навыки. На самом деле это очень просто. Распределение 0-1 — это бинарная классификация. Задачу бинарной классификации можно рассматривать как задача классификации с двумя категориями Зная вероятность p события, вероятность другого события равна 1-p, поэтому прогнозируемая вероятность одной категории равна q, тогда вероятность другого события должна быть 1-q. Поэтому логично перейти к приведенной выше формуле расчета.