сеньорчикОткрыть в Telegram
← вся теориятеория к собесу · Нейросети

Обучение нейросети на практике

Зачем это спрашивают

Практика обучения - вопросы, на которых видно, тренировал ли ты сети сам: «модель не учится - что делаешь?», «как файнтюнить, не убив предобученное?». Правильные ответы - процедуры, не заклинания.

// Главная мантра темы: данные важнее архитектуры. Аудит данных даёт больше, чем смена модели.

Отладка: сначала оверфитни сотню примеров

Первый шаг отладки любого обучения - оверфитнуть крошечный кусок данных: если сеть не выучивает 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, остальные разбираются в тренажёре.

  1. #training_practice1 / 5
    Mixed precision training (fp16/bf16): в чём выгода и главный риск fp16?
    A)Главная выгода — более точные градиенты, а каких-либо рисков у fp16 нет
    B)≈2× скорость и вдвое память; fp16 underflow лечится loss scaling
    C)Убирает необходимость в оптимизаторе, но теряет воспроизводимость
    D)Mixed precision применим на инференсе, но не при обучении
    показать ответ и разбор
    +B)≈2× скорость и вдвое память; fp16 underflow лечится loss scaling

    // разбор: Половинная точность разгружает память и включает tensor cores. У fp16 всего 5 бит экспоненты — градиенты ~1e-5 обнуляются, поэтому GradScaler умножает лосс перед backward и делит после. Bf16 жертвует мантиссой ради диапазона fp32 и обычно работает без скейлинга — стандарт для обучения LLM на современных GPU/TPU.

  2. #training_practice2 / 5
    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.

  3. #training_practice3 / 5
    Что такое эпоха, батч и итерация в обучении сети?
    A)Эпоха — это ровно один обучающий пример, батч — сразу все данные, а итерация — один слой сети
    B)Эпоха — проход по всем данным; батч — порция; итерация — шаг по батчу
    C)Это три полных синонима одного и того же понятия в обучении
    D)Эпоха — размер модели, батч — число слоёв, итерация — число классов
    показать ответ и разбор
    +B)Эпоха — проход по всем данным; батч — порция; итерация — шаг по батчу

    // разбор: Эпоха — один полный проход по всему обучающему набору. Данные подаются порциями (батчами); обработка одного батча со сделанным шагом оптимизатора — это итерация. За эпоху происходит столько итераций, сколько батчей в датасете (N/batch_size).

  4. #training_practice4 / 5
    Детектор редкого дефекта: 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. Дольше учить или выкинуть класс — только хуже.

  5. #training_practice5 / 5
    Почему для инициализации весов берут схемы Xavier/He, а не просто маленькие случайные числа «на глаз»?
    A)Xavier/He инициализируют вообще все веса строго нулём, что якобы обеспечивает одинаковый честный старт всех нейронов сети сразу
    B)Это чистая косметика: инициализация маленькими случайными числами на практике работает совершенно так же, без разницы
    C)Они задают весам максимально большие возможные значения, чтобы градиент на старте был как можно крупнее и обучение шло быстрее
    D)Масштаб весов подбирают под число входов/активацию, чтобы дисперсия сигнала и градиента не затухала и не взрывалась по слоям
    показать ответ и разбор
    +D)Масштаб весов подбирают под число входов/активацию, чтобы дисперсия сигнала и градиента не затухала и не взрывалась по слоям

    // разбор: Xavier (для tanh/sigmoid) и He (для ReLU) выбирают дисперсию начальных весов в зависимости от числа входов (и выходов) слоя так, чтобы масштаб активаций и градиентов сохранялся при проходе через много слоёв — не затухал и не взрывался. Плохая инициализация (слишком мелко/крупно) в глубокой сети ломает обучение с самого старта. Нулевая инициализация недопустима (симметрия нейронов), а «максимально крупные» веса ведут к взрыву.

дальше

Теорию прочитали. Навык ставится повторением

В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.