Модель не обучается
Вопрос
Loss не падает с первых шагов. Как вы будете искать причину?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Переобучиться на одном маленьком батче: если не получается, баг в коде
Проверить данные и метки: соответствие, нормализация, перемешивание
Проверить loss и выход: логиты против вероятностей, правильный reduction
Проверить цикл: zero_grad, backward, step, режим train, requires_grad
Подбор lr, нормы градиентов по слоям, инициализация
Что могут спросить следом
- Что если модель переобучается на одном батче, но на всём датасете стоит?
- Как быстро проверить, что метки не перепутаны?
Разбор
Первый тест: беру маленький батч, например 8 объектов, и пытаюсь довести loss почти до нуля. Если сеть не может переобучиться на 8 примерах, проблема в коде, а не в данных или модели. Дальше проверяю данные: смотрю глазами на пары вход-метка после всех преобразований, нормализацию входов, что метки не сдвинуты относительно объектов и что DataLoader перемешивает трейн. Проверяю выход и потерю: в CrossEntropyLoss идут логиты, а не вероятности; размерности совпадают; нет случайного broadcasting. Проверяю цикл: zero_grad перед backward, вызывается optimizer.step(), оптимизатору переданы параметры нужной модели, model.train() включён, параметры не заморожены. Затем смотрю нормы градиентов по слоям (нули или взрыв) и делаю короткий поиск lr по логарифмической сетке. Начальный loss тоже подсказка: для 10 классов при случайной инициализации он должен быть около ln 10 ≈ 2.3.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.