모델이 글자를 이어 붙일 때 한 층에서 무슨 일이 벌어지는지. 「그것은」이 문장 앞의 무엇을 가리키는지 정하는 걸음과, 그 결과를 다듬는 걸음을 나눠 본다.
용어 풀이정리 2026-09-20모델 구조
▾
트랜스포머 한 층은 두 걸음이다. 먼저 어텐션이 지금 토큰과 앞선 토큰들을 섞고, 그다음 FFN 이 그 결과를 토큰 하나하나에 따로 먹여 다듬는다. 섞는 걸음은 토큰끼리 서로 보고, 다듬는 걸음은 옆을 안 본다. 이 두 걸음이 층마다 되풀이된다.
핵심 포인트
Q·K·V 는 같은 토큰에서 뽑은 세 벡터다. 같은 임베딩에 서로 다른 가중치를 곱해 만든다. Q(쿼리 — 내가 무엇을 찾는가)는 그 스텝에서 쓰고 버리고, K(키 — 나는 무엇을 들고 있는가)와 V(밸류 — 골라졌을 때 내줄 내용)는 한 번 만들면 그 토큰이 대화에 남아 있는 한 계속 다시 쓰여 캐시에 쌓인다 — 「KV 캐시」가 커진다는 말이 이 뜻이다. 그리고 얼마나 볼지를 정하는 것은 Q 와 K 인데 그 비율로 섞이는 것은 V 라, 어디를 많이 보느냐와 결과를 많이 정하느냐가 같지 않다.
1막 — 어텐션 (23초짜리 한 바퀴)
실제로 Qwen2.5-0.5B 를 한 번 돌려 뽑은 수치다. 「그것은」 자리의 Q 가 앞선 토큰들의 K 를 왼쪽부터 훑어 점수를 내고, 그 점수가 합 1 의 비율로 다시 선 뒤, 그 비율을 가중치로 V 를 가중평균해 출력 하나가 남는다.
점수를 비율로 바꾼 뒤 가중평균한다. Q 와 K 를 곱하면(내적) 그 수가 클수록 그 토큰을 많이 본다. 크기가 제각각이라 소프트맥스로 합이 1 이 되게 눌러 「어느 토큰을 몇 퍼센트 볼까」로 만들고, 비율 × V 를 토큰마다 구해 전부 더한다.
정보는 가중치에 들어 있다. 넓히는 행렬 자체가 그 정보다. 896 × 4,864 행렬은 896 칸짜리 벡터를 4,864 개 세워 둔 것이고, 그 열 하나하나가 학습 때 익힌 패턴 하나다 — 이것을 key(키 — 이 패턴이 들어왔나를 재는 자)라 부른다. 접는 행렬의 행 하나가 그 key 에 딸린 value(밸류 — 걸렸을 때 내놓을 내용)다. 게바 등이 2021 년에 보인 것이 이 짝이고, 지금 통용되는 설명이다.
곱셈은 넓히는 일이 아니라 대조하는 일이다. 입력 벡터에 그 행렬을 곱하면 입력을 4,864 개 key 각각과 내적한다. 나온 결과의 j 번째 숫자는 「입력이 j 번 key 와 얼마나 닮았나」 하나다. 그러니 칸이 4,864 개가 된 것은 정보가 늘어서가 아니라 4,864 번 대조한 점수표이기 때문이다.
사전 찾기 세 동작이라고 보면 맞는다. ① 표제어 4,864 개짜리 사전(넓히는 행렬)에 입력을 들고 가 전부와 대조해 점수표를 만든다 ② 문턱이 낮은 점수를 0 으로 눌러 실제로 걸린 표제어만 남긴다 — 이 모델에서 97.7% 가 여기서 꺼진다 ③ 표제어마다 딸린 뜻풀이(접는 행렬)를 점수만큼 가중합해 원래 896 칸으로 되돌린다.
2막 — FFN (21초짜리 한 바퀴)
위 1막이 낸 출력이 이 막의 입력이다. 같은 층·같은 자리에서 잰 수치다. 문장이 떴다가 「그것은」만 남는 것은 FFN 이 옆 토큰을 안 보기 때문이다. 넓힌 줄의 칸 하나가 key·value 짝 하나이고, 칸 밝기가 지금 문맥에 그 key 가 얼마나 걸렸는지다.
그 표제어는 낱말이 아니다. key 하나는 896 칸짜리 방향 하나이고, 그 방향과 닮은 입력이 오면 켜진다. 게바 논문이 사람에게 시켜 분류해 보니 아래쪽 층의 key 는 표면에 가까운 패턴(어떤 낱말로 끝나는 문장 꼴 같은)에, 위쪽 층은 주제나 뜻에 가까운 패턴에 걸렸다. value 도 「이 토큰을 내놓아라」가 아니라 다음 토큰 확률을 어느 쪽으로 밀지 정하는 방향이다.
낱말 사전은 따로 있다. 토큰 ID 를 받아 벡터를 내주는 임베딩 표가 모델 맨 앞에, 어휘로 되돌리는 표가 맨 뒤에 있다. 그쪽은 「350 번 토큰 → 이 벡터」처럼 번지수로 정확히 찾는다. FFN 의 key 에는 번지수가 없어 입력을 전부와 대 보고 닮은 정도로 걸린다 — 그래서 어느 key 가 걸릴지 미리 못 알고, 가중치 전체를 매번 읽어야 해서 HBM 에 둬야 한다. 엔그램(N-gram 임베딩) 표가 DRAM 으로 나갈 수 있는 것은 반대로 토큰 ID 만으로 읽을 행이 정해지기 때문이다.
사실 지식이 여기 들어 있다. 멍 등이 2022 년에 보인 causal tracing 은 「파리는 프랑스의 수도」 같은 사실을 모델이 꺼낼 때 결정적인 자리가 중간 층들의 이 FFN 이라는 것을 짚었고, 그 자리만 고쳐 사실을 바꿔 넣는 것도 됐다. 어텐션이 문맥을 옮겨 오는 길이라면 FFN 은 모델이 이미 외워 둔 것을 꺼내 오는 자리다.
넓힐수록 표제어가 는다. key·value 짝 하나가 기억 한 칸이라 칸 수가 곧 그 층이 담을 수 있는 패턴의 수다. 아래쪽 층의 key 는 얕은 패턴(글자 꼴·어구)에, 위쪽 층은 뜻에 가까운 패턴에 걸린다고 같은 연구가 짚었다.
문턱이 없으면 이 조회가 성립하지 않는다. 곱셈과 덧셈은 들어온 수에 늘 같은 규칙을 먹여서 「이 key 가 걸렸을 때만 그 value 를 쓴다」가 안 나온다. 들어온 수에서 5 를 뺀 뒤 음수면 0 으로 만드는 식의 문턱이 있어야 걸린 것과 안 걸린 것이 나뉜다. 문턱이 없으면 층을 아무리 쌓아도 한 층으로 접힌다 — 2 를 곱하고 3 을 더한 뒤 5 를 곱하고 1 을 더하면 10 을 곱하고 16 을 더한 것과 같다.
접어야 다음 층이 받는다. 걸린 key 들의 value 를 모아 원래 폭으로 되돌린다. 층들이 같은 폭을 주고받아야 쌓을 수 있고, 잔차 연결로 들어온 벡터에 더할 수도 있다. 「넓혔다 접는다」가 한 세트인 이유다.
넓히는 대가가 크다. 이 모델 한 층에서 FFN 이 쓰는 가중치가 13,074,432 개인데 어텐션은 1,835,008 개다 — 층 안 가중치의 88% 가 FFN 에 있다. MoE 가 굳이 이 자리를 여러 벌로 쪼개 토큰마다 일부만 돌리는 이유가 여기다. 엔그램(N-gram 임베딩)은 아예 곱셈 없이 표에서 행을 읽어 와 이 비용을 피한다.
어텐션은 한 번으로 안 끝난다. 이 계산이 층마다, 그리고 층 안에서도 헤드 여럿으로 동시에 돈다. 헤드마다 보는 데가 달라서 어떤 헤드는 지시대명사가 가리키는 명사를, 어떤 헤드는 바로 앞 낱말을 본다. 위 1막은 그중 「그것은」이 앞 명사를 가장 세게 되짚는 헤드 하나를 골라 그린 것이고, 그 고른 기준을 화면에 적어 뒀다.
두 걸음의 성격이 다르다. 어텐션은 토큰이 늘수록 볼 것이 늘어 계산과 캐시가 같이 커지지만, FFN 은 토큰마다 독립이라 서로 얽히지 않는다. 긴 문맥이 비싸지는 쪽은 어텐션이다.
Q·K·V 옆과 FFN 입력·출력 옆에 적힌 숫자는 벡터의 첫 성분 하나다. 넓힌 칸 64 개도 4,864 칸에서 고르게 뽑아 보인 것이고 전부가 아니다. 그 수치를 굽는 자리는 scratchpad/attn_trace.py 와 scratchpad/ffn_trace.py 이고, 거기서 직접 계산한 결과가 모델이 낸 것과 같은지를 굽는 단계에서 검사한다. 가중치 개수는 모델 설정에서 바로 센 것이다.