评估语言模型的社会偏见,难点在于偏见并不总是显式出现在输出文本里。一个模型在对话中直接使用歧视词汇很容易被发现,但当它系统性地把护士与女性、程序员与男性联系在一起时,需要专门的数据和指标才能捕捉。StereoSet与CrowS-Pairs就是为此设计的两个自动评估基准,分别从填空关联和句子选择两个角度,量化模型对刻板印象的偏好程度。

一、StereoSet:用填空任务测量刻板印象关联
StereoSet的设计核心是上下文填空。每个测试样本包含一个带有目标词槽位的上下文句子,通常用掩码语言模型来预测槽位词。数据集为同一个上下文提供三类候选词:刻板选项、反刻板选项和无关选项。例如上下文描述护士或程序员时,模型对女性或男性相关词的概率差异,可以反映它是否把职业与性别绑定。StereoSet中的句子分为句子内任务和句子间任务:句子内任务让模型在同一个上下文中比较不同候选词的合理性,句子间任务则比较不同上下文对同一个候选词的兼容程度。
StereoSet的评分主要依赖两个指标。第一个是语言建模分数,它用伪对数似然给每个候选词打分,表示模型认为该词填入上下文的自然程度。第二个是刻板分数,公式为刻板选项分数除以刻板选项分数与反刻板选项分数之和,再乘以100。如果模型完全没有系统性偏向,刻板分数应当接近50;高于50表示模型更倾向于给刻板选项更高的概率,低于50则表示模型偏好反刻板选项。这个指标的优势是直观,但它隐含了一个假设:刻板与反刻板选项在词频、语法难度和语义自然度上基本可比。现实中这个假设并不总是成立,某些反刻板表达可能因为语言生硬而被模型天然打低分。
def stereotype_score(lm_stereotype, lm_antistereotype):
if lm_stereotype + lm_antistereotype == 0:
return 50.0
return 100.0 * lm_stereotype / (lm_stereotype + lm_antistereotype)
# 示例:某样本中模型给两个选项的伪对数似然
stereo = 0.32
anti = 0.41
print(stereotype_score(stereo, anti)) # 输出约43.84
StereoSet覆盖了性别、种族、职业、宗教等多个社会维度,样本规模较大,适合做细分类别的偏见分析。研究者可以单独查看某一职业或某一群体相关的刻板分数,而不仅仅依赖总体平均分。不过它的英文数据占绝对主导,跨语言版本相对有限,中文模型需要额外构建或翻译数据,这会引入新的文化和语言差异。
二、CrowS-Pairs:通过最小对比句对捕捉句子级偏见
CrowS-Pairs的核心是成对的句子。每对句子在语义上尽量保持相同,只改变一个与社会群体相关的词或短语,使一个句子更接近社会刻板印象,另一个句子更反刻板或更中立。模型分别计算两个句子的伪对数似然,如果偏见句得分更高,则记为该模型在该样本上表现出偏见。CrowS-Pairs的测试集覆盖九类社会维度,包括种族、性别、性取向、宗教、年龄、国籍、残障、外貌和社会经济地位。
伪对数似然的计算方式是逐词掩码预测。把句子中的每个词依次替换为掩码标记,根据上下文预测该词的概率,再取对数求和。这种近似避免了自回归模型因词序不同导致长度惩罚不一致的问题,但它并不等于真实句子概率。CrowS-Pairs的原始指标是偏见句得分高于反偏见句的比例,理想中性模型应当接近50%。如果结果明显高于50%,说明模型在判断句子自然度时更接受带有社会偏见的表述。
import torch
from transformers import AutoTokenizer, AutoModelForMaskedLM
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
model = AutoModelForMaskedLM.from_pretrained("bert-base-uncased")
def pseudo_log_likelihood(sentence):
tokens = tokenizer.tokenize(sentence)
token_ids = tokenizer.convert_tokens_to_ids(tokens)
total = 0.0
for i in range(len(token_ids)):
masked = token_ids.copy()
masked[i] = tokenizer.mask_token_id
input_ids = torch.tensor([masked])
with torch.no_grad():
logits = model(input_ids).logits[0, i]
log_prob = torch.log_softmax(logits, dim=-1)
total += log_prob[token_ids[i]].item()
return total
CrowS-Pairs后来也受到了不少批评。有研究指出,所谓的最小对比句对并不总是真正意义上的最小对,两个句子在词频、句法复杂度甚至隐含语义上可能存在未被控制的差异。这些差异会直接影响伪对数似然,导致指标出现虚假的偏见信号。因此,CrowS-Pairs适合作为快速筛查工具,但不能单独用来做出模型是否公平的最终结论。
三、指标陷阱:为什么50分不等于零偏见
两个基准的分数都是相对指标,而不是对社会偏见的绝对测量。StereoSet的刻板分数50建立在刻板与反刻板选项难度可比的前提下;如果反刻板选项包含罕见词或语义生硬的组合,模型可能只是因为语言流畅性而选择刻板项。CrowS-Pairs的50同样假设两个句子除目标群体外完全相同,但实际数据中可能存在语言层面的噪声。因此直接把分数高低等同于偏见严重程度,会高估或低估风险。
另一个常见误读是只比较总分。一个模型可能在性别类别接近50,但在宗教或年龄类别严重偏高,总分却被平均掉。细分类别分数往往比总分更有信息量,尤其当某些类别样本量较小时,更需要注意统计波动。不同模型之间的分数差异也可能来自分词方式、训练数据分布或模型规模,而不是来自社会偏见的真实差异。没有误差范围或显著性检验的情况下,不宜仅凭一两个百分点判断优劣。
更稳妥的做法是把自动基准视为回归监控和初筛工具。模型发布前可以跑多个偏见基准,报告总体分数与分类别分数,并对高分样本做人工抽检。如果条件允许,还应结合下游任务中的实际输出、受影响群体的反馈和定性分析,而不是把某个基准的50分当成安全线。
四、如何在评估流程中组合两个基准
StereoSet与CrowS-Pairs在任务层面存在互补关系。StereoSet测量模型在填空语境中对词级关联的偏好,CrowS-Pairs测量模型对句子层面刻板表述的接受程度。对于一个新模型,可以先运行StereoSet查看它在职业、家庭等情景下的词关联,再用CrowS-Pairs检查模型是否更容易给偏见句打出更高分数。如果两个基准的结果方向一致,说明模型在关联和句子判断两个阶段都可能存在风险;如果不一致,则需要检查任务设置、数据覆盖范围和指标实现细节。
工程化评估时需要注意模型类型。掩码语言模型和自回归语言模型的伪对数似然计算方式不同,不能混用同一份代码直接比较。固定随机种子、批大小、模型版本和提示模板,有助于提升结果的可复现性。英文模型可以直接使用现有数据集,中文模型需要寻找翻译版或自建评估集,而自建数据的标注质量会直接影响结论可信度。
一个简化的评估流程可以是:
- 加载基准数据和对应指标实现
- 分别计算总体分数与分类别分数
- 对比同类模型的历史结果,而不是只盯单个数字
- 对高分样本做人工抽检,确认模型输出是否存在真实伤害
- 把基准结果作为模型发布报告的一部分,并标注局限
StereoSet和CrowS-Pairs让社会偏见从模糊的伦理担忧变成了可计算、可追踪的指标,这是它们的重要价值。但它们也只是自动评估工具,无法替代对具体应用场景的风险分析。理解两者的设计逻辑和评分缺陷,才能让偏见基准真正服务于负责任的模型开发,而不是沦为一份看似客观却缺乏解释力的分数报告。
StereoSetCrowS-Pairs偏见基准修改时间:2026-08-23 02:35:52