LLM 레이어 복붙으로 추론 능력을 3배 올린다고? (No Training, Just Routing)


최근 Hacker News에서 꽤나 흥미롭고, 동시에 의심스러운 프로젝트 하나가 올라왔다. 모델 가중치(weights)를 전혀 건드리지 않고, 추가 학습(Fine-tuning)도 없이 단지 LLM의 특정 레이어 3개를 복사해서 Forward Pass에 끼워 넣었더니 BBH Logical Deduction 점수가 0.22에서 0.76으로 수직 상승했다는 것이다.

15년 넘게 엔지니어링을 하면서 “공짜 점심”을 주장하는 기술은 일단 의심부터 하고 보는 병이 생겼다. 처음 이 글을 봤을 때 내 머릿속을 스친 생각은 “이거 특정 벤치마크에 과적합된 플루크(fluke) 아니야?”였다. 하지만 코드를 뜯어보고 HN 커뮤니티의 난상토론을 지켜보면서, 이 현상이 Transformer 아키텍처의 근본적인 특성을 찌르고 있다는 것을 깨달았다.

어떻게 동작하는가? (The Technical Deep Dive)

이 프로젝트(llm-circuit-finder)는 본질적으로 David Ng의 RYS(Representation Yielding System) 방법론을 자동화하고 확장한 툴킷이다. 핵심 아이디어는 이렇다. Transformer 모델 내부에는 3~4개 레이어로 구성된 연속된 블록이 하나의 인지 단위 혹은 추론 회로 (reasoning circuit)로 작동한다는 것이다.

저자는 GGUF 파일을 조작하여 실행 경로를 비튼다. 예를 들어 Devstral-24B 모델의 경우 12-14번 레이어가 이 추론 회로에 해당한다. 실행 흐름은 다음과 같이 변한다.

  • 기존 흐름: Layers 0 -> 11 -> 12 -> 13 -> 14 -> 15 -> … -> 39
  • 수정된 흐름: Layers 0 -> 11 -> [12 -> 13 -> 14] -> [12 -> 13 -> 14] -> 15 -> … -> 39

단순히 똑같은 가중치를 가진 레이어를 한 번 더 태우는 것만으로 모델이 “생각을 두 번” 하게 만든다. 제공된 gguf_surgery.py 스크립트를 보면 물리적으로 레이어를 복제하거나, 실행 시 라우팅만 변경하여 테스트를 진행한다. 두 대의 AMD GPU만으로 하룻밤 사이에 최적의 레이어 구간을 찾아냈다는 점이 인상적이다.

왜 망가지지 않을까? (My Personal Take)

자, 여기서 시니어 엔지니어라면 당연히 던져야 할 질문이 있다. 훈련 과정에서 모델은 N-1번 레이어의 출력을 다시 N번 레이어의 입력으로 넣으라고 배운 적이 없다. 그런데 왜 출력이 쓰레기 값(garbage)으로 발산하지 않을까?

내 생각에 해답은 Residual Connections 에 있다. Transformer의 각 레이어는 x_out = x_in + Sublayer(x_in) 형태로 구성된다. 즉, 레이어를 통과하더라도 원본 정보(residual stream)는 보존되고, 각 레이어는 필요한 연산 결과만 더해주는 구조다. 만약 특정 중간 레이어들이 대부분의 입력에 대해 Identity function에 가깝게 동작하면서, 오직 논리적 추론에 관련된 특정 feature만 증폭시키도록 훈련되었다면? 이 구간을 루프 돌리는 것은 그 feature를 극대화하는 효과를 낳을 수 있다.

또 다른 가설은 좀 더 냉소적이지만 현실적이다. HN의 한 유저가 지적했듯, RLHF나 안전성 튜닝 과정에서 모델의 추론 능력을 깎아먹는 거절 회로 (refusal circuit)가 생겼고, 레이어 복제가 이 거절 회로의 타이밍을 망가뜨려 억눌려 있던 추론 능력을 해방시켰을 가능성이다. 개인적으로는 두 가지가 복합적으로 작용했을 것이라 본다.

Hacker News의 반응과 업계의 컨텍스트

HN 스레드의 반응은 그야말로 날것 그대로다. 누군가는 “작성자가 README를 Claude로 썼다”며 비아냥거렸고(저자도 쿨하게 인정했다. 코드가 돌아가는데 그게 대수인가), 다른 이들은 이 발견이 꽤나 중요한 의미를 가진다고 평가했다.

특히 흥미로웠던 토론은 과거 Upstage의 Solar 10.7B 모델에 쓰였던 Depth Up-Scaling 기법과의 비교였다. Solar 역시 레이어를 복제해 모델의 깊이를 늘렸지만, 그들은 이후 막대한 비용을 들여 Continued Pre-training을 진행했다. 반면 이 방법은 Zero-shot 레이어 복제다.

또한, 모델의 앞뒤 레이어를 잘라내도(Pruning) 성능이 유지된다는 기존 연구들과 맞물려, “Transformer의 중간 레이어들이 사실상 재귀적(recursive) 연산을 억지로 Unroll한 형태가 아니냐”는 통찰이 쏟아졌다. 전적으로 동의한다. 우리는 지금 코드를 짤 때 for 루프를 안 쓰고 statement를 60줄 복붙해 놓은 비효율적인 아키텍처를 쓰고 있는지도 모른다.

결론: 프로덕션에 쓸 수 있을까?

그래서 당장 내일 회사 프로덕션 모델에 이 트릭을 적용해야 할까? 아니다.

이 접근법은 VRAM을 추가로 소모하고(복제된 물리적 레이어만큼), Inference Latency를 레이어 수에 비례해 증가시킨다. 40 레이어 모델에 3개를 추가하면 약 7.5% 느려진다. 게다가 특정 벤치마크(BBH)에서는 극적인 효과를 보였지만, 다른 범용적인 태스크에서는 성능 저하가 발생할 리스크가 다분하다. HN 댓글에서도 지적하듯, 모든 태스크를 아우르는 공정한 믹스에서는 평균 성능이 떨어질 확률이 높다.

하지만 이 발견이 가지는 엔지니어링적 가치는 엄청나다. 우리가 블랙박스라고 부르는 LLM 내부에 명확하게 분리 가능한 기능적 블록 이 존재한다는 것을 증명했기 때문이다. 앞으로의 모델 아키텍처는 무식하게 레이어를 100개씩 쌓는 대신, 20개의 핵심 레이어를 만들고 특정 추론이 필요할 때만 동적으로 레이어를 루핑(Looping)하는 형태, 즉 MoE(Mixture of Experts)를 넘어선 MoD(Mixture of Depths)나 Recurrent Transformer 구조로 진화할 것이라 확신한다.

주말에 남는 GPU가 있다면 한 번쯤 sweep.py를 돌려보길 권한다. 수백만 달러짜리 학습 과정 없이 모델의 뉴로아나토미(Neuroanatomy)를 직접 메스로 찔러보는 경험은 꽤나 짜릿할 것이다.

References