Обучение нейросети на практике
Практика обучения - вопросы, на которых видно, тренировал ли ты сети сам: «модель не учится - что делаешь?», «как файнтюнить, не убив предобученное?». Правильные ответы - процедуры, не заклинания.
// Главная мантра темы: данные важнее архитектуры. Аудит данных даёт больше, чем смена модели.
Отладка: сначала оверфитни сотню примеров
Первый шаг отладки любого обучения - оверфитнуть крошечный кусок данных: если сеть не выучивает 100 примеров до почти нулевого лосса, проблема в коде, данных или лоссе, а не в «мало эпох». Это дешёвый тест на «пайплайн вообще работает».
Кривые обучения - главный прибор: train падает, val растёт - переобучение; оба высоко - недообучение или малый lr; ступеньки - планировщик; дрожь - маленький батч.
// Сравнивать прогоны по одному запуску нельзя: разброс между сидами бывает больше «прироста». Фиксируй сиды и мерь по нескольким.
- learning curves
- train/val лосс по шагам - диагностика по форме
Transfer learning: дефолт при малых данных
Учить с нуля на пяти тысячах примеров при живом предобученном бэкбоне - расточительство. Стандарт: замораживаем бэкбон, обучаем голову; затем размораживаем верхние слои с малым lr.
Файнтюн большим lr разрушает предобученные веса - catastrophic forgetting. Лекарство - discriminative lr: чем ближе к входу, тем меньше шаг; голова учится смелее всех.
// Порядок разморозки - сверху вниз: верхние слои задачно-специфичны, нижние держат универсальные признаки.
- catastrophic forgetting
- файнтюн стёр предобученные представления
- freeze / unfreeze
- заморозка/разморозка слоёв при переносе
Память, скорость и воспроизводимость
Mixed precision (fp16/bf16) - почти бесплатные двукратная экономия памяти и ускорение. Нюанс fp16 - underflow мелких градиентов, лечится loss scaling; bf16 обычно живёт без него.
Чекпоинты: сохраняй лучшую по валидации модель, а не последнюю эпоху - «доучил до конца» часто значит «переобучил хвост».
// Полная детерминированность на GPU - отдельная плата за скорость: фиксированные сиды дают воспроизводимость «почти», и это нормально.
- mixed precision
- fp16/bf16 вместо fp32: память и скорость ×2
Как отвечать: «Модель не учится. Твои действия?»
Сначала изолирую проблему: оверфичу 100 примеров - если лосс не идёт к нулю, ошибка в коде, данных или лоссе, и никакие эпохи не помогут. Проверяю данные и шкалы: перемешаны ли метки, нормированы ли входы, нет ли NaN. Дальше lr: пробую на порядок меньше и на порядок больше - форма кривой обучения подскажет. Если задача с малыми данными - не учу с нуля, беру предобученный бэкбон и файнтюню голову. И смотрю кривые train/val, а не финальную цифру: форма кривых это диагноз.
Процедура изоляции от дешёвого к дорогому вместо перебора архитектур - так дебажат люди, у которых модель «не училась» много раз.
На чём валят
- −Лосс не падает - крутить архитектуру вместо проверки данных и lr на 100 примерах.
- −Сравнивать прогоны с разными сидами по одному запуску - разброс больше «прироста».
- −Учить с нуля на 5k примеров при живом предобученном бэкбоне.
- −Выкатить последнюю эпоху вместо лучшего чекпоинта по валидации.
Проверьте себя
Пять вопросов из банка по этой подтеме. Всего их 14, остальные разбираются в тренажёре.
- Mixed precision training (fp16/bf16): в чём выгода и главный риск fp16?A)Главная выгода — более точные градиенты, а каких-либо рисков у fp16 нетB)≈2× скорость и вдвое память; fp16 underflow лечится loss scalingC)Убирает необходимость в оптимизаторе, но теряет воспроизводимостьD)Mixed precision применим на инференсе, но не при обучении
показать ответ и разбор
+B)≈2× скорость и вдвое память; fp16 underflow лечится loss scaling// разбор: Половинная точность разгружает память и включает tensor cores. У fp16 всего 5 бит экспоненты — градиенты ~1e-5 обнуляются, поэтому GradScaler умножает лосс перед backward и делит после. Bf16 жертвует мантиссой ради диапазона fp32 и обычно работает без скейлинга — стандарт для обучения LLM на современных GPU/TPU.
- GPU-память не вмещает нужный batch size. Какие приёмы позволяют обучаться так, будто батч большой, без второй видеокарты?A)Урезать обучающий датасет до объёма, целиком влезающего в память одной видеокартыB)Отключить обратное распространение для половины слоёв сетиC)Просто увеличить learning rate пропорционально размеру батчаD)Grad accumulation, checkpointing, mixed precision, на кластере — ZeRO/FSDP
показать ответ и разбор
+D)Grad accumulation, checkpointing, mixed precision, на кластере — ZeRO/FSDP// разбор: Аккумуляция даёт эффективный батч k×b ценой k форвардов на шаг; checkpointing меняет память активаций на ~30% лишних вычислений; fp16/bf16 режет память вдвое. ZeRO/FSDP раскладывают веса, градиенты и состояние Adam по устройствам. Помнить: с ростом эффективного батча lr обычно масштабируют и добавляют warmup.
- Что такое эпоха, батч и итерация в обучении сети?A)Эпоха — это ровно один обучающий пример, батч — сразу все данные, а итерация — один слой сетиB)Эпоха — проход по всем данным; батч — порция; итерация — шаг по батчуC)Это три полных синонима одного и того же понятия в обученииD)Эпоха — размер модели, батч — число слоёв, итерация — число классов
показать ответ и разбор
+B)Эпоха — проход по всем данным; батч — порция; итерация — шаг по батчу// разбор: Эпоха — один полный проход по всему обучающему набору. Данные подаются порциями (батчами); обработка одного батча со сделанным шагом оптимизатора — это итерация. За эпоху происходит столько итераций, сколько батчей в датасете (N/batch_size).
- Детектор редкого дефекта: 1 брак на 1000. Сеть на обычном кросс-энтропи предсказывает всегда «годен». Что менять?A)Ничего менять не нужно: точность в 99,9 процента на такой задаче — уже отличный и достаточный итоговый результат моделиB)Достаточно просто обучать сеть значительно дольше по времени, и она сама рано или поздно научится находить редкий класс брака в данныхC)Нужно убрать редкий класс брака из обучающей выборки, чтобы он не мешал сети уверенно предсказывать класс «годен»D)Бороться с дисбалансом: взвешенный лосс или focal loss, oversampling редкого класса, а метрика — recall/PR, а не accuracy
показать ответ и разбор
+D)Бороться с дисбалансом: взвешенный лосс или focal loss, oversampling редкого класса, а метрика — recall/PR, а не accuracy// разбор: При 1:1000 модель минимизирует средний кросс-энтропи, предсказывая мажоритарный класс, — accuracy 99.9% при нулевой пользе. Меняют постановку под редкий класс: взвешивают лосс в пользу позитивов или берут focal loss, ресемплят (oversampling брака/undersampling годных), а качество меряют recall, precision и PR-AUC при нужном пороге, а не accuracy. Дольше учить или выкинуть класс — только хуже.
- Почему для инициализации весов берут схемы Xavier/He, а не просто маленькие случайные числа «на глаз»?A)Xavier/He инициализируют вообще все веса строго нулём, что якобы обеспечивает одинаковый честный старт всех нейронов сети сразуB)Это чистая косметика: инициализация маленькими случайными числами на практике работает совершенно так же, без разницыC)Они задают весам максимально большие возможные значения, чтобы градиент на старте был как можно крупнее и обучение шло быстрееD)Масштаб весов подбирают под число входов/активацию, чтобы дисперсия сигнала и градиента не затухала и не взрывалась по слоям
показать ответ и разбор
+D)Масштаб весов подбирают под число входов/активацию, чтобы дисперсия сигнала и градиента не затухала и не взрывалась по слоям// разбор: Xavier (для tanh/sigmoid) и He (для ReLU) выбирают дисперсию начальных весов в зависимости от числа входов (и выходов) слоя так, чтобы масштаб активаций и градиентов сохранялся при проходе через много слоёв — не затухал и не взрывался. Плохая инициализация (слишком мелко/крупно) в глубокой сети ломает обучение с самого старта. Нулевая инициализация недопустима (симметрия нейронов), а «максимально крупные» веса ведут к взрыву.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.