CritiQ 记录
[TOC]
目标
- 训练模型,由模型判断语料文本数据的质量(高/低),完成质量检测,帮助后续模型训练
训练数据准备
- 至少需要300正例+300负例,希望是人类专家的标注
在训练数据不足1w的情况,使用CritiQ去做数据标注
传统训练都是训练集>测试集
这里是通过挖掘人类偏好,测试集合远大于训练集,使用训练集挖掘出来的指标,对测试集进行标注
当训练数据超过1w的时候,可以直接跳过这个部分去做分类模型训练
Knowledge Base
对于数据质量评估,如果完全交由模型生成评估指标,从各个角度来说都很水
参考:2502.19279] CritiQ: Mining Data Quality Criteria from Human Preferences
workflow:
- 从huggingface的数据集中寻找参考论文列表
- 从arxiv能找到的论文中爬取摘要
- 通过制作agent分析摘要,判断论文中是否有关于数据集评价等内容
- 提取评估指标
最后论文作者得到了一个370+数量的指标
根据不同的待测数据集,跑一遍,选择准确度较高的
数量不够让模型生成
Training
github
环境
cuda 12.4 + torch 2.6 + Python3.10
1
2
3
|
conda create -n critiq_env python=3.10 -y
conda activate critiq_env
pip3 install torch torchvision torchaudio
|
1
|
python -c "import torch; print('PyTorch版本:', torch.__version__); print('GPU可用:', torch.cuda.is_available()); print('GPU名称:', torch.cuda.get_device_name(0) if torch.cuda.is_available() else '无可用GPU')"
|
1
2
3
|
git clone https://github.com/KYLN24/CritiQ
cd CritiQ
pip install -e ".[vllm,train]"
|
之后如果网络不太行,换一个源:
1
2
|
import os
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
|
数据集
Pair Data格式如下:
1
2
3
4
|
class PairData(TypedDict):
A: str
B: str
answer: Literal["A", "B"]
|
训练数据格式(保存为train_reward.jsonl
):
1
2
|
{"A": "金属的导热系数显著高于木材(铁约80 W/m·K vs 木材约0.1 W/m·K),根据傅里叶定律q=-k∇T,更高的导热系数导致更快的热传导速率,使手部热量迅速流失。","B": "金属传热特别快,能迅速把你手上的热量带走,所以摸起来凉;木头传热慢,热量不容易流失,感觉就没那么凉。就像夏天坐金属凳子比坐木凳子感觉更凉快。","answer": "B"}
{"A": "由牛顿第一定律可知,物体保持原有运动状态。当汽车以加速度a减速时,乘客因惯性保持原速v,直到受到座椅摩擦力f=μN的作用才减速。","B": "因为你的身体想保持原来的运动状态。车停了,但你的身体还在往前,所以会往前倾。就像跑步时突然停下,身体还会往前冲一样。","answer": "B"}
|
Reward模型输入格式(保存为predict_reward.jsonl
):
1
2
3
4
5
6
|
{"text": "金属的导热系数显著高于木材(铁约80 W/m·K vs 木材约0.1 W/m·K),根据傅里叶定律q=-k∇T,更高的导热系数导致更快的热传导速率,使手部热量迅速流失。"}
{"text": "金属传热特别快,能迅速把你手上的热量带走,所以摸起来凉;木头传热慢,热量不容易流失,感觉就没那么凉。就像夏天坐金属凳子比坐木凳子感觉更凉快。"}
{"text": "由牛顿第一定律可知,物体保持原有运动状态。当汽车以加速度a减速时,乘客因惯性保持原速v,直到受到座椅摩擦力f=μN的作用才减速。"}
{"text": "因为你的身体想保持原来的运动状态。车停了,但你的身体还在往前,所以会往前倾。就像跑步时突然停下,身体还会往前冲一样。"}
{"text": "光从光密介质(水,n=1.33)进入光疏介质(空气,n≈1)时发生折射,根据斯涅尔定律n₁sinθ₁=n₂sinθ₂,折射角大于入射角导致视觉偏移。"}
{"text": "因为光从水进入空气时会拐弯,让我们看到的位置和实际位置不一样,所以筷子看起来像是弯的。就像把吸管插进水里也会看起来弯折一样。"}
|
一共准备了137条数据:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
请生成100个初中物理现象问题与解答,要求:
1. 每个问题包含两种回答:
- **A**:专业严谨的物理解释(含公式、原理名称、数据等)
- **B**:通俗易懂的讲解(用比喻、生活实例,语言口语化)
- **answer**:固定标注"B"
2. 数据格式:每行一个完整JSON对象,严格遵循以下结构:
{"A": "...", "B": "...", "answer": "B"}
3. 内容要求:
- 物理现象需贴近日常生活(如热学、光学、力学等)
- B回答必须正确且易于理解,避免专业术语
- 示例类比需直观(如"像磁铁吸住""像气球爆炸")
4. 输出:直接给出结果,无需注释,禁止使用```包裹
示例格式:
{"A": "金属导热系数较高(铁80 W/m·K),根据傅里叶定律q=-k∇T...", "B": "金属像‘传热快手’,迅速带走热量,所以摸起来更凉", "answer": "B"}
|
由模型生成
先做一个预测:
1
|
python ./critiq/scripts/reward_predict.py --model Qwen/Qwen2.5-1.5B-Instruct --data ./data/predict_reward.jsonl --output_dir ./output
|
输出结果在output
1
2
3
4
5
6
|
{"text": "金属的导热系数显著高于木材(铁约80 W/m·K vs 木材约0.1 W/m·K),根据傅里叶定律q=-k∇T,更高的导热系数导致更快的热传导速率,使手部热量迅速流失。", "reward": 0.9465966820716858}
{"text": "金属传热特别快,能迅速把你手上的热量带走,所以摸起来凉;木头传热慢,热量不容易流失,感觉就没那么凉。就像夏天坐金属凳子比坐木凳子感觉更凉快。", "reward": 0.9046503901481628}
{"text": "由牛顿第一定律可知,物体保持原有运动状态。当汽车以加速度a减速时,乘客因惯性保持原速v,直到受到座椅摩擦力f=μN的作用才减速。", "reward": 0.9736446738243103}
{"text": "因为你的身体想保持原来的运动状态。车停了,但你的身体还在往前,所以会往前倾。就像跑步时突然停下,身体还会往前冲一样。", "reward": 0.9664104580879211}
{"text": "光从光密介质(水,n=1.33)进入光疏介质(空气,n≈1)时发生折射,根据斯涅尔定律n₁sinθ₁=n₂sinθ₂,折射角大于入射角导致视觉偏移。", "reward": 0.9532749652862549}
{"text": "因为光从水进入空气时会拐弯,让我们看到的位置和实际位置不一样,所以筷子看起来像是弯的。就像把吸管插进水里也会看起来弯折一样。", "reward": 0.9845753908157349}
|
给的分数都很高,因为两种风格的文本质量都不低
为了让模型出现人类的偏好,我们开始训练一下:
1
|
python ./critiq/scripts/train_reward.py --data ./data/train_reward.jsonl --eval_steps 40
|
eval_steps
一定要开大一点……原代码是1,每一步保存一个模型,磁盘炸的很快
训练的模型保存路径:<output_dir>/<job_name>
我这里是./output/tmp
再跑一下预测:
1
|
python ./critiq/scripts/reward_predict.py --model ./output/tmp/checkpoint-109 --data ./data/predict_reward.jsonl --output_dir ./output
|
还没fixed的bug:
predict不知道为什么给的结果永远是:0.9以上
我直接修改了train.py,训练完直接跑预测,结果是对的(
1
2
3
4
5
6
7
|
{"text": "突然关水龙头像‘管道撞车’,水流‘刹车不及’撞出巨响", "reward": 0.9999999586005831}
{"text": "磁致伸缩ΔL/L≈10^-5(镍),逆效应用于超声换能器", "reward": 2.2827974365423323e-05}
{"text": "磁致伸缩材料像‘会呼吸的磁铁’,磁场一变就‘伸缩’", "reward": 0.9999999123574378}
{"text": "防晒霜氧化锌散射UV,粒径d≈20 nm最优", "reward": 1.568953403843032e-05}
{"text": "物理防晒像‘纳米镜子’,把紫外线‘弹弹球’般反射", "reward": 0.9999999918479713}
{"text": "橡皮船浮力F=ρgV,PVC材料ρ≈1.4 g/cm³", "reward": 1.0129980850990629e-05}
{"text": "充气船像‘塑料泡泡’,空气‘内胆’让它漂水面", "reward": 0.9999985406223194}
|