Обучение нейросетей
Регуляризация нейросетей, dropout на обучении и инференсе, нормализационные слои (BatchNorm/LayerNorm), накопление градиентов, архитектуры для множеств и графов.
21 вопросов
JuniorТеорияОчень частоКогда выбирают ReLU, LeakyReLU, GELU, sigmoid или tanh и что такое умирающий ReLU?
Когда выбирают ReLU, LeakyReLU, GELU, sigmoid или tanh и что такое умирающий ReLU?
ReLU — дешёвый выбор по умолчанию для скрытых слоёв; sigmoid и tanh насыщаются и уместны на выходах и в гейтах. LeakyReLU и GELU держат ненулевой наклон для отрицательных входов, а GELU — стандарт трансформеров. Умирающий ReLU застрял на отрицательном входе: ноль на выходе, нулевой градиент.
Типичные ошибки
- ✗Ставят sigmoid в скрытые слои по умолчанию и упираются в насыщение
- ✗Думают, что LeakyReLU и GELU тоже обнуляют отрицательную часть
- ✗Считают, что мёртвый ReLU-нейрон сам оживёт позже в обучении
Уточняющие вопросы
- →Какой гиперпараметр чаще всего убивает целый слой ReLU?
- →Почему
GELUглаже, чем ReLU, и где это помогает?
MiddleТеорияОчень частоЧто оптимизатор Adam адаптирует для каждого параметра и почему настроенный SGD с momentum часто обобщает лучше?
Что оптимизатор Adam адаптирует для каждого параметра и почему настроенный SGD с momentum часто обобщает лучше?
Adam хранит для каждого веса скользящие оценки первого и второго моментов градиента и делит шаг на корень из второго, так что у каждого веса свой эффективный шаг плюс momentum. Это быстро сходится почти без настройки, но тянет в более острые минимумы, а настроенный SGD с momentum — в пологие.
Типичные ошибки
- ✗Думают, что Adam настраивает один глобальный learning rate, а не шаг по каждому параметру
- ✗Переворачивают формулу — домножают на второй момент вместо деления на корень из него
- ✗Считают Adam строго лучшим и никогда не меняют его на настроенный SGD
Уточняющие вопросы
- →Как
AdamWрасцепляет weight decay и почему это не то же самое, что L2 в Adam? - →Зачем Adam нужна коррекция смещения на первых шагах?
MiddleТеорияОчень частоКак backpropagation считает градиенты через глубокий стек слоёв и почему из-за этого глубокие сети нестабильны?
Как backpropagation считает градиенты через глубокий стек слоёв и почему из-за этого глубокие сети нестабильны?
Прямой проход сохраняет активации каждого слоя, затем градиент лосса идёт назад и каждый слой домножает его на свой локальный якобиан. Градиент раннего слоя — длинное произведение якобианов: нормы ниже или выше единицы дают экспоненциальное затухание или взрыв по глубине.
Типичные ошибки
- ✗Путают backpropagation с численной оценкой градиента конечными разностями
- ✗Думают, что якобианы слоёв складываются, а не перемножаются вдоль пути
- ✗Забывают, что прямой проход обязан сохранять активации для обратного
Уточняющие вопросы
- →Как residual-связи меняют это произведение якобианов?
- →Почему обратный проход стоит примерно вдвое дороже прямого?
MiddleТеорияОчень частоКак BatchNorm ведёт себя на обучении и на инференсе и чем он отличается от LayerNorm?
Как BatchNorm ведёт себя на обучении и на инференсе и чем он отличается от LayerNorm?
При обучении BatchNorm нормирует каждый мини-батч его средним/дисперсией и обновляет бегущие статистики; на инференсе использует эти сохранённые статистики, поэтому выход детерминирован. LayerNorm нормирует объект по признакам, без статистик батча, и одинаков в обеих фазах.
Типичные ошибки
- ✗Думают, что BatchNorm на инференсе использует статистики текущего батча
- ✗Считают, что LayerNorm зависит от оси батча
- ✗Забывают, что BatchNorm хранит бегущие статистики для инференса
Уточняющие вопросы
- →Почему малый размер батча вредит BatchNorm, но не LayerNorm?
- →Почему в трансформерах предпочитают LayerNorm, а не BatchNorm?
JuniorТеорияЧастоЧто такое early stopping, за какой кривой следят и что означает patience?
Что такое early stopping, за какой кривой следят и что означает patience?
Следят за метрикой на валидации, а не за обучающим лоссом, и встают, когда она перестала улучшаться, возвращая веса лучшей эпохи. Patience — сколько эпох без улучшения вы терпите до остановки, чтобы шумная просадка не оборвала прогон. Это регуляризация: ёмкость модели ограничивается.
Типичные ошибки
- ✗Следят за обучающим лоссом вместо метрики на валидации
- ✗Оставляют веса последней эпохи вместо восстановления лучшего чекпоинта
- ✗Путают patience с общим бюджетом эпох или задержкой на старте
Уточняющие вопросы
- →Почему early stopping должен идти по валидации, а не по тесту?
- →Как слишком малый patience сочетается с шумной кривой валидации?
JuniorТеорияЧастоЧем различаются эпоха, итерация и батч и что меняется, если удвоить размер батча?
Чем различаются эпоха, итерация и батч и что меняется, если удвоить размер батча?
Батч — группа примеров под один шаг градиента, итерация — сам этот шаг, а эпоха — полный проход по обучающей выборке, поэтому итераций в эпохе столько, сколько размер выборки делить на размер батча. Удвоение батча вдвое сокращает итерации и снижает шум, поэтому learning rate поднимают, с warmup.
Типичные ошибки
- ✗Меняют местами определения эпохи и итерации
- ✗Умножают вместо деления, считая число итераций в эпохе
- ✗Считают, что размер батча и learning rate настраиваются независимо
Уточняющие вопросы
- →Почему больший батч снижает дисперсию оценки градиента?
- →Когда правило линейного масштабирования learning rate перестаёт работать?
JuniorТеорияЧастоКак выглядят кривые лосса, когда learning rate слишком велик и когда слишком мал?
Как выглядят кривые лосса, когда learning rate слишком велик и когда слишком мал?
Слишком большой — лосс скачет, колеблется или уходит в NaN и не устаканивается. Слишком малый — падает плавно, но чересчур медленно и выходит на полку выше достижимого. Range-тест найдёт значение за один прогон: экспоненциально поднимайте скорость и берите точку чуть раньше разворота лосса вверх.
Типичные ошибки
- ✗Меняют симптомы местами — ждут колебаний от слишком малой скорости
- ✗Берут по range-тесту скорость в минимуме лосса, а не чуть раньше разворота
- ✗Принимают медленный, но ровный спад за сошедшуюся модель
Уточняющие вопросы
- →Почему range-тест берёт значение ниже наблюдённого минимума лосса?
- →Как меняется лучшая скорость при переходе с SGD на Adam?
JuniorТеорияЧастоКакие способы регуляризации нейросетей вы знаете?
Какие способы регуляризации нейросетей вы знаете?
Основные — dropout (случайное обнуление нейронов при обучении) и L2 weight decay. Семейство нормализаций — Batch/Layer/Instance/Group Norm — стабилизирует и слегка регуляризует обучение. Аугментация данных и ранняя остановка тоже регуляризуют.
Типичные ошибки
- ✗Думают, что большая модель всегда обобщает лучше
- ✗Считают, что dropout или weight decay работают лишь на инференсе
- ✗Не знают семейства нормализаций, кроме BatchNorm
Уточняющие вопросы
- →Как именно dropout снижает переобучение?
- →Почему BatchNorm считают лишь слабым регуляризатором?
JuniorТеорияЧастоЧто такое затухающие и взрывающиеся градиенты и как они проявляются в логах обучения?
Что такое затухающие и взрывающиеся градиенты и как они проявляются в логах обучения?
Затухание — градиент по пути назад стремится к нулю, ранние слои почти не обновляются и лосс застревает. Взрыв — он растёт неограниченно, давая огромные скачки весов и лосс, который подскакивает или уходит в NaN. Сильнее страдают глубокие обычные стеки и RNN без residual-связей.
Типичные ошибки
- ✗Путают затухающий градиент с лоссом, который просто сошёлся
- ✗Ищут симптом в последних слоях, а не в самых ранних
- ✗Думают, что residual-связи усугубляют проблему, а не смягчают её
Уточняющие вопросы
- →Какую послойную статистику вы бы логировали, чтобы поймать это рано?
- →Почему функция активации
sigmoidусугубляет затухание градиентов?
MiddleТеорияЧастоКогда нужно обрезание градиентов и чем обрезание по норме отличается от обрезания по значению?
Когда нужно обрезание градиентов и чем обрезание по норме отличается от обрезания по значению?
Обрезают, когда градиенты изредка взрываются: глубокие рекуррентные сети, трансформеры, RL. Обрезание по норме перемасштабирует весь вектор при превышении глобальной нормы, поэтому направление сохраняется и падает лишь длина шага. Обрезание по значению урезает каждую координату отдельно и меняет направление.
Типичные ошибки
- ✗Путают, какой из вариантов сохраняет направление градиента
- ✗Берут обрезание против затухающих градиентов, а не против взрывающихся
- ✗Думают, что обрезание обнуляет чрезмерные компоненты, а не ограничивает их
Уточняющие вопросы
- →С какого порога глобальной нормы вы бы начали и как его откалибровали?
- →Почему обрезать надо после обратного прохода, но до шага оптимизатора?
MiddleТеорияЧастоПочему очень большой батч часто вредит обобщению и в чём состоит аргумент об острых и пологих минимумах?
Почему очень большой батч часто вредит обобщению и в чём состоит аргумент об острых и пологих минимумах?
Больший батч даёт менее шумный градиент, а этот шум — часть того, что регуляризует SGD. Без него оптимизатор оседает в острых минимумах, где лосс круто растёт при малых сдвигах весов или данных, а пологие такие сдвиги терпят и лучше переносятся. Масштабирование скорости с warmup закрывает часть разрыва.
Типичные ошибки
- ✗Думают, что больший батч добавляет шум градиента, а не убирает его
- ✗Переворачивают аргумент, называя лучше обобщающими острые минимумы
- ✗Понижают learning rate при большом батче вместо того, чтобы поднять его
Уточняющие вопросы
- →Почему шум градиента называют неявным регуляризатором?
- →По какой измеримой величине вы бы назвали минимум острым или пологим?
MiddleДебаггингЧастоОбучающий лосс с первой эпохи стоит на месте и высоко. Как вы будете это диагностировать?
Обучающий лосс с первой эпохи стоит на месте и высоко. Как вы будете это диагностировать?
Идите от дешёвого: попробуйте переобучиться на одном батче — не вышло, значит баг в коде, а не в данных. Затем проверьте соответствие меток входам, подходит ли лосс задаче, отнормированы ли входы и не абсурдна ли скорость. В конце ищите мёртвые ReLU и параметры без оптимизатора.
Открыть задачу →Типичные ошибки
- ✗Читают плоский лосс как сходимость, а не как сломанный шаг обучения
- ✗Наращивают ёмкость, не проверив, что модель может переобучиться на одном батче
- ✗Подают вероятности после softmax в лосс, который сам ожидает сырые логиты
Уточняющие вопросы
- →Почему переобучение на одном батче — самая дешёвая первая проверка?
- →Как убедиться, что градиенты действительно доходят до самого раннего слоя?
MiddleТеорияЧастоЧем различаются расписания learning rate — cosine, step и one-cycle — и зачем трансформерам нужен warmup?
Чем различаются расписания learning rate — cosine, step и one-cycle — и зачем трансформерам нужен warmup?
Step роняет скорость в несколько раз на заданных эпохах; cosine плавно снижает её к нулю; one-cycle сначала поднимает, затем опускает, часто меняя momentum в противофазе. Warmup поднимает скорость почти от нуля за первые шаги: вторые моменты Adam ещё шумны, и полный шаг расшатал бы residual-стек.
Типичные ошибки
- ✗Путают, какое расписание дискретное, а какое снижается плавно
- ✗Считают warmup прогревом инфраструктуры, а не мерой стабильности оптимизатора
- ✗Полагают, что адаптивные оптимизаторы делают warmup ненужным
Уточняющие вопросы
- →Какой длины warmup вы бы выбрали и от чего она зависит?
- →Почему cosine обычно выигрывает у одиночного step-спада при том же бюджете?
MiddleДебаггингЧастоЛосс уходит в NaN посреди обучения. Каковы причины и какое исправление для каждой?
Лосс уходит в NaN посреди обучения. Каковы причины и какое исправление для каждой?
Взрыв градиентов — обрезайте по глобальной норме. Переполнение fp16 — loss scaler или bf16. Самописный log(0) — слитый лосс по логитам или эпсилон. Слишком большая скорость — снизьте или добавьте warmup. NaN уже в батче — проверяйте входы. Ищите первый плохой шаг по нормам градиентов.
Открыть задачу →Типичные ошибки
- ✗Винят данные и никогда не смотрят нормы градиентов или реализацию лосса
- ✗Пишут log(softmax(x)) руками вместо слитого лосса по логитам
- ✗Считают, что GradScaler делает переполнение fp16 невозможным
Уточняющие вопросы
- →Почему bf16 терпит переполнение лучше, чем fp16, при той же разрядности?
- →Как поймать точный шаг и тензор, где появился первый NaN?
MiddleДебаггингЧастоОбучающий лосс падает, а валидационный растёт с третьей эпохи. Что вы проверите и в каком порядке?
Обучающий лосс падает, а валидационный растёт с третьей эпохи. Что вы проверите и в каком порядке?
Сначала убедитесь, что разрыв настоящий: валидация достаточно велика, из того же распределения и без утечки, льстившей ранним эпохам. Затем взвесьте ёмкость модели против размера выборки и перечитайте расписание скорости. И лишь потом регуляризация: сперва early stopping, затем dropout и weight decay.
Открыть задачу →Типичные ошибки
- ✗Хватаются за более сильную регуляризацию до проверки сплита и поиска утечки
- ✗Обучают scaler на всех данных, занося статистики валидации в обучение
- ✗Сохраняют веса последней эпохи, когда лучшая модель была на несколько эпох раньше
Уточняющие вопросы
- →Почему 5-процентный валидационный сплит делает раннее расхождение ненадёжным?
- →Какой регуляризатор вы возьмёте первым и почему именно его?
MiddleТеорияЧастоПочему нельзя инициализировать все веса нулями и что именно чинят инициализации Xavier и He?
Почему нельзя инициализировать все веса нулями и что именно чинят инициализации Xavier и He?
При нулевых весах все нейроны слоя считают одно и то же и получают одинаковый градиент, поэтому остаются одинаковыми и симметрия не нарушается. Xavier масштабирует дисперсию по fan-in и fan-out, удерживая дисперсию сигнала на tanh и sigmoid; He удваивает её для ReLU, обнуляющего половину входов.
Типичные ошибки
- ✗Считают, что одних смещений достаточно, чтобы нарушить симметрию между нейронами
- ✗Путают, какая инициализация рассчитана на ReLU, а какая на tanh и sigmoid
- ✗Думают, что He уменьшает дисперсию вдвое, а не увеличивает
Уточняющие вопросы
- →Почему слишком большая начальная дисперсия имитирует взрыв градиентов?
- →Какая инициализация подходит residual-ветке, чей выход прибавляется обратно?
SeniorТеорияЧастоКак dropout ведёт себя на инференсе и на обучении и как сохраняется согласованный масштаб активаций?
Как dropout ведёт себя на инференсе и на обучении и как сохраняется согласованный масштаб активаций?
На инференсе нейроны НЕ выкидываются — работает вся сеть. Чтобы соответствовать величине активаций при обучении, стандартный dropout домножает активации на (1−p) на инференсе (p — вероятность выкинуть нейрон). Частый вариант, inverted dropout, масштабирует оставленные активации на 1/(1−p) ВО ВРЕМЯ обучения, а на инференсе — ничего.
Типичные ошибки
- ✗Думают, что на инференсе нейроны всё ещё выкидываются
- ✗Путают, в какой фазе применяется (1−p) против 1/(1−p)
- ✗Забывают, что масштабирование нужно для согласования ожидаемой величины активаций
Уточняющие вопросы
- →Почему inverted dropout переносит масштабирование в фазу обучения?
- →Что сломается, если вовсе забыть про перемасштабирование?
JuniorТеорияИногдаВы хотите batch_size = 2048, но в память влезает лишь 32. Как обучать так, будто батч равен 2048?
Вы хотите batch_size = 2048, но в память влезает лишь 32. Как обучать так, будто батч равен 2048?
Используйте накопление градиентов (gradient accumulation). Делайте forward + loss.backward() на каждом микро-батче из 32, давая градиентам суммироваться в буферах .grad, и вызывайте optimizer.step() + optimizer.zero_grad() лишь раз в 2048/32 = 64 микро-батча. При усреднённых лоссах делите лосс на 64.
Типичные ошибки
- ✗Вызывают zero_grad после каждого микро-батча, стирая накопление
- ✗Забывают делить лосс на число шагов при усреднённых лоссах
- ✗Думают, что подкрутка learning rate заменяет настоящее накопление
Уточняющие вопросы
- →Почему zero_grad нужно вызывать лишь после окна накопления?
- →Чем BatchNorm усложняет накопление градиентов?
MiddleДизайнИногдаНедобросовестные продавцы создают много аккаунтов, постя почти одинаковые объявления, чтобы забить поисковую выдачу. Для данного аккаунта можно найти технически связанные с ним (например, заходившие с того же IP), образующие зашумлённое окружение. Предложите архитектуру нейросети, классифицирующую аккаунт по его окружению, и объясните, как она справляется с переменным числом соседей в произвольном порядке.
Недобросовестные продавцы создают много аккаунтов, постя почти одинаковые объявления, чтобы забить поисковую выдачу. Для данного аккаунта можно найти технически связанные с ним (например, заходившие с того же IP), образующие зашумлённое окружение. Предложите архитектуру нейросети, классифицирующую аккаунт по его окружению, и объясните, как она справляется с переменным числом соседей в произвольном порядке.
Моделируйте окружение как неупорядоченное МНОЖЕСТВО (или граф) и берите перестановочно-инвариантную архитектуру: Deep Sets, attention pooling или Graph Attention Network (GAT). Кодируйте каждого соседа, затем агрегируйте симметрично (сумма/среднее или attention) — это делает выход инвариантным к порядку и принимает любое число соседей.
Типичные ошибки
- ✗Берут чувствительные к порядку модели (RNN, фиксированная конкатенация) для неупорядоченного множества
- ✗Предполагают фиксированное число соседей вместо переменной мощности
- ✗Полагаются на единственного самого похожего соседа и упускают коллективные сигналы
Уточняющие вопросы
- →Какая симметричная агрегация делает сеть инвариантной к порядку и почему?
- →Как attention pooling придаёт больший вес более подозрительным соседям?
SeniorТеорияИногдаЧто такое double descent и что он ломает в классической U-образной кривой смещения и разброса?
Что такое double descent и что он ломает в классической U-образной кривой смещения и разброса?
С ростом ёмкости тестовая ошибка идёт по классической U до порога интерполяции, где модель едва подгоняется под обучение и ошибка пикует. За порогом она снова падает: среди решений с нулевой обучающей ошибкой оптимизатор берёт гладкие, с меньшей нормой. U описывает лишь недопараметризованный режим.
Типичные ошибки
- ✗Читают кривую как ошибку на обучении, а не как тестовую ошибку от ёмкости
- ✗Помещают пик ошибки не на порог интерполяции, а куда-то ещё
- ✗Считают, что все решения с нулевой ошибкой на обучении выбираются равновероятно
Уточняющие вопросы
- →Какое неявное смещение заставляет оптимизатор предпочесть решение с меньшей нормой?
- →Где возникает поэпохный double descent и чем он отличается от формы по ёмкости?
SeniorПроизводительностьИногдаОбучение падает по памяти при батче 32 — что занимает память GPU и как ранжировать способы её освободить?
Обучение падает по памяти при батче 32 — что занимает память GPU и как ранжировать способы её освободить?
Основное занимают веса, состояние оптимизатора (Adam хранит два момента), градиенты и активации для обратного прохода; активации растут как батч на глубину. Ранжируйте по цене: mixed precision, накопление градиентов, activation checkpointing, шардирование ZeRO, offload на CPU.
Типичные ошибки
- ✗Считают только веса, забывая про состояние оптимизатора и сохранённые активации
- ✗Считают activation checkpointing бесплатным, а не разменом вычислений на память
- ✗Думают, что меньший микро-батч уменьшает объём состояния оптимизатора
Уточняющие вопросы
- →Почему Adam требует примерно втрое больше состояния, чем обычный SGD?
- →Во что activation checkpointing обходится по скорости и когда он оправдан?