잔차 스트림은 덮어쓰지 않고 더한다 - 트랜스포머 여덟 부품으로 읽는 LLM 내부
토큰화부터 다음 토큰 예측까지 트랜스포머 여덟 부품을 수식 없이 설명한 글. 스트로베리 R 개수 오류의 진짜 원인, RoPE가 회전을 쓰는 이유, FFN에 파라미터 대부분이 사는 이유, ROME 사실 편집, GQA와 MoE 실측 수치를 정리했다.
잔차 스트림은 덮어쓰지 않고 더한다
TL;DR
- 글의 전제가 학습 경로를 단순하게 만드는데 현대 LLM은 대부분 트랜스포머 블록을 계속 쌓아 만들었으므로 트랜스포머 기계를 이해하면 거기까지 대부분 도달한다는 것이다. 그래서 목표도 실용적이다. 끝까지 읽으면 현대 LLM 논문이나 모델 카드를 읽으면서 각 절이 아키텍처의 어느 조각을 말하는지 알 수 있어야 한다.
- 스트로베리 오류의 원인이 정확히 지목되는데 LLM에게 스트로베리에 R이 몇 개인지 물으면 예전에는 틀렸지만 그것은 모델이 세기에 실패한 것이 아니다. 이유는 입력 단위에 있다. 모델이 글자를 직접 다루지 않고 사람이라면 글자별로 쪼갤 단어를 우연히 이루는 토큰 ID만 다루기 때문이다.
- 위치 처리의 전환이 명확히 대비되는데 원래 트랜스포머는 위치 패턴을 임베딩에 더했지만 의미와 위치를 같은 숫자 집합에 담아야 했고 학습된 절대 위치 임베딩은 훈련에서 못 본 위치로 일반화되지 않았다. 그래서 RoPE가 방식을 바꿨다. 위치 정보를 더하는 대신 쿼리와 키 벡터를 위치에 따른 각도로 회전시켜, 나중에 비교될 때 회전 차이가 서로 얼마나 떨어졌는지를 인코딩한다.
- 무게가 실린 곳이 어텐션이 아니라 밀집 트랜스포머 모델에서 파라미터 대부분은 피드포워드 네트워크에 살고 그것은 모델의 저장된 사실과 의미 구조가 상당 부분 사는 곳이다. 그 증거가 편집 가능성이다. ROME 같은 방법이 특정 FFN 가중치 행렬에 표적화된 저계수 편집을 해서 에펠탑이 파리에 있다를 로마에 있다로 바꿀 수 있다.
- 깊은 스택을 가능하게 한 것이 가장 단순한 연산인데 어텐션이나 FFN의 결과가 토큰 벡터를 대체하지 않고 더해지며 서른이나 오십, 백 개 층에 걸쳐 각 층의 기여가 이전 벡터를 덮어쓰는 대신 누적된다. 그 결과 이상한 성질이 생겨 원래 입력 임베딩이 후반 층까지 직접적인 덧셈 경로를 여전히 가지고 있다.
Source
How LLMs Actually Work — 0xkato, 2026년 6월 1일, 26분 분량 · @sairahul1 추천
Knowledge
수식 없이 가는 여덟 정거장
글은 자기 성격을 먼저 규정한다. LLM이 어떻게 작동하는지 훑는 글이고 현대 LLM은 대부분 트랜스포머 블록을 계속 쌓아 만들었으므로 트랜스포머 기계를 이해하면 거기까지 대부분 도달한다는 것이다. 수학에 대한 태도도 분명하다. 끈적한 수학 없이 핵심 기제를 다루지만 오해하지 말라며 수학은 배워야 한다고 덧붙인다. 이 글은 입문 역할을 할 수 있다는 것이다.
모델 간 차이가 어디서 오는지도 미리 정리한다. 대부분의 현대 LLM이 같은 트랜스포머 계열 골격을 공유하고 차이는 각각이 무엇으로 훈련됐는지와 규모, 설정 선택, 그리고 그 위에 얹은 사후 훈련에서 온다는 것이다.
경로가 아홉 단계로 제시된다. 토큰으로 문자열이 정수 열이 되는 과정, 임베딩으로 그 정수들이 의미를 얻는 과정, 위치 인코딩으로 모델이 순서를 아는 방법, 어텐션으로 토큰들이 서로 정보를 나누는 방법, 다중 헤드 어텐션으로 여러 종류 관계를 동시에 추적하는 방법, 모델의 저장된 구조가 상당 부분 사는 피드포워드 네트워크, 깊은 스택을 훈련 가능하게 만드는 잔차 스트림과 층 정규화, 모델이 실제로 출력하는 것과 생성 루프, 그리고 아키텍처와 훈련된 가중치의 구분이다.
목표도 실용적이다. 끝까지 읽으면 현대 LLM 논문이나 모델 카드를 읽으면서 각 절이 아키텍처의 어느 조각을 말하는지 알 수 있어야 한다는 것이다. 그리고 배경과 무관하게 누구나 따라올 수 있도록 작은 설명 상자가 곳곳에 등장한다고 예고한다.
스트로베리 문제의 진짜 원인
모델은 텍스트를 직접 읽지 않고 정수 ID를 읽는다. 프롬프트를 그 정수 열로 바꾸는 단계가 토큰화이고 토크나이저가 문자열을 받아 정수 열을 만드는데 각 정수는 고정된 어휘의 항목을 가리킨다. 현대 LLM 어휘는 보통 수만에서 수십만 항목을 담는다.
토큰이 온전한 단어가 아닌 이유가 효율에 있다. 보통 하위 단어 조각이고 tokenization이 token과 ization으로, running이 run과 ning으로 쪼개질 수 있다. 온전한 단어 어휘는 너무 크고 새 단어로 일반화되지 않으며 글자 단위 어휘는 너무 작아서 모델이 가장 단순한 패턴까지 처음부터 배우게 만든다. 하위 단어 토큰화가 중간에 앉아 가장 흔한 조각은 단일 토큰이 되고 드물거나 새로운 단어는 더 작은 조각으로 구성된다.
그래서 사람들이 예상하지 못한 곳에서 대가가 드러난다. 고전적 예가 스트로베리에 R이 몇 개인지 묻는 것이고 LLM들이 예전에는 틀렸다. 그런데 원인 규정이 정확하다. 그것은 모델이 세기에 실패한 것이 아니고 모델이 글자를 직접 다루지 않으며 사람이라면 글자별로 쪼갤 단어를 우연히 이루는 토큰 ID만 다룬다는 것이다.
계열별 차이도 짧게 언급된다. GPT 모델은 바이트 페어 인코딩 변형을, 라마 계열은 센텐스피스를 흔히 쓴다. 선택이 연산량과 다국어 커버리지 같은 것에 영향을 주지만 기본 형태는 같다. 텍스트가 들어가고 정수가 나온다.
임베딩이 의미를 준다
토큰 ID 1024 같은 것은 그냥 행 인덱스이고 그 자체로는 아무 뜻이 없다. 의미를 주는 것이 임베딩 행렬이라는 거대한 표다. 모든 모델이 하나씩 가지고 있고 어휘 항목마다 한 행이 있으며 각 행은 긴 숫자 벡터다. 각 행의 길이가 모델의 은닉 크기이고 많은 7B급 모델에서는 토큰당 4,096개 숫자를 뜻한다. 더 큰 모델은 보통 더 넓은 벡터를 쓴다.
흥미로운 성질이 유사성에 있다. 의미적으로 비슷한 토큰이 비슷한 벡터로 끝난다는 것이다. king의 벡터가 공간에서 queen의 벡터와 가깝고 Paris가 France와 가깝다. 그런데 강조점이 붙는다. 이 중 어느 것도 하드코딩되지 않았고 충분한 텍스트로 훈련하는 데서 출현하며 그 위치들이 텍스트를 잘 예측하게 해 주기 때문에 모델이 배운다는 것이다. 임베딩에 산술을 할 수 있고 때로 작동하는데, 유명한 예가 king에서 man을 빼고 woman을 더하면 queen에 가깝다는 것이다. 아무도 그렇게 만들라고 하지 않았는데도 임베딩 공간의 기하가 실제 의미 구조를 담는다.
그런데 이 단계의 한계가 명시된다. 모든 토큰이 자기 임베딩으로 대체됐지만 임베딩만으로는 그 토큰이 열의 어디에 앉아 있는지 아무 말도 하지 않는다는 것이다. dog의 벡터는 프롬프트의 첫 단어일 때나 다섯 번째일 때나 같은 벡터이고 그것이 문제다.
더하는 대신 회전시킨다
평범한 자기 어텐션은 단어 순서에 대한 내장 표현이 없다. 위치 신호가 없으면 dog가 bites 뒤가 아니라 앞에 왔다는 것을 직접 알 방법이 없다는 것이다. 단어 순서가 의미를 바꾸므로 각 토큰의 위치를 수식에 주입할 방법이 필요하다.
원래 트랜스포머 논문은 각 위치에 자기 숫자 패턴을 주고 다른 어떤 처리보다 먼저 각 토큰 임베딩에 직접 더하는 방식을 썼다. 위치 1은 한 패턴, 위치 5는 다른 패턴, 위치 100은 또 다른 패턴이고 패턴들은 서로 다른 진동수의 사인과 코사인 파에서 왔다. 그래서 위치 1의 dog 임베딩이 위치 5의 dog 임베딩과 달라졌는데, 더해진 위치 패턴이 달랐기 때문이다. 사인 방식이 선택된 이유 하나는 훈련에서 본 정확한 열 길이를 넘어 외삽할 수 있다는 점이었다.
그런데 덧셈 방식에 두 문제가 있었고 모델이 커지면서 중요해졌다. 첫째는 임베딩이 의미와 위치를 같은 숫자 집합에 담아야 했다는 것이고 담을 수 있는 양에 한계가 있다. 둘째는 특히 학습된 절대 위치 임베딩이 깔끔하게 일반화되지 않는다는 것이다. 2,048 토큰까지 훈련했다면 모델은 훈련 중 위치 5,000을 결코 본 적이 없고 그 위치의 임베딩은 같은 방식으로 학습되지 않았다.
현대 모델은 대부분 회전 위치 임베딩이라는 다른 방식을 쓴다. 2021년 도입돼 지금 라마와 미스트랄, 젬마, 큐원, 그리고 대부분의 다른 오픈 웨이트 계열에서 쓰인다. 직관이 명확하다. 각 토큰 벡터에 위치 정보를 더하는 대신, 쿼리와 키 벡터를 토큰 위치에 의존하는 각도로 회전시킨다는 것이다. 위치 1의 토큰은 작게 돌고 위치 100의 토큰은 더 크게 돈다. 나중에 두 토큰이 어텐션에서 비교될 때 중요한 것은 쿼리와 키 회전의 차이이고 그것이 서로 얼마나 떨어졌는지를 인코딩한다.
실용적 이점이 셋으로 정리된다. 상대 위치를 자연스럽게 인코딩하는데 이것이 어텐션이 실제로 원하는 것에 더 가깝고 더 긴 컨텍스트로 더 잘 일반화되며 모델에 새 파라미터를 더하지 않는다.
그런데 좋은 위치 인코딩이 있어도 남는 문제가 지적된다. 현대 LLM에는 문서화된 중간에서 길을 잃는 문제가 있다는 것이다. 긴 프롬프트의 시작과 끝 정보를 중간에 묻힌 정보보다 더 신뢰성 있게 쓴다. 그래서 중요한 맥락을 앞에 두라거나 핵심 정보를 끝에 반복하라는 프롬프트 조언이 실제로 도움이 된다. 모델이 프롬프트의 모든 부분을 똑같이 잘 쓰고 있지 않다는 것이다.
세 역할을 동시에 맡는다
어텐션이 아키텍처에 이름을 준 기제다. 모든 트랜스포머 층 안에서 어텐션은 한 가지를 하는데, 각 토큰이 볼 수 있게 허용된 다른 토큰들을 보고 다음에 올 것에 어느 것이 중요한지 결정하게 한다.
방법은 각 토큰에 세 역할을 동시에 주는 것이다. 각 토큰이 쿼리와 키, 밸류라는 세 새 벡터로 변환된다. 쿼리는 다른 토큰에서 무엇을 찾고 있는지 묻고 키는 자기를 보는 토큰에게 무엇을 제공하는지 말하며 밸류는 매치가 일어날 때 전달되는 것을 나른다. 같은 토큰이 세 역할을 동시에 연기하고 세 변환이 학습된 행렬이므로 각 토큰이 무엇을 찾고 무엇을 제공해야 하는지 모델이 훈련 중에 알아낸다.
매칭은 유사도 점수로 일어난다. 각 토큰의 쿼리가 볼 수 있게 허용된 각 토큰의 키와 비교되는데 조정된 내적을 쓴다. 직관적으로 두 벡터가 얼마나 정렬되는지를 재는 것이고 조정은 소프트맥스 전에 숫자를 안정적으로 유지한다. 그다음 매치 점수가 소프트맥스로 가중치가 되고 소프트맥스는 어떤 숫자 집합이든 합이 1이 되는 확률처럼 생긴 분포로 바꾼다. 매치 점수가 높은 토큰이 더 높은 가중치를 받고 그 가중치로 밸류 벡터들의 가중 평균을 취한다.
예시가 구체적이다. 어제 내가 본 그 고양이가 잠들어 있었다는 문장에서 모델이 was를 처리할 때 무엇이 잠들어 있는지 알아내야 한다. was의 쿼리 벡터가 볼 수 있는 토큰들의 키 벡터와 비교되고 cat과의 내적이 높다. was 같은 동사가 주어를 필요로 하고 cat 같은 주어가 잘 정렬되는 키 벡터를 만든다는 것을 모델이 배웠기 때문이다. yesterday와의 내적은 낮다. 소프트맥스가 그 점수를 가중치로 바꿔 cat이 높은 가중치를, yesterday가 낮은 가중치를 받고 대응하는 밸류 벡터들의 가중 합을 취하므로 cat의 밸류가 결과를 지배한다. 그래서 was의 새 표현이 이제 대부분 cat의 밸류로 형성되고 이것이 몇 자리 뒤의 토큰이 지시 대상이 되는 방식이다.
GPT 계열 특유의 제약도 설명된다. 왼쪽에서 오른쪽으로 생성하므로 위치 5의 토큰은 1부터 5까지만 볼 수 있고 6, 7, 8은 아직 생성되지 않았으니 볼 수 없다. 이것이 인과 마스킹이고 구현은 단순하다. 미래 토큰이 소프트맥스 후 사실상 영 가중치가 될 만큼 낮은 매치 점수를 받는 것이다.
해석 가능성 연구의 발견도 소개된다. 2022년 앤스로픽이 찾은 유도 헤드라는 특화된 어텐션 헤드다. A B 그리고 A 형태의 패턴을 프롬프트에서 발견하고 다음에 B가 온다고 예측하는 것을 배운다는 것이다. 모델이 A를 두 번째로 볼 때 유도 헤드가 이전에 A가 나온 곳을 돌아보고 그 뒤에 무엇이 왔는지 보고 그것을 복사한다. 그래서 위치가 규정된다. 프롬프트에서 패턴을 집어 이어 가는 능력인 문맥 내 학습의 가장 명확히 알려진 기제 중 하나라는 것이다.
비용 문제도 짚는다. 완전 어텐션에서 각 토큰이 볼 수 있는 모든 토큰과 비교하므로 프롬프트 길이를 두 배로 하면 작업량이 대략 네 배가 된다. 긴 프롬프트가 비싼 이유이고 최근 연구가 어텐션을 더 효율적으로 만드는 데 많이 쏠린 이유다.
조각이 아니라 시선이다
단일 어텐션 통과는 어느 토큰이 어느 토큰에 중요한지 결정하는 한 가지 방식만 준다. 그것으로는 부족하다는 이유가 언어에 있다. 주어와 동사 일치, 대명사와 그것이 가리키는 이름, 문장 사이 장거리 참조, 어순과 국소 구절이 동시에 일어난다.
다중 헤드 어텐션이 어텐션을 여러 번 병렬로 돌려 이를 해결하고 각 병렬 통과가 자기 더 작은 공간에서 작동한다. 각 통과를 헤드라고 부른다.
여기서 흔한 오해가 교정된다. 많은 튜토리얼을 포함해 잘못 서술되는 부분이라며 각 헤드가 원래 토큰 벡터의 문자 그대로의 조각을 받는 것이 아니라고 못 박는다. 각 헤드가 자기 학습된 투영 행렬을 가지고 전체 토큰 벡터를 자기 더 작은 쿼리와 키, 밸류 벡터로 사상한다는 것이다. 토큰당 4,096개 숫자와 헤드 32개인 모델이면 각 헤드가 보통 128차원 공간에서 일하지만 그 128개 숫자는 전체 4,096의 학습된 투영이고 고정된 조각이 아니다. 정리가 한 줄로 온다. 같은 토큰의 다른 시선이고 다른 덩어리가 아니라는 것이다.
각 헤드가 독립적으로 어텐션을 돌린 다음 모든 헤드의 출력이 이어 붙여지고 마지막 선형 층을 통과해 다시 하나의 완전한 크기 벡터로 섞인다. 그 마지막 섞기도 모델이 배운다.
흥미로운 점이 특화의 출현이다. 서로 다른 헤드가 종종 부분적으로 특화된다는 것인데, 모델은 각 헤드가 무엇을 해야 하는지 결코 듣지 못했고 특화가 훈련 중에 자연스럽게 출현한다. 연구자들이 문법을 추적하는 헤드, 어느 대명사가 어느 이름을 가리키는지 알아내는 헤드, 위치 패턴을 추적하는 헤드, 유도 헤드 등을 찾았다. 규모가 이렇게 정리된다. 단일 층에 헤드 32개가 있을 수 있고 현대 프런티어 모델은 수십 개 층을 가지므로, 전형적인 LLM은 총 수천 개 어텐션 헤드를 가지며 각각이 자기 학습된 시선을 더한다.
비용이 최근 아키텍처 변화를 낳았다는 설명이 이어진다. 각 헤드가 이미 생성된 모든 토큰에 대해 키와 밸류 벡터를 메모리에 유지해야 하는데, 새 토큰이 생성될 때 전부 처음부터 다시 계산하지 않기 위해서다. 이것이 KV 캐시이고 긴 컨텍스트에서 LLM을 돌리는 주된 메모리 비용이다.
그래서 현대 디코더 전용 LLM은 대부분 그룹 쿼리 어텐션이라는 변형을 쓴다. 모든 헤드가 자기 키와 밸류를 갖는 대신 헤드 그룹이 같은 키와 밸류 헤드를 공유하는 것이다. 수치가 붙는다. 라마2 70B는 쿼리 헤드 64개에 키와 밸류 헤드는 8개뿐이고 미스트랄 7B는 쿼리 헤드 32개에 키와 밸류 헤드 8개다. 결과는 완전 다중 헤드 어텐션과 거의 같은 정확도인데 메모리 압박과 추론 비용은 훨씬 적다.
파라미터 대부분이 사는 곳
어텐션이 토큰 사이 정보를 섞고 나면 모든 층에 사람들이 그만큼 말하지 않는 두 번째 단계가 있다. 피드포워드 네트워크다. 어텐션이 토큰끼리 대화하는 것이라면, 피드포워드 네트워크는 각 토큰이 혼자서 더 많은 처리를 하는 것이다. 모든 토큰 벡터에 독립적으로 돌고 토큰 간 섞기가 없다.
순서가 셋이다. 토큰 벡터를 더 큰 크기로 확장하고 비선형 함수를 적용하고 원래 크기로 압축해 되돌린다. 원래 트랜스포머는 4배를 썼고 현대 SwiGLU 모델은 다른 확장 크기를 자주 쓴다.
가운데 비선형 단계의 역할이 정확하게 설명된다. 비선형성은 입력을 굽히는 함수이고 가장 단순한 ReLU는 음수에 영을 출력하고 양수는 그대로 통과시킨다. 없으면 FFN은 그냥 두 선형 층을 쌓은 것이 되고 순수 선형 수학을 쌓으면 붕괴한다는 것이다. 연달아 놓인 두 선형 층은 수학적으로 단일 선형 층과 동등하고 백 개를 연달아 놓아도 여전히 하나와 동등하다. 비선형성이 그 붕괴를 막고 FFN이 단일 행렬 곱보다 풍부한 것을 할 수 있는 이유다. 원래 트랜스포머는 ReLU를, GPT와 BERT는 GELU를, 라마와 미스트랄, PaLM 같은 현대 모델은 SwiGLU를 쓴다. 확장 후 압축 구조는 그대로 남았고 비선형성 자체가 반복 개선됐다.
무게가 실린 곳에 대한 진술이 이 절의 핵심이다. 밀집 트랜스포머 모델에서 파라미터 대부분이 어텐션이 아니라 FFN에 산다는 것이다. 그리고 그 파라미터가 일반적인 것이 아니라, 모델의 저장된 사실과 의미 구조가 상당 부분 사는 곳이다. 연구자들이 FFN 안의 어떤 뉴런들이 특정 개념이나 사실과 강하게 연관돼 있음을 찾았는데, 어떤 뉴런은 에펠탑 관련 텍스트에, 다른 뉴런은 프로그래밍 언어에, 또 다른 뉴런은 과거 시제 동사에 강하게 활성화된다. 모델이 파리가 프랑스의 수도임을 안다고 할 때, 그 사실은 특정 층의 FFN 가중치와 활성화에 걸쳐 표현된다.
이 저장된 기억 성질이 흥미로운 결과를 낳는다. 재훈련 없이 훈련된 모델의 일부 사실을 직접 편집하는 방법을 연구자들이 알아냈다는 것이다. ROME 같은 방법이 특정 FFN 가중치 행렬에 표적화된 저계수 편집을 해서 에펠탑이 파리에 있다를 로마에 있다로 바꿀 수 있고 그러면 모델이 편집된 연관과 일관된 텍스트를 생성하는 경향을 보인다.
일부 현대 프런티어 모델은 밀집 FFN을 전문가 혼합으로 대체하기 시작했다. 층마다 하나의 피드포워드 네트워크 대신 병렬 FFN 여럿을 두고 각 토큰을 어느 전문가가 처리할지 고르는 작은 라우터 네트워크를 둔다. 믹스트랄 8x7B는 층마다 전문가 8개를 가지고 어떤 토큰에도 2개만 활성화된다. 총 파라미터 수는 상당히 오르는데 전문가 몇 개만 돌기 때문에 토큰당 연산은 훨씬 느리게 자란다. 수치가 붙는다. 믹스트랄 8x7B는 총 467억 파라미터인데 토큰당 약 129억을 쓴다. 그래서 추론 비용을 비례해 늘리지 않고 파라미터 수를 계속 키우는 방법이 된다.
덮어쓰지 않고 더한다
잔차 스트림이 모델을 대체하는 것이 아니라 더하는 것으로 만든다. 어텐션이 돌거나 피드포워드 네트워크가 돈 뒤에 결과가 보통 토큰 벡터를 대체하지 않고 위치별로 더해진다는 것이다. 새 벡터가 옛 벡터에 하위 블록의 출력을 더한 것이 된다.
효과가 규모로 표현된다. 서른이나 오십, 백 개 층에 걸쳐 각 층의 기여가 이전 벡터를 단순히 덮어쓰는 대신 누적된다는 것이다. 그 누적 합이 잔차 스트림이고 이상한 성질을 갖는다. 원래 입력 임베딩이 후반 층까지 직접적인 덧셈 경로를 여전히 가지고 있고 도중의 모든 하위 블록 기여와 섞인다.
기원도 밝힌다. 잔차 연결은 트랜스포머를 위해 발명되지 않았고 원래 이미지 인식을 위한 ResNet에서 왔다. 동기는 깊은 네트워크를 훈련하기가 불가능했다는 점이었다. 훈련 신호가 여러 층을 거쳐 되돌아갈 때 너무 약해지거나 때로는 너무 강해졌고 모델이 자기 실수에서 실제로 배울 수 없었다. 지름길 경로를 더하니 신호가 출력에서 입력으로 직접 흐를 수 있었고 갑자기 수백 층 네트워크를 훈련할 수 있게 됐다.
현대 해석 가능성 연구에서의 위치도 언급된다. 잔차 스트림이 중심 대상이 됐다는 것이고 모든 구성 요소와 모든 어텐션 헤드, 모든 피드포워드 네트워크, 심지어 끝의 언임베딩 단계까지 잔차 스트림에서 읽고 다시 그것에 쓴다.
층 정규화는 훨씬 실용적인 이유로 존재한다. 없으면 잔차 스트림이 안정적으로 유지되지 않는다는 것이다. 수십 번의 덧셈을 흐르는 숫자들은 위로 폭발하거나 영으로 붕괴하는 경향이 있고 어느 쪽이든 훈련이 실패한다. 층 정규화가 하위 블록 사이에서 각 토큰 벡터를 통제된 범위로 다시 조정한다.
배치와 함수가 모두 바뀌었다. 원래 2017년 트랜스포머는 각 하위 블록 뒤에 정규화를 적용했는데, 얕은 모델에서는 통했지만 깊이가 늘면서 신뢰성 있게 훈련하기 어려워졌다. 현대 트랜스포머는 GPT-2 이후로 각 하위 블록 앞에 적용하는 것이 흔하고 그것이 매우 깊은 트랜스포머를 더 쉽게 훈련하게 만든 변화 중 하나다. 함수도 바뀌었다. 많은 현대 오픈 모델이 RMSNorm이라는 더 단순한 변형을 쓰는데, 원래 층 정규화가 각 벡터를 영으로 이동시킨 뒤 숫자 크기를 재조정하는 두 일을 했다면 RMSNorm은 이동 단계를 버리고 재조정만 남긴다. 경험적으로 재조정이 이득 대부분을 나르면서 계산이 더 싸다는 것이다.
절의 결론이 이렇게 정리된다. 잔차 연결이 없으면 매우 깊은 모델을 훈련하기가 훨씬 어려워지고 층 정규화가 없으면 누적 합이 폭발하거나 붕괴하며 둘 다 있으면 수백 층 깊이의 모델을 얻는다.
마지막 토큰의 벡터 하나
모든 층이 끝나면 모델은 열의 각 토큰에 대한 벡터를 갖는다. 그런데 생성 중에 다음 단어를 예측하려면 마지막 토큰의 최종 벡터만 가져간다.
그 마지막 벡터가 가능한 다음 토큰마다 하나의 숫자로 변환된다. 어휘가 10만 토큰이면 10만 개 숫자이고 이 숫자들을 로짓이라고 부른다. 아직 확률이 아니고 양수든 음수든 어떤 크기든 될 수 있다. 소프트맥스가 로짓을 가능한 다음 토큰에 대한 확률 분포로 바꾸는데, 앞과 같은 연산이고 모델 안의 다른 위치다.
모델이 보통 매번 가장 높은 확률의 토큰을 고르지는 않는다. 디코딩 설정이 출력이 얼마나 결정적이거나 다양할지 통제한다는 것이다. 온도가 분포가 얼마나 날카로운지 바꾸고 상위 k와 상위 p가 선택지를 가장 그럴듯한 다음 토큰들로 제한한다. 그래서 같은 모델이 한 설정에서는 정확하게 느껴지고 다른 설정에서는 더 창의적으로 느껴진다.
루프도 설명된다. 토큰이 골라지면 입력에 더해지고 모델이 더 긴 열에서 다음 단계를 돌리는데 보통 KV 캐시를 재사용해 전체 접두사를 처음부터 다시 계산하지 않는다. 새 토큰에 대한 새 어텐션, 새 피드포워드, 새 최종 벡터, 새 예측이다. 모델이 열 끝 토큰을 내보내거나 길이 한계에 부딪힐 때까지 루프가 이어지고 문단 하나가 그냥 이 루프이며 한 번에 토큰 하나다.
훈련 신호에 대한 규정이 중요하다. 다음 토큰을 예측하는 이 단일 목적이 기반 LLM의 핵심 훈련 신호라는 것이다. 기반 모델은 사실 정확성이나 대화 능력, 추론, 코딩을 직접 훈련받지 않고 방대한 텍스트에서 다음 토큰을 예측하도록 훈련된다. 그다음에 사후 훈련이 지시 따르기와 선호, 안전, 대화 행동을 위해 모델을 조정할 수 있다.
효율 혁신으로 추측 디코딩이 소개된다. 작고 빠른 모델이 몇 토큰 앞을 제안하고 큰 모델이 그것들을 병렬로 검증하는 것이다. 제안된 토큰이 큰 모델의 확률 아래에서 받아들여지면 수용하고 아니면 큰 모델로 되돌아간다. 제대로 하면 출력 분포가 큰 모델만 돌린 것과 일치하는데 루프는 훨씬 빠르게 돌 수 있다.
무엇이 같고 무엇이 다른가
마지막 절이 실용적 질문에 답한다. GPT와 클로드, 제미나이, 라마 사이에 실제로 무엇이 다른가다. 태도가 정직하다. 공개된 세부가 다르고 독점 모델은 모든 아키텍처 선택을 공개하지 않는다는 것이다. 다만 이 글이 다루는 수준에서는 대체로 같은 트랜스포머 계열 설계 공간에 앉아 있다.
공통 구조가 나열된다. 토큰화, 임베딩, 위치 인코딩, 쌓인 트랜스포머 층, 각 층의 다중 헤드 어텐션과 피드포워드 네트워크, 잔차 스트림, 층 정규화, 다음 토큰 예측이다.
모델 간에 바뀌는 것은 셋이다. 서로 다른 규모의 서로 다른 훈련 데이터에서 학습된 훈련된 가중치 자체, 층 수와 어휘 크기, 헤드 수, 파라미터 수, MoE인지 밀집인지 같은 설정, 그리고 기반 모델 위에 적용된 지시 조정과 인간 피드백 학습, 안전 통제 같은 사후 훈련이다.
수렴에 대한 관찰이 이어진다. 2023년부터 2025년까지의 현대 트랜스포머 스택이 많은 진지한 프런티어와 오픈 웨이트 모델에 걸쳐 공통된 선택 집합으로 수렴했다는 것이고 서로 다른 팀이 독립적으로 그것에 도달했다. 사전 정규화 배치, RMSNorm, RoPE, SwiGLU, 그룹 쿼리 어텐션, 그리고 가장 큰 모델 일부의 전문가 혼합이다. 그리고 이것들이 한꺼번에 발명되지 않았고 원래 2017년 설계 위에 약 5년의 개선으로 누적됐다는 점을 짚는다.
마지막으로 이 수렴이 머신러닝 역사에서 이례적이라고 평가한다. 이 분야 대부분의 시간 동안 모든 문제가 자기만의 특화된 네트워크를 가졌다는 것이다. 이미지 인식이 한 종류, 언어가 다른 종류, 오디오가 세 번째였고 비전과 언어 팀은 방법을 거의 공유하지 않았다. 지금은 트랜스포머 방식 모델이 언어와 비전, 오디오, 다중 모달 시스템 전반에 나타나고 트랜스포머가 이 분야의 큰 부분을 흡수했다.
그런데 이것이 바뀔 수 있다고 덧붙인다. 맘바와 다른 상태 공간 모델이 특히 매우 긴 열에서 신뢰할 만한 대안이고 혼성 아키텍처가 탐색되고 있으며 전문가 혼합은 이미 프런티어에서 아키텍처가 무엇을 뜻하는지를 5년 전이라면 이색적으로 여겨졌을 방식으로 바꿔 놓았다. 그럼에도 결론은 지속성에 있다. 이 글의 핵심 기제들이 지속되는 부분이고 아키텍처가 바뀌어도 이것들은 어떤 열 모델이든 어떤 형태로든 풀어야 하는 문제라는 것이다.
더 생각해보기
- 스트로베리 오류가 토큰화의 구조적 결과라면, 글자 단위 처리가 필요한 작업을 모델이 근본적으로 잘하게 만들 방법은 무엇인가.
- 중간에서 길을 잃는 문제가 문서화됐는데도 남아 있다면, 프롬프트 배치 조언은 근본 해결이 아니라 우회에 그치는가.
- 각 헤드가 조각이 아니라 학습된 투영이라는 교정이 실무에서 어떤 오해를 막아 주는가.
- 파라미터 대부분이 FFN에 살고 그곳이 사실 저장소라면, 모델 압축이나 양자화는 어느 부분을 먼저 건드려야 하는가.
- ROME처럼 사실을 직접 편집할 수 있다면, 그 편집의 부작용은 어떻게 검증되는가.
- 잔차 스트림에 원래 임베딩이 후반 층까지 직접 경로를 갖는다는 성질은 해석 가능성 연구에 어떤 도구를 주는가.
- 기반 모델이 사실 정확성을 직접 훈련받지 않는다는 사실은 환각 문제를 어떻게 재정의하는가.
- 서로 다른 팀이 독립적으로 같은 선택 집합에 수렴했다면, 그것은 최적해에 도달한 것인가 아니면 같은 국소 최적에 갇힌 것인가.
- 맘바 같은 상태 공간 모델이 대안이 된다면, 이 글이 지속된다고 본 여덟 기제 중 어느 것이 먼저 형태를 바꾸는가.