在AI模型部署到实际环境之前,确保其公平性是AI基础设施工程师面临的关键挑战。模型常常会无意中吸收训练数据中固有的社会偏差(例如,基于性别或种族的偏见),导致对特定群体产生系统性的不利影响。对抗性去偏见(Adversarial Debiasing, AD)是一种强大的模型内(in-processing)技术,它通过引入一个对抗性判别器(Adversary),在训练阶段强制模型学习到与敏感属性无关的表示(representations),从而实现偏差缓解。
一、对抗性去偏见的工作原理
对抗性去偏见的核心思想是构建一个包含两个相互竞争组件的系统:
- 分类器 (Classifier/Predictor $M$): 这是我们的主模型,目标是最大化预测准确率 $L_{task}$。
- 判别器 (Adversary $A$): 这是一个辅助模型,目标是预测输入数据中的敏感属性 $S$(例如,性别、种族)。
在训练过程中,分类器 $M$ 的优化目标是最大化其自身的预测准确率,同时最小化判别器 $A$ 预测敏感属性的能力。这形成了一个 Minimax 博弈:
$$\min_{M} \left( L_{task} – \lambda L_{adv} \right)$$
$$\max_{A} L_{adv}$$
其中 $L_{adv}$ 是判别器预测敏感属性的损失,$\lambda$ 是一个超参数,用于平衡任务准确性与公平性之间的权重。通过这种方式,分类器被迫学习那些对完成任务有用,但对判别器预测敏感属性却毫无帮助的特征,从而消除了表示中的偏见。
二、实操:使用 AIF360 实现对抗性去偏见
IBM 的 AI Fairness 360 (AIF360) 库提供了一套完整的偏差缓解算法实现,包括 AdversarialDebiasing。
我们将使用经典的 Adult Census 数据集(目标:预测收入是否超过 $50K),敏感属性选择 ‘Sex’。
步骤 1: 环境准备和数据加载
安装 AIF360 和其依赖项(该算法通常需要 TensorFlow 1.x 或兼容版本)。
pip install aif360 'scikit-learn>=0.24'
# 注意:AdversarialDebiasing 依赖特定版本的 TensorFlow
# pip install tensorflow==1.15 # 实际环境中可能需要指定旧版本
import numpy as np
import pandas as pd
from aif360.datasets import AdultDataset
from aif360.metrics import BinaryLabelDatasetMetric, ClassificationMetric
from aif360.algorithms.inprocessing import AdversarialDebiasing
from sklearn.preprocessing import MinMaxScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 1. 加载数据并定义敏感属性
dataset_orig = AdultDataset(
protected_attribute_names=['sex'],
privileged_classes=[['Male']],
metadata={
'label_names': ['income-per-year'],
'protected_attribute_names': ['sex'],
'privileged_classes': [['Male']]
}
)
# 2. 数据划分与预处理
scaler = MinMaxScaler()
dataset_orig_train, dataset_orig_test = dataset_orig.split([0.7], shuffle=True)
# 对特征进行缩放
xf = dataset_orig_train.features
x_train = scaler.fit_transform(xf)
dataset_orig_train.features = x_train
x_test = scaler.transform(dataset_orig_test.features)
dataset_orig_test.features = x_test
privileged_groups = [{'sex': 1}]
unprivileged_groups = [{'sex': 0}]
步骤 2: 训练一个基线(Biased)模型
首先训练一个不进行公平性处理的逻辑回归模型,作为比较基准。
# 训练基线模型
bias_model = LogisticRegression(solver='liblinear')
bias_model.fit(dataset_orig_train.features, dataset_orig_train.labels.ravel())
# 预测
dataset_pred_biased = dataset_orig_test.copy(deepcopy=True)
y_pred_biased = bias_model.predict(dataset_orig_test.features)
dataset_pred_biased.labels = y_pred_biased
# 计算基线公平性指标 (Statistical Parity Difference, SPD)
metric_biased = ClassificationMetric(
dataset_orig_test,
dataset_pred_biased,
unprivileged_groups=unprivileged_groups,
privileged_groups=privileged_groups
)
print(f"基线模型准确率: {accuracy_score(dataset_orig_test.labels, y_pred_biased):.4f}")
print(f"基线 Statistical Parity Difference (SPD): {metric_biased.statistical_parity_difference():.4f}")
步骤 3: 训练对抗性去偏见模型
使用 AdversarialDebiasing 类进行训练。请注意,这个过程是模型内处理,它会训练一个具备对抗性损失的新模型。
# 导入 TensorFlow (假设已安装兼容版本)
import tensorflow.compat.v1 as tf
tf.disable_eager_execution()
# 初始化 AD 模型
# scope_name 确保每次运行模型的变量名是唯一的
# 关键参数: deprocessing_input=False, 减少对原始数据的依赖
np.random.seed(0)
tf.set_random_seed(0)
debiased_model = AdversarialDebiasing(
privileged_groups=privileged_groups,
unprivileged_groups=unprivileged_groups,
scope_name="debiasing_classifier",
debiasing_layers=1, # 判别器的层数
num_epochs=50,
batch_size=128,
session=tf.Session()
)
# 训练 AD 模型 (该过程可能较慢)
debiased_model.fit(dataset_orig_train)
# 预测
dataset_pred_debiased = debiased_model.predict(dataset_orig_test)
# 计算去偏见后的公平性指标
metric_debiased = ClassificationMetric(
dataset_orig_test,
dataset_pred_debiased,
unprivileged_groups=unprivileged_groups,
privileged_groups=privileged_groups
)
# 提取预测结果用于准确率计算
y_pred_debiased = dataset_pred_debiased.labels.ravel()
print("\n--- 对抗性去偏见结果 ---")
print(f"去偏见模型准确率: {accuracy_score(dataset_orig_test.labels, y_pred_debiased):.4f}")
print(f"去偏见 Statistical Parity Difference (SPD): {metric_debiased.statistical_parity_difference():.4f}")
预期的结果分析:
通常情况下,去偏见模型的准确率(Task Accuracy)可能会略有下降,这是公平性-准确性权衡的结果。然而,关键的公平性指标 Statistical Parity Difference (SPD) 将会显著接近于 0 (理想值为 0),这表明模型对不同敏感群体的预测结果差异大大减小。
三、模型部署与基础设施考量
在AI基础设施中,使用对抗性去偏见技术意味着模型的训练过程变得更复杂,因为它引入了额外的损失项和判别器网络。
- 资源规划: AD 模型训练时间更长,需要更强大的计算资源(通常是 GPU)来处理两个网络的并行优化。
- MLOps 集成: 公平性指标(如 SPD、Equal Opportunity Difference)必须成为 MLOps 流程中模型验证和监控的关键环节。模型只有在满足准确率阈值和公平性阈值后,才能被批准部署。
- 序列化: 最终部署的是经过 AD 训练的主分类器模型。如果使用 TensorFlow/Keras,需要确保正确序列化和导出整个图结构,以便在生产环境中进行低延迟推理。
汤不热吧