
Привет, чемпионы! Алгоритм Recovering Difference Softmax (RDS) – это не просто очередной метод машинного обучения, а полноценный подход к оптимизации уведомлений и контента для повышения вовлеченности пользователей. Изначально разработанный командой исследователей Duolingo, этот алгоритм эффективно решает конкретные проблемы, возникающие при использовании стандартных алгоритмов многоруких бандитов в задачах, связанных с повторяющимися уведомлениями. RDS помогает увеличить активность пользователей и удержать их внимание к приложению или платформе.

Softmax обычно используется для мультиклассовой классификации, где важно определить вероятность принадлежности объекта к одному из нескольких классов Softmax function.
Что такое Softmax и зачем он нужен

Softmax – это функция, которая преобразует вектор чисел в вектор вероятностей, где сумма всех вероятностей равна 1.
Это позволяет интерпретировать выходные данные модели как вероятности принадлежности к разным классам.
🧠Математически это выглядит так:
1P(i) = exp(a_i) / ∑ exp(a_j)
Где:
P(i)
– вероятность принадлежности к классуi
.a_i
– оценка (score) для классаi
, выданная моделью.Суммирование происходит по всем классам
j
.
Пример: Представим, модель классифицирует изображения по классам: кошка, собака и птица, и дала следующие оценки: кошка (2.0), собака (1.0), птица (0.5). Softmax преобразует эти оценки в вероятности:
Класс | Оценка (aᵢ) | exp(aᵢ) | P(i) (вероятность) |
---|---|---|---|
Кошка | 2.0 | 7.39 | 0.665 |
Собака | 1.0 | 2.72 | 0.245 |
Птица | 0.5 | 1.65 | 0.149 |
Сумма | 1.000 |
Теперь модель уверена на 66.5%, что на изображении кошка.
Recovering Difference Softmax: В чём особенность?
Recovering Difference Softmax (RDS) помогает "восстановить" важную информацию о разнице между классами, которая могла быть потеряна в процессе обучения. Это особенно полезно, когда классы сильно отличаются друг от друга, и важно учитывать эти различия.
Главная идея — добавлять специальные "штрафы" или "бонусы" к оценкам классов на основе их различий, помогая модели лучше различать классы и точнее вычислять вероятности.

Где это применяется RDS?
Алгоритм RDS может использоваться в самых разных областях, где нужно делать выбор:
Рекомендательные системы: Выбор лучших товаров или услуг для пользователя.
Обработка естественного языка: Определение наиболее вероятного следующего слова в предложении.
Компьютерное зрение: Распознавание объектов на изображениях.
Примеры использования Softmax и Recovering Difference Softmax
Сценарий | Использование Softmax | Использование Recovering Difference Softmax |
---|---|---|
Рекомендация фильмов | Предлагает несколько фильмов с примерно одинаковой вероятностью | Выбирает один фильм, который с наибольшей вероятностью понравится пользователю |
Определение следующего слова | Предлагает несколько возможных следующих слов | Выбирает наиболее вероятное следующее слово |
Распознавание объектов | Определяет несколько объектов на изображении с разными вероятностями | Определяет один объект на изображении с наибольшей вероятностью |
Пример из Duolingo: Duolingo использует RDS для оптимизации уведомлений, определяя лучшее время отправки уведомлений, чтобы пользователи не забросили учёбу. Алгоритм учитывает индивидуальные привычки пользователей (кто-то учится каждый день, кто-то раз в неделю) и “восстанавливает” мотивацию тех, кто давно не заходил в приложение.
Математическая Интерпретация RDS

Точная формула RDS может варьироваться в зависимости от реализации, но общая идея заключается в модификации оценок классов перед применением Softmax. Например, можно добавить компонент, учитывающий разницу между максимальной и остальными оценками:
RunCopy code1P(i) = exp(a_i + bonus_i) / ∑ exp(a_j + bonus_j)
1P(i) = exp(a_i + bonus_i) / ∑ exp(a_j + bonus_j)
Где bonus_i
– это функция, которая зависит от разницы между классами.
Техническая реализация
import numpy as np
def recovering_difference_softmax(logits, alpha=1.0):
"""
Вычисляет Recovering Difference Softmax для заданных логитов.
:param logits: Входные логиты (numpy array), размерность (n_samples, n_classes)
:param alpha: Параметр, контролирующий степень различия
:return: Вероятности классов после применения RDS
"""
# Вычисляем стандартные вероятности softmax
exp_logits = np.exp(logits - np.max(logits, axis=1, keepdims=True))
softmax_probs = exp_logits / np.sum(exp_logits, axis=1, keepdims=True)
# Вычисляем среднее значение вероятностей для каждого класса
mean_probs = np.mean(softmax_probs, axis=0, keepdims=True)
# Вычисляем разницу между вероятностями и их средним значением
diff_probs = softmax_probs - mean_probs
# Применяем модификацию с параметром alpha
rds_probs = softmax_probs + alpha * diff_probs
# Нормализуем вероятности, чтобы их сумма была равна 1
rds_probs = rds_probs / np.sum(rds_probs, axis=1, keepdims=True)
return rds_probs
# Пример использования
logits = np.array([[2.0, 1.0, 0.1],
[1.0, 3.0, 0.2],
[0.5, 0.2, 2.0]])
rds_probs = recovering_difference_softmax(logits, alpha=0.5)
print("Вероятности после применения RDS:\n", rds_probs)
Пояснения:
Логиты: Это входные значения, которые подаются на softmax. Они представляют собой необработанные оценки для каждого класса.
Стандартный softmax: Вычисляется с помощью экспоненты логитов, нормализованных по сумме, чтобы получить вероятности.
Среднее значение вероятностей: Вычисляется среднее значение вероятностей для каждого класса по всем образцам.
Разница вероятностей: Вычисляется разница между вероятностями и их средним значением, чтобы учесть отклонения.
Модификация с параметром alpha: Параметр
α
контролирует степень, с которой учитываются различия. Приα=0
RDS сводится к стандартному softmax.Нормализация: После модификации вероятности нормализуются, чтобы их сумма для каждого образца была равна 1.
Альтернативы Softmax

Также существуют и другие методы для решения задач классификации, например SVM (Support Vector Machine). SVM и Softmax часто дают схожие результаты, но Softmax позволяет получить вероятности классов, что может быть полезно во многих приложениях CS231n: Softmax классификатор - My deep learning.
Заключение
Recovering Difference Softmax — мощный инструмент для улучшения работы алгоритмов машинного обучения, особенно когда нужно делать чёткие выборы. Он помогает алгоритмам быть более уверенными в своих решениях и лучше справляться с задачами, где важна точность.
Особенно эффективен он в задачах, где важны время, новизна контента и персонализация. Если ты хочешь, чтобы твои пользователи были довольны и активны, RDS — это то, что тебе нужно!
📚Список источников
How I Re-Created Duolingo's Famous Notification Algorithm - Medium.
softmax is not enough (for sharp out-of-distribution) - OpenReview
A Sleeping, Recovering Bandit Algorithm for Optimizing Recurring Notifications PDF
Improving Routing in Sparse Mixture of Experts with Graph PDF
Recovering Neural Network Weights through Controlled Channels
🔥 Ставьте лайк и пишите, какие темы разобрать дальше! Главное — пробуйте и экспериментируйте!
✔️ Присоединяйтесь к нашему Telegram-сообществу @datafeeling, где мы делимся новыми инструментами, кейсами, инсайтами и рассказываем, как всё это применимо к реальным задачам.