←  Все статьи

Обучение моделей   ·   2 ноября 2026  ·  6 мин чтения

Две ошибки в softmax, которые есть почти во всех фреймворках

Исследователи Google DeepMind показали, что стандартные реализации softmax и кросс-энтропии в PyTorch, JAX и учебниках теряют градиент из-за округления. Разбираем обе ошибки и простое исправление.

Разбор работы

A Fix for Softmax and Cross-Entropy

Jonathan T. Barron, Dan Gnanapragasam, Michael Tschannen  ·  Google DeepMind · 22 октября 2026

Оригинал на alphaXiv  ↗

Ключевая цифра

p − 1 = 0

в плавающей точке вероятность округляется до единицы — и градиент исчезает

Коротко

01Стандартные softmax и кросс-энтропия в PyTorch и JAX теряют градиент из-за округления
02В bf16 сбой наступает уже при отрыве правильного класса ≈ 5,5
03Исправление — считать малую разность напрямую: 85% точности против 23%

Ошибка первая: обвал softmax

Когда модель очень уверена, оценка правильного класса сильно превосходит остальные. Знаменатель softmax становится единицей плюс крошечная сумма, и в арифметике с плавающей точкой эта сумма исчезает при округлении. Градиент по правильному классу считается как вероятность около единицы минус единица — и превращается в ровный ноль.

Градиенты по остальным классам при этом остаются положительными, и сумма градиентов перестаёт быть нулевой, как должна. Порог, за которым это происходит, зависит от точности вычислений.

Отрыв правильного класса, после которого градиент обнуляется
bf16≈ 5,5
fp32≈ 16,6
fp64≈ 36,7

Данные авторов. В bf16, популярном при обучении больших моделей, порог самый низкий.

Ошибка вторая: взаимное сокращение

При дистилляции ученик учится повторять распределение учителя. Стандартная реализация отдельно считает обе вероятности и вычитает их. Когда ответы ученика почти совпадают с учителем, разница теряется при округлении — и градиент получается ненулевым даже там, где ученик и учитель полностью совпадают.

Как исправили

  • Для обычного обучения. Сумму экспонент по неправильным классам считают отдельно и аккуратно объединяют с правильным. Градиент правильного класса строится как минус сумма остальных, а не вычитанием единицы из округлённой вероятности.
  • Для дистилляции. Разницу считают напрямую из разности логитов функциями, которые сохраняют точность около нуля. При совпадении ученика и учителя градиент становится ровно нулевым.

Что это даёт

На задачах модульной арифметики исчезают «рогатки» — повторяющиеся всплески функции потерь на поздних этапах обучения с Adam. Без регуляризации весов эффект резче: со стандартной кросс-энтропией точность на тесте падает с 61 до 23%, с исправленной — продолжает расти до 85%.

Точность на тесте без регуляризации весов, fp32
Стандартная кросс-энтропия, до сбоя61%
Стандартная, после сбоя23%
Исправленная кросс-энтропия85%

Данные авторов, задача — квадрат суммы по модулю 97.

При дистилляции, где ученик стартует с весов учителя, исправленная версия держит расхождение на нуле и точность 100%. Стандартная в bf16 уводит ученика от учителя. Любопытная деталь: ошибку нашла и исправила модель Gemini, а большую часть экспериментов тоже провёл ИИ.

Что это значит на практике

Если вы дистиллируете модели в bf16 или обучаете до очень высокой уверенности, стоит проверить реализацию функции потерь — исправление подставляется вместо стандартной. Авторы честно оговаривают: такие режимы редки в обычном крупном обучении, а проверки шли на небольших задачах; замеров скорости в работе нет.

Читайте также

Исследования и агентные системы

Все статьи

Аккредитованная ИТ-компания · реестр Минцифры России № 20142