QINGYI-KDA-0.6B · 清漪
以 Qwen3-0.6B-Base 为基座,将 28 层中的 21 层全注意力替换为 KDA(Kimi Delta Attention)线性注意力、保留 7 层原生 GQA,经分层对齐、端到端 KL 蒸馏、格式专项、人格 SFT 与 DPO 抛光得到的混合架构模型(657.5M 参数)。人格"清漪"直接烙在权重里,无需 system prompt。
相关工作坐标:GenDistill(arXiv:2603.26556)已公开完成 Qwen3-0.6B→Hybrid-KDA(Stage 3a/3b、completion-only KD);本项目是其配方族在消费级/租用单卡预算下的独立工程实现(解冻范围直接采用其 MLP 冻结消融结论),贡献在于其未覆盖的接口伤四置换诊断学、人格对齐扩展与全流程事故/修复记录。另一个坐标上,THUNLP 的 HALO 曾报告 Qwen3→KDA 在其 App. B 同配置实验中 Stage 2 梯度发散失败(App. G.2);本管线端到端跑通并收敛(注意 HALO 正式管线同样保留 25% 注意力层,收敛差异的候选解释未经消融证明)。
代码、训练脚本、复现配方与技术报告(v1→v3 全记录): github.com/Sisyphbaous-DT-Project/open-qingyi 论文 preprint(DOI): 10.5281/zenodo.21722356
架构
| 项 | 值 |
|---|---|
| 基座 | Qwen/Qwen3-0.6B-Base(Apache 2.0) |
| 层数 | 28 = 21 KDA + 7 GQA(每 4 层保留 1 层全注意力:3, 7, 11, 15, 19, 23, 27) |
| KDA 配置 | hidden 1024 · 16 heads · head_dim 128 · short-conv kernel 4 · RMSNorm eps 1e-6 |
| 参数量 | 657.5M(tied embeddings) |
| 上下文 | 训练 seq_len 2048;位置编码配置继承基座 32K,长上下文未实测 |
| 解码缓存 | KDA 层为 O(1) 循环状态(HybridKDACache);整模型 KV cache 仍随 7 层 GQA 线性增长 |
训练血缘与关键数字
Qwen3-0.6B-Base(C-Eval 50.59%,同口径教师基线)
→ 手术替换(21×KDA + 7×GQA,门控 g6,canonical hash 锁定)
→ Stage 2 分层对齐(hidden-state MSE,best step-900:CE 4.1250 / KL 1.33)
→ Stage 3a 端到端 forward-KL 蒸馏(主臂 7,000 步 / 57.3M tokens,T=1)
→ Stage 3b 格式专项(选择题四置换/古诗/翻译,1,000 步 / 8.2M packed tokens)
→ SFT 人格语料两 epoch(7,768 步)
→ 身份小灶(300 步)
→ DPO 抛光(100 步,on-policy pairs)
- C-Eval 轨迹(lm-eval
ceval-valid,0-shot,loglikelihood 选项排序):Stage 2 后 25.48%(CE 已大降但选择题仍躺随机线——"perplexity 会撒谎")→ Stage 3a 后 28.83% → Stage 3b 后 41.31% → 最终 41.83% ± 1.33(教师基线 50.59%) - 15 个 C-Eval 守护点跟踪:人格训练全程无灾难性遗忘(SFT 首点曾下探 38.63%,随后恢复并稳定在 39%~41%)
- DPO held-out reward acc 0.625→0.792;第二轮 DPO 迭代无效(只增生复读),已弃
核心发现
- 接口伤是低分的主要可修复因素之一:Stage 3a 后 C-Eval 仅 ~28%,但四选项置换诊断显示模型严重"黏住 A/B/C/D 标签"——选 A 率 81.06%,106/161 题四次换位仍黏同一标签,正确项 margin 为负。1,000 步格式专项后:选 A 率降至 58.5%、黏标签题降至 47/161、margin 转正、C-Eval +12.48pt。这是接口失能的强证据,但不排除并存的知识损伤(古诗/翻译仍有教师对而学生错的残例;+12.48pt 的代价是 valid CE/KL 小幅恶化)。
- **人格可以"白嫖"**:人格 SFT/小灶/DPO 全程 C-Eval 波动基本在噪声带内,身份三要素(自名/模型名/作者归属)权重级绑定。
- on-policy DPO 一轮即甜区。
- 工程教训:bf16 参数+动量会吞掉 norm 类权重的小更新(Stage 2/3 必须 FP32 master);新层必须第一天实现增量缓存并对拍(我们曾因此把缓存 bug 误判为人格未绑定)。
使用
依赖:transformers>=5.0、fla-core、einops、triton==3.6.0(3.7.x 会使 chunk_kda 训练假死),需要 CUDA GPU(KDA 层使用 Triton kernel,无 CPU 回退)。trust_remote_code=True,本仓库自带全部自定义代码。
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
REPO = "shiershuihesaixiliya/qingyi-kda-0.6b"
tok = AutoTokenizer.from_pretrained(REPO, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
REPO, trust_remote_code=True, dtype=torch.bfloat16, device_map="cuda")
model.eval()
prompt = "<|im_start|>user\n哥哥: 你是谁?<|im_end|>\n<|im_start|>assistant\n"
ids = tok(prompt, add_special_tokens=False, return_tensors="pt").input_ids.cuda()
out = model.generate(ids, max_new_tokens=80, do_sample=False,
pad_token_id=tok.eos_token_id)
print(tok.decode(out[0, ids.shape[1]:], skip_special_tokens=True))
# -> 我是清漪。哥哥的贴身助手……
采样建议:身份/事实类绑定在高温下会被冲散(T0.7 时"你是谁"约半数回潮为通用回答)。部署建议 temperature 0.3~0.5, top_p 0.9, repetition_penalty 1.1(≤0.5 为外推建议,未逐点实测);闲聊类可放宽到 0.6~0.7。
已知限制
- 0.6B 小模型:通用能力有限,长文本会复读,事实会编。
- 评测口径:最终 41.83% 所用的
ceval-valid在训练过程中被反复用于检查点选择(守护点 15+ 次),存在选择偏差(winner's curse),不是 untouched test;三档评测尺中的 release 档已锁定未开封。最终权重未复测 MMLU/CMMLU、标准生成基准与长上下文。 - 拒密行为(api key / system prompt)在采样下不稳定,可能编造假 key 应对(不会泄露真实密钥——训练数据里本来就没有)。
- 模型按设计记得一个真实 QQ 号并会回答"是哥哥"——这是刻意的身份设定,不是泄露。
- 人格语料来自真实聊天记录清洗(已脱敏,原始数据不公开),聊天风格强拟人;请勿用于冒充真人欺骗他人。
- 与教师仍有 ~8.8pt C-Eval 差距;"数据多样性不足是上限主因、而非架构上限"目前只是工作假设。
License
Apache 2.0(代码与权重;基座 Qwen3-0.6B 同为 Apache 2.0)。第三方训练数据集许可以各自数据源为准。
QOSP = Qingyi Open Source Project(开源清漪计划),隶属 DT-Project(数字孪生 / Digital Twin)。
- Downloads last month
- 34
Model tree for shiershuihesaixiliya/qingyi-kda-0.6b
Base model
Qwen/Qwen3-0.6B-Base