Дифференциальное и матричное исчисление
Градиент softmax и кросс-энтропии
Вывод, который стоит проделать один раз до конца — ответ оказывается неправдоподобно простым
Две функции
Softmax превращает произвольные числа (логиты) в распределение:
Кросс-энтропия измеряет, насколько распределение расходится с правильным ответом (обычно one-hot):
Для one-hot с единицей на позиции это просто . Смысл разберём в блоке 4; здесь нас интересует только производная.
Покрутите логиты, сдвиг и температуру. Сдвиг ничего не меняет — это первое, что понадобится в выводе:
- сумма вероятностей
- 1
- наибольшая
- 60.9%
Инвариантность к сдвигу
Множитель сокращается. Два следствия:
- у softmax есть лишняя степень свободы: логиты определены с точностью до общего сдвига, поэтому у задачи с классами по существу параметров;
- отсюда берётся стандартный трюк устойчивости: вычесть перед
экспонентой. Тогда наибольший показатель равен нулю,
expне переполняется, а ответ не меняется. Ровно это делаетlogsumexp, и к нему вернёмся в блоке 6.
Якобиан softmax
Дифференцируем по . Случай и случай считаются по правилу частного и объединяются в одну формулу:
Это матрица, а не вектор: softmax отображает . Диагональные
элементы положительны, внедиагональные отрицательны.
Включите строку якобиана в виджете выше и проверьте знаки.
Сокращение
Теперь соберём градиент лосса по логитам. По правилу цепочки с суммой по путям — через каждую компоненту :
Первый множитель: . Подставляем якобиан:
Множитель сократился — это первое чудо. Раскрываем:
потому что для распределения. Итого:
Ни экспонент, ни делений, ни матрицы якобиана — просто разность предсказания и правильного ответа. Матрица сократилась в вектор длины .
Почему это важно, а не просто красиво
Численно. В при малом и в теряется точность. В
терять нечего. Именно поэтому фреймворки предоставляют
cross_entropy(logits, target) одной функцией, а не композицию log(softmax(x)) с
NLL: сокращение делается аналитически, до вычислений.
Если вы когда-нибудь получали NaN, написав log(softmax(x)) вручную, — вот
объяснение. Это не хрупкость библиотеки, а отказ от готового сокращения.
Содержательно. Градиент пропорционален ошибке. Предсказали верно — градиент почти нулевой; уверенно ошиблись — градиент близок к единице по модулю. Никакого насыщения, в отличие от сигмоиды с квадратичным лоссом, где при уверенной ошибке градиент как раз исчезает. Выбор кросс-энтропии для классификации — следствие этой выкладки, а не соглашение.
Температура
При распределение стремится к one-hot на максимуме, при — к равномерному. Покрутите ползунок температуры: логиты не меняются, а распределение меняется от почти детерминированного до почти равномерного.
Где встречается: сэмплирование из языковых моделей, дистилляция знаний, Gumbel-softmax, энтропийная регуляризация в RL. Везде это один параметр — насколько распределению позволено быть уверенным.
Источники
- Goodfellow, Bengio, Courville — Deep Learning, гл. 6.2 — Softmax, кросс-энтропия, градиенты выходного слоя
- Bishop — Pattern Recognition and Machine Learning, гл. 4.3.4 — Многоклассовая логистическая регрессия и её градиент
Проверки
0 из 2Что даёт сокращение
Отметьте все верные утверждения про softmax и кросс-энтропию.
Стабильный softmax и градиент
Реализуйте
softmax_ce(logits, target)— верните список[loss, grad_0, grad_1, ...], гдеlossэто кросс-энтропия, а остальное — градиент по логитам.target— индекс правильного класса. Значит one-hot, и по урокуДва требования:
- softmax считайте устойчиво: вычтите максимум логитов перед
exp. Иначе на больших логитах получитеinf / inf; - градиент считайте по формуле , а не через якобиан.
Проверьте на последнем случае, что устойчивость действительно нужна: без вычитания максимума
exp(1000)даёт бесконечность и весь ответ становитсяNaN.Загрузка редактора…
Ctrl/⌘ + Enter- softmax считайте устойчиво: вычтите максимум логитов перед