资讯动态

用CAV概念激活向量定位口语评分模型偏差

发布时间:2026/8/28 13:18:28 来源:尧图企业网站定制
自动口语评分系统Automated L2 Speaking Assessment已经在第二语言学习、模拟测试和在线教育中大量落地。考生对着麦克风读一段英文或者回答一个开放问题系统就会输出流利度、发音、词汇、语法等维度的分数。这类系统的优势很直接评测标准一致、反馈即时、不需要等待人工阅卷。但一个更隐蔽的问题也随之出现系统会不会因为考生的母语背景、口音、语速或表达风格不同而产生系统性偏差。要回答这个问题只对比不同群体的平均分是不够的。平均分低只能说明结果不公平无法解释模型到底依据什么给出了低分。这时需要模型可解释性方法。Concept Activation Vectors概念激活向量CAV是其中一类适合做概念级归因的工具它把是否带有非母语口音是否频繁停顿这类人类概念映射到神经网络隐藏层中的方向向量再通过方向导数判断模型预测是否依赖这些概念。基于 CAV 的 TCAV 分数已经在视觉和文本任务中被验证可用于概念归因同样也可以用于 L2 口语评分系统的偏差分析。下面围绕如何使用 CAV 分析 L2 口语评分系统的偏差这条主线展开先讲清楚评分系统中的偏差来源和 CAV 的工作原理再给出一套可复现的实验流程包括概念样本设计、激活抽取、CAV 训练、TCAV 计算和显著性检验最后补充常见问题、排查路径和工程落地检查清单。1. 先理解 L2 口语自动评分系统中的偏差问题1.1 评分系统从音频到分数的处理链路L2 口语评分系统通常不是端到端一句话直接输出总分的。常见处理链路是考生音频 - 静音裁剪、音量归一化等预处理 - 声学模型提取帧级特征或句级嵌入 - 评分头映射到各维度分数 - 汇总为总分在早期系统中特征可能是人工设计的韵律特征、发音准确度特征和文本特征在近几年的深度学习方案中通常先由预训练语音编码器wav2vec 2.0、HuBERT、Whisper encoder 等把音频转换成嵌入向量再由线性层或小规模神经网络预测各维度分数。评分头输出的分数不仅是模型对考生表现的估计也包含了编码器和评分头从训练数据中学到的各种相关关系。理解这条链路的意义在于偏差分析不是只看最后的总分而是要看分数从哪一层开始被某些不相关概念带动。编码器输出的嵌入中包含了口音、语速、音色、录音环境等多种信息评分头会对这些信息做加权组合。如果某个权重设置不合理偏差就会被编码进最终分数。1.2 偏差可能藏在评分链路的各个环节如果只把偏差理解为某些群体平均分偏低会漏掉很多细节。按链路拆开看偏差可以来自四个环节训练数据偏差某个母语背景的考生数量占绝对多数模型就会在该群体上学得更准其他群体的误差更大。比如训练集中中文母语者占 60%模型对日语、西语背景考生的表现大概率更不稳定。特征偏差某些声学特征与口音、年龄、性别高度相关。如果评分任务只要求评估内容质量但模型无意中使用了口音作为评分依据就形成偏差。标签偏差训练用的标签来自人工评分员。如果评分员对某种口音存在系统性偏好模型会把这种偏好当成规律学进去。人工标签里的偏差最终会转移到模型上。评估偏差上线后只统计全体考生的均分差和相关系数不按母语、性别、录音设备等维度拆解平均指标会掩盖局部偏差。可以用一张表整理这些来源环节偏差来源典型影响训练数据某些群体样本过少少数群体预测误差大特征/嵌入口音、语速与分数隐含相关分数被非目标维度带动标签评分员对某类口音有偏好模型复现评分员偏见评估只看整体指标不按群体拆解局部偏差被平均掩盖1.3 为什么偏差分析需要概念级归因传统公平性分析常用的做法是比较预测分与人工分在各群体上的误差例如计算每组 MAE、RMSE 和相关系数。这类结果能回答系统在哪个群体上表现更差但不能回答为什么更差。差异可能来自训练数据不足也可能来自模型依赖了不该依赖的概念。概念级归因的思路不同。它先定义一组人类可以理解的概念例如非母语口音流利中断语速异常再检查模型预测对这些概念的敏感程度。如果某个概念的敏感度远高于预期说明模型在做决策时实际使用了这个概念。这个概念到底合不合理取决于评测任务本身如果任务是测发音使用口音概念有合理性如果任务是测内容组织使用口音概念就是明确的偏差信号。2. Concept Activation Vectors 的原理与工作流程2.1 从概念样本到方向向量CAV 的出发点是一个很朴素的想法神经网络隐藏层的激活向量不是随机的。当输入音频带有某种共同属性时比如都有明显非母语口音它们在某一层的激活会落在相近的区域。如果能够找到一条方向使得带口音样本的激活沿这个方向投影后明显区别于不带口音样本这条方向就可以作为非母语口音这个概念在模型内部空间中的编码。实现方式通常是训练一个二分类线性模型。正样本是概念样本负样本是随机样本。线性分类器的系数向量经过归一化之后就得到 CAV。这里使用线性分类器而不是非线性分类器是为了让方向向量保持可解释性。非线性分类器得到的边界比较复杂无法用一个统一方向表达。2.2 TCAV判断模型预测是否依赖某个概念有了概念方向之后还需要回答模型预测是否真的依赖这个方向。TCAVTesting with Concept Activation Vectors的做法是计算预测对激活的梯度与CAV 方向的点积即方向导数。公式可以写成S_C,k(x) ∇ f_k(x_l) · v_C其中 f_k 是模型对第 k 类的输出分数x_l 是输入 x 在第 l 层的激活v_C 是概念 C 的 CAV 方向。如果 S_C,k(x) 大于零说明在输入 x 附近沿着概念方向稍微移动模型预测分数会上升模型在 x 上正向依赖这个概念。对一组目标样本计算 S_C,k(x) 大于零的比例就得到 TCAV 分数TCAV_C,k |{x ∈ X_k : S_C,k(x) 0}| / |X_k|TCAV 越接近 1说明模型越依赖这个概念越接近 0说明模型在这个方向上与预测负相关接近 0.5 则说明依赖关系不明显。2.3 CAV 方法用于偏差分析的边界CAV 不是万能的。它只能回答模型是否依赖某个概念不能回答这个依赖是否造成了实际的不公平。要从 TCAV 结果得出偏差结论还需要结合任务定义、分组对比和误差分析。另外CAV 依赖概念样本的标注质量。如果非母语口音这个概念本身标注不稳定得到的方向向量也不稳定。因此 CAV 分析通常不是跑一次脚本就结束而是需要多次重复、统计检验和人工复核。3. 构建一套基于 CAV 的偏差分析实验3.1 先明确实验问题在设计实验前先把问题写清楚。以英语口语整体能力评测为例可以定义三个问题评分模型是否依赖非母语口音这个概念依赖程度是多少不同 L1第一语言背景的考生模型的 TCAV 分数是否有显著差异模型对各维度的评分是否使用了与维度不匹配的概念问题定义清楚后才能决定概念集、目标类和后续的显著性检验方式。偏差分析最常见的问题是概念没有定义清楚实验结果出来了却无法解释。3.2 模型、数据与激活层选择实验需要的模型不一定是新训练的。现成的预训练语音编码器加一个评分头只要能够拿到中间层激活和评分输出就可以做 CAV 分析。数据方面至少需要一组带 L1 标签的考生口语录音每个样本的人工评分至少包含总分和维度分概念标注由评分员对样本进行概念标签标注。激活层的选择很关键。浅层激活包含更多声学细节概念语义不明显靠近输出层的激活语义更强但梯度空间可能已经高度压缩。建议先在多个层级计算 TCAV选择语义稳定、分数区分度明显的一层作为主分析层。3.3 概念样本集设计概念样本集是 CAV 实验最重要的输入。正样本是包含该概念的样本负样本是随机样本。所谓随机样本不一定要完全没有该概念而是从全体数据中随机抽取代表不特别属于该概念的一般分布。下面是一个概念集示例概念名正样本定义负样本定义标注问题非母语口音明显受本族语音系影响从全体样本随机抽取这位考生的口音是否明显流利中断较多填充停顿、自我重复从全体样本随机抽取语流中是否频繁出现 er/uh语速异常持续过快或过慢从全体样本随机抽取语速是否符合日常交流节奏词汇复杂度使用低频词和复杂句式从全体样本随机抽取用词是否丰富概念集的设计要遵守几个原则每个正样本都被多个标注者一致确认正样本数量不要太少建议不低于 100随机样本和概念样本不要重叠概念之间要尽量语义独立避免两个 CAV 方向高度相似。注意随机样本和负样本是两回事。CAV 训练中的负样本是随机样本目的是提供一个不属于该概念突出形态的基准分布而不是找一批完全没有该概念的极端样本。3.4 抽取激活并训练 CAV假设已经用预训练编码器抽取了某一层的激活矩阵训练 CAV 的代码可以这样写import numpy as np from sklearn.linear_model import LogisticRegression from sklearn.preprocessing import StandardScaler def train_cav(positive_acts, random_acts, seed0): X np.vstack([positive_acts, random_acts]) y np.array([1] * len(positive_acts) [0] * len(random_acts)) scaler StandardScaler() X_scaled scaler.fit_transform(X) clf LogisticRegression(max_iter1000, random_stateseed) clf.fit(X_scaled, y) w clf.coef_[0] return w / (np.linalg.norm(w) 1e-12)这段代码里有一个细节训练前对激活做了标准化。激活向量不同维度的数值范围可能相差很大标准化可以避免某些维度在逻辑回归中因为数值大而主导分类结果。CAV 方向来自标准化后的线性系数。实际项目中需要结合自己的特征接口替换positive_acts和random_acts的抽取逻辑。4. 计算 TCAV 分数从结果中判断偏差4.1 用 PyTorch 计算方向导数计算 TCAV 需要模型对目标类的输出求对指定层激活的梯度。下面是思路演示代码import torch def compute_tcav(model, layer_activations, cav, target_class): acts_t torch.tensor(layer_activations, requires_gradTrue) logits model.head(acts_t) grad torch.autograd.grad(logits[:, target_class].sum(), acts_t)[0] cav_t torch.tensor(cav, dtypegrad.dtype) sensitivities (grad * cav_t).sum(dim1).numpy() return float(np.mean(sensitivities 0))这里model.head是评分模型中负责把激活映射到分数的部分。实际项目中如果你使用的是完整音频编码器需要把编码器和评分头连在一起并明确从哪一层开始作为梯度计算的起点。如果模型已经封装成.pth文件需要先确认前向传播能否返回中间层激活。4.2 多次重复训练 CAV再做显著性检验单次 CAV 训练受随机抽样影响很大正规做法是重复多次得到 TCAV 分数的分布再用 t 检验判断均值是否显著偏离 0.5。from scipy import stats def cav_bias_experiment(concept_acts, random_acts, model, target_class, runs20, sample_size200): tcav_list [] for seed in range(runs): rng np.random.RandomState(seed) pos_idx rng.choice(len(concept_acts), sample_size, replaceFalse) neg_idx rng.choice(len(random_acts), sample_size, replaceFalse) cav train_cav(concept_acts[pos_idx], random_acts[neg_idx], seed) tcav_list.append(compute_tcav(model, concept_acts, cav, target_class)) mean_tcav float(np.mean(tcav_list)) _, p_value stats.ttest_1samp(tcav_list, 0.5) return mean_tcav, p_value这里要说明为什么原假设是 0.5如果模型对某概念完全不敏感正负方向敏感性各占一半TCAV 会接近 0.5。t 检验判断多次重复的均值是否显著大于 0.5。p 值受运行次数和样本量影响建议在正式实验中固定运行次数并同时报告置信区间。注意t 检验的 p 值只能说明 TCAV 是否显著偏离 0.5不能说明偏差的严重程度。严重程度要结合 TCAV 数值和分组误差共同判断。4.3 分组对比偏差需要落到具体群体整体 TCAV 只能说明模型对概念的总体依赖。偏差分析需要按考生背景分组计算。常见分组维度包括 L1 母语、性别、录音设备、地区口音。示例代码如下def tcav_by_group(group_activations, random_acts, model, target_class): for group_id, acts in group_activations.items(): mean_tcav, p_value cav_bias_experiment( acts, random_acts, model, target_class) print(group_id, round(mean_tcav, 3), round(p_value, 4))注意分组后的样本量可能比整体小很多这时可以把 TCAV 结果与置信区间一起报告而不是只比较点估计。如果两组 TCAV 置信区间明显不重叠才适合说存在差异。注意不要直接比较两个分组的 TCAV 点估计大小就下结论必须先看置信区间是否重叠。4.4 输出一份偏差分析报告实验结束后建议按下面的格式整理结果分组样本量TCAV(口音)pTCAV(流利中断)p人工分与预测分 RMSE整体8000.720.010.680.010.42L1中文3200.760.010.640.020.39L1西班牙语2400.700.010.710.010.48L1日语2400.730.010.690.010.44上面的数据只是用于说明格式不是真实实验结果。偏差结论不能只看 TCAV 一个数要结合任务维度如果非母语口音的 TCAV 很高而任务评估的是内容质量就说明口音概念被错误地引入了评分如果任务本身是发音评测这个结果则未必是偏差。5. 常见问题与排查路径5.1 CAV 方向在多次训练中不稳定现象不同随机种子训练出的 CAV 互相点积接近 0方向差异很大。可能原因概念样本量太少或者正样本和随机样本在激活空间中重叠严重。检查方式画出两类样本在激活空间的可视化或者计算多次 CAV 的余弦相似度。处理建议增加概念样本量检查标注一致性换到更高层激活适当增加逻辑回归的 L2 正则强度。5.2 TCAV 分数长期接近 0.5现象多次运行 TCAV 都在 0.5 附近p 值很大。可能原因模型预测本来就不依赖该概念或者选错激活层或者标记的概念和模型实际使用的概念不一致。检查方式计算 CAV 在训练集上的分类准确率。如果准确率也不高说明正负样本没有分开。处理建议确认概念定义没有歧义换一层激活重试如果所有层都接近 0.5可以接受模型不依赖该概念的结论。5.3 随机样本与概念样本互相污染现象CAV 分类准确率很高但 TCAV 结果与业务直觉完全相反。可能原因随机样本里混入了大量概念样本负样本不再是一般分布。检查方式统计随机样本中被标注为概念的样本比例抽查随机样本的音频。处理建议从全体数据中分层随机抽样并剔除已经被标注为概念极端的样本。随机样本的目的不是完全没有概念而是不集中体现概念。5.4 梯度计算出现 NaN 或维度不匹配现象运行compute_tcav时维度错误或梯度为 NaN。可能原因激活矩阵的形状和评分头输入不一致激活层没有介入计算图音频样本长度不同导致激活长度不同。检查方式打印layer_activations.shape和model.head输入维度检查是否需要 padding 或 pooling。处理建议统一采用句级 pooling 后的激活确保计算梯度时激活张量设置了requires_gradTrue。这些问题可以汇总成一张排查表问题现象常见原因检查方式处理建议CAV 方向不稳定概念样本量少、正负样本重叠计算多次 CAV 余弦相似度增加样本、清洗标注、换激活层TCAV 接近 0.5概念与预测无关或梯度噪声大检查 CAV 分类准确率调整概念定义、换层重试TCAV 与业务直觉相反随机样本被概念样本污染统计随机样本中的概念比例分层随机抽样并剔除极端样本梯度 NaN 或维度错误激活层与评分头不匹配打印 shape、检查计算图做句级 pooling、设置 requires_grad6. 最佳实践与扩展方向6.1 做 CAV 偏差分析前的检查清单偏差定义要落到具体评测任务写清楚哪个群体、哪个维度、关注哪种概念。概念标注至少两人计算标注一致性不一致的样本剔除或讨论。概念正样本数量不少于 100随机样本从全体数据分层抽样。在多个评分维度上分别计算 TCAV不要只看总分。至少选 2 到 3 层激活进行对比再确定主分析层。每次实验固定随机种子、CAV 运行次数和样本量避免复现困难。报告时附带置信区间和 p 值不要只看点估计。结合分组误差指标RMSE、MAE、相关系数一起判断TCAV 不能单独证明偏差。保留实验脚本、数据版本和模型版本方便复核。6.2 学习环境和生产环境的

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价