TL;DR
공개된 config.json, tokenizer.json, 임베딩 가중치 세 가지 축을 결합해 모델이 'from-scratch'인지 외부 베이스를 차용했는지 판별하는 재현 가능한 파이프라인이 제시되었다. config 기반의 아키텍처 튜플과 토크나이저 어휘 겹침(min-overlap)은 강력한 1차 증거이며, 임베딩 비교는 행 단위 코사인이 회전 불변성 때문에 무의미하고 선형 CKA는 독립 학습을 확인하는 데는 유용하나 파생을 단독으로 확정하기에는 민감도가 부족하다는 관찰이 핵심이다. 이 방식을 동일 기준으로 한국의 공개 모델 구성을 조사해 포팅·혼합·네이티브 스펙트럼을 드러냈고, 모든 입력은 공개 아티팩트여서 재현 가능하도록 도구와 코드가 공개되었다.
섹션별 상세
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 레포의 config.json을 원격으로 가져와 모델의 핵심 필드 다수를 추출해 아키텍처 형태를 튜플로 만든다. 이 튜플(예: hidden_size·intermediate_size·num_hidden_layers·heads·kv)은 동일하게 일치할 경우 타 레퍼런스에서 아키텍처를 채택했을 가능성을 강하게 시사한다. 동일 필드 하나만 일치하는 것은 우연으로 볼 수 있지만 여러 필드가 동시에 일치하면 지문 역할을 한다.
- config.json의 핵심 수치 튜플이 외부 오픈웨이트와 정확히 일치하면 아키텍처를 채택했을 강력한 증거가 된다. — 본문의 아키텍처 지문 코드와 예시 튜플들(예: 3584·18944·28·28·4)이 같은 레퍼런스와 정확히 일치한 사례.
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토크나이저의 vocab 집합을 읽어 두 모델의 어휘 교집합 비율을 min(|A|,|B|)으로 계산하면 작은 어휘가 큰 어휘의 부분집합인 경우에도 1.0에 가까운 값을 얻어 '기초 토크나이저를 그대로 차용했는지'를 올바르게 가려낸다. 이 비율은 아키텍처 지문과 결합되어 '외형은 동일하지만 언어적 토대는 새로 훈련했다' 같은 케이스를 드러낸다. 실무에서는 동일 토크나이저를 복사했을 때 겹침이 1.0이 되는 점을 주요 신호로 사용한다.
- 토크나이저 어휘 겹침을 min(|A|,|B|)으로 계산하면 작은 어휘가 큰 어휘의 부분집합인 경우에도 1.0에 근접해 '부분집합 토크나이저'를 올바르게 식별한다. — 토크나이저 겹침 계산 코드(tok_overlap)와 그 설명; 본문에서 특정 모델이 Qwen과 아키텍처는 같지만 토크나이저 겹침이 약 0.38로 나타난 사례 언급.
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()공유 어휘에서 임베딩 행들을 같은 순서로 추출해 평균을 제거한 뒤 선형 CKA를 계산하면 회전과 등방성 스케일 변화에 불변한 전체 표현 구조 유사도를 얻을 수 있다. 실험에서는 from-scratch 모델이 후보 기반과 거의 0에 가까운 CKA를 보였고, 파생 모델은 약 0.25로 무관계 모델(≈0.21)보다 약간 높아 '완전한 증거'로 삼기 어렵다는 관찰이 나왔다. 따라서 CKA는 '독립 학습'을 확증할 때 유용하지만 파생 여부를 단독으로 판정하기에는 민감도가 충분치 않다.
- 행 단위 코사인 유사도 평균은 회전 불변성 때문에 혈연관계 추정에 무용하다. — 섹션 4의 'Trap 1' 설명과 실험에서 알려진 from-scratch 및 Llama-파생 모델 모두에서 평균 코사인이 거의 0에 근접했다는 관측.
- 선형 CKA는 회전·스케일 불변성을 제공해 독립 학습을 확인할 때 유용하지만, 파생 모델을 판별하는 데는 민감도가 충분치 않다(파생 모델 ≈0.25, 무관 모델 ≈0.21). — linear_cka 코드와 본문 수치(파생 모델 ≈0.25, 무관 모델 ≈0.21) 및 from-scratch 모델이 거의 0을 보였다는 기술.
용어 해설
- 모델 구성 파일(config.json)
- — Transformers 체크포인트에 포함되는 JSON 파일로서 model_type, vocab_size, hidden_size, intermediate_size, num_hidden_layers, num_attention_heads 같은 필드가 모델 아키텍처의 핵심 형태를 결정하며 서로 일치하면 아키텍처 복제 가능성을 강하게 시사한다.
- 토크나이저 사전 파일(tokenizer.json)
- — 토크나이저의 어휘 집합을 담는 파일로서 BPE·SentencePiece 등 구현에서 토큰과 ID 매핑을 제공하며 어휘의 교집합 비율(min-overlap)을 통해 '어떤 모델이 다른 모델의 토크나이저를 그대로 썼는지'를 가늠할 수 있다.
- CKA (표현 비교 지표)(Centered Kernel Alignment (CKA))
- — 표현 행렬들 사이의 일치도를 측정하는 방법으로 회전과 등방성 스케일에 불변성을 가져 서로 다른 기저에 표현된 임베딩의 구조적 유사성을 비교하는 데 적합하지만 대규모 재학습 뒤에는 판별력이 떨어질 수 있다.
- 회전 불변성(rotational invariance)
- — Transformers의 은닉공간은 특정 기준 기저를 갖지 못해 동일한 정보가 서로 직교 회전된 기저에서 표현될 수 있으며, 이로 인해 행 단위 코사인 유사도처럼 기저에 의존하는 비교법은 혈연관계를 잘못 판단하게 된다.
- 토큰 임베딩 행렬(embed_tokens.weight)
- — 모델의 입력 토큰을 벡터로 매핑하는 가중치 행렬로서 공유된 어휘 순서를 기준으로 행렬을 추출해 CKA로 비교하면 전체 표현 구조의 유사성을 평가할 수 있으나 대규모 파인튜닝 이후에는 값이 재형성되어 판별 민감도가 떨어질 가능성이 있다.
기술
- config.json
- tokenizer.json
- embed_tokens.weight
- Linear CKA
- Hugging Face
- Transformers
활용 사례
- 벤더가 'from-scratch' 기반이라고 주장하는 공개 모델의 혈연관계 검증
- 공개 레포를 대상으로 한 모델 계보 감사와 투명성 보고
- 연구자가 특정 공개 베이스와의 파생 여부를 빠르게 탐지해 재현 가능성 평가
AI 요약 · 북마크 · 개인 피드 설정 — 무료
출처 · 인용 안내
인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.