通过架构配置、tokenizer 重叠度和 CKA 嵌入相似性三个维度,可在不依赖训练数据的前提下判断模型血统,虽非完美但对红队评估有参考价值。
TL;DR. 一个名为 Model DNA 的公开方法——配有一个在线工具——让外部人员仅凭公开产物(config.json、tokenizer.json 和 embedding 权重)就能估计一个 LLM 是从零训练的还是衍生自某个开源权重基座。这是一篇技术深度解析,引用并用 PyTorch 重现了该方法,然后分析了它在哪里成立、在哪里失效。
三个公开信号——架构配置、分词器重叠度、以及通过 Linear CKA 衡量的 embedding 空间相似度——结合在一起,将模型定位于一条谱系光谱上。
一个字段匹配只是噪音;同时五个才是指纹。溯源是一个"优势证据"的判断,不是一项单一测试。
该方法的真正优势是可复现性和旋转不变相似度;它的真正局限是继续预训练的灰色地带、阈值敏感性,以及仅看 embedding 的视角。
指纹揭示的是谱系,不是意图。基于开源权重基座进行构建是业界标准做法;输出的是一个标签,不是指控。
每隔几周,就有一家实验室宣布一个"从零自研"的基础模型。2026 年中期,这些说法不再被盲目采信。知乎上关于夏季模型浪潮的圆桌讨论和一条数百万浏览量的帖子,成了公开审视"自研"声明的场所——结果发现几个比宣传的更具衍生性(报道链接)。
Model DNA 之所以重要,是因为它把争论从"凭感觉"推进到了可复现的程序,而且已经在韩国主要基础模型厂商中运行过——包括 LG、NAVER、Kakao、SKT、KT、NCSOFT、Upst 和 Motif。(本文只停留在方法层面,不对任何具名公司做出判断;每个模型的标签属于工具本身,不属于一篇博客文章。)接下来用 PyTorch 再现该流程,并将它作为方法来评估,范围限定在源头已公开的部分。
前提:不要求泄露内部信息。所有内容都从模型的公开文件中读取。
比较实验室在设计时选择的结构字段:model_type、vocab_size、hidden_size、intermediate_size、num_hidden_layers、num_attention_heads、num_key_value_heads。独立设计的模型很少会在所有这些字段上同时对齐。
import json
ARCH_FIELDS = [
"model_type", "vocab_size", "hidden_size", "intermediate_size",
"num_hidden_layers", "num_attention_heads", "num_key_value_heads",
"max_position_embeddings", "rope_theta",
]
def arch_match_count(cfg_a: dict, cfg_b: dict, fields=ARCH_FIELDS) -> int:
"""Number of structural fields that match simultaneously."""
return sum(1 for k in fields
if cfg_a.get(k) is not None and cfg_a.get(k) == cfg_b.get(k))
读取规则(正如源头所述):单个偶然匹配的字段毫无意义;同时五个才是指纹。将多少个字段作为阈值,取决于候选基座池的多样性。
两个真正独立训练的模型几乎不可能在相同词汇上收敛。用较小词汇量对共享 token 做归一化。
def tokenizer_overlap(vocab_a: dict, vocab_b: dict) -> float:
sa, sb = set(vocab_a), set(vocab_b)
return len(sa & sb) / min(len(sa), len(sb))
这只是辅助信号——见陷阱 2。
最 robust 的信号是比较表示几何。朴素 cosine 比较会被旋转欺骗(陷阱 1),所以该方法使用 Linear CKA(Centered Kernel Alignment)——来自 Kornblith 等人(2019),《Similarity of Neural Network Representations Revisited》(ICML)——它对旋转、正交变换和各向同性缩放是不变的。
对于行中心化的矩阵 X ∈ ℝ^{n×d1} 和 Y ∈ ℝ^{n×d2}:
CKA(X, Y) = ||Yᵀ X||²_F / ( ||Xᵀ X||_F · ||Yᵀ Y||_F )
关键在于,它在 d1 ≠ d2 时也有定义,所以不同 hidden size 的模型可以直接比较。
import torch
@torch.no_grad()
def linear_cka(X: torch.Tensor, Y: torch.Tensor) -> float:
# X:(n,d1), Y:(n,d2) — embeddings over the SAME token set (rows aligned)
X = X - X.mean(0, keepdim=True)
Y = Y - Y.mean(0, keepdim=True)
num = ((Y.t() @ X) ** 2).sum()
den = torch.sqrt(((X.t() @ X) ** 2).sum() * ((Y.t() @ Y) ** 2).sum())
return (num / den).clamp(0, 1).item()
对齐是 catch。两个 embedding 矩阵必须索引相同的 token。实践中取两个分词器的共享 token 子集,然后收集对应行:
def aligned_embeddings(emb_a, vocab_a, emb_b, vocab_b):
shared = sorted(set(vocab_a) & set(vocab_b))
idx_a = torch.tensor([vocab_a[t] for t in shared])
idx_b = torch.tensor([vocab_b[t] for t in shared])
return emb_a[idx_a], emb_b[idx_b]
该工具将三个信号折叠为四个标签——一种清晰的结果读取方式(Model Genome Korea):

陷阱 1 — 行-wise cosine 相似度看起来严谨但实际不是。它会被旋转不变性欺骗:一个真正衍生出来的模型可以通过旋转显得"不同",而朴素检查会让它通过。这正是 CKA 和配置信号承载重量的原因。
陷阱 2 — 共享分词器单独证明不了什么。分词器复用往往是出于许可或便利的决策。把重叠度当作辅助证据,而不是结论。
可复现性。三个信号都从公开产物中计算,代码不过几十行。声明和验证在同一平面上。
旋转不变性正确。选择 Linear CKA 是正确的——它中和了击败 cosine 比较的最常见伪装手段(正交变换)。
证据融合。基于三个轴的同时一致来做判断,压制了假阳性和假阴性。
继续预训练的灰色地带。Embedding CKA 能很好识别从零训练,但对保持基座权重并在此之上大量训练的衍生模型不能干净分离。此时判断是概率性的,配置和分词器证据占主导。
阈值敏感性。"多少个字段"、"什么 CKA 截断值"取决于候选池。硬编码常量会在池变化时让结论摇摆——这就是本文不规定任何常数的原因。
Embedding 偏差。只看 embedding 层很便宜,但模型的"身份"也存在于中上层。逐层 CKA 曲线能提高灰色地带的分辨率。
对齐依赖性。共享 token 少(语言或领域特定的分词器)会缩小 CKA 样本并放大方差。在报告 CKA 时同时报告共享 token 数量。
将单层 embedding CKA 扩展为逐层 CKA 曲线(输入层 → 中层 → 输出层)。
针对整个候选基座池打分,以相对排名而非绝对截断值来判断。
报告共享 token 数量并给出 bootstrap 置信区间以示统计显著性。
简而言之,Model DNA 在正确的不变性下融合了正确的信号——一个可靠的起点。它只在被当作带不确定性的谱系而非"从零/非从零"二元标签来解读时,才能避免误判。
谱系,不是意图。它能显示 B 与 A 在结构上相似;但不能说明这是否被披露过、有许可还是被隐瞒——这是伦理和文书问题,不是线性代数。
"从零"是一个谱系,不是布尔值。数据、初始化、架构和后训练各自都处于原创性的连续体上。
基于开源权重构建是合法的。目标是透明和准确标注,不是指控。
能判断一个 LLM 是否真的从零训练的吗?
通常可以,概率很高。将架构配置、分词器重叠和 embedding CKA 与候选基座交叉检查;三者一致表明是衍生,分歧则支持从零训练。
什么是 Model DNA / 模型溯源?
仅凭公开产物(配置、分词器、权重)估算模型来源——是原创还是衍生自开源权重基座——无需训练数据或内部日志。
基于 Llama、Qwen 或 DeepSeek 构建是合法的吗?
合法。对开源权重基座做微调或继续预训练是标准的、有许可的做法。溯源工具报告的是谱系,不是行为不当。
如何区分微调模型和从零训练的模型?
从零训练的模型在架构和分词器上存在分歧,对任何基座的 embedding CKA 都低。衍生模型保留基座的骨架和分词器,相似度保持高位——这是最难的情况,此时配置和分词器证据最为重要。
为什么用 Linear CKA 而不是 cosine?
因为 CKA 对旋转和缩放是 robust 的——这些变换正是衍生模型用来显得"不同"的手段。
不同 hidden size 的模型能比较吗?
能。CKA 比较的是 n×n Gram 矩阵,所以 d1 ≠ d2 完全没问题——只要 embedding 行对齐到相同的 token。
被分析的方法:Model DNA — architecture & weight lineage
在线工具(space):Model Genome Korea
公告帖:Architecture lineage of Korea's sovereign-AI models
学术基础:Kornblith, Norouzi, Lee, Hinton (2019), Similarity of Neural Network Representations Revisited, ICML.
相关讨论:知乎圆桌"大模型卷一夏" · 知乎帖子 · 报道
溯源正在成为一种规范,而不是找茬。最健康的版本是:"我们从零训练"带着指纹到来——或者至少能通过指纹验证。如果你做模型,自己发布检查结果。