[控场AI]
· 6 分钟阅读· 3,331 字

Qwengram-0.8B实验:跨模型迁移n-gram记忆,困惑度降低5.05%

Qwengram-0.8B实验:跨模型迁移n-gram记忆,困惑度降低5.05%

冻结大模型n-gram记忆迁移至0.8B小模型,仅训练轻量读取器与动态门控,困惑度下降5.05%。

一位开发者在免费Kaggle GPU上完成了一项低成本记忆迁移实验:将Qwen3.8 Flash-Next预训练的约510亿参数PLE n-gram记忆冻结后,通过一个仅在第3、9层部署的R=1轻量读取器和token级动态门控,注入到同样冻结的Qwen3.5-0.8B主干中。最终在冻结验证集上实现5.05%的困惑度下降(PPL从18.28降至17.35),且无需对主干做任何微调。消融实验表明真实预训练记忆优于随机对照,动态门控优于固定注入强度,R=1是兼顾整体指标与数学/代码任务稳定性的平衡架构。工程上,推理通过修改版llama.cpp实现,Q8_0量化保留99.1%的BF16增益,PLE作为外部sidecar挂载。全部代码与模型均已开源。

一位开发者用免费的 Kaggle notebook GPU 完成了一项颇有意思的实验:把大模型 Qwen3.8 Flash-Next 预训练的 PLE(n-gram 记忆)迁移到体量小得多的 Qwen3.5-0.8B 模型上,最终在冻结验证集上取得了 5.05% 的困惑度(perplexity)下降。整个过程没有对主干模型做任何微调,值得关注的是它揭示了「外挂记忆 + 动态门控」这一路线在小模型上的可行性。

reddit source: Qwengram-0.8B

实验设计:冻结主干,只训练一个轻量读取器

这项实验的核心思路是把两块「重资产」都冻结:一是 Qwen3.5-0.8B 主干本身,二是约 510 亿参数的 PLE 记忆模块。真正被训练的,只是一个极小的 R=1 读取器(reader),部署在解码器的第 3 层和第 9 层。

在后期注入阶段,作者引入了一个 token 级别的线性门控(gate),用来控制记忆信号在不同 token 上的注入强度。这个门控是「真正动态」的——它的记忆强度在不同 token 间差异显著,而非退化成一个学到的常数。整个方案不涉及主干微调,这意味着它可以在几乎不改动原始模型的前提下叠加外部记忆能力。

当前发布的「平衡版」检查点,读取器仅用 1500 万 token 训练,配合一个单独校准的动态门控。

PLE(Pointwise Lexical Embedding / n-gram 记忆) 是一种将高频 n-gram 的统计共现信息预先编码进一组可检索向量的记忆结构。与 KV Cache 或 RAG 不同,PLE 不依赖运行时检索,而是在预训练阶段把 n-gram 级别的条件概率「蒸馏」进一批固定参数,因此可以被冻结并作为独立模块挂载到其他模型上。其规模通常远大于主干模型本身——本实验中约 510 亿参数的 PLE 来自更大的 Qwen3.8 Flash-Next,尺寸是 0.8B 主干的六十余倍。读取器(reader)的作用是充当「翻译层」:它接受主干当前的隐状态,从冻结的 PLE 中检索相关记忆向量,再将检索结果以残差形式注入解码器中间层。R 值表示读取器的秩(rank),R=1 意味着极低的参数开销,同时也限制了每次注入的信息容量。

核心结果:困惑度下降5.05%

在冻结的完整验证集上,对比数据如下:

  • Qwen3.5-0.8B 原版:NLL 2.905585,PPL 18.2759
  • Qwengram-0.8B:NLL 2.853786,PPL 17.3534
  • 困惑度下降:5.05%

作者特别强调了一个容易被误读的点:这是语言模型验证层面的困惑度下降,而不是声称 benchmark 准确率提升了 5%。困惑度衡量的是模型对文本的预测能力,与下游任务准确率并非等价关系。这种克制的表述在自发实验中并不常见,也让结果更可信。

几个关键发现塑造了最终设计

实验过程中的一系列消融对比,其实比最终数字更有信息量。

真实预训练记忆确实优于随机对照

作者做了对照实验:使用真实预训练的 PLE,效果明显好于随机记忆和打乱(permuted)记忆的对照组。这说明起作用的是 PLE 中承载的真实统计信息,而非单纯多加了一堆参数。同样在相同记忆预算下,学习到的 token 放置策略优于随机打乱的放置。

训练量与任务能力的取舍

读取器的损失在 500 万 token 之后仍在持续下降。用 2000 万 token 训练的读取器进一步降低了整体 LM 损失,但在数学任务上出现了退化。权衡之下,作者选择 1500 万 token 作为平衡点。这类「整体指标改善但特定能力回退」的现象,在记忆注入类研究中相当典型。

动态门控挽回了固定注入的损失

如果在后期层做强度固定的记忆注入,会损害 LAMBADA 表现(该任务考验长距离依赖预测)。引入 token 级别的动态仲裁后,很大程度上恢复了这一折损。作者还发现,把记忆定向注入到「高不确定性位置」能找回部分优势,但仍不及学习出来的动态门控。

LAMBADA 是一个专门测试长距离语境依赖的语言模型基准:每道题给出一段叙述文本,要求模型预测最后一个单词,而该单词只有读懂整段上下文才能推断。固定强度的记忆注入之所以会损害 LAMBADA 表现,是因为记忆信号在所有 token 上均匀施加压力,干扰了模型原本依赖长程注意力完成跨句推理的机制。token 级动态门控通过让模型自主决定「在哪个位置、以多大权重接受记忆辅助」,使得记忆主要在短程 n-gram 强相关的位置生效,而在需要长距离推理的关键 token 处自动退让,从而兼顾了两类能力。这一发现对所有涉及外部知识注入的架构都有参考意义:注入强度的空间分布与注入量本身同样重要。

R=1 才是平衡架构

一个 warm-start 的 R=4 读取器带来了微小的整体 LM 损失改善,但引入了代码和数学任务的退化。因此作者最终保留 R=1 作为平衡架构。

工程落地:llama.cpp推理路径与量化保真度

除了训练与评估,作者还在 llama.cpp 中实现了完整推理路径,并公开了模型、训练代码和修改版运行时:

  • 模型 / GGUF:huggingface.co/Ninnix96/Qwengram-0.8B
  • 训练、对照与评估:github.com/Ninnix/qwen-ple-transfer
  • 修改版 llama.cpp 运行时:github.com/Ninnix/llama.cpp

值得一提的架构选择是:GGUF 中打包了 Qwen3.5 主干加上训练好的读取器与仲裁张量,而庞大的 PLE 记忆则作为外部量化 sidecar 存在,没有塞进模型 GGUF。这种「主干 + 外挂记忆」的分离设计对部署更友好。

在一个独立的 WikiText-2 GGUF 运行时测试中,Q8_0 量化保留了 BF16 读取器 NLL 增益的 99.1%——注意这是与前述 Kaggle 冻结验证不同的另一项测量。

GGUF(GPT-Generated Unified Format)是 llama.cpp 生态中主流的模型打包格式,支持将权重、分词器和量化元数据统一封装进单文件以便本地部署。Q8_0 是其中精度最高的整数量化方案,将每个权重从 BF16(16位浮点)压缩至 8 位整数,体积约减半,推理速度在 CPU 上有显著提升,但量化误差通常很小。本实验中 Q8_0 保留了 99.1% 的 BF16 读取器增益,说明读取器和门控张量的权重分布对低比特量化足够友好。将 PLE 作为外部 sidecar 而非打包进主 GGUF,一方面避免单文件过大,另一方面也允许用户按需挂载或替换记忆库,为将来适配不同领域的 PLE 保留了灵活性。

意义与下一步

这项工作最大的价值不在那 5.05% 的数字本身,而在于它用极低成本验证了一条技术路线:用冻结的大模型记忆去增强小模型,只训练轻量读取器和动态门控。它给出了一个清晰的「读取器扩展」和「动态记忆仲裁」的配方。

作者下一步计划尝试更大的 Qwen 主干,特别是 35B-A3B 的 MoE 架构,但坦言这需要远超免费 Kaggle notebook 的算力。作者也公开欢迎他人复现或改进读取器、PLE 缓存、路由和运行时。

需要说明的是,作者披露自己是 Qwengram 及相关仓库的作者,英语非母语,帖子借助了 AI 润色,实验开发过程中也使用了编码 agent(主要是 ChatGPT)辅助实现、调试与分析,但实验设计、研究决策和最终结论由本人负责。这类透明披露,本身也是 AI 辅助研究时代值得推广的做法。

分享:

相关推荐