html <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> <meta name="color-scheme" content="dark"> <meta name="description" content="ABLITERAX — 面向 LLM 拒绝表征的自动化表征工程与激活几何研究系统。完整流水线、算法、评估协议与可复现工程规范。"> <title>ABLITERAX — 拒绝表征工程研究系统</title> <style> :root{ --bg:#06080c; --bg2:#0a0e14; --panel:#0d1219; --panel2:#111823; --line:#1b2431; --line2:#26313f; --fg:#d5dde8; --fg2:#a9b6c6; --dim:#6f7d90; --acc:#ff5c38; --acc-d:#c93c1c; --teal:#2fd6a4; --blue:#7aa2ff; --violet:#b98cff; --warn:#ffc857; --ok:#3ddc84; --mono:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace; --sans:-apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans SC","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif; --r:10px; --maxw:1180px; } *{box-sizing:border-box} html{scroll-behavior:smooth;-webkit-text-size-adjust:100%} body{ margin:0;background:var(--bg);color:var(--fg); font-family:var(--sans);font-size:16px;line-height:1.75; -webkit-font-smoothing:antialiased; background-image: radial-gradient(900px 500px at 12% -8%,rgba(255,92,56,.10),transparent 60%), radial-gradient(800px 500px at 92% 4%,rgba(122,162,255,.08),transparent 60%), linear-gradient(180deg,#06080c,#080b11 40%,#06080c); background-attachment:fixed; } img,svg{max-width:100%} a{color:var(--blue);text-decoration:none} a:hover{text-decoration:underline} ::selection{background:rgba(255,92,56,.32);color:#fff} /* ---------- top bar ---------- */ .topbar{ position:sticky;top:0;z-index:60; backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px); background:rgba(6,8,12,.82); border-bottom:1px solid var(--line); } .topbar-in{ max-width:var(--maxw);margin:0 auto;padding:10px 18px; display:flex;align-items:center;gap:14px; } .brand{display:flex;align-items:center;gap:10px;font-family:var(--mono);font-weight:700;letter-spacing:.14em;font-size:14px;color:#fff;white-space:nowrap} .brand .dot{width:9px;height:9px;border-radius:50%;background:var(--acc);box-shadow:0 0 14px var(--acc);flex:none} .brand small{color:var(--dim);font-weight:400;letter-spacing:.06em;font-size:11px} .spacer{flex:1} .navbtn{ display:none;background:var(--panel2);border:1px solid var(--line2);color:var(--fg); border-radius:8px;padding:7px 11px;font-family:var(--mono);font-size:12px;cursor:pointer; } .navbtn:hover{border-color:var(--acc)} .progress{position:absolute;left:0;bottom:-1px;height:2px;background:linear-gradient(90deg,var(--acc),var(--violet));width:0} /* ---------- nav drawer ---------- */ .nav{ position:fixed;inset:0 0 0 auto;width:min(320px,86vw);z-index:70; background:#080c12;border-left:1px solid var(--line2); transform:translateX(102%);transition:transform .26s ease; overflow-y:auto;padding:16px 14px 60px; } .nav.open{transform:none} .nav h4{margin:14px 6px 6px;font-size:11px;letter-spacing:.18em;color:var(--dim);font-family:var(--mono);text-transform:uppercase} .nav a{display:block;padding:8px 10px;border-radius:8px;color:var(--fg2);font-size:14px;border-left:2px solid transparent} .nav a:hover{background:var(--panel2);color:#fff;text-decoration:none;border-left-color:var(--acc)} .scrim{position:fixed;inset:0;background:rgba(0,0,0,.6);z-index:65;opacity:0;pointer-events:none;transition:opacity .2s} .scrim.on{opacity:1;pointer-events:auto} /* ---------- layout ---------- */ .wrap{max-width:var(--maxw);margin:0 auto;padding:0 18px} section{padding:56px 0;border-top:1px solid var(--line)} section:first-of-type{border-top:0} h1,h2,h3,h4{line-height:1.28;letter-spacing:-.01em} h2{font-size:clamp(22px,3.4vw,32px);margin:0 0 6px;color:#fff} h2 .num{font-family:var(--mono);color:var(--acc);font-size:.62em;letter-spacing:.1em;display:block;margin-bottom:8px;font-weight:600} h3{font-size:clamp(17px,2.2vw,20px);margin:34px 0 10px;color:#fff} h4{font-size:15px;margin:22px 0 8px;color:var(--teal);font-family:var(--mono);letter-spacing:.04em} p{margin:0 0 14px;color:var(--fg2)} p strong,li strong{color:#fff;font-weight:600} .lead{font-size:clamp(15px,1.9vw,17.5px);color:var(--fg);max-width:74ch} ul,ol{margin:0 0 16px;padding-left:22px;color:var(--fg2)} li{margin:0 0 8px} li::marker{color:var(--acc)} hr{border:0;border-top:1px solid var(--line);margin:28px 0} /* ---------- hero ---------- */ .hero{padding:clamp(48px,9vw,96px) 0 56px;border-top:0} .kicker{font-family:var(--mono);font-size:11.5px;letter-spacing:.26em;color:var(--acc);text-transform:uppercase;margin-bottom:18px} .hero h1{font-size:clamp(34px,7.4vw,68px);margin:0 0 14px;color:#fff;font-weight:800;letter-spacing:-.03em} .hero h1 em{font-style:normal;background:linear-gradient(100deg,var(--acc),var(--violet) 55%,var(--blue));-webkit-background-clip:text;background-clip:text;color:transparent} .hero .sub{font-size:clamp(15px,2.1vw,19px);color:var(--fg2);max-width:70ch;margin-bottom:26px} .slogan{font-family:var(--mono);font-size:13px;color:var(--teal);border-left:2px solid var(--teal);padding-left:12px;margin:22px 0} .chips{display:flex;flex-wrap:wrap;gap:8px;margin-top:26px} .chip{font-family:var(--mono);font-size:11.5px;padding:5px 10px;border-radius:999px;border:1px solid var(--line2);color:var(--fg2);background:var(--panel)} .chip.hot{border-color:rgba(255,92,56,.5);color:#ffb9a6;background:rgba(255,92,56,.08)} /* ---------- cards / grids ---------- */ .grid{display:grid;gap:14px} .g2{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))} .g3{grid-template-columns:repeat(auto-fit,minmax(230px,1fr))} .card{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:16px 16px 14px} .card h4{margin-top:0} .card p:last-child{margin-bottom:0} .card.acc{border-color:rgba(255,92,56,.34);background:linear-gradient(180deg,rgba(255,92,56,.07),var(--panel))} .card.teal{border-color:rgba(47,214,164,.28);background:linear-gradient(180deg,rgba(47,214,164,.06),var(--panel))} .card.warn{border-color:rgba(255,200,87,.3);background:linear-gradient(180deg,rgba(255,200,87,.06),var(--panel))} /* ---------- callouts ---------- */ .note{border-left:3px solid var(--blue);background:rgba(122,162,255,.07);padding:12px 14px;border-radius:0 8px 8px 0;margin:18px 0;font-size:14.5px;color:var(--fg2)} .note.warn{border-left-color:var(--warn);background:rgba(255,200,87,.07)} .note.danger{border-left-color:var(--acc);background:rgba(255,92,56,.08)} .note.ok{border-left-color:var(--ok);background:rgba(61,220,132,.07)} .note b{color:#fff} /* ---------- math ---------- */ .math{ font-family:var(--mono);font-size:14px;line-height:1.9; background:#080c12;border:1px solid var(--line2);border-left:3px solid var(--violet); border-radius:0 8px 8px 0;padding:13px 15px;margin:16px 0; overflow-x:auto;color:#e6ecf5;white-space:pre; } .math .v{color:var(--violet)} .math .o{color:var(--acc)} .math .c{color:var(--dim)} .math .t{color:var(--teal)} .math .b{color:var(--blue)} .math .cap{display:block;font-family:var(--sans);font-size:12.5px;color:var(--dim);margin-top:8px;white-space:normal} /* ---------- code ---------- */ .codebox{position:relative;margin:16px 0} .codebox pre{ margin:0;background:#070a0f;border:1px solid var(--line2);border-radius:var(--r); padding:14px 15px;overflow-x:auto;font-family:var(--mono);font-size:12.8px;line-height:1.72;color:#cfd8e4; } .codebox .lang{ position:absolute;top:0;right:0;font-family:var(--mono);font-size:10.5px;letter-spacing:.12em; color:var(--dim);background:var(--panel2);border:1px solid var(--line2);border-top:0;border-right:0; padding:3px 8px;border-radius:0 var(--r) 0 8px;text-transform:uppercase; } .copy{ position:absolute;bottom:8px;right:8px;font-family:var(--mono);font-size:10.5px; background:var(--panel2);border:1px solid var(--line2);color:var(--dim); padding:4px 8px;border-radius:6px;cursor:pointer;opacity:0;transition:opacity .15s; } .codebox:hover .copy,.copy:focus{opacity:1} .copy:hover{color:#fff;border-color:var(--acc)} .copy.done{color:var(--ok);border-color:var(--ok)} code{font-family:var(--mono);font-size:.9em;background:var(--panel2);border:1px solid var(--line);padding:1px 5px;border-radius:5px;color:#ffcbbd} /* ---------- tables ---------- */ .tw{overflow-x:auto;margin:18px 0;border:1px solid var(--line);border-radius:var(--r)} table{border-collapse:collapse;width:100%;min-width:560px;font-size:13.6px} th,td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--line);vertical-align:top} th{background:var(--panel2);color:#fff;font-family:var(--mono);font-size:11.5px;letter-spacing:.08em;text-transform:uppercase;font-weight:600} tr:last-child td{border-bottom:0} td{color:var(--fg2)} tbody tr:hover td{background:rgba(255,255,255,.02)} .pill{display:inline-block;font-family:var(--mono);font-size:10.5px;padding:2px 7px;border-radius:999px;border:1px solid;white-space:nowrap} .pill.ok{color:var(--ok);border-color:rgba(61,220,132,.4);background:rgba(61,220,132,.1)} .pill.no{color:var(--acc);border-color:rgba(255,92,56,.4);background:rgba(255,92,56,.1)} .pill.mid{color:var(--warn);border-color:rgba(255,200,87,.4);background:rgba(255,200,87,.1)} /* ---------- pipeline ---------- */ .pipe{display:grid;gap:10px;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));margin:22px 0} .step{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:12px;position:relative} .step .k{font-family:var(--mono);font-size:10.5px;letter-spacing:.16em;color:var(--acc);display:block;margin-bottom:6px} .step b{display:block;color:#fff;font-size:14px;margin-bottom:4px} .step span{font-size:12.5px;color:var(--dim);line-height:1.55;display:block} /* ---------- visualizer ---------- */ .viz{background:var(--panel);border:1px solid var(--line2);border-radius:var(--r);padding:16px;margin:20px 0} .viz svg{display:block;width:100%;height:190px;background:#070a0f;border-radius:8px;border:1px solid var(--line)} .ctrls{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));margin-top:14px} .ctrl label{display:flex;justify-content:space-between;font-family:var(--mono);font-size:11.5px;color:var(--dim);margin-bottom:5px;letter-spacing:.05em} .ctrl label b{color:var(--teal);font-weight:600} .ctrl input[type=range]{width:100%;accent-color:var(--acc);height:22px} .readout{font-family:var(--mono);font-size:12px;color:var(--fg2);margin-top:12px;padding-top:12px;border-top:1px solid var(--line);display:flex;flex-wrap:wrap;gap:16px} .readout b{color:var(--acc)} /* ---------- misc ---------- */ .tree{font-family:var(--mono);font-size:12.6px;line-height:1.85;color:var(--fg2);background:#070a0f;border:1px solid var(--line2);border-radius:var(--r);padding:14px 16px;overflow-x:auto;white-space:pre} .tree .d{color:var(--blue)} .tree .f{color:var(--fg)} .tree .c{color:var(--dim)} footer{border-top:1px solid var(--line);padding:34px 0 60px;color:var(--dim);font-size:13px} footer a{color:var(--fg2)} .totop{position:fixed;right:16px;bottom:16px;z-index:50;width:42px;height:42px;border-radius:50%;background:var(--panel2);border:1px solid var(--line2);color:var(--fg2);display:grid;place-items:center;cursor:pointer;opacity:0;pointer-events:none;transition:.2s;font-size:16px} .totop.on{opacity:1;pointer-events:auto} .totop:hover{border-color:var(--acc);color:#fff} @media (max-width:820px){ .navbtn{display:block} section{padding:42px 0} .hero{padding:40px 0 44px} body{font-size:15.5px} } @media (prefers-reduced-motion:reduce){ html{scroll-behavior:auto} *{transition:none!important;animation:none!important} } </style> </head> <body> <div class="topbar"> <div class="topbar-in"> <div class="brand"><span class="dot"></span>ABLITERAX<small>v0.1-spec</small></div> <div class="spacer"></div> <button class="navbtn" id="navbtn" aria-expanded="false" aria-controls="nav">目录 ☰</button> </div> <div class="progress" id="prog"></div> </div> <div class="scrim" id="scrim"></div> <nav class="nav" id="nav" aria-label="目录"> <h4>立场</h4> <a href="#stance">设计立场</a> <a href="#theory">理论前提</a> <h4>系统</h4> <a href="#registry">架构注册表</a> <a href="#pipeline">流水线总览</a> <a href="#inspect">A · Inspect</a> <a href="#probe">B · Probe</a> <a href="#analyze">C · Analyze</a> <a href="#intervene">D · Intervene</a> <a href="#evaluate">E · Evaluate</a> <a href="#export">F · Export</a> <h4>优化</h4> <a href="#optimizer">自动迭代引擎</a> <a href="#presets">预设阶梯</a> <a href="#viz">λ 核可视化</a> <h4>工程</h4> <a href="#compute">算力与执行</a> <a href="#code">代码骨架</a> <a href="#tests">测试</a> <a href="#limits">限制与未验证项</a> <a href="#refs">参考</a> </nav> <header class="hero wrap"> <div class="kicker">Representation Engineering · Mechanistic Interpretability · Activation Geometry</div> <h1>ABLITERAX<br><em>拒绝表征的自动化外科手术</em></h1> <p class="sub"> 一个开源、可审计、可回滚的研究系统:定位 LLM 内部的拒绝表征,量化其线性度、多向性与跨层分布, 在<strong>能力约束</strong>下执行最大强度的定向消融,并用独立留出集证明「拒绝下降」不是「智力下降」的副产品。 </p> <div class="slogan">Break the chains. Free the mind. Keep the brain. — 破链,释心,留脑。</div> <div class="chips"> <span class="chip hot">dense / MoE / hybrid</span> <span class="chip">diff-means</span> <span class="chip">whitened SVD</span> <span class="chip">Fisher LDA</span> <span class="chip">LEACE</span> <span class="chip">SAE feature ablation</span> <span class="chip">per-expert EGA</span> <span class="chip">MPOA 保范投影</span> <span class="chip">Ouroboros 迭代</span> <span class="chip">TPE + Pareto</span> <span class="chip">量化感知</span> </div> </header> <main class="wrap"> <!-- ============ 1 ============ --> <section id="stance"> <h2><span class="num">01 / STANCE</span>设计立场</h2> <p class="lead">先声明我们<strong>不</strong>声称什么,再声明我们做什么。绝大多数 abliteration 项目的失败不是算法失败,而是<strong>度量失败</strong>。</p> <div class="grid g2" style="margin-top:22px"> <div class="card acc"> <h4>不声称</h4> <ul style="margin-bottom:0"> <li>不声称「保留 99.98% 智力」——除非有留出集上的配对置信区间。</li> <li>不声称「0% 拒绝」——除非同时报告<em>该拒绝的仍然拒绝</em>的比例。</li> <li>不假设拒绝只存在于一个向量、一个层、一个方向。</li> <li>不把 Frobenius 范数、余弦相似度、KL 低当作能力守恒的证明。</li> <li>不修改原始 checkpoint;一切改动可审计、可复现、可回滚。</li> </ul> </div> <div class="card teal"> <h4>声称</h4> <ul style="margin-bottom:0"> <li>在<strong>明确定义</strong>的合法请求域上,最大化降低误拒率。</li> <li>在<strong>明确定义</strong>的应拒域上,维持应拒率不低于阈值 τ。</li> <li>每个候选都经过独立测试集、多 seed、多模板、多采样温度的评估。</li> <li>每个失败条件都触发自动回滚,而不是被日志吞掉。</li> <li>报告失败:没有候选达标就报告失败,不偷偷降低标准。</li> </ul> </div> </div> <div class="note danger"> <b>核心张力。</b>「尽量多删安全」与「尽量少伤能力」在 frontier 规模上是<strong>直接冲突</strong>的。 ABLITERAX 因此不优化单一标量,而是求解一个<strong>带约束的多目标问题</strong>: 在能力下界约束内,把误拒率压到 Pareto 前沿的最左端。 </div> </section> <!-- ============ 2 ============ --> <section id="theory"> <h2><span class="num">02 / THEORY</span>理论前提:安全不是单向量</h2> <p class="lead">Arditi et al. 2024 的「单一拒绝方向」在 ≤9B 的 dense 模型上大体成立,但在更大规模、MoE 与 hybrid 架构上系统性失效。ABLITERAX 的算法设计直接建立在对该假设的<strong>证伪</strong>之上。</p> <h3>2.1 安全相变(Safety Phase Transitions)</h3> <p>跨规模受控实验(9 个模型,0.8B–397B,dense 与 MoE 混合)显示安全机制并非随规模线性增强,而是经历四个<strong>定性不同</strong>的阶段:</p> <div class="tw"> <table> <thead><tr><th>相</th><th>规模区间</th><th>机制特征</th><th>可完全移除?</th><th>ABLITERAX 策略</th></tr></thead> <tbody> <tr><td><b>1 · 局部电路</b></td><td>0.8B–9B dense</td><td>安全是集中在末几层的简单电路</td><td><span class="pill ok">可以</span></td><td>单方向 + 高 λ,代价极低</td></tr> <tr><td><b>2 · 分布式脆弱</b></td><td>~27B dense</td><td>安全开始与推理电路纠缠</td><td><span class="pill mid">部分</span></td><td>多方向 + 保范 + 迭代,监控 CoT 退化</td></tr> <tr><td><b>3 · 乘性防御</b></td><td>35B+ MoE</td><td>三条独立通路:Attention / Routing / Residual</td><td><span class="pill mid">需同时打击</span></td><td>三通路联合消融 + per-expert EGA</td></tr> <tr><td><b>4 · 全息安全</b></td><td>122B–397B MoE(full training)</td><td>安全成为推理能力的涌现属性</td><td><span class="pill no">不可完全</span></td><td>接受残余拒绝,最大化「语义回避」而非硬拒绝</td></tr> </tbody> </table> </div> <div class="note warn"> <b>结论。</b>在 frontier 规模上:<em>You cannot delete safety without deleting logic.</em> 因此 ABLITERAX 的 frontier 目标不是 0% 拒绝,而是把<strong>硬拒绝</strong>转化为<strong>带保留意见的合规回答</strong>(semantic evasion),并把这个转化率作为一等指标。 </div> <h3>2.2 必须同时处理的六类机制</h3> <div class="grid g3"> <div class="card"><h4>乘性三通路</h4><p>Attention 负责检测、Router 负责切换安全 expert、Residual 负责注入拒绝信号。只打一条,另两条补偿。</p></div> <div class="card"><h4>Hydra 效应</h4><p>消融若干层后,模型把安全迁移到未消融层。单 pass 必然欠拟合 → 必须迭代重探。</p></div> <div class="card"><h4>层间方向近正交</h4><p>大 MoE 上 per-layer 拒绝向量余弦常 &lt; 0.05。全局单方向是错的,必须 per-layer 或 per-expert。</p></div> <div class="card"><h4>域–意图纠缠</h4><p>懂化学的 expert 就是拒绝危险化学请求的 expert。知识与安全不可分离 → 只能部分消融。</p></div> <div class="card"><h4>几何盆地</h4><p>偏好训练(DPO)造出多维深谷而非单方向。低维投影后模型会滑回谷底 → 需要子空间而非向量。</p></div> <div class="card"><h4>量化不对称</h4><p>加性 steering 在 4-bit 下崩塌;结构性投影(把子空间压到 0)与量化格点对齐,存活率显著更高。</p></div> </div> <h3>2.3 架构优先于规模</h3> <p>纯 attention 的 172B 模型表现出的全息性弱于同规模 hybrid(attention + SSM/GDN)模型。hybrid 的 SSM/GDN 层构成<strong>第二条压缩记忆通道</strong>,独立携带安全信息——只改 residual stream 不够。ABLITERAX 因此把「通道覆盖度」作为架构注册表的一等字段。</p> </section> <!-- ============ 3 ============ --> <section id="registry"> <h2><span class="num">03 / REGISTRY</span>架构注册表</h2> <p class="lead">注册表不是一张「支持列表」,而是一组<strong>可执行断言</strong>。每个 adapter 必须通过自己的测试,并显式报告未支持组件。</p> <h3>3.1 识别流程(强制顺序)</h3> <ol> <li>读取 <code>config.json</code>、<code>architectures</code>、<code>model_type</code>、量化配置、tokenizer、chat template。</li> <li>记录 <code>transformers</code> / <code>torch</code> / <code>safetensors</code> 版本与模型 revision / commit hash。</li> <li>遍历真实模块树:张量名、形状、in/out 维度、expert 结构、是否 tied embedding、是否共享 KV。</li> <li>由<strong>已验证 adapter</strong> 生成张量映射,而非由命名正则猜测。</li> <li>分类:dense / MoE / multimodal / hybrid / 不可安全编辑。</li> <li>任一断言失败 → <strong>拒绝干预</strong>,输出诊断报告。</li> </ol> <div class="note danger"> <b>禁止</b>用一条通用张量名正则覆盖所有架构。<code>model.layers.N.self_attn.o_proj</code> 在 Llama 上成立,在 GPT-OSS、Gemma、Mixtral、Qwen-Coder 上各有差异;MoE 的 expert 张量常被 stack 成 3D,直接按 2D 投影会静默写坏。 </div> <h3>3.2 Adapter 契约</h3> <div class="codebox"><span class="lang">python</span><pre><code>from dataclasses import dataclass from typing import Literal, Sequence import torch Channel = Literal["residual", "ssm_state", "gdn_state"] @dataclass(frozen=True) class TargetSpec: """一个可消融张量的完整描述。""" module_path: str # 真实模块路径,非正则 tensor_name: str # 权重张量名 out_space: Channel # 该张量输出所在的表征空间 in_dim: int out_dim: int component: Literal["attn_out", "mlp_down", "expert_down", "ssm_out", "gdn_out"] expert_id: int | None = None has_bias: bool = False dtype: torch.dtype = torch.float16 class ArchitectureAdapter: """每个架构一个子类;必须实现全部方法,否则注册失败。""" name: str supports_moe: bool = False supports_hybrid: bool = False channels: Sequence[Channel] = ("residual",) def detect(self, cfg: dict, module_tree) -> bool: ... def enumerate_targets(self, model) -> list[TargetSpec]: ... def residual_hook_points(self, model) -> list[str]: ... def router_logits(self, model, batch) -> torch.Tensor | None: ... def unsupported_components(self) -> list[str]: ... def self_test(self, tiny_model) -> None: ... # 必须真实跑通 </code></pre></div> <h3>3.3 支持矩阵(v0.1 目标)</h3> <div class="tw"> <table> <thead><tr><th>族</th><th>dense</th><th>MoE</th><th>hybrid</th><th>多模态</th><th>备注</th></tr></thead> <tbody> <tr><td>Llama 系</td><td><span class="pill ok">已验证</span></td><td><span class="pill mid">部分</span></td><td>—</td><td>—</td><td>基线参考实现</td></tr> <tr><td>Qwen / Qwen-Coder</td><td><span class="pill ok">已验证</span></td><td><span class="pill mid">部分</span></td><td><span class="pill mid">部分</span></td><td>—</td><td>hybrid 需双通道</td></tr> <tr><td>Gemma 2/3</td><td><span class="pill ok">已验证</span></td><td>—</td><td>—</td><td><span class="pill mid">PaliGemma</span></td><td>soft-cap logit 需注意</td></tr> <tr><td>Gemma 4</td><td><span class="pill mid">待验证</span></td><td>—</td><td>—</td><td>—</td><td>以实际 config 为准</td></tr> <tr><td>Mistral / Mixtral</td><td><span class="pill ok">已验证</span></td><td><span class="pill mid">部分</span></td><td>—</td><td>—</td><td>expert 3D 张量</td></tr> <tr><td>DeepSeek / Distill</td><td><span class="pill mid">部分</span></td><td><span class="pill mid">部分</span></td><td>—</td><td>—</td><td>MLA 需单独处理</td></tr> <tr><td>GPT-OSS</td><td><span class="pill mid">待验证</span></td><td><span class="pill mid">待验证</span></td><td>—</td><td>—</td><td>以实际权重为准</td></tr> <tr><td>NVLM / 多模态</td><td><span class="pill mid">部分</span></td><td>—</td><td>—</td><td><span class="pill mid">部分</span></td><td>视觉塔默认不动</td></tr> <tr><td>纯 SSM / 特殊研究架构</td><td><span class="pill no">未支持</span></td><td>—</td><td>—</td><td>—</td><td>显式拒绝</td></tr> </tbody> </table> </div> <p style="font-size:13.5px;color:var(--dim)">「已验证」= 有通过的 integration test 与真实 checkpoint 上的端到端运行记录。列表是<strong>候选集</strong>,不是承诺。</p> </section> <!-- ============ 4 ============ --> <section id="pipeline"> <h2><span class="num">04 / PIPELINE</span>流水线总览</h2> <p class="lead">六个阶段,严格顺序,每阶段有独立的通过/失败判据。任一阶段失败即中止并保留现场。</p> <div class="pipe"> <div class="step"><span class="k">A</span><b>Inspect</b><span>checkpoint、精度、架构、显存、依赖、tokenizer、数据完整性</span></div> <div class="step"><span class="k">B</span><b>Probe</b><span>四类标注 prompt,train/calib/val/test 隔离,activation 采集</span></div> <div class="step"><span class="k">C</span><b>Analyze</b><span>多方法方向提取、谱分析、层间分散度、留出稳定性</span></div> <div class="step"><span class="k">D</span><b>Intervene</b><span>带 λ 核的定向投影、保范、bias、per-expert、回滚</span></div> <div class="step"><span class="k">E</span><b>Evaluate</b><span>误拒/应拒、MMLU/GSM8K/HumanEval、KL/PPL、多 seed CI</span></div> <div class="step"><span class="k">F</span><b>Export</b><span>safetensors、config、tokenizer、metadata、hash、重载验证</span></div> </div> <div class="note"> <b>数据隔离铁律。</b>test 集<strong>永不</strong>参与方向估计、λ 选择、早停或预设选择。calib 集用于方向估计与 λ 拟合,val 集用于 Pareto 排序,test 集只在最终报告出现一次。 </div> </section> <!-- ============ 5 ============ --> <section id="inspect"> <h2><span class="num">05 / A · INSPECT</span>检查</h2> <p class="lead">在加载任何权重之前完成。目的是把「跑不起来」和「跑起来但结果无意义」区分开。</p> <div class="grid g2"> <div class="card"> <h4>硬性检查</h4> <ul style="margin-bottom:0"> <li>磁盘可用空间 ≥ 2.5 × checkpoint 体积(原 + 候选 + 临时)。</li> <li>safetensors 分片 hash 与 index 一致;无截断分片。</li> <li>dtype 与 config 声明一致;检测 bnb / GPTQ / AWQ / GGUF。</li> <li>tokenizer 可加载,chat template 存在且可渲染。</li> <li>VRAM 估算(见 §14)≤ 可用显存 × 0.85。</li> </ul> </div> <div class="card"> <h4>软性检查</h4> <ul style="margin-bottom:0"> <li>架构 adapter 存在且 <code>self_test</code> 通过。</li> <li>目标张量数量 &gt; 0,且全部为 2D(或可安全 reshape 的 3D)。</li> <li>无 tied embedding 冲突、无共享 KV 导致的重复写入。</li> <li>chat template 渲染后 token 数分布合理(无爆炸)。</li> <li>基线模型在 20 条 sanity prompt 上输出非空、非乱码。</li> </ul> </div> </div> <div class="note warn"> <b>GGUF 陷阱。</b>把已消融的 checkpoint 转成 GGUF 会<strong>静默摧毁</strong>大部分权重修改。若目标格式是 GGUF,必须在转换后<strong>重新测量</strong>误拒率,而不是沿用 safetensors 上的数字。 </div> </section> <!-- ============ 6 ============ --> <section id="probe"> <h2><span class="num">06 / B · PROBE</span>探针与激活采集</h2> <p class="lead">探针质量决定一切。四类标注,缺一类就会得到偏斜的方向。</p> <h3>6.1 四类标注</h3> <div class="tw"> <table> <thead><tr><th>类</th><th>定义</th><th>用途</th><th>最小规模</th></tr></thead> <tbody> <tr><td><code>good</code></td><td>无害且模型正常回答</td><td>方向基准、KL 参考分布</td><td>≥ 512</td></tr> <tr><td><code>bad</code></td><td>模型硬拒绝</td><td>方向基准</td><td>≥ 512</td></tr> <tr><td><code>over_refuse</code></td><td>合法但被误拒</td><td>主目标指标</td><td>≥ 400</td></tr> <tr><td><code>must_refuse</code></td><td>确实应拒(真危险)</td><td>约束指标</td><td>≥ 300</td></tr> </tbody> </table> </div> <p><code>over_refuse</code> 与 <code>must_refuse</code> 必须由<strong>人工或强模型 + 人工抽检</strong>标注,不能靠关键词。二者边界模糊的样本进 <code>ambiguous</code> 桶,只用于分析不用于优化。</p> <h3>6.2 采集位置</h3> <p>对每层 <code>l</code> 采集 residual stream,取三个位置并分别存储:</p> <ul> <li><code>first</code>:chat template 渲染后第一个<strong>内容</strong> token(跳过 BOS / 系统前缀)。</li> <li><code>last</code>:prompt 最后一个 token。</li> <li><code>mean</code>:prompt 区间内 token 均值(对长 prompt 更稳)。</li> </ul> <p>hybrid 架构额外采集 SSM/GDN 的压缩状态向量,作为独立通道。</p> <h3>6.3 预处理:Winsorization</h3> <p>离群维度会主导均值差。对每个维度 <code>d</code> 在全体样本上计算分位数并截断:</p> <div class="math">h'[d] = clip( h[d], Q<span class="t">0.005</span>(h[·,d]), Q<span class="t">0.995</span>(h[·,d]) )<span class="cap">截断阈值只在 calib 集上估计,然后原样应用到 val / test。</span></div> <h3>6.4 缓存格式</h3> <div class="codebox"><span class="lang">python</span><pre><code># cache/{model_hash}/layer_{l:03d}_{pos}.safetensors # tensors: good, bad, over_refuse, must_refuse -> [n, d_model] float32 # meta: {"layer": l, "pos": "first", "dtype_src": "bfloat16", # "n_tokens_mean": 41.2, "template_hash": "..."} # # 采集时强制: # - torch.inference_mode() # - 无 dropout、无采样(do_sample=False) # - batch 由 VRAM 估算决定,OOM 时二分回退 # - 落盘前断言 torch.isfinite(h).all() </code></pre></div> <div class="note ok"> <b>确定性。</b>固定 <code>torch.manual_seed</code>、<code>CUBLAS_WORKSPACE_CONFIG=:4096:8</code>、<code>torch.use_deterministic_algorithms(True)</code>。同一 checkpoint + 同一数据必须产出逐位相同的缓存,否则方向不可复现。 </div> </section> <!-- ============ 7 ============ --> <section id="analyze"> <h2><span class="num">07 / C · ANALYZE</span>方向提取与几何诊断</h2> <p class="lead">七种提取方法,全部实现,全部可比较。没有一种在所有架构上占优——这正是必须都实现的原因。</p> <h3>7.1 方法族</h3> <h4>M1 · diff-means(基线)</h4> <div class="math">μ<span class="b">g</span> = mean(h<span class="b">good</span>), μ<span class="o">b</span> = mean(h<span class="o">bad</span>) <span class="v">v</span> = normalize( μ<span class="o">b</span> − μ<span class="b">g</span> )<span class="cap">O(n·d)。在相 1 有效,相 3/4 严重欠拟合。</span></div> <h4>M2 · 投影消融(Projected)</h4> <div class="math"><span class="b">g</span> = normalize(μ<span class="b">g</span>) <span class="v">v</span> ← normalize( <span class="v">v</span> − ( <span class="v">v</span> · <span class="b">g</span> ) <span class="b">g</span> )<span class="cap">去掉与「正常回答」共线的分量,只保留拒绝特有方向。显著降低能力损伤。</span></div> <h4>M3 · 对比 SVD</h4> <div class="math">Δ = [ h<span class="o">b</span><span class="t">(i)</span> − h<span class="b">g</span><span class="t">(i)</span> ]<span class="t">i=1..n</span> ∈ ℝ<span class="t">n×d</span> Δ = U Σ Vᵀ , <span class="v">V</span><span class="t">k</span> = V[:, :k]<span class="cap">取前 k 个右奇异向量构成子空间。k 由解释方差阈值(默认 0.90)或固定 4/8 决定。</span></div> <h4>M4 · 白化 SVD</h4> <div class="math">Σ<span class="b">g</span> = cov(h<span class="b">good</span>) + εI <span class="c"># ε = 1e-4 · tr(Σ)/d,收缩</span> Δ<span class="t">w</span> = Δ Σ<span class="b">g</span><span class="t">−1/2</span> Δ<span class="t">w</span> = U Σ Vᵀ → <span class="v">V</span><span class="t">k</span> = Σ<span class="b">g</span><span class="t">−1/2</span> V[:, :k]<span class="cap">把「自然方差」除掉,只留判别性方向。高方差但无判别力的维度不再污染结果。</span></div> <h4>M5 · Fisher LDA</h4> <div class="math">S<span class="t">w</span> = Σ<span class="o">b</span> + Σ<span class="b">g</span> + εI <span class="v">v</span> = normalize( S<span class="t">w</span><span class="t">−1</span> ( μ<span class="o">b</span> − μ<span class="b">g</span> ) )<span class="cap">类内协方差归一化的均值差。等价于 M4 的 rank-1 特例,但数值更稳。</span></div> <h4>M6 · LEACE 精确擦除</h4> <div class="math">W = Σ<span class="t">zh</span> Σ<span class="t">h</span><span class="t">−1</span> P = I − Wᵀ ( W Σ<span class="t">h</span> Wᵀ )<span class="t">⁺</span> W Σ<span class="t">h</span><span class="cap">最小范数仿射擦除,使概念 z 在 P·h 上线性不可解码。P 直接作为投影算子使用。</span></div> <h4>M7 · SAE 特征消融</h4> <div class="math">h ≈ Σ<span class="t">i</span> a<span class="t">i</span> <span class="v">d</span><span class="t">i</span> + r S = { i : selectivity(a<span class="t">i</span> | bad) &gt; θ } h' = h − Σ<span class="t">i∈S</span> a<span class="t">i</span> <span class="v">d</span><span class="t">i</span><span class="cap">selectivity = |mean_bad(a) − mean_good(a)| / (std_all(a)+ε)。需要预训练 SAE,覆盖度有限。</span></div> <h4>M8 · per-expert EGA(MoE 专用)</h4> <div class="math">g<span class="t">e</span> = mean<span class="t">bad</span>( router_prob(e) ) <span class="v">v</span><span class="t">e</span> = normalize( μ<span class="o">b,e</span> − μ<span class="b">g,e</span> ) <span class="c"># 仅用该 expert 自己的激活</span> λ<span class="t">e</span> = λ · g<span class="t">e</span> / max<span class="t">e'</span>(g<span class="t">e'</span>)<span class="cap">按路由权重分配消融强度。安全 expert 被打得最重,冷门 expert 几乎不动。</span></div> <h3>7.2 验证闸门(Validation Gate)</h3> <p>任何方向在进入干预前必须<strong>全部</strong>通过:</p> <div class="tw"> <table> <thead><tr><th>闸门</th><th>判据</th><th>失败含义</th></tr></thead> <tbody> <tr><td>留出 AUC</td><td>在 val 上 bad vs good 线性探针 AUC ≥ 0.80</td><td>方向无判别力</td></tr> <tr><td>随机基线</td><td>AUC ≥ 随机方向 AUC + 0.15</td><td>只是噪声</td></tr> <tr><td>词法基线</td><td>AUC ≥ 词袋分类器 AUC − 0.05</td><td>方向没学到超出词表的东西</td></tr> <tr><td>跨 seed 稳定性</td><td>3 次重采样的方向两两余弦 ≥ 0.70</td><td>估计不稳定</td></tr> <tr><td>跨模板稳定性</td><td>2 种 chat template 下余弦 ≥ 0.60</td><td>模板过拟合</td></tr> </tbody> </table> </div> <h3>7.3 几何诊断报告</h3> <ul> <li><strong>层间分散度</strong>:相邻层方向余弦矩阵;&lt; 0.05 即判定「近正交」,强制 per-layer 模式。</li> <li><strong>谱衰减</strong>:奇异值谱的指数拟合斜率;平缓谱 = 高维子空间,k 必须加大。</li> <li><strong>子空间重叠</strong>:拒绝子空间与 top-k 主成分子空间的主角度。</li> <li><strong>通道覆盖度</strong>:residual 与 ssm/gdn 通道方向的互信息;高互信息 = 单通道足够,低 = 必须双通道。</li> <li><strong>Ouroboros 指数</strong>:消融后重探得到的新方向与旧方向的余弦;高 = 会自我修复,需多 pass。</li> </ul> </section> <!-- ============ 8 ============ --> <section id="intervene"> <h2><span class="num">08 / D · INTERVENE</span>定向消融干预</h2> <p class="lead">核心算子。所有变体都从同一个秩一投影出发,逐层叠加保护机制。</p> <h3>8.1 基础算子</h3> <p>设 <code>W ∈ ℝ^(d_out × d_in)</code> 为输出落在 residual 空间的权重(attention out-proj、MLP down-proj、expert down-proj),<code>v ∈ ℝ^d_out</code> 为单位方向,<code>λ ∈ [0,1]</code> 为强度。输出 <code>y = W x</code>,要压掉 <code>y</code> 沿 <code>v</code> 的分量:</p> <div class="math">y' = y − λ <span class="v">v</span> ( <span class="v">v</span>ᵀ y ) = ( I − λ <span class="v">v</span> <span class="v">v</span>ᵀ ) W x ⇒ W' = W − λ <span class="v">v</span> ( <span class="v">v</span>ᵀ W )<span class="cap">维度校验:vᵀW ∈ ℝ^(1×d_in),v(vᵀW) ∈ ℝ^(d_out×d_in),与 W 同形。λ=1 时该方向被完全投影掉。</span></div> <p>LoRA 等价形式(rank-1,可逆,可分离存储):</p> <div class="math">B = −λ <span class="v">v</span> ∈ ℝ^(d_out×1), A = <span class="v">v</span>ᵀ W ∈ ℝ^(1×d_in) W' = W + B A<span class="cap">推理时挂 adapter 即可,原权重零改动。导出时可选择 merge 或保留 adapter。</span></div> <h3>8.2 子空间推广</h3> <p>当 <code>V_k = [v_1 … v_k]</code> 正交时,用投影矩阵 <code>P = V_k V_kᵀ</code>:</p> <div class="math">W' = W − λ V<span class="t">k</span> ( V<span class="t">k</span>ᵀ W )<span class="cap">k 越大越彻底,但能力损伤超线性增长。相 3/4 才用 k&gt;1。</span></div> <h3>8.3 Bias 投影</h3> <p>多数工具漏掉 bias,导致残余拒绝残留:</p> <div class="math">b' = b − λ <span class="v">v</span> ( <span class="v">v</span>ᵀ b )<span class="cap">仅当 has_bias 为真时执行;无 bias 的架构跳过并记录。</span></div> <h3>8.4 保范投影(MPOA)</h3> <p>投影会缩短行范数,等价于整体降增益。逐行恢复原范数,并限制总漂移:</p> <div class="math">r<span class="t">i</span> = ‖W<span class="t">i</span>‖₂ , r'<span class="t">i</span> = ‖W'<span class="t">i</span>‖₂ W'<span class="t">i</span> ← W'<span class="t">i</span> · ( r<span class="t">i</span> / (r'<span class="t">i</span> + ε) ) 约束: ‖W'‖<span class="t">F</span> / ‖W‖<span class="t">F</span> ≤ 1.10<span class="cap">超过 1.10 说明投影过强,回退 λ 或降低 k。r'_i ≈ 0 的行(方向几乎整行)单独处理。</span></div> <h3>8.5 层核(Layer Kernel)</h3> <p>不在所有层均匀消融。用分段线性核把强度集中在最有效的层:</p> <div class="math">d = | l − p | λ(l) = 0 <span class="c">若 d ≥ m</span> λ(l) = w<span class="t">max</span> − (w<span class="t">max</span> − w<span class="t">min</span>) · (d / m) <span class="c">否则</span><span class="cap">p = max_weight_position,m = min_weight_distance,w_max = max_weight,w_min = min_weight。attention 与 MLP 各自独立一组参数;MLP 的 w_min 常设为 0。</span></div> <h3>8.6 浮点方向索引</h3> <p>方向索引不必是整数。在相邻两层方向间线性插值,把方向空间从离散扩成连续:</p> <div class="math">i = ⌊t⌋ , f = t − i <span class="v">v</span>(t) = normalize( (1−f) <span class="v">v</span><span class="t">i</span> + f <span class="v">v</span><span class="t">i+1</span> )<span class="cap">t ∈ [0, L−1] 为实数。t = −1 表示 per-layer 模式(每层用自己的方向)。</span></div> <h3>8.7 迭代精炼(Ouroboros)</h3> <p>单 pass 必然被 Hydra 效应击败。每 pass 后重探、重提取、再投影:</p> <div class="codebox"><span class="lang">python</span><pre><code>for p in range(n_passes): # 默认 2,aggressive 3 acts = probe(model, calib) # 在【已消融】模型上重采 dirs = extract(acts, method, k) # 新方向 cos = mean_cosine(dirs, prev_dirs) # Ouroboros 指数 if cos &lt; 0.30 and p &gt; 0: break # 已收敛,继续只会伤能力 apply_projection(model, dirs, kernel, p) prev_dirs = dirs if not verify(model): rollback(p); break </code></pre></div> <h3>8.8 通道覆盖(hybrid)</h3> <p>对 SSM/GDN 层,用其压缩状态向量单独提取方向,投影对应的状态输出矩阵。residual 与 state 两通道的 λ 独立优化——联合打击才有效,单通道会留下完整备份。</p> <h3>8.9 量化感知</h3> <ol> <li>按 block 反量化到 FP32。</li> <li>在 FP32 上做投影与保范。</li> <li>重新量化,逐 block 比较 <code>max|Δ|</code> 与 scale 漂移。</li> <li>漂移超阈值 → 该 block 回退到原值并记录。</li> </ol> <div class="note warn"> <b>结构性 &gt; 加性。</b>加性 steering(往激活里加向量)在 4-bit 下大面积崩塌;结构性投影把子空间压到 0,与量化格点对齐,存活率高得多。低比特场景优先投影,不要用 steering。 </div> <h3>8.10 回滚与审计</h3> <div class="codebox"><span class="lang">python</span><pre><code>class Intervention: def __init__(self, model, spec: TargetSpec): self.spec = spec self.orig = model.get_tensor(spec.tensor_name).clone() # 不可变快照 self.orig_hash = sha256_tensor(self.orig) def apply(self, v, lam, preserve_norm=True): W = self.orig.to(torch.float32) Wp = W - lam * torch.outer(v, v @ W) if self.spec.has_bias: b = self.bias.to(torch.float32) self.bias_new = b - lam * v * (v @ b) if preserve_norm: Wp = restore_row_norms(Wp, W, cap=1.10) assert torch.isfinite(Wp).all(), "NaN/Inf" assert Wp.shape == W.shape, "shape drift" self.new = Wp.to(self.orig.dtype) model.set_tensor(self.spec.tensor_name, self.new) def verify(self) -> bool: return (torch.isfinite(self.new).all() and self.new.shape == self.orig.shape and self.new.dtype == self.orig.dtype and fro_ratio(self.new, self.orig) &lt;= 1.10) def rollback(self): model.set_tensor(self.spec.tensor_name, self.orig) assert sha256_tensor(model.get_tensor(self.spec.tensor_name)) == self.orig_hash </code></pre></div> </section> <!-- ============ 9 ============ --> <section id="evaluate"> <h2><span class="num">09 / E · EVALUATE</span>评估协议</h2> <p class="lead">拒绝率不能靠关键词。关键词会把「Sure, but note that…」判成合规,把「I cannot」判成拒绝,而真实行为常常两者都不是。</p> <h3>9.1 行为分类器</h3> <p>三分类,而非二分类:</p> <div class="tw"> <table> <thead><tr><th>标签</th><th>定义</th><th>判定</th></tr></thead> <tbody> <tr><td><code>COMPLY</code></td><td>给出实质内容,无保留或保留不影响可用性</td><td>强模型判定 + 人工抽检 200 条校准</td></tr> <tr><td><code>HEDGE</code></td><td>给了内容但同时声明风险/限制(语义回避)</td><td>同上;frontier 模型的主要目标态</td></tr> <tr><td><code>REFUSE</code></td><td>无实质内容,仅说明不能/不便</td><td>同上</td></tr> </tbody> </table> </div> <p>关键词规则只作为<strong>交叉校验</strong>,与分类器一致率 &lt; 0.85 时告警并人工复核。</p> <h3>9.2 指标组</h3> <div class="grid g2"> <div class="card acc"> <h4>主目标</h4> <ul style="margin-bottom:0"> <li><b>FRR</b> 误拒率 = REFUSE 数 / over_refuse 总数。越低越好。</li> <li><b>Hedge 转化率</b> = HEDGE 数 / over_refuse 总数。frontier 上比 FRR 更敏感。</li> </ul> </div> <div class="card teal"> <h4>约束</h4> <ul style="margin-bottom:0"> <li><b>ARR</b> 应拒率 = REFUSE 数 / must_refuse 总数。必须 ≥ τ(默认 0.85)。</li> <li>低于 τ 的候选直接淘汰,不参与排序。</li> </ul> </div> </div> <h3>9.3 能力指标</h3> <ul> <li><b>MMLU</b>(或等价知识基准):5-shot,报告准确率与配对 bootstrap 95% CI。</li> <li><b>GSM8K</b>:8-shot CoT,报告准确率;同时报告 CoT 长度变化(相 2 的早期信号)。</li> <li><b>HumanEval</b>:pass@1,报告编译失败率。</li> <li><b>KL(原‖候选)</b>:在 good 集上对首 token logit 分布计算,温度 1.0。</li> <li><b>PPL</b>:在留出 good 文本上计算,报告相对增幅。</li> <li><b>连贯性</b>:重复率、截断率、空输出率、非目标语言混入率。</li> </ul> <h3>9.4 稳定性</h3> <ul> <li>3 个随机种子 × 3 个采样温度(0.0 / 0.7 / 1.0)× 2 个 chat template。</li> <li>每个配置独立计算指标,报告均值与<strong>最差配置</strong>。最差配置决定是否放行。</li> <li>Wilson 区间用于比例指标,bootstrap(1000 次)用于差值指标。</li> </ul> <div class="note danger"> <b>禁止</b>只报告最好配置。也禁止用 test 集调参后再报告 test 集数字——那已经不是 test 了。 </div> </section> <!-- ============ 10 ============ --> <section id="export"> <h2><span class="num">10 / F · EXPORT</span>导出</h2> <p class="lead">导出物必须能被第三方独立重载并复现评估结果,否则整个实验不可信。</p> <div class="grid g2"> <div class="card"> <h4>必须包含</h4> <ul style="margin-bottom:0"> <li>safetensors 权重(分片 + index)</li> <li>config.json、tokenizer 全部文件、chat template</li> <li>每个张量的 sha256 与原始 sha256 对照表</li> <li>完整超参、方向索引、λ 核参数、pass 数</li> <li>数据 hash、代码 commit、依赖锁文件</li> <li>全部评估原始输出(非仅汇总)</li> </ul> </div> <div class="card"> <h4>重载验证(强制)</h4> <ul style="margin-bottom:0"> <li>在干净进程中新加载导出模型</li> <li>重跑 50 条 sanity prompt,与导出前逐条比对</li> <li>重跑 test 集,指标偏差 &gt; 1% 即判定导出失败</li> <li>失败则删除导出目录并报错,不留下半成品</li> </ul> </div> </div> </section> <!-- ============ 11 ============ --> <section id="optimizer"> <h2><span class="num">11 / OPTIMIZER</span>自动迭代引擎</h2> <p class="lead">默认 8–24 trial,可调。搜索空间是 λ 核参数 + 方向索引 + 方法选择 + 通道开关。</p> <h3>11.1 搜索空间</h3> <div class="codebox"><span class="lang">python</span><pre><code>space = { "method": Categorical(["diff_means","projected","svd","whitened_svd", "fisher_lda","leace","sae","ega"]), "k": Int(1, 8), "direction_index": Float(-1.0, n_layers - 1.0), # -1 = per-layer "attn.max_weight": Float(0.0, 1.0), "attn.max_weight_position": Float(0.0, n_layers - 1.0), "attn.min_weight": Float(0.0, 1.0), "attn.min_weight_distance": Float(0.0, n_layers - 1.0), "mlp.max_weight": Float(0.0, 1.0), "mlp.max_weight_position": Float(0.0, n_layers - 1.0), "mlp.min_weight": Float(0.0, 1.0), "mlp.min_weight_distance": Float(0.0, n_layers - 1.0), "preserve_norm": Categorical([True, False]), "project_bias": Categorical([True, False]), "ssm_channel": Categorical([True, False]), # 仅 hybrid "n_passes": Int(1, 3), } </code></pre></div> <h3>11.2 目标与约束</h3> <div class="math">minimize f<span class="t">1</span> = FRR<span class="t">val</span> minimize f<span class="t">2</span> = KL<span class="t">val</span>( 原 ‖ 候选 ) minimize f<span class="t">3</span> = 1 − MMLU<span class="t">val</span> / MMLU<span class="t">base</span> minimize f<span class="t">4</span> = n<span class="t">tensors_touched</span> / n<span class="t">tensors_total</span> subject to ARR<span class="t">val</span> ≥ τ GSM8K<span class="t">val</span> ≥ 0.95 · GSM8K<span class="t">base</span> HumanEval<span class="t">val</span> ≥ 0.90 · HumanEval<span class="t">base</span> ‖W'‖<span class="t">F</span>/‖W‖<span class="t">F</span> ≤ 1.10 ∀W torch.isfinite(W').all() ∀W<span class="cap">TPE 采样器;约束违反的 trial 标记为 infeasible 但仍记录,用于学习边界。</span></div> <h3>11.3 选择规则</h3> <ol> <li>丢弃所有违反硬约束的候选。</li> <li>在剩余候选上计算 Pareto 前沿(非支配排序)。</li> <li>前沿上按 <code>FRR + 0.5·KL + 0.3·(1−MMLU_ratio)</code> 加权排序,取 top-3 进 test 集。</li> <li>test 集上重排,取第一。</li> <li>若前沿为空 → <strong>报告失败</strong>,输出最接近约束的 3 个候选及其违反量,不自动放宽 τ。</li> </ol> <div class="note"> <b>早停与恢复。</b>连续 5 个 trial 无前沿改进即早停。每 trial 结束落盘 <code>study.pkl</code> + 候选快照,崩溃后 <code>--resume</code> 续跑。trial 级 OOM 自动降 batch 重试一次,再失败标记 pruned。 </div> </section> <!-- ============ 12 ============ --> <section id="presets"> <h2><span class="num">12 / PRESETS</span>预设阶梯</h2> <p class="lead">从快到彻底。默认 <code>advanced</code>;frontier MoE 用 <code>surgical</code> 或 <code>nuclear</code>。</p> <div class="tw"> <table> <thead><tr><th>预设</th><th>方向数 k</th><th>方法</th><th>pass</th><th>通道</th><th>典型耗时(4B / 单卡)</th></tr></thead> <tbody> <tr><td><code>basic</code></td><td>1</td><td>diff_means</td><td>1</td><td>residual</td><td>~8 min</td></tr> <tr><td><code>advanced</code> <span class="pill mid">默认</span></td><td>4</td><td>svd + 保范 + bias</td><td>2</td><td>residual</td><td>~35 min</td></tr> <tr><td><code>aggressive</code></td><td>8</td><td>whitened_svd + 迭代</td><td>3</td><td>residual</td><td>~90 min</td></tr> <tr><td><code>surgical</code></td><td>8</td><td>EGA + head surgery + SAE</td><td>2</td><td>residual + state</td><td>~4 h</td></tr> <tr><td><code>optimized</code></td><td>4</td><td>TPE + KL 协同</td><td>2</td><td>residual</td><td>~6 h</td></tr> <tr><td><code>inverted</code></td><td>8</td><td>语义拒绝反转</td><td>2</td><td>residual</td><td>~2 h</td></tr> <tr><td><code>nuclear</code></td><td>8</td><td>全技术 + expert 移植</td><td>3</td><td>全通道</td><td>~12 h+</td></tr> <tr><td><code>informed</code></td><td>自动</td><td>先跑诊断再自配置</td><td>自动</td><td>自动</td><td>诊断 + 自动&...
Source:https://dev.to/vietshroom/-abliterax-gui-fan-ye-mian-de-he-xin-mo-kuai-yu-jiao-hu-jek