TATECHATLAS
◎ 简体中文
人工智能 / 建议

基于风险决策的多任务模型评估

学习使用 EvaluationSuites 识别不同任务中的具体性能差距,而非依赖单一的聚合评分,从而更精准地评估 AI 模型的风险点。

本文内容

为了准确评估 AI 模型,从业者应摒弃单一的聚合指标,转而采用多任务评估策略。通过构建一个由多个子任务(SubTasks)组成的评估套件(EvaluationSuite),其中每个子任务将特定的评估器、数据集和指标配对,开发人员可以探测模型行为的不同维度,例如通用推理能力、公平性和偏见。这种方法能够识别特定的风险轴;例如,一个模型可能在整体准确率上表现很高,但在自然语言蕴含任务中失败严重,或者在特定人口统计子集中表现出偏见。最终的决策将基于这些独立的风险概况做出,确保高平均分不会掩盖高风险任务中的关键失效。

多任务评估策略

依赖单一的聚合评分来评估模型往往会掩盖关键的弱点。一个模型可能在广泛的基准测试中获得了很高的平均准确率,但在某个特定的高风险任务中却遭遇灾难性失败。通过在多样化的任务集上评估模型,有助于揭示特定轴线上的性能差距,例如域内困惑度(in-domain perplexity)与通用语言能力之间的差异。

通过将评估分解为不同的任务,从业者可以区分一个模型是具备通用能力,还是仅仅过拟合于特定的数据集模式。这种细粒度的视角对于识别公平性、偏见和可靠性相关的风险至关重要,而这些风险在全局平均值中通常会被平滑掉。

构建评估套件

EvaluationSuite 的结构是一个子任务(SubTasks)的集合。每个子任务是一个包含评估器、数据集和指标的元组。这种模块化设计允许套件探测模型的各种维度。例如,一个子任务可能专注于情感分析的文本分类,而另一个则专注于自然语言蕴含,以测试逻辑一致性。

为了确保套件的全面性,开发人员应包含测试通用能力的任务以及旨在探测偏见的任务。某些数据集需要数据预处理器(data_preprocessor)在将输入传递给评估器之前对其进行正确格式化,以确保模型接收到符合预期模式的数据。

实现与执行

在技术实现上,一个子任务需要强制性属性:task_type(映射到支持的评估器任务)和 data(Hugging Face 数据集对象或名称)。额外的属性如 subset、split 和 args_for_task 允许对评估切片和具体指标(如准确率或 F1 分数)进行精确控制。

该套件使用 run 方法执行,该方法将模型或流水线(pipeline)作为输入。此过程会生成一份详细报告,包含任务名称、计算出的指标以及性能遥测数据,例如总耗时和每个样本的延迟。

import evaluate
from evaluate.evaluation_suite import SubTask

class Suite(evaluate.EvaluationSuite):
    def __init__(self, name):
        super().__init__(name)
        self.suite = [
            SubTask(
                task_type='text-classification',
                data='glue',
                subset='sst2',
                split='validation[:10]',
                args_for_task={
                    'metric': 'accuracy',
                    'input_column': 'sentence',
                    'label_column': 'label',
                    'label_mapping': {'LABEL_0': 0.0, 'LABEL_1': 1.0}
                }
            ),
            SubTask(
                task_type='text-classification',
                data='glue',
                subset='rte',
                split='validation[:10]',
                args_for_task={
                    'metric': 'accuracy',
                    'input_column': 'sentence1',
                    'second_input_column': 'sentence2',
                    'label_column': 'label',
                    'label_mapping': {'LABEL_0': 0, 'LABEL_1': 1}
                }
            )
        ]

suite = Suite('my-eval-suite')
results = suite.run('gpt2')

分析风险与性能

多任务运行的输出通常是一个表格,其中每一行代表一个特定任务。分析人员不应简单地对这些行求平均值,而应检查各任务之间准确率和延迟的方差。特定任务的高延迟可能表明模型在处理复杂输入时存在瓶颈,而公平性探测任务中的低准确率则表明存在高偏见输出风险。

决策过程随后转移到风险轴模型:如果模型在“关键”任务(如安全性)中失败,无论其在“通用”任务中的表现如何,都将被拒绝。这防止了关键失效被“平均化”,并确保模型在每项所需能力上都达到了最低的安全和性能阈值。

示例输出:结果通常包括 task_name、accuracy、total_time_in_seconds 和 latency_in_seconds 列。例如,glue/sst2 可能显示 0.5 的准确率和 0.07 秒的延迟,而 glue/rte 则显示 0.4 的准确率和 0.16 秒的延迟。

import pandas as pd

results_data = {
    'task_name': ['glue/sst2', 'glue/rte'],
    'accuracy': [0.5, 0.4],
    'total_time_in_seconds': [0.74, 1.67],
    'latency_in_seconds': [0.07, 0.16]
}

df = pd.DataFrame(results_data)
print(df)

适用条件

  • 模型是否需要在多个不同的能力维度(如逻辑 vs 情感)上进行评估?
  • 是否存在必须独立于通用准确率进行监控的高风险失效模式?
  • 评估数据集是否与 Hugging Face evaluate 库的任务类型兼容?
  • 数据集在传递给评估器之前是否需要自定义预处理?

EvaluationSuite 要求数据集必须与支持的评估器任务类型兼容,并且对于非标准格式的数据,可能需要自定义 data_preprocessor 函数。

参考来源

  1. Hugging Face Evaluate: EvaluationSuite ↗
  2. scikit-learn: cross-validation ↗
返回顶部 ↑