Привет! На связи Мария Жарова, ML-инженер в команде рекомендаций в Wildberries 👋🏻
Представьте ситуацию: вы обучили модель, на трейне — почти идеальная точность, а на новых данных всё разваливается… Значит, вы столкнулись с переобучением 🙂
Что это вообще такое?
Переобучение — это когда модель слишком хорошо запоминает обучающую выборку и перестаёт обобщать закономерности на новые данные. Как школьник, который «зазубрил» правильные ответы, а похожую задачу решить не может.
Классический сигнал переобучения:
🟠 На тренировочных данных ошибка падает;
🟠 На валидационных данных начинает расти.
В классическом (и не только) ML причины, как правило, делятся на две группы: либо проблема в данных (мультиколлинеарность, много дубликатов или маленький объем), либо в модели (слишком сложная или неподходящая архитектура, не те гиперпараметры).
Как с этим бороться?
Существует целая группа методов борьбы с переобучением — регуляризация. Разберём основные подходы.
1️⃣ Штраф на большие веса
Один из сигналов, что модель переобучается в случае линейной модели или нейросети — большие коэффициенты весов. Так давайте просто добавим штраф к функции потерь, чтобы в интересах модели было не только уменьшать значение ошибки, но и не делать веса слишком большими по модулю!
Существует несколько разных подходов: L1 (Lasso), L2 (Ridge) и их комбинация (Elastic Net), вот псевдокод вариантов этого «добавочного» слагаемого:
alpha * sum(abs(w)) # добавка к loss при L1
alpha * sum(w**2) # добавка к loss при L2
2️⃣ Ранняя остановка обучения
Иногда переобучение возникает из-за слишком долгого обучения. В таком случае важно поймать момент, когда метрики на обучении и валидации начинают «разъезжаться» — и можно сделать это автоматически, просто периодически проверяя разницу между ними.
3️⃣ Больше данных (или их имитация)
Пожалуй, это самый недооценённый способ: как правило, если данных мало, модель вынуждена переобучаться. Поэтому если есть возможность, имеет смысл собрать данных побольше или хотя бы убрать шум из имеющихся + сделать простые аугментации, если это допустимо.
4️⃣ «Упрощение» модели
Иногда проблема не в данных, а в том, что вы чересчур усложнили модель. Для разных архитектур приемы её «упрощения» отличаются, вот несколько примеров:
➖ Уменьшить глубину дерева;
➖ Уменьшить число обучаемых параметров;
➖ Попробовать в принципе более простую архитектуру.
Так что переобучение — это не баг, а естественное поведение модели. И ваша задача — держать его под контролем.
Ставьте ❤️, если было полезно — и сохраняйте, чтобы не потерять!
