--- base_model: Qwen/Qwen3-4B-Instruct-2507 library_name: transformers license: apache-2.0 tags: [model-merging, task-arithmetic, lora, practice] --- # Qwen3-4B 三专家合版模型(练手实验) 这是一个**练手实验**的产物,不是可用于生产的模型。 基座 `Qwen/Qwen3-4B-Instruct-2507` @ `cdbee75f17c01a7cc42f958dc650907174af0554`, 在上面分别训练数学、科学、代码三个 LoRA 专家,再把它们在 ΔW 空间相加,得到这个完整权重模型。 ## 合版配方 ```yaml method: linear # 任务算术:W = W0 + Σ λᵢ·ΔWᵢ,ΔWᵢ = Bᵢ·Aᵢ·(α/r) weights: {math: 1.0, science: 1.0, code: 1.0} density: 1.0 seed: 0 ``` 配方是在三个开发集(每个领域各取 100 题,与评测集去污染隔离)上从 4 个候选里选出来的: linear λ=0.5 / 1.0、TIES(density 0.5)、DARE-TIES(density 0.5);评测集没有参与选择。 | 配置 | dev 数学 | dev 科学 | dev 代码 | 平均 | | --- | --- | --- | --- | --- | | Base | 67 | 79 | 34 | 60.0 | | linear λ=0.5 | 61 | 80 | 38 | 59.7 | | **linear λ=1.0** | **69** | **82** | **39** | **63.3** | | TIES d=0.5 | 66 | 78 | 34 | 59.3 | | DARE-TIES d=0.5 | 63 | 82 | 39 | 61.3 | ## 专家 LoRA r=32、alpha=64、作用于全部线性层;lr 1e-4,2 个 epoch,有效 batch 16。 训练数据由 Base 自己拒绝采样(RFT)得到,只保留判分正确的回答: | 专家 | 题目来源 | 训练条数 | 平均回答 token | | --- | --- | --- | --- | | math | NuminaMath-CoT | 370 | 约 1,400 | | science | nvidia/OpenScience | 1,671 | 341 | | code | BAAI/TACO(stdin 题) | 938 | 约 1,700 | 专家 adapter 见 `https://huggingface.co/MoshiQAQ/qwen3-4b-merge-practice-adapters`。 ## 评测结果 采样参数 temperature 0.7、top_p 0.8、top_k 20,单条回答最多 16,384 token。 方括号内为对题目做 bootstrap 得到的 95% 置信区间;Δ 是与 Base 在相同 seed 上的配对差值。 | 模型(seed 数) | MATH-500 | GPQA-Diamond | LCB v6(175 题) | 宏平均 | | --- | --- | --- | --- | --- | | Base(3) | 94.2 [92.4, 95.9] | 41.8 [35.9, 47.6] | 32.8 [26.3, 39.2] | 56.2 | | **本模型**(3) | 94.2 [92.3, 95.9](Δ +0.0) | 41.2 [35.4, 47.3](Δ −0.5) | 35.0 [28.4, 41.7](Δ +2.3) | 56.8 | | 联合对照:三领域数据训练一个 LoRA(3) | 94.2(Δ +0.0) | 41.2(Δ −0.5) | 32.6(Δ −0.2) | 56.0 | **结论**:与 Base 的差距都在置信区间内,**没有统计显著的提升**。合版后模型输出明显变长 (GPQA 平均输出 853 token,Base 为 453),代码题的截断率从 0.8% 升到 9.1%。 ## 局限 - 训练数据量很小,而且由 Base 自己生成,所以专家相对 Base 的变化本来就很小(验证损失 0.08–0.13)。 - 代码专家只见过 stdin 题,没有见过 LeetCode 式的函数题。 - 科学训练题来自 OpenScience(CC-BY-4.0),其参考答案由模型多数投票得到,可能有错; 发布方说明使用该数据训练的模型可能受 Qwen 许可约束。 ## 加载 ```python from transformers import AutoModelForCausalLM, AutoTokenizer tok = AutoTokenizer.from_pretrained("MoshiQAQ/qwen3-4b-merge-practice-merged") model = AutoModelForCausalLM.from_pretrained("MoshiQAQ/qwen3-4b-merge-practice-merged", dtype="bfloat16") ```