Какие ошибки в тренировочном цикле могут ухудшить обучение и качество модели
Что проверяют
Писали ли вы цикл обучения руками и знаете ли ошибки, которые не роняют код, а тихо портят модель. Следом обычно спрашивают: «лосс на трейне падает, а на валидации стоит, что проверите первым?»
Как отвечать
Разделите ошибки на механику цикла, данные и оценку. На примере PyTorch:
- нет
optimizer.zero_grad(): градиенты по умолчанию накапливаются, и каждый шаг идёт по сумме предыдущих; - забытые
model.train()иmodel.eval(): dropout работает на валидации, аBatchNormобновляет статистики на валидационных батчах; - валидация без
torch.no_grad(): строится граф, растёт память. Туда жеlosses.append(loss)вместоloss.item(): список держит графы всех шагов; - softmax перед
CrossEntropyLoss: функция ждёт сырые логиты, лишний softmax сжимает градиенты, и модель учится медленно; - порядок шагов:
scheduler.step()вызывается послеoptimizer.step(), а при накоплении градиентов лосс делится на число шагов накопления; - fp16 без
GradScaler: мелкие градиенты обнуляются. На bf16 скейлер не нужен.
По данным: утечка (скейлер или энкодер обучены на всём датасете до разбиения), shuffle=False в трейн-лоадере при отсортированных данных, случайное разбиение там, где нужно по времени или по пользователю. По оценке: подбор гиперпараметров по тесту, ранняя остановка по лоссу трейна, метрика, не совпадающая с задачей.
Сильный ход: назвать приём отладки. Сначала переобучите модель на одном батче. Если лосс не уходит почти в ноль, баг в цикле, а не в данных.
Где спотыкаются
Отвечают общими словами про «плохие данные и неверные гиперпараметры». Интервьюер ждёт конкретные строки кода, которые ломают обучение без единого исключения.
Путают переобучение с ошибкой в цикле. Если валидационная метрика подозрительно высокая, первым делом ищут утечку, а не радуются.
Не знают поведения по умолчанию: градиенты складываются, eval() не отключает вычисление градиентов, а no_grad() не переключает dropout. Это разные вещи, и нужны обе.