Какие методы дебиасинга модели (adversarial debiasing)?
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.