Sobes.tech
Back to questions
Senior
15

Какие методы дебиасинга модели (adversarial debiasing)?

Companies where asked
ГазпромбанкГазпромбанк

Answer from AI

sobes.tech AI

Что хотят услышать интервьюеры:

Adversarial debiasing — это способ уменьшить влияние чувствительного признака на прогноз модели через добавление второй, «противодействующей» модели. Основная модель учится решать целевую задачу, а adversary пытается восстановить защищённый атрибут из её выходов или внутренних представлений. Если adversary не может это сделать, значит в представлении стало меньше нежелательной дискриминирующей информации.

Определение:

Методы дебиасинга — это техники, которые уменьшают систематические перекосы модели по отношению к группам пользователей, связанным с чувствительными признаками: полом, возрастом, расой и т. п.

Adversarial debiasing — один из подходов, где обучение формулируется как состязание:

  • основная модель минимизирует ошибку на целевой задаче;
  • adversary пытается предсказать чувствительный признак;
  • основная модель дополнительно штрафуется, если из её представления можно извлечь этот признак.

Идея в том, чтобы сохранить полезную для задачи информацию и одновременно убрать информацию, которая позволяет модели принимать несправедливо разные решения для разных групп.

Пример использования:

Допустим, модель предсказывает вероятность одобрения кредита. Если в данных исторически есть перекос по полу, модель может неявно использовать этот признак или его прокси. Тогда строят adversarial-схему: основная сеть предсказывает одобрение, а вторая сеть пытается угадать пол по скрытому вектору.

# Упрощённая идея обучения
# main_model: x -> y_pred
# adversary: hidden_repr -> sensitive_attr_pred

for x, y, s in dataloader:
    hidden = main_model.encoder(x)
    y_pred = main_model.head(hidden)

    # loss по основной задаче
    task_loss = criterion(y_pred, y)

    # adversary пытается восстановить чувствительный признак
    s_pred = adversary(hidden.detach())
    adv_loss = criterion_sensitive(s_pred, s)

    # обновляем adversary
    adv_optimizer.zero_grad()
    adv_loss.backward()
    adv_optimizer.step()

    # основная модель минимизирует task_loss и "ломает" adversary
    s_pred_for_main = adversary(hidden)
    debias_loss = task_loss - lambda_ * criterion_sensitive(s_pred_for_main, s)

    main_optimizer.zero_grad()
    debias_loss.backward()
    main_optimizer.step()

Пояснение кода:

Код показывает базовый цикл из двух шагов.
Сначала hidden-репрезентация идёт в adversary, который учится предсказывать чувствительный атрибут s. На этом шаге hidden.detach() не даёт градиенту идти в основную модель.
Затем основная модель обучается так, чтобы одновременно уменьшать ошибку на целевой задаче и ухудшать способность adversary угадывать чувствительный признак. Параметр lambda_ задаёт баланс между качеством и справедливостью.

Ключевые моменты:

  • Adversarial debiasing не удаляет bias полностью, а снижает его в представлении или предсказаниях модели.
  • Это полезно, когда чувствительный признак не должен влиять на решение напрямую или через прокси-признаки.
  • Главная идея — оптимизация с конфликтующими целями: точность против извлечимости sensitive attribute.
  • Метод часто применяется вместе с другими подходами: reweighting, preprocessing, fairness constraints, calibration.
  • Важен выбор метрики fairness: demographic parity, equal opportunity, equalized odds — у них разные компромиссы.
  • Метод требует аккуратной валидации: можно улучшить fairness-метрику и при этом ухудшить качество или даже переобучить adversary.