TL;DR
공개 LLM이 from-scratch로 학습됐는지 외부 기반에서 파생됐는지 확인하려면 config.json의 아키텍처 지문과 tokenizer.json의 어휘 중복률을 먼저 비교해야 합니다. 대응 embedding 행의 cosine은 Transformer 표현의 회전 불변성 때문에 무력하며, Linear CKA도 from-scratch 확인에는 유용하지만 continued-pretraining 파생 여부를 강하게 가르지는 못합니다. 글은 아키텍처와 가중치 결과를 Native, Adapted, Mixed, Ported genotype으로 묶고 토크나이저와 attention diversity를 보조 근거로 남겼습니다. 한국 조직 아홉 곳의 공개 foundation model에 같은 절차를 적용한 결과 계보가 외부 모델 재사용부터 자체 설계까지 다양하게 나타났으며, Model Genome Korea에서 결과를 확인하고 세 함수를 직접 재현할 수 있습니다.
섹션별 상세
import requests
def arch_fingerprint(repo): c = requests.get(f"https://huggingface.co/{repo}/resolve/main/config.json", headers={"User-Agent": "genome/1.0"}).json()
return {k: c.get(k) for k in ("model_type", "vocab_size", "hidden_size", "intermediate_size", "num_hidden_layers", "num_attention_heads", "num_key_value_heads")}Hugging Face Hub의 config.json에서 아키텍처 지문을 구성하는 핵심 필드를 읽어옵니다.
def vocab_set(repo):
j = requests.get(f"https://huggingface.co/{repo}/resolve/main/tokenizer.json").json()
v = j["model"]["vocab"] # BPE: {token: id}
return set(v.keys())
def tok_overlap(a, b): A, B = vocab_set(a), vocab_set(b)
return len(A & B) / min(len(A), len(B)) # 1.0 == subset두 저장소의 tokenizer.json에서 어휘 집합을 추출하고 작은 집합을 기준으로 중복률을 계산합니다.
import torch
def linear_cka(X, Y):
# X: (n, d1), Y: (n, d2) — SAME token order (shared vocab)
X = X - X.mean(0, keepdim=True)
Y = Y - Y.mean(0, keepdim=True)
num = (X.T @ Y).norm() ** 2
den = (X.T @ X).norm() * (Y.T @ Y).norm()
return (num / den).item()공유 어휘의 같은 토큰 순서로 정렬한 두 embedding 행렬의 Linear CKA를 계산합니다.
KEYS = ("layer_types", "linear_attn_config", "sliding_window", "mamba2_d_state", "hyena_filter_order", "mla_kv_lora_rank", "attention_cls")
def attention_diversity(cfg):
hits = [k for k in KEYS if k in cfg] # e.g. layer_types = [full×16, sliding×48] -> hybrid (2)
return hitsconfig.json에 기록된 서로 다른 attention 관련 설정의 수를 세어 구조적 다양성을 확인합니다.
용어 해설
- 아키텍처 지문(Architecture Fingerprint)
- — LLM의 config.json에 기록된 hidden size, 레이어 수, attention head 수 같은 구조적 수치를 묶어 모델의 설계 계보를 비교하는 방법입니다. 여러 값이 외부 모델과 동시에 일치하면 단순한 우연보다 기존 아키텍처 채택의 근거가 강해집니다.
- 토크나이저 중복률(Tokenizer Overlap)
- — 두 모델의 tokenizer.json에서 어휘 집합이 얼마나 겹치는지 비교하는 지표입니다. 더 작은 어휘 집합의 크기를 분모로 사용하면 한 모델의 어휘가 다른 모델의 엄격한 부분집합일 때 중복률이 1.0에 가까워져 기반 토크나이저 재사용을 포착할 수 있습니다.
- 회전 불변성(Rotational Invariance)
- — Transformer의 은닉 공간은 특정 좌표축을 우선하지 않으므로 표현 전체를 직교 회전해도 같은 정보를 담을 수 있다는 성질입니다. 이 때문에 대응 토큰의 embedding 행끼리 cosine을 계산하면 계보가 같은 모델도 유사하지 않게 측정될 수 있습니다.
- Linear CKA
- — Linear CKA는 두 표현 행렬의 중심화된 내적 구조를 비교하는 방법으로, 회전과 등방성 스케일 변화에 영향을 덜 받습니다. 이 글에서는 공유 어휘의 같은 토큰 순서로 embedding을 정렬한 뒤 CKA를 계산해 from-scratch와 continued-pretraining의 차이를 보조적으로 측정했습니다.
- Continued Pretraining
- — 이미 학습된 외부 모델의 가중치를 출발점으로 삼아 새로운 데이터에서 추가 사전학습을 수행하는 방식입니다. 원래 가중치의 흔적이 남을 수 있지만 대규모 학습이 embedding을 크게 바꾸면 Linear CKA만으로 파생 여부를 뚜렷하게 판별하기 어렵습니다.
기술
- Hugging Face Hub
- config.json
- tokenizer.json
- Python
- requests
- PyTorch
- Linear CKA
- Model Genome Korea
활용 사례
- 공개 foundation model의 from-scratch 학습 여부와 외부 기반 모델 계보 비교
- 모델 발표 내용과 공개 체크포인트의 구조 및 토크나이저 일치 여부 검증
- 여러 조직의 LLM을 Native, Adapted, Mixed, Ported 계열로 분류
- 공개 모델 저장소에 대한 재현 가능한 lineage 분석
AI 요약 · 북마크 · 개인 피드 설정 — 무료
출처 · 인용 안내
인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.