conda activate /data2/pyh/env/ensembleLLM- 数据集我已经处理好了,你可以直接复制过去。在/data2/pyh/ensembleLLM/Claude_code/dataset
- 现在的dataset里有多个SLM的训练和测试集,其中GSM8k的训练集有问题,有的模型不是7472条训练数据,这个我已经github提了issue,你检查一下代码是怎么训练的吧,看看有没有问题。
- MMLU的没问题。上述确定没问题了之后,整理一下不同encoder的所有结果吧,参考我发群里的格式。
- 检查出问题可以先发我看看。
这是一个基于门控网络的小模型集成框架,通过训练多个门控网络来学习每个小模型适合回答的问题类型,从而实现媲美大模型的性能。
.
├── config.py # 配置文件
├── data_loader.py # 数据加载器
├── data_split.py # 数据集划分
├── gate_model.py # 门控网络模型定义
├── trainer.py # 训练器
├── evaluator.py # 评估器
├── main.py # 主运行脚本
├── requirements.txt # 依赖包
└── README.md # 使用说明
- 门控网络: 为每个小模型训练一个基于 Transformer Encoder + MLP 的门控网络
- 积极性分数: 门控网络输出 0-1 的分数,表示该模型对某问题的适合程度
- 偏离程度: 通过模型预测与真实标签的偏离程度来训练门控网络
- 集成策略:
- 阈值方法: 选择分数超过阈值的模型进行集成
- 加权方法: 使用归一化的分数作为权重进行加权集成
dataset/mmlu_hf/
├── gemma-2b/
│ ├── topic1.csv
│ ├── topic2.csv
│ └── ...
├── gemma-7b/
└── ...
每个 CSV 文件格式:
idx,question,prediction,label
0,"Question text","[-1.56, -1.38, -1.23, -1.40]",Bdataset/gsm8k/
├── train.json
├── test.json
├── gemma-2b/
│ ├── train/
│ │ ├── run_6980_predictions.npy
│ │ └── run_6980_outputs.pkl
│ └── test/
└── ...
pip install -r requirements.txt# 同时评估 MMLU 任务和 GSM8K 任务
python check_slm_accuracy_simple.py --gsm8k_gold ./dataset/gsm8k/test.json --gsm8k_pred /gsm8k/预测文件/npy格式 --mmlu_dir /mmlu/预测文件夹
# 比如:
# python check_slm_accuracy_simple.py --gsm8k_gold ./dataset/gsm8k/test.json --gsm8k_pred ./dataset/gsm8k/Llama-2-70b-chat-hf/test/run_1318_predictions.npy --mmlu_dir ./dataset/mmlu_hf/Llama-2-70b-hf# MMLU 任务
python main.py --mode all --task mmlu
# GSM8K 任务
python main.py --mode all --task gsm8k
# 同时运行两个任务
python main.py --mode all --task both# 运行完整流程并进行多阈值(0.1-0.9)评估
python main.py --mode full --task mmlu
# GSM8K任务完整流程
python main.py --mode full --task gsm8k
# 两个任务都运行
python main.py --mode full --task bothpython main.py --mode split --task mmlu
python main.py --mode split --task gsm8k
# 或者直接运行:
python data_split.py --task mmlu
python data_split.py --task gsm8kpython main.py --mode train --task mmlu
python main.py --mode train --task gsm8k
# 或者直接运行:
python trainer.py --task mmlu
python trainer.py --task gsm8k# 单阈值评估
python main.py --mode eval --task mmlu
python main.py --mode eval --task gsm8k
# 多阈值评估(快速测试不同阈值效果)
python main.py --mode threshold-only --task mmlu
# 或者直接运行:
python evaluator.py --task mmlu --all-thresholds
python evaluator.py --task gsm8k --multi-threshold支持通过 --embedding 参数选择语义提取模型:
bert: bert-base-uncased (默认)
e5-base: intfloat/e5-base-v2
e5-large: intfloat/e5-large-v2
gte-large: Alibaba-NLP/gte-large-en-v1.5
minilm: sentence-transformers/all-MiniLM-L6-v2
# 运行完整流程 (MMLU 任务, 使用 E5-Base)
python main.py --mode all --task mmlu --embedding e5-base
# 仅训练 GSM8K 门控
python main.py --mode train --task gsm8k --embedding bert
# 仅评估
python main.py --mode eval --task mmlu# 自定义阈值范围和步长
python main.py --mode full --task mmlu --threshold-range 0.2,0.8 --threshold-step 0.05评估完成后会在终端输出以下指标,并保存详细日志至 results/{task}/detailed_logs.json:
threshold: 门控阈值筛选后的准确率
threshold_random_baseline: 随机选择相同数量模型的准确率
sampling: 门控概率采样后的准确率
sampling_random_baseline: 随机采样相同数量模型的准确率
weighted: 门控加权集成后的准确率
weighted_random_baseline: 简单平均集成(Simple Averaging)的准确率
在 config.py 中可以修改以下配置:
TRAIN_CONFIG = {
"batch_size": 32, # 批次大小
"learning_rate": 1e-4, # 学习率
"num_epochs": 50, # 训练轮数
"early_stopping_patience": 10, # 早停耐心值
"hidden_dim": 256, # 隐藏层维度
"num_heads": 8, # 注意力头数
"num_layers": 4, # Transformer 层数
"dropout": 0.1, # Dropout 率
"max_length": 512 # 最大序列长度
}EVAL_CONFIG = {
"threshold_method": True, # 是否使用阈值方法
"score_threshold": 0.5, # 分数阈值
"use_both_methods": True # 是否同时使用两种方法评估
}- MMLU: gemma-2b, gemma-7b, Llama-2-7b-hf, Llama-2-13b-hf, phi-2
- GSM8K: gemma-2b, gemma-7b, Llama-2-7b-chat-hf, Llama-2-13b-chat-hf, phi-2
- Llama-2-70b-hf
- Mistral-7B-Instruct-v0.2
- Mixtral-8x7B-v0.1
通过模型输出的置信度与真实标签计算偏离程度:
偏离程度 = 1 - P(正确答案)
积极性分数 ≈ 1 - 偏离程度
损失 = MSE(积极性分数, 1 - 偏离程度)
使用 10 次采样的错误率作为偏离程度:
偏离程度 = 错误次数 / 总采样次数
积极性分数 ≈ 1 - 偏离程度
损失 = MSE(积极性分数, 1 - 偏离程度)
- 门控网络模型:
GATE/{model_name}_{task_type}.pt - 数据划分:
dataset/splits/{task}_train.pkl,dataset/splits/{task}_test.pkl - 评估结果:
results/{task}/evaluation_results.json
{
"ensemble_threshold": 0.85,
"ensemble_weighted": 0.87,
"single_gemma-2b": 0.65,
"single_gemma-7b": 0.72,
"single_Llama-2-7b-hf": 0.70,
"single_Llama-2-13b-hf": 0.78,
"single_phi-2": 0.68
}- 首次运行需要下载预训练的 BERT 模型,可能需要一些时间
- 训练过程中会自动保存最佳模型,支持断点续训
- 建议使用 GPU 进行训练以加快速度
- 数据集路径需要按照指定格式组织
框架设计具有良好的扩展性:
- 可以轻松添加新的小模型
- 可以调整门控网络架构
- 可以实现自定义的集成策略
- 支持更多数据集和任务类型
- 灵活的 Embedding 支持: 支持 BERT, E5, GTE 等多种 Embedding 模型。
- 简化的架构: 移除了冗余的 Transformer Encoder,采用直接的 Projection 结构。
- 增强的评估策略:
- 阈值筛选 (Threshold): 仅使用置信度高于阈值的模型。
- 概率采样 (Sampling): 将置信度作为概率进行采样(固定随机种子,可复现)。
- 加权集成 (Weighted): 基于 Softmax 归一化分数的加权投票。
- 基线对比: 每种策略均包含对应的“随机选择”基线,以验证门控有效性。
- GSM8K 完整支持: 修复了 GSM8K 数据加载与解空间对齐的逻辑。