最小二乘概念消除法(LEACE)
概念消除旨在从表示中移除特定特征。它可用于改善公平性(例如防止分类器使用性别或种族)和可解释性(例如移除概念以观察模型行为的变化)。这是**最小二乘概念消除法(LEACE)**的代码仓库,它是一种闭式方法,可以有效地防止所有线性分类器检测某个概念,同时对表示造成最小的损害。您可以在这里查看相关论文。
安装
我们需要Python 3.10或更高版本。您可以从PyPI安装该软件包:
pip install concept-erasure
使用方法
此仓库中的两个主要类是LeaceFitter
和LeaceEraser
。
LeaceFitter
用于跟踪计算LEACE消除函数所需的协方差和互协方差统计数据。这些统计数据可以通过LeaceFitter.update()
以增量方式更新。消除函数在访问.eraser
属性时才会被惰性计算。该类使用O(d2)内存,其中_d_是表示的维度,因此在计算消除函数后您可能需要丢弃它。LeaceEraser
是LEACE消除函数的紧凑表示,仅使用O(dk)内存,其中_k_是您试图消除的概念的类别数(或等效地,如果概念不是分类的,则为概念的_维度_)。
批处理使用
在大多数情况下,您可能有一批特征向量X
和概念标签Z
,并希望从X
中消除概念。最简单的方法是使用LeaceEraser.fit()
便捷方法:
import torch
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from concept_erasure import LeaceEraser
n, d, k = 2048, 128, 2
X, Y = make_classification(
n_samples=n,
n_features=d,
n_classes=k,
random_state=42,
)
X_t = torch.from_numpy(X)
Y_t = torch.from_numpy(Y)
# 逻辑回归在概念消除前能学到一些东西
real_lr = LogisticRegression(max_iter=1000).fit(X, Y)
beta = torch.from_numpy(real_lr.coef_)
assert beta.norm(p=torch.inf) > 0.1
eraser = LeaceEraser.fit(X_t, Y_t)
X_ = eraser(X_t)
# 但在消除后学不到任何东西
null_lr = LogisticRegression(max_iter=1000, tol=0.0).fit(X_.numpy(), Y)
beta = torch.from_numpy(null_lr.coef_)
assert beta.norm(p=torch.inf) < 1e-4
流式使用
如果您有数据流,可以使用LeaceFitter.update()
来更新统计数据。这在处理大型数据集且想避免将所有数据存储在内存中时很有用。
from concept_erasure import LeaceFitter
from sklearn.datasets import make_classification
import torch
n, d, k = 2048, 128, 2
X, Y = make_classification(
n_samples=n,
n_features=d,
n_classes=k,
random_state=42,
)
X_t = torch.from_numpy(X)
Y_t = torch.from_numpy(Y)
fitter = LeaceFitter(d, 1, dtype=X_t.dtype)
# 使用批量更新计算互协方差矩阵
for x, y in zip(X_t.chunk(2), Y_t.chunk(2)):
fitter.update(x, y)
# 从数据中消除概念
x_ = fitter.eraser(X_t[0])
论文复现
用于生成概念清洗实验的词性标记的脚本可以在这个仓库中找到。我们计划很快将标记后的数据集上传到HuggingFace Hub。
概念清洗
概念清洗的代码目前有点凌乱,可能很快会进行重构。我们发现有必要为不同的HuggingFace模型系列编写定制实现。到目前为止,我们已经实现了LLaMA和GPT-NeoX。这些可以在concept_erasure.scrubbing
子模块中找到。