
Meta-Attention만 있으면 충분합니다
요약
Transformer 아키텍처를 기반으로 한 새로운 'meta-transformers' 개념을 제안합니다. 작성자는 실험을 통해 발견한 이 구조의 유효성을 검증받기 위해 전문가들의 비판적 피드백을 요청하고 있습니다.
핵심 포인트
- Transformer 아키텍처를 변형한 meta-transformers 구조 제안
- 모델 가중치와 소스 코드를 Hugging Face 및 Codeberg에 공개
- 기존 'Attention Is All You Need' 논문의 메커니즘과 유사한 접근
- 전문가들의 객관적인 검증과 피드백을 목적으로 하는 프로젝트
서론
이 글에서는 제가 언어 모델(Language Models)을 실험하며 발견한 흥미로운 결과에 대해 이야기하고자 하며, 이를 "meta-transformers"라고 부르기로 했습니다.
제가 정말로 흥미로운 무언가를 발견한 것인지, 아니면 희망 사항을 현실로 착각한 것인지는 알 수 없습니다. 기술적으로 역량 있는 외부 관찰자만이 객관적인 평가를 내릴 수 있을 것이며, 이것이 바로 이 글을 게시한 이유입니다. Transformer 아키텍처(Transformer architecture) 전문가분들의 참여를 특히 환영합니다.
모델 가중치(Model weights), 프로젝트 소스 코드(Project source code), 그리고 모든 문서는 글의 마지막인 Sources 섹션에 링크될 예정입니다. 가중치는 Hugging Face, 코드는 Codeberg(GitHub와 유사한 플랫폼)를 통해 제공됩니다. 초기 프로젝트는 러시아어 문서와 주석으로 작성되었으나, 글로벌 커뮤니티를 위해 Codex를 사용하여 주석과 문서를 영어로 번역했습니다. Codeberg에는 원래의 러시아어(RU) 버전과 번역된 영어(ENG) 버전이 모두 포함될 것입니다.
이 글은 Codeberg에 러시아어와 영어 두 버전 모두 루트 디렉토리에
meta-attention-is-all-you-need.md라는 이름으로 게시될 것입니다.
Architectural Diagrams 섹션 시작 부분에서 미리보기 다이어그램을 확인할 수 있습니다.업데이트: 커버 이미지를 더 멋진 것으로 변경했습니다. 글의 다른 내용은 변경되지 않았습니다.
전체 섹션:
- 중요 참고 사항
- meta-transformers 알아보기
- 구성 요소 상세 분석
- 학습 과정 상세 분석
- 실험
- 아키텍처 다이어그램
- 결론
- 출처
1. 중요 참고 사항
이 섹션의 정보는 아키텍처를 이해하는 데 필수적인 것은 아닙니다. 읽어보시는 것을 권장하지만, 원하신다면 "meta-transformers 알아보기" 섹션의 아키텍처 설명으로 바로 넘어가셔도 좋습니다.
이 프로젝트와 관련 개념들이 매우 특수하다는 점을 고려할 때, 그리고 모든 밀레니엄 문제(Millennium Prize problems)를 한 번에 해결했다고 주장하는 또 다른 미친 발명가처럼 보이고 싶지 않기에, 이 섹션에 꽤 많은 주의 사항을 적어 두었습니다. 본문 내용으로 넘어가기 전에 이를 읽어보시길 권장합니다.
이것은 제가 본업 외의 자유 시간에 작업한 전형적인 주말 프로젝트입니다. 만약 이 아이디어가 실패한다면 실망스럽겠지만, 어느 쪽이든 제가 크게 잃을 것은 없으므로, 제 생각에는 여기서 상당히 객관적이고 비판에 열려 있을 수 있다고 봅니다.
제목의 언급 (The title reference)
정보를 갖춘 일부 독자들은 이 글의 제목이 Transformer (트랜스포머) 아키텍처를 처음 설명한 2017년 논문 "Attention Is All You Need"를 참조하고 있다는 점을 눈치챘을지도 모릅니다. 물론, 제 아이디어를 그 논문과 같은 수준으로 놓고 말하는 것은 아닙니다. 메커니즘과 작동 원리가 단순히 상당히 유사할 뿐입니다.
그럼에도 불구하고, 저는 이 아이디어의 중요성이나, 혹은 중요성이 아예 있는지조차 스스로 평가할 수 없습니다. 저에게는 전문 지식이 부족하며, 무엇보다 유능한 피드백이 부족합니다. 그것이 바로 여러분이 이 글을 읽고 계신 이유이기도 합니다.
독창성 (Uniqueness)
이 아이디어가 매우 일반적인 형태로는 상당히 시사적이고 단순해 보이기 때문에, 누군가가 이미 시도했을 가능성이 충분히 있으며 제가 충분히 잘 찾아보지 못한 것일 수도 있습니다. 만약 그런 사례를 발견하신다면 알려주시면 감사하겠습니다.
같은 이름을 가진 또 다른 프로젝트
Google에서 검색해 보면 Transformer를 수정하는 또 다른 "meta-transformer" 아키텍처를 찾을 수도 있습니다. 유사점은 거기서 끝납니다. 요약하자면, 그것은 공통의 토큰 공간 (token space)을 제공함으로써 12가지 모달리티 (modalities)를 통합하기 위한 프레임워크입니다.
왜 그것이 meta-transformers라고 불렸는지는 추측만 가능할 뿐입니다. 아마도 단순히 멋진 이름을 위해서였을 가능성이 높습니다. 기술적으로는 meta-modal 아키텍처라고 부르는 것이 더 정확할 것입니다.
제가 그것을 잘못 전달하고 있지 않은지 확인하려면, 해당 아키텍처에 관한 논문을 여기에서 읽어보실 수 있습니다.
실험 지표 (Experiment metrics)
보고된 수치들을 맹신하지 마시길 권장합니다. 저는 특별히 뛰어나지도 않은, 자유 시간에 개인 프로젝트를 진행하는 한 명의 프로그래머일 뿐입니다. 저는 쉽게 실수를 저질렀을 수도 있습니다. 만약 여러분이 전문 지식과 직접 테스트를 수행하고자 하는 의지가 있다면, 댓글이나 DM을 통해 그 결과를 공유해 주시면 기쁘겠습니다.
실험의 기원 및 기간
이 아키텍처(architecture)의 초기 스케치는 2025년 8월에 등장했으나, 최종적으로 발전한 아이디어와는 공통점이 거의 없습니다. 당시에는 "반사적 코어 (reflexive core)"라고 불렸으며, 목표는 언어 모델(language model)이 "자신의 사고에 대해 생각하도록 (think about its own thinking)" 가르치는 것이었습니다.
현재의 형태로는 올해 3월에 프로젝트가 나타났으며, max 5x 플랜의 Claude Code를 활용한 약 한 달간의 집중적인 작업과, 훈련을 위해 vast.ai에서 사용한 약 30달러의 비용이 소요되었습니다.
2. 메타 트랜스포머 (meta-transformers)와 친해지기
실험 초기 단계의 메타 트랜스포머 (meta-transformer) 아키텍처와 최신 단계의 아키텍처는 동일한 일반 원칙을 공유하지만, 세부 사항에서 차이가 있습니다. 이 글은 개요를 다루는 기사이므로 주로 최신 버전에 초점을 맞춥니다. 모든 단계에 대한 정보는 소스 코드에서 확인할 수 있습니다.
일반 원칙
텍스트를 입력으로 받아 그 뒤를 이어 생성하는 모델을 상상해 보십시오. 토큰(tokens)을 받으면 각 레이어(layer) 내부에서 숫자로 이루어진 벡터(vectors)가 발생합니다. 이를 활성화 값 (activations)이라고 부릅니다. 아이디어는 이 활성화 값들을 가져와 다시 동일한 레이어들로 투영(project)하는 것입니다. 사실상 이것은 모델 자신의 어텐션 (attention)에 대한 어텐션 메커니즘이며, 이것이 아키텍처 이름에 "메타 (meta)" 접두사가 붙은 이유입니다.
적용
모델이 자신이 거짓말을 하고 있다는 것을 실제로 알고 있지만, 이 "불확실성 신호 (uncertainty signal)"가 출력 레이어 (output layers)까지 도달하지 않는다는 가정을 바탕으로 합니다. 우리는 모델의 활성화 값을 다시 모델 자신에게 주입함으로써 모델이 스스로의 불확실성을 결정하는 데 도움을 줄 수 있습니다.
주요 구성 요소
최상위 수준에서, 이 아키텍처는 단일 메타 트랜스포머 (meta-transformer) 파이프라인을 형성하는 네 가지 핵심 구성 요소를 가지고 있습니다.
- 활성화 후크 (Activation hooks)는 활성화 값을 읽어오는 메커니즘입니다. 후크는 순전파 (forward pass) 과정이 지정된 레이어에 도달하면 자동으로 실행되어, 필요한 은닉 상태 (hidden-state) 위치를 추출하고 이를 활성화 버퍼 (activation buffer)에 저장합니다.
- 인지 인코더 (cognitive encoder)는 버퍼의 활성화 값을 인지 토큰 (cognitive tokens)으로 변환하는 작은 신경망입니다. 두 가지 주요 아키텍처는 레이어에서 토큰으로 이어지는 레이어별 선형 프로젝터 (linear projectors)와 작은 MLP 헤드 조합, 그리고 미니 트랜스포머 (mini-transformer)입니다. 두 네트워크 모두 효과적인 결과를 생성했지만, 서로 다른 측면에서 그러했습니다. 이에 대해서는 나중에 논의하겠습니다.
- 어텐션 게이트 (Attention gates)는 레이어당 하나씩 존재하는 학습 가능한 스칼라 곱셈기 (scalar multipliers)입니다. 이들은 메타 어텐션 (meta-attention)이 레이어에 얼마나 강하게 혼합될지를 조절합니다. 즉, 해당 레이어에 성찰 (introspection)이 필요한지 여부를 결정합니다.
- 메타 어텐션 헤드 (Meta-attention heads)는 개별 레이어가 다른 레이어의 활성화 값을 얼마나 강하게 또는 약하게 "들을"지 선택적으로 결정할 수 있게 합니다. 즉, 레이어 B보다 레이어 A에 더 집중 (attend)할 수 있습니다.
학습 방식
학습 가능한 구성 요소는 인지 인코더 (cognitive encoder), 메타 어텐션 헤드 (meta-attention heads), 그리고 게이트 (gates)입니다. Llama-3.1-8B 모델의 경우 이는 약 1억 8,800만 (188M) 개의 파라미터로, 8B 베이스 모델의 약 2.3%에 해당합니다.
베이스 모델의 가중치 (weights)는 엄격하게 동결 (frozen)됩니다. 모든 실험 결과, 베이스 모델의 학습을 허용할 경우 모델이 일반화 (generalizing)하는 대신 신호를 경직되게 이용하기 시작하며, 생성 품질이 개선되지 않거나 오히려 악화되는 것으로 나타났습니다.
학습 사이클:
한 번의 학습 단계 (training step)는 동일한 질문에 대해 동일한 모델을 두 번의 순전파 (forward pass)하는 것으로 구성됩니다:
-
패스 1 (Pass 1): 생성 과정이 없는 순전파입니다. 활성화 후크 (Activation hooks)가 모든 레이어로부터 활성화 값을 수집합니다. 인코더는 이를 인지 토큰 (cognitive tokens)으로 투영하여 버퍼에 넣습니다.
-
패스 2 (Pass 2): 활성 메타 주입 (active meta-injection)이 포함된 순전파입니다. 각 레이어에서 메타 어텐션 (meta-attention)은 버퍼에 있는 인지 토큰을 확인하고, 게이트 (gates)를 통해 메타 신호를 메인 스트림 (main stream)에 혼합합니다. 모델은 답변을 생성합니다.
동일한 두 번의 패스(two-pass) 메커니즘이 추론 시간에도 사용됩니다. 학습(Train)과 평가(Eval)는 동일한 순전파 구조를 가집니다. 유일한 차이점은 학습 중에는 두 번의 순전파 후에 역전파(backward pass)가 실행된다는 것입니다. 이 과정에서 기울기(gradients)가 계산되고, 옵티마이저(optimizer)가 인코더, 메타-어텐션(meta-attention), 게이트 가중치(gate weights)를 업데이트합니다. 기본 모델(base)은 고정된 상태로 유지됩니다. 즉, 기울기는 이를 통과하지만 가중치는 변경되지 않습니다. 추론 시간에는 역전파 과정이 필요하지 않으며, 모델은 단순히 답변을 생성할 뿐입니다.
3. 상세 구성 요소 분석
본 섹션에서는 활성화 후크(activation hooks), 인지 인코더(cognitive encoder), 게이트(gates), 그리고 메타-어텐션 헤드(meta-attention heads)의 네 가지 전체 파이프라인을 분해하여 설명합니다.
활성화 후크 (Activation hooks)
가장 낮은 수준의 구성 요소는 신경망이라기보다는 고전적인 프로그램인 활성화 읽기 메커니즘입니다. 기술적으로 이는 PyTorch의 register_forward_hook이며, 기본 모델(base model)의 각 타겟 레이어에 부착됩니다.
def hook(module, input, output):
if self._frozen:
return
...
작동 방식은 다음과 같습니다:
- 순전파가 할당된 레이어에 도달할 때 후크가 자동으로 발동됩니다.
- 이후크는 전체 은닉 상태 텐서(
[batch, seq_len, hidden_dim])를 받습니다. - 마지막 토큰 슬라이스인
[:, -1, :]를 추출합니다. 자기회귀 모델(autoregressive model)의 경우, 이는 다음 토큰이 예측되는 결정 지점입니다. .detach()는 이를 기본 모델 그래프에서 분리합니다. 왜냐하면 기본 모델로 기울기가 흐르는 것을 원하지 않기 때문이며,.clone()은 버퍼에 대한 참조를 유지하지 않도록 복사본을 만듭니다.- 결과를 레이어별로 인덱싱된 딕셔너리에 저장합니다.
_frozen 플래그, 또는 동결/해제(freeze-unfreeze)는 model.generate()와의 호환성을 위한 핵심 세부 사항입니다. 패스 1(Pass 1), 즉 프롬프트 읽기 과정에서는 후크가 활성화되어 활성화를 수집합니다. 패스 2(Pass 2) 직전에는 freeze()를 사용하여 동결됩니다. 그렇지 않으면, 매 자기회귀 생성 단계마다 후크가 활성화를 덮어쓰게 되어,
후크 (Hooks)에는 학습 가능한 파라미터 (trainable parameters)가 없습니다. 이들은 순수하게 수동적인 관찰자 역할을 합니다. 이들은 다양한 아키텍처를 지원합니다: model.model.layers를 통한 Llama/Gemma/Qwen, 그리고 model.transformer.h를 통한 GPT-2가 그 예입니다.
정확히 무엇을 수집하는 것일까요?
프롬프트가 레이어 (layer)를 통과할 때, 레이어는 단 하나의 벡터를 출력하는 것이 아닙니다. 입력 토큰당 하나의 은닉 벡터 (hidden vector)를 출력합니다: 즉, [seq_len, hidden_dim] 형태의 텐서 (tensor)입니다. 예를 들어, 20개의 토큰으로 구성된 프롬프트의 경우, 레이어 15는 각각 4096의 차원을 가진 20개의 벡터를 출력합니다.
질문은 이것입니다: 어떻게 이 seq_len개의 벡터를 해당 레이어를 위한 하나의 인지적 토큰 (cognitive token)으로 변환할 것인가? 이것이 바로 시퀀스 (sequence)를 하나의 표현 (representation)으로 압축하는 방법인 "토큰화 (tokenization)" 또는 "풀링 (pooling)" 단계입니다.
마지막 토큰 (Last token, 베이스라인 변형)
hidden_states[:, -1, :]는 마지막 토큰의 벡터를 취한다는 의미입니다. 20개의 토큰 중 20번째 토큰을 가져오는 것입니다.
이 방식을 사용하는 이유: 자기회귀 (autoregressive) 모델에서 다음 토큰은 구체적으로 마지막 토큰의 은닉 상태 (hidden state)로부터 예측됩니다. 다시 말해, 이것은 모델이 막 생성을 시작하려는 바로 그 상태입니다. 이전의 19개 위치는 이 지점까지 이르게 된 문맥 (context)입니다. 이는 "결정 그 자체의 단면"이라고 할 수 있습니다.
단점: 이는 단 하나의 지점일 뿐입니다. 시퀀스 전체에 걸쳐 축적된 모든 정보가 종단점으로 압축되며, 일부 분산된 신호들은 그곳에 반영되지 않을 수 있습니다.
평균 풀링 (Mean pool)
hidden_states.mean(dim=1)은 모든 위치에 대해 평균을 내는 것을 의미합니다. 20개의 벡터를 모두 더한 뒤 20으로 나누어, 4096 차원의 하나의 "평균화된" 벡터를 생성합니다.
직관적 이해: "종단점에서의 상태" 대신, 전체 입력에 걸친 레이어 활동의 전반적인 초상화를 얻게 됩니다. 만약 프롬프트의 어떤 요소가 5번째 토큰에서 불확실성을 유발했다면, 마지막 토큰 벡터는 어텐션 (attention)이 이미 다음으로 넘어갔기 때문에 이를 보존하지 못할 수 있지만, 평균은 이를 포함하여 "배경" 신호를 보존할 수 있습니다.
단점: 결정 지점(decision point)이 흐릿해집니다. "바로 여기가 내가 결정을 내리는 지점이다"라는 구체적인 순간이 모든 토큰(tokens)에 대한 평균값 속으로 녹아들어 버리는데, 프롬프트의 시작 부분이나 서비스 토큰(service tokens)과 같이 최종 결정과는 거의 관련이 없는 토큰들이 다수를 차지하기 때문입니다.
세 가지 Phase 5 변형(variants):
| 변형 (Variant) | 추출 대상 | 프로젝터 입력 차원 (Projector input dimensionality) | sel_acc |
|---|---|---|---|
| baseline | 마지막 토큰 (last token) | 4096 | 89.1% |
| ... |
변형 A (Variant A), 평균만 사용: 84.1%, baseline보다 낮음. 결정 지점을 잃는 것이 분산된 컨텍스트(distributed context)를 통해 얻는 이득보다 더 큰 손실을 초래합니다. 이는 엔드포인트(endpoint)가 매우 중요하다는 것을 확인시켜 줍니다.
변형 B (Variant B), 마지막 토큰 + 평균: 두 벡터를 하나의 [8192] 벡터로 결합(concatenate)하며, 이제 프로젝터는 4096 대신 8192를 입력으로 받습니다. 결과는 역대 최고치인 90.1%를 기록했습니다. 그 논리는 다음과 같습니다: last는 구체적인 선택("나는 답변 C로 기울어진다")을 포함하고, mean은 그 선택을 조건 지은 컨텍스트("그리고 이것은 그 선택으로 이어진 일반적인 추론 배경이다")를 포함합니다. 이 둘은 각각 단독으로 존재할 때보다 함께 있을 때 더 많은 정보를 전달합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기