제1부 기반: 언어모델과 트랜스포머
1.5 위치 인코딩·정규화·활성함수
1.4은 어텐션이 집합 연산임을 증명하고 세 개의 비용 항목을 다음 장으로 미뤘다. 어텐션이 순서를 모른다는 것, 어텐션을 수십 층 쌓으면 학습이 발산한다는 것, 그리고 어텐션만으로는 비선형 계산이 부족하다는 것. 이 장이 그 셋을 갚는다. 그런데 이것을 "트랜스포머 부록 세 편"으로 읽으면 요점을 놓친다. 위치 인코딩·정규화·활성함수는 서로 무관한 곁가지가 아니라, 어텐션이라는 핵심을 깊게 쌓아도 죽지 않고, 순서를 알고, 생각할 수 있는 몸으로 만드는 세 장기다. 셋 다 없으면 트랜스포머는 단어 가방에 불과하거나(위치 없음), 몇 층에서 발산하거나(정규화 없음), 폭만 넓은 선형 사상으로 접힌다(비선형 없음). 그래서 이 장은 각 부품을 "왜 필요한가 → 어떻게 하는가 → 무엇이 깨지는가"까지 다룬다. 마지막에는 이 셋을 조립해 오늘날 거의 모든 디코더가 공유하는 블록의 기본형 — RMSNorm + RoPE + SwiGLU — 을 수작업으로 작성한다.
1.5.1 순서를 잃은 대가
1.4.7에서 본 사실을 정확히 다시 세워 두자. 셀프어텐션 한 층이 토큰 벡터 $x_1,\dots,x_n$ 을 받아 $y_1,\dots,y_n$ 을 낼 때, 각 $y_i$ 는 모든 $x_j$ 의 가중합이고 그 가중치는 오직 $q_i\cdot k_j$ 라는 내용 유사도로만 정해진다. 이 식 어디에도 "$j$ 가 $i$ 보다 앞이냐 뒤냐", "둘이 몇 칸 떨어졌냐"가 들어갈 자리가 없다. 그 결과가 순열 등변성이다 — 입력 행을 순열 행렬 $P$ 로 뒤섞으면 출력도 똑같이 뒤섞일 뿐, 각 토큰이 받는 표현값 자체는 변하지 않는다.
$$\text{Attention}(PX) = P\,\text{Attention}(X)$$
FFN도 위치별로 같은 가중치를 독립 적용하니 이 성질을 물려받는다. 따라서 위치 정보가 없으면 트랜스포머 블록 전체가 순열 등변이고, 모델은 문장을 수열이 아니라 토큰들의 봉지로 본다. "개가 사람을 문다"와 "사람을 개가 문다"는 뜻이 정반대인데, 위치를 모르는 어텐션에는 같은 집합 $\{$개가, 사람을, 문다$\}$ 로 보인다. 주어와 목적어를 못 가린다는 뜻이고, 언어모델로서는 사망 선고다. 순서는 언어에서 장식이 아니라 의미의 골격이다 — 격, 수식 관계, 시간 순서가 전부 순서에 실린다.
RNN은 이 문제가 없었다. 토큰을 순서대로 처리하니 순서가 계산 구조에 내장돼 있었다. 어텐션은 그 순차성을 버려 병렬성을 샀고(1.4.1), 그 거스름돈으로 위치 정보를 잃었다. 그래서 트랜스포머는 순서를 따로 주입해야 한다. 어떻게 주입하느냐를 두고 십 년 가까이 방식이 진화했는데, 그 진화는 세 개의 질문에 대한 답이 바뀐 역사로 읽힌다. 무엇을 인코딩하나 — 토큰의 절대 위치(문장에서 몇 번째)인가, 두 토큰의 상대 거리($i-j$)인가. 어디에 주입하나 — 입력 임베딩에 더하나, 어텐션 점수에 더하나, Q·K 벡터 자체를 변형하나. 훈련 길이를 넘어 일반화되나 — 512로 배웠는데 4천 토큰이 들어오면 붕괴하나. 이 세 축을 들고 다섯 방식을 차례로 보면, 왜 현대 모델이 지금의 답으로 수렴했는지가 저절로 드러난다.
1.5.2 사인·코사인 — 주파수로 위치를 쓰다
가장 단순한 답부터. 각 위치 $pos$ 에 고유한 벡터를 만들어 토큰 임베딩에 더한다. 원조 트랜스포머는 이 위치 벡터를 학습하지 않고 서로 다른 주파수의 사인·코사인으로 계산했다. 차원 $d$ 의 위치 벡터 성분을 짝수·홀수 자리에 대해
$$PE_{(pos,\,2i)} = \sin\!\left(\frac{pos}{10000^{2i/d}}\right), \qquad PE_{(pos,\,2i+1)} = \cos\!\left(\frac{pos}{10000^{2i/d}}\right)$$
로 둔다. 이 식의 겉모습은 임의적으로 보이지만, 주파수의 설계에 실린 뜻이 이 절의 핵심이다. 각 차원 쌍의 각속도는 $\theta_i = 10000^{-2i/d}$ 이고, 그 파장(한 바퀴 회전하는 데 걸리는 위치 수)은 $2\pi/\theta_i = 2\pi\cdot 10000^{2i/d}$ 다. $i$ 를 $0$ 부터 $d/2-1$ 까지 훑으면 파장이 $2\pi\approx 6.3$ 토큰(가장 빠른 쌍)에서 $2\pi\cdot 10000\approx 63000$ 토큰(가장 느린 쌍)까지 기하급수적으로 벌어진다. 낮은 차원은 초침처럼 빠르게 회전해 바로 옆 위치를 세밀히 구분하고, 높은 차원은 시침처럼 느리게 회전해 수만 토큰 떨어진 위치까지 큰 스케일로 구분한다.
왜 기하급수인가, 왜 등간격이 아닌가. 여기가 놓치기 쉬운 대목이다. 자릿수가 다른 시계 여러 개를 겹쳐야 넓은 범위를 조밀하게 덮을 수 있기 때문이다. 이진수를 떠올리면 정확하다 — 정수를 이진 자릿값(1, 2, 4, 8, …)으로 쓰면 몇 비트로 큰 수를 표현하듯, 서로 다른 주기의 파동을 겹치면 $d/2$ 개 쌍으로 $6$ 부터 $6$ 만까지의 스케일을 로그 격자로 덮는다. 주파수를 등간격으로 조밀하게 두면 전부 비슷한 스케일에 몰려, 가까운 위치는 잘 구분해도 먼 위치는 죄다 구분되지 않거나 그 반대가 된다. 기하 간격은 "가까움도 멂도 동시에" 표현 가능하게 하는 배분이다.
이 형태를 택한 두 번째 이유가 더 깊고, 실은 이 장 뒤쪽의 RoPE로 곧장 이어진다. 한 쌍 $(\sin(pos\,\omega),\,\cos(pos\,\omega))$ 을 보면, $k$ 만큼 떨어진 위치의 값이 삼각함수 덧셈정리로
$$\sin\!\big((pos{+}k)\omega\big) = \sin(pos\,\omega)\cos(k\omega) + \cos(pos\,\omega)\sin(k\omega)$$
처럼 풀린다. 즉 $PE_{pos+k}$ 는 $PE_{pos}$ 를 각도 $k\omega$ 만큼 회전시킨 것 — $pos$ 와 무관하게 오직 $k$ 에만 의존하는 고정 선형 사상으로 표현된다. 그래서 모델이 원리상 "$k$ 칸 떨어진 위치"를 선형 연산으로 근사할 수 있고, 훈련 때 못 본 위치로 외삽할 여지도 생긴다 — 는 것이 원 논문의 기대였다. 실제로 그 외삽은 강하지 않다는 것이 나중에 드러났지만, "위치를 회전으로 다루면 상대 위치가 각도 차이로 튀어나온다"는 단초는 여기 이미 있었다. RoPE는 이 회전을 입력에 더하는 대신 Q·K에 직접 적용해 그 단초를 완성한 것이다.
한 가지 자주 받는 질문을 정리하고 넘어가자. 위치 벡터를 왜 이어 붙이지(concat) 않고 더하나. 더하면 위치와 내용이 같은 차원을 공유해 섞이는데 괜찮은가. 괜찮다 — 그리고 이유가 재미있다. $d_{model}$ 이 수천 차원이면 무작위로 뽑은 두 벡터는 거의 직교한다(고차원의 축복). 네트워크는 필요하면 학습으로 내용과 위치를 거의 겹치지 않는 부분공간에 나눠 담을 수 있어, 더해도 서로를 지우지 않는다. 반면 이어 붙이면 위치 전용으로 차원을 영구히 떼어 줘야 해서, 같은 표현력에 더 넓은 $d_{model}$ 이 든다. 덧셈은 차원을 한 톨도 더 쓰지 않고 위치를 추가하는, 무비용에 가까운 주입이다.
1.5.3 학습된 위치 임베딩과 절대 방식의 한계
또 다른 갈래는 위치 벡터를 계산하지 않고 단순히 배우게 하는 것이다. 크기 $(L_{\max}, d)$ 의 학습 가능한 표를 두고, 위치 $pos$ 의 행을 토큰 임베딩에 더한다. GPT-2·BERT 계열이 이 방식을 썼다. 단순하고, 데이터에서 유용한 위치 패턴을 알아서 찾는다는 장점이 있다. 사인·코사인이 "위치는 이렇게 생겼을 것"이라는 사전 지식을 수작업으로 주입한다면, 학습된 임베딩은 그 형태마저 데이터에 맡긴다.
대신 표의 크기가 $L_{\max}$ 로 고정되는 것이 치명적이다. 훈련 때 정한 최대 길이를 넘는 위치에는 임베딩 자체가 존재하지 않는다 — 512로 학습했으면 513번째 자리의 벡터가 아예 없다. 외삽이 원천적으로 불가능하고, 컨텍스트를 늘리려면 표를 키워 재학습하거나 억지로 보간해야 한다. 사인·코사인은 적어도 임의 위치에 값을 계산은 할 수 있어 이 장벽은 없지만, 앞서 봤듯 그렇게 계산한 먼 위치의 값이 훈련 분포 밖이라 품질이 유지되진 않는다.
두 절대 방식의 실제 공통 약점은 더 근본적인 데 있다. 둘 다 위치를 입력에 한 번 더하고 마는 구조라, 어텐션이 정작 알고 싶은 것을 직접 말해 주지 않는다. 어텐션 점수 $q_i\cdot k_j$ 가 궁금한 것은 "$i$ 와 $j$ 가 얼마나 떨어졌나"인데, 절대 방식은 각 토큰에 절대 좌표만 쥐여 주고 그 차이는 모델이 알아서 빼서 쓰라고 맡긴다. 게다가 그 좌표는 첫 층 입력에만 추가되어 있어, 층이 깊어질수록 잔차 스트림 속에서 다른 특성에 묻혀 희미해진다. "관계는 거리로 정의되는데 왜 좌표만 주나"라는 불만이 다음 아이디어를 낳았다.
1.5.4 상대 위치 — 거리가 관계다
언어에서 실제로 중요한 것은 절대 위치보다 상대 거리인 경우가 많다. "바로 앞 단어", "세 칸 뒤 명사", "가장 가까운 동사"처럼 문법 관계는 거리로 정의된다. 같은 구절이 문장 5번째에 오든 500번째에 오든 내부 관계는 같아야 한다. 이 통찰을 정면으로 구현한 것이 상대 위치 인코딩이다. 대표적으로 T5의 상대 위치 바이어스는 위치를 입력에 더하는 대신 어텐션 점수에 직접 스칼라를 더한다.
$$\text{score}_{ij} = \frac{q_i^\top k_j}{\sqrt{d}} + b_{\,r(i-j)}$$
$b$ 는 학습되는 스칼라 표이고, $r(i-j)$ 는 상대 거리 $i-j$ 를 몇 개의 버킷으로 묶는 함수다. 가까운 거리는 버킷 하나씩 세밀히 나누고, 먼 거리는 로그 스케일로 뭉뚱그린다 — 옆 토큰과 세 칸 뒤는 구별할 가치가 크지만 300칸 뒤와 305칸 뒤는 거의 같으니 합리적인 배분이다. 바이어스 집합은 헤드마다 달라, 어떤 헤드는 근거리에 어떤 헤드는 원거리에 특화된다. 초기의 Shaw et al.이나 Transformer-XL도 같은 계열로, 키·값에 상대 위치 항을 더했다.
장점은 명확하다. 위치의 차이를 직접 모델링하니 길이 일반화에 유리하고, 절대 좌표에 매이지 않는다. 하지만 대가가 있고, 그 대가가 이 방식을 1선에서 물러나게 했다. 어텐션 점수 행렬 $n\times n$ 의 칸마다 상대 항을 조회·더해야 해서 구현이 부하가 크고, 특히 서빙 최적화와 궁합이 나쁘다. KV 캐시(5.1)는 과거 키·값을 고정해 두고 재사용하는 것이 전제인데, 상대 바이어스는 점수 계산 시점에 매번 위치 차이를 개입시켜 그 흐름에 이물처럼 섞인다. FlashAttention(1.4.17)처럼 점수 행렬을 아예 물질화하지 않고 타일로 처리하는 커널과도 매끄럽게 안 맞는 형태가 많았다. "상대 위치의 이점"과 "절대 위치의 가벼운 구현"을 동시에 가질 수는 없을까 — 이 물음의 우아한 답이 RoPE다.
1.5.5 RoPE — 절대로 회전시켜 상대를 남기다
RoPE(Rotary Position Embedding, RoFormer)의 착상은 한 문장이다. 각 토큰의 Q·K 벡터를 그 절대 위치에 비례하는 각도만큼 회전시킨다. 그러면 두 벡터의 내적은 회전각의 차이 — 즉 상대 위치 — 에만 의존한다. 절대 위치로 회전을 적용했는데 어텐션 점수에는 상대 위치만 남는다. 절대의 단순함과 상대의 이점을 한 번에 얻는, 대칭성을 이용한 기법이다. 앞 절 사인·코사인에서 본 "회전이 상대 위치를 만든다"는 단초를, 입력이 아니라 점수를 만드는 Q·K에 심은 것이다.
$d$ 차원 벡터를 2차원씩 $d/2$ 개의 쌍으로 나눈다. 한 쌍 $(x_{2i}, x_{2i+1})$ 을, 위치 $m$ 에서 각도 $m\theta_i$ 만큼 회전 행렬로 회전시킨다.
$$R_m^{(i)} = \begin{pmatrix} \cos m\theta_i & -\sin m\theta_i \\ \sin m\theta_i & \phantom{-}\cos m\theta_i \end{pmatrix}, \qquad \theta_i = b^{-2i/d}\ \ (b\ \text{는 기저, 보통}\ 10000)$$
이제 왜 상대 위치가 남는지를 끝까지 유도하자. 질의 $q$ 가 위치 $m$, 키 $k$ 가 위치 $n$ 에 있으면 회전 후 내적은
$$(R_m q)^\top (R_n k) = q^\top R_m^\top R_n\, k$$
이다. 관건은 가운데의 $R_m^\top R_n$ 하나다. 2차원 회전 행렬은 각을 더하며 합성되고($R_\alpha R_\beta = R_{\alpha+\beta}$), 전치는 반대 방향 회전이다($R_\alpha^\top = R_{-\alpha}$). 이 두 성질은 회전 행렬을 직접 곱해 보면 삼각함수 덧셈정리로 정확히 떨어진다.
$$R_{-m\theta}R_{n\theta} = \begin{pmatrix} \cos m\theta & \sin m\theta \\ -\sin m\theta & \cos m\theta \end{pmatrix}\begin{pmatrix} \cos n\theta & -\sin n\theta \\ \sin n\theta & \cos n\theta \end{pmatrix} = \begin{pmatrix} \cos(n{-}m)\theta & -\sin(n{-}m)\theta \\ \sin(n{-}m)\theta & \cos(n{-}m)\theta \end{pmatrix} = R_{(n-m)\theta}$$
(왼쪽 위 원소만 확인해도 $\cos m\theta\cos n\theta + \sin m\theta\sin n\theta = \cos(n-m)\theta$ 로 덧셈정리 그대로다.) 그래서 $R_m^\top R_n = R_{n-m}$ — 두 절대 회전의 곱이 상대 회전 하나로 접힌다. 결국
$$(R_m q)^\top (R_n k) = q^\top R_{n-m}\, k$$
로, 어텐션 점수는 절대 위치 $m, n$ 이 각각 사라지고 오직 차이 $n-m$ 에만 의존한다. 위치를 절대적으로 넣었는데 결과가 상대적으로 나오는 이유가 이 한 줄의 대수에 다 들어 있다.
$d$ 차원 전체에서는 이 $2\times2$ 회전이 $d/2$ 개 쌓인 블록 대각 행렬 $R_m$ 이 되고, 각 쌍마다 주파수 $\theta_i = 10000^{-2i/d}$ 가 다르다. 사인·코사인 절대 인코딩과 똑같은 다중 주파수 구조가 여기서 다시 나온다 — 낮은 차원(높은 주파수)은 빠르게 회전해 근거리 관계를, 높은 차원(낮은 주파수)은 천천히 회전해 장거리 관계를 담는다. 결정적 차이는 주입 지점이다. 절대 인코딩은 입력 임베딩에 한 번 더하고 말지만, RoPE는 매 층의 Q·K에 회전을 적용한다. 그리고 값 V에는 걸지 않는다 — 위치는 "누구에게 주목할지"(점수)에만 개입하고 "무엇을 가져올지"(내용)는 변경하지 않는다. 이 구분을 놓쳐 V에까지 회전을 적용하면 위치가 실어 나르는 내용을 오염시켜 성능이 붕괴한다.
실제 구현은 이 블록 대각 행렬을 곱하지 않는다 — 대부분이 0인 희소 행렬이라 낭비다. 대신 원소별 연산으로 같은 결과를 낸다.
$$\text{RoPE}(x)_m = x \odot \cos(m\boldsymbol{\theta}) + \text{rotate\_half}(x) \odot \sin(m\boldsymbol{\theta})$$
여기서 rotate_half 는 쌍을 $(-x_{2i+1}, x_{2i})$ 로 뒤섞는 연산이다. 곱셈·덧셈 몇 번이면 끝나므로 학습 파라미터가 하나도 없고(회전각은 계산되지 상수), FlashAttention·KV 캐시와도 자연스럽게 맞물린다. T5 상대 바이어스가 서빙 커널과 부딪혔던 자리에서, RoPE는 회전을 Q·K에 미리 발라 두면 그다음은 평범한 내적이라 아무 마찰이 없다. 상대 위치의 이점을 절대 위치만큼 저렴하게 얻는다 — 이것이 RoPE가 사실상의 표준이 된 공학적 이유다.
1.5.6 수계산 — RoPE가 정말 상대만 남기나
식은 눈으로 미끄러진다. 숫자를 넣어 두 번 확인하자. 단순하게 하려고 $\theta=1\ \text{rad/위치}$ 로 두는데(실제 주파수는 이보다 훨씬 작다), 한 개의 2D 쌍만 본다.
먼저 내적을 직접 계산한다. 질의 $q=(1,0)$ 이 위치 $m=1$ 에, 키 $k=(1,0)$ 이 위치 $n=4$ 에 있다. 회전하면
$$R_1 q = (\cos 1,\ \sin 1) \approx (0.540,\ 0.841), \qquad R_4 k = (\cos 4,\ \sin 4) \approx (-0.654,\ -0.757)$$
이고 내적은
$$(R_1 q)^\top (R_4 k) \approx 0.540\times(-0.654) + 0.841\times(-0.757) \approx -0.353 - 0.637 = -0.990$$
이다. 이제 상대 위치가 예측한 값과 맞춰 본다. $q=k=(1,0)$ 이므로 $q^\top R_{n-m} k = \cos(n-m) = \cos 3 \approx -0.990$. 정확히 일치한다. $m=1,\ n=4$ 라는 절대 위치는 사라지고 거리 $3$ 만 점수에 남았다. 같은 쌍을 $m=101,\ n=104$ 로 옮겨도 점수는 여전히 $\cos 3$ 이다 — 문장 앞이든 뒤든 거리 3의 관계는 동일하게 인코딩된다.
두 번째로, $R_m^\top R_n = R_{n-m}$ 자체를 행렬로 눈앞에서 확인하자. 위와 같은 $\theta=1,\ m=1,\ n=4$ 로,
$$R_1^\top = \begin{pmatrix} 0.540 & 0.841 \\ -0.841 & 0.540 \end{pmatrix}, \qquad R_4 = \begin{pmatrix} -0.654 & 0.757 \\ -0.757 & -0.654 \end{pmatrix}$$
를 곱하면
$$R_1^\top R_4 = \begin{pmatrix} 0.540(-0.654)+0.841(-0.757) & 0.540(0.757)+0.841(-0.654) \\ -0.841(-0.654)+0.540(-0.757) & -0.841(0.757)+0.540(-0.654) \end{pmatrix} = \begin{pmatrix} -0.990 & -0.141 \\ 0.141 & -0.990 \end{pmatrix}$$
이다. 이것을 $R_3 = \big(\begin{smallmatrix}\cos 3 & -\sin 3\\ \sin 3 & \cos 3\end{smallmatrix}\big) = \big(\begin{smallmatrix}-0.990 & -0.141\\ 0.141 & -0.990\end{smallmatrix}\big)$ 과 나란히 놓으면 원소까지 같다($\sin 3\approx 0.141$). 두 절대 회전의 곱이 상대 회전 하나로 접히는 것이 추상 대수가 아니라 눈에 보이는 계산임을 확인한 셈이다.
이 두 계산은 한 쌍, 한 주파수의 이야기다. 실제 RoPE는 $d/2$ 개 쌍이 저마다 다른 $\theta_i$ 로 회전해, 전체 점수는 여러 주파수에서 나온 $\cos((n-m)\theta_i)$ 항들의 합으로 쌓인다. 높은 주파수 쌍은 거리 몇 칸에도 부호가 급격히 바뀌어 근거리를 예민하게 구분하고, 낮은 주파수 쌍은 수천 칸에 걸쳐 완만히 변해 장거리 추세를 담는다. 이 다중 스케일 합성이 RoPE가 짧은 의존과 긴 의존을 동시에 표현하는 방식이고, 다음 절에서 볼 롱컨텍스트 확장이 왜 "주파수를 조절하는" 문제로 귀결되는지의 배경이다.
1.5.7 RoPE와 롱컨텍스트 — 통념의 과장을 걷어내고
RoPE가 긴 컨텍스트의 사실상 표준이 된 데는 이유가 있지만, "RoPE는 외삽이 잘 된다"는 흔한 통념에는 과장이 섞여 있다. 나눠 보자.
먼저 실제 강점. RoPE는 상대 거리를 직접 인코딩하므로, 훈련 때 못 본 절대 위치라도 익숙한 상대 거리 범위 안이면 처리 방식이 일관된다. 학습된 표가 없어 위치가 표 크기에 갇히지도 않는다 — 각도만 계산하면 임의의 위치에 회전을 적용한다. 그리고 가장 중요한 성질은, 각 위치의 회전량이 기저 $b$ 와 주파수라는 조정 변수로 통제된다는 것이다. 이 조정 변수를 바꿔 회전 속도를 늦추면, 훈련 때 익힌 각도 범위 안으로 더 긴 위치를 압축해 담을 수 있다. 위치 보간(PI)·NTK·YaRN 같은 값싼 컨텍스트 확장 기법이 전부 이 조정 변수를 조작하는 것들이고, 그래서 RoPE 모델은 재학습을 거의 안 하거나 조금만 하고도 컨텍스트를 늘리기 쉽다(구체 기법은 1.6).
RoPE를 두고 흔히 "외삽이 잘 된다"고 하는데, 그대로는 사실이 아니다. 훈련 길이 $L$ 로 배운 RoPE 모델에 아무 조치 없이 $2L$ 을 넣으면 품질이 눈에 띄게 붕괴한다. 이유는 앞 절의 다중 주파수 그림에서 곧장 나온다. 낮은 주파수 쌍은 파장이 수만 토큰이라, 훈련 길이 안에서는 한 바퀴를 채 회전하지 못한다 — 모델은 그 쌍의 회전각을 좁은 구간에서만 봤다. 그런데 위치가 훈련 길이를 넘어가면 그 쌍에 훈련 때 한 번도 안 나온 큰 회전각이 들어오고, 어텐션이 처음 보는 각도 앞에서 갈피를 잃는다. 그래서 RoPE가 롱컨텍스트에 유리하다는 말의 실제 뜻은 "구조 덕분에 값싼 보간·재조정으로 길이를 늘리기 쉽다"이지, "그냥 길어져도 된다"가 아니다. 이 구분을 흐리면 1.6에서 다룰 위치 보간이 왜 필요한지가 전부 안 보인다 — 보간은 바로 이 "훈련 밖 각도" 문제를 조정 변수로 되돌려 넣는 처방이다.
1.5.8 ALiBi — 위치 임베딩 없이 거리 페널티로
RoPE와 다른 길로 롱컨텍스트를 노린 것이 ALiBi(Attention with Linear Biases)다. 발상은 한층 더 단순하다. 위치 임베딩을 아예 쓰지 않고, 어텐션 점수에 거리에 비례하는 페널티를 더한다.
$$\text{score}_{ij} = \frac{q_i^\top k_j}{\sqrt{d}} + m_h\cdot(j-i)$$
$i$ 는 질의, $j$ 는 키 위치이고 인과 어텐션이라 $j\le i$ 이므로 $(j-i)\le 0$ — 멀리 있는 키일수록 점수가 선형으로 감소한다. 즉 다른 조건이 같으면 가까운 토큰에 더 주목한다. 기울기 $m_h$ 는 헤드마다 다른 고정 상수(학습하지 않음)로, 헤드 수 $n$ 에 대해 $2^{-8/n},\ 2^{-16/n},\dots$ 같은 기하수열을 쓴다. 어떤 헤드는 가파른 페널티로 바로 옆만 보고, 어떤 헤드는 완만한 페널티로 멀리까지 참조하게 역할을 나눈다. 위치가 점수에 스칼라 편향으로만 들어가니 파라미터도, 위치 임베딩도, Q·K 변형도 없다.
ALiBi의 실제 강점은 외삽이다. 페널티는 임의의 거리로 자연스럽게 연장되므로, 짧게 훈련한 모델을 훨씬 긴 입력에 그대로 써도 성능이 비교적 완만하게 유지된다고 원 논문은 보고했다 — RoPE가 보간이라는 손질을 요구하는 자리에서 ALiBi는 손질 없이 길어진다. 대신 약점도 뚜렷하다. 선형 페널티가 최근성 편향을 강제하니, 아주 먼 위치의 정보를 정밀하게 끌어와야 하는 과제 — 긴 문서에서 바늘 하나 찾기(needle in a haystack) 같은 — 에서는 불리할 수 있다. 위치를 각도로 풍부하게 표현하는 RoPE에 비해 유연성이 떨어진다는 평가도 있다. 어느 쪽이 롱컨텍스트에 무조건 낫다고 단정할 수는 없다. ALiBi는 외삽이 매끄러운 대신 원거리 정밀도가 약하고, RoPE는 원거리 표현이 풍부한 대신 확장에 보간이 필요하다. 현대 대형 모델의 다수가 RoPE 계열로 수렴한 것은 이 트레이드오프에서 "표현력 + 값싼 확장"을 택한 결과이지, ALiBi가 틀려서가 아니다 — "훈련은 짧게, 추론은 길게"가 지상 목표인 상황에서는 ALiBi가 여전히 매력적인 대안이다.
1.5.9 다섯 방식을 한자리에 놓고 보면
지금까지의 다섯 방식을 성질 중심으로 늘어놓으면 진화의 방향이 한눈에 드러난다.
| 방식 | 절대/상대 | 주입 지점 | 학습 파라미터 | 무조치 외삽 | 확장 용이성 | 성격 |
|---|---|---|---|---|---|---|
| 사인·코사인(고정) | 절대 | 입력 임베딩에 덧셈 | 없음 | 약함 | 낮음 | 원조, 회전 방식의 원형 |
| 학습된 위치 임베딩 | 절대 | 입력 임베딩에 덧셈 | 있음(표) | 불가(표 밖 없음) | 낮음 | GPT-2·BERT 계열 |
| 상대 바이어스(T5류) | 상대 | 어텐션 점수에 바이어스 | 있음(버킷) | 중간 | 중간 | 구현 부담 |
| RoPE | 절대로 넣어 상대로 | Q·K 회전(매 층) | 없음 | 약함(그대로면 붕괴) | 높음(보간·NTK·YaRN) | 현대 다수 |
| ALiBi | 상대(거리 페널티) | 어텐션 점수에 선형 바이어스 | 없음 | 강함 | 높음 | 최근성 편향 |
읽는 법은 이렇다. 파라미터 없이 상대 위치의 이점을 얻으면서, 값싼 보간으로 컨텍스트를 늘릴 수 있다는 조합이 RoPE를 사실상의 기본값으로 높였다. 절대 인코딩 둘은 대형 사전학습의 1선에서는 드물어졌지만 원리를 이해하는 출발점이고, 사인·코사인의 회전 아이디어가 RoPE로 자란 계보를 보면 "밀려난" 게 아니라 "흡수된" 것에 가깝다. 상대 바이어스는 옳은 목표(거리를 직접 모델링)를 부하가 큰 구현으로 겨냥했다가, RoPE가 같은 목표를 적은 비용으로 달성하며 대체됐다. ALiBi는 다른 봉우리에 오른 별개의 답이다. 이 표를 위치 인코딩의 결론표로 읽지 말고, "무엇을·어디에 주입하나, 확장이 쉬운가"라는 세 축이 다섯 설계를 어떻게 갈랐는지의 지도로 읽는 편이 오래 남는다.
1.5.10 왜 정규화가 깊은 망을 살리나
위치 인코딩이 "무엇을 보게 할까"였다면, 정규화는 "이 블록을 수십 층 쌓아도 학습이 터지지 않게" 하는 장치다. 문제부터 정확히 보자. 깊은 망의 근본 골칫거리는 활성값의 스케일이 층을 지나며 걷잡을 수 없이 커지거나 작아지는 것이다. 각 층이 앞 층 출력을 입력으로 받으니, 스케일이 층마다 조금씩 어긋나면 그 어긋남이 층 수에 대해 지수적으로 증폭된다 — 층당 평균 1.5배면 40층이면 $1.5^{40}\approx 1.1\times10^7$ 배, 0.7배면 그만큼 소멸이다. 1.4.1에서 RNN의 야코비안 곱이 시간축으로 폭주·소실하던 바로 그 병이 여기서는 깊이축으로 재발한다.
이 스케일 어긋남이 세 가지를 동시에 망친다. 순전파에서 값이 발산하거나 0으로 소멸하고, 역전파에서 기울기가 같은 이유로 폭발·소실해 학습이 멈추거나 급등하며, 앞 층이 조금만 바뀌어도 뒤 층이 받는 입력 분포가 변동해 학습이 계속 불안정해진다. 정규화는 각 층의 활성값을 일정한 통계(평균·분산 또는 크기)로 되돌려 이 연쇄를 끊는다. 효과는 경험적으로 잘 확립돼 있다 — 손실 지형이 매끄러워져 더 큰 학습률을 견디고, 가중치 초기값이 조금 어긋나도 스케일이 교정돼 초기화에 덜 민감해지며, 층 간 표현 스케일이 통제돼 깊은 망이 수렴한다.
다만 "정규화가 왜 돕는가"의 정확한 메커니즘은 아직 논쟁 중이라는 점은 정직하게 말해 둘 값어치가 있다. 초기의 "내부 공변량 이동(뒤 층이 받는 분포가 흔들리는 것) 감소" 설명은, 이후 손실 지형 평활화가 더 본질이라는 연구에 도전받았다. 확실한 것은 경험적 효과(안정성·큰 학습률·초기화 강건성)이고, 그 이론적 근거는 완전히 정착되지 않았다. 이 애매함을 "그냥 통하니 쓴다"로 넘기지 말고, 무엇이 검증됐고 무엇이 미결인지 구분해 두는 편이 나중에 정규화 변형을 판단할 때 변동하지 않는다.
트랜스포머가 하필 층 정규화(LayerNorm) 계열을 쓰고 배치 정규화(BatchNorm)를 안 쓰는 이유도 여기 얽혀 있다. BatchNorm은 배치 안의 다른 샘플들을 가로질러 통계를 낸다 — 이 채널의 평균을 배치 32개 예시에서 구하는 식이다. 언어모델에는 이것이 세 겹으로 안 맞는다. 시퀀스 길이가 가변이라 위치마다 통계에 참여하는 샘플 수가 다르고, 사전학습은 메모리 탓에 유효 배치가 작을 때가 있어 통계가 불안하며, 결정적으로 자기회귀 추론은 토큰을 하나씩 생성하니 "배치를 가로지른 통계"라는 개념 자체가 성립하지 않는다 — 생성 시점에 그 위치의 다른 샘플이 없다. LayerNorm은 각 토큰 벡터 하나 안의 특징 차원만으로 통계를 내므로 배치·길이에 완전히 무관하고 토큰마다 독립적이다. 학습과 추론이 같은 계산을 하고, 스트리밍 생성에도 아무 문제가 없다. 언어모델에 적합한 정규화다.
1.5.11 LayerNorm과 RMSNorm — 무엇을 빼도 되나
LayerNorm은 한 토큰의 특징 벡터 $x\in\mathbb{R}^d$ 에 대해 특징 차원을 가로질러 평균과 분산을 구해 정규화한 뒤, 학습되는 이득 $\gamma$ 와 편향 $\beta$ 로 다시 스케일·이동한다.
$$\mu = \frac{1}{d}\sum_{i=1}^{d} x_i, \qquad \sigma^2 = \frac{1}{d}\sum_{i=1}^{d}(x_i-\mu)^2, \qquad \text{LN}(x) = \gamma\odot\frac{x-\mu}{\sqrt{\sigma^2+\epsilon}} + \beta$$
여기엔 두 조작이 들어 있다. 재중심화 — 평균 $\mu$ 를 빼 중심을 0으로. 재스케일 — 표준편차로 나눠 분산을 1로. $\gamma,\beta$ 는 정규화가 표현력을 지나치게 옥죄지 않도록 모델이 되돌릴 여지를 주고, $\epsilon$ 은 0 나눗셈을 막는 작은 수다.
RMSNorm은 여기서 재중심화 전체를 버린다. 평균을 빼지 않고, 벡터의 제곱평균제곱근(RMS)으로만 나눈다.
$$\text{RMS}(x) = \sqrt{\frac{1}{d}\sum_{i=1}^{d} x_i^2 + \epsilon}, \qquad \text{RMSNorm}(x) = \gamma\odot\frac{x}{\text{RMS}(x)}$$
편향 $\beta$ 도 보통 생략한다. 남는 것은 크기 정규화뿐 — 평균 계산도, 뺄셈도, 편향도 없다. 이것이 왜 충분한가에 대한 가설은 이렇다. LayerNorm의 이득 대부분은 재스케일(크기를 일정하게)에서 오고, 재중심화의 기여는 작다. 그렇다면 평균 관련 연산을 다 걷어내도 품질은 유지되면서 계산이 저렴해진다 — 통계 패스가 둘에서 하나로 줄고, 뺄셈과 편향 파라미터가 사라진다. 대규모 학습·추론에서 매 층·매 토큰마다 반복되는 이 절감은 무시할 수 없다.
숫자로 개략을 파악하자. 작은 벡터 $x=(2,-1,0,3)$ 에 두 정규화를 적용해 본다. 평균 $\mu = 4/4 = 1$, 분산 $\sigma^2 = (1+4+1+4)/4 = 2.5$, $\sigma\approx 1.581$ 이므로 LayerNorm은(이득 전) $\frac{x-\mu}{\sigma} = (1,-2,-1,2)/1.581 \approx (0.63,\ -1.26,\ -0.63,\ 1.26)$ 이다. RMS는 $\sqrt{(4+1+0+9)/4}=\sqrt{3.5}\approx 1.871$ 이라 RMSNorm은 $x/\text{RMS} \approx (1.07,\ -0.53,\ 0,\ 1.60)$ 이다. 둘이 꽤 다르다 — 이 예제는 평균이 1로 0에서 멀기 때문이다. 여기가 핵심이다. RMSNorm이 LayerNorm과 갈리는 유일한 지점은 바로 이 평균이 0이 아닐 때뿐이고, 실제 대형 모델의 활성 벡터는 수천 차원에 걸쳐 평균이 0 근처에 앉는 경우가 많다(앞 층의 정규화와 대체로 대칭적인 활성 분포 덕이다). 그런 벡터에서는 $\mu\approx 0$ 이라 재중심화가 거의 아무 일도 안 하고, 두 정규화 출력이 사실상 겹친다. RMSNorm의 내기는 "평균은 어차피 0 근처니 빼는 수고를 아끼자"인 셈이고, 경험적으로 이 내기가 대체로 맞아 현대 대형 디코더의 다수가 RMSNorm으로 수렴했다.
| 항목 | LayerNorm | RMSNorm |
|---|---|---|
| 재중심화(평균 빼기) | 함 | 안 함 |
| 재스케일 | 표준편차로 | RMS로 |
| 이득 $\gamma$ | 있음 | 있음 |
| 편향 $\beta$ | 있음 | 보통 없음 |
| 통계 패스 | 평균+분산 | RMS 한 번 |
| 상대 비용 | 기준 | 더 쌈 |
이것을 "RMSNorm이 항상 더 낫다"로 읽으면 곤란하다. 정확히는 "대체로 동등한 품질을 더 싸게"에 가깝고, 과제·규모에 따라 재중심화가 도움이 되는 경우도 있다. 채택이 RMSNorm으로 기운 것은 비용 대비 효율의 문제이지 LayerNorm이 틀려서가 아니다.
1.5.12 Pre-LN과 Post-LN — 정규화를 어디에 두나
정규화의 수식만큼 중요한 것이 그 위치다. 트랜스포머 블록에는 잔차 연결이 있고(1.4.12), 정규화를 잔차 덧셈 전에 두느냐 후에 두느냐로 깊은 모델의 학습 가능 여부가 갈린다. 원조 Post-LN은 서브층을 잔차에 더한 뒤 정규화한다: $x_{out} = \text{Norm}(x + \text{Sublayer}(x))$. 현대 표준 Pre-LN은 서브층에 넣기 전에 정규화하고 잔차 경로는 정규화를 거치지 않는다: $x_{out} = x + \text{Sublayer}(\text{Norm}(x))$.
차이는 잔차 스트림을 보면 분명하다. 1.4에서 잔차를 "입력에서 출력까지 뚫린 덧셈 고속도로"로 봤는데, Pre-LN에서는 $x$ 가 정규화를 거치지 않고 이 고속도로를 깨끗한 항등 경로로 관통한다. Post-LN에서는 매 층의 잔차 합이 Norm을 통과하므로 그 고속도로가 매번 정규화로 억제된다. 이 구조 차이가 곧장 기울기로 이어진다. Xiong et al.(2020)의 분석은, 초기화 시점에 Post-LN은 출력에 가까운 층일수록 기울기가 커져 깊을수록 불안정하고 성공적 학습에 긴 학습률 웜업이 사실상 필수임을, 반면 Pre-LN은 기울기가 층에 걸쳐 잘 조절돼 웜업 없이도 깊게 안정적으로 학습됨을 보였다. 1.4.12에서 잔차의 항등항 $I$ 가 기울기를 소실 없이 전달한다고 했는데, Pre-LN은 그 항등 경로를 Norm으로 방해하지 않아 그 이점을 온전히 살리고, Post-LN은 경로 위에 Norm을 추가해 일부를 잠식한다. 그래서 수십에서 수백 층을 쌓는 대형 모델은 학습이 발산하지 않는 쪽 — Pre-LN으로 수렴했다.
Pre-LN이 무비용은 아니다. 잔차 스트림에 매 층의 서브층 출력이 정규화 없이 계속 더해지므로 표현의 크기가 층을 지나며 커지는 경향이 있다(1.4.12에서 본, 스트림이 층 수에 따라 부푸는 그 현상이다). 이를 다스리려 스택 맨 끝에 최종 정규화를 한 번 더 둔다 — 커진 잔차를 언임베딩에 넘기기 전 크기를 되돌리는 마개다. 또 Post-LN이 (학습만 성공시키면) 최종 품질이 약간 더 낫다는 관측도 있어, 안정성과 최종 성능 사이의 트레이드오프로 보는 시각도 있다. 그 사이를 절충하려는 변형들도 있다 — 서브층 앞뒤로 두 번 정규화하는 방식이나, Q·K를 내적 전에 따로 정규화해 어텐션 로짓 폭주(1.4.18)를 막는 QK-Norm 같은. 세부는 모델마다 다르지만, 큰 그림은 확고하다. 깊이를 원하면 잔차 고속도로를 깨끗이 열어야 하고, 그 대가로 최종 norm이 붙는다.
| 항목 | Post-LN | Pre-LN |
|---|---|---|
| Norm 위치 | 잔차 덧셈 후 | 서브층 전(잔차는 항등) |
| 잔차 고속도로 | Norm이 매번 누름 | 깨끗이 유지 |
| 초기 기울기 | 출력층 쪽 폭증 | 층에 걸쳐 안정 |
| 웜업 필요성 | 사실상 필수 | 덜 민감 |
| 깊은 모델 학습 | 까다로움 | 잘 됨(현대 표준) |
| 대가 | — | 잔차 팽창 → 최종 norm 필요, 최종 품질 소폭 손실 가능 |
1.5.13 활성함수 — ReLU에서 GELU로, 왜 매끄럽게
세 번째 축은 블록의 FFN(위치별 완전연결층, 1.4.13) 안에 들어가는 비선형성이다. 어텐션이 토큰 사이 정보를 섞는다면 FFN은 각 토큰 위치에서 그 정보를 비선형으로 변환하는데, 비선형이 없으면 두 선형층이 하나로 접혀($xW_1W_2$) 표현력이 사라진다(1.4.13). 그러니 활성함수의 선택은 곧 FFN 표현력의 문제다.
가장 단순한 것은 ReLU $= \max(0,x)$ 다. 저렴하고, 음수를 0으로 죽여 희소성을 준다. 하지만 두 흠이 있다. 0에서 꺾여 미분이 불연속이고, 음의 입력을 완전히 죽여 어떤 뉴런이 항상 음수 영역에만 들어가면 기울기가 0으로 굳어 다시는 못 살아나는 죽은 뉴런이 생긴다. GELU(Gaussian Error Linear Unit)는 이 딱딱한 문턱을 부드러운 확률적 게이트로 바꾼다. 표준정규분포의 누적분포함수 $\Phi$ 를 써서
$$\text{GELU}(x) = x\cdot\Phi(x) \approx 0.5\,x\left(1 + \tanh\!\left[\sqrt{\tfrac{2}{\pi}}\,(x + 0.044715\,x^3)\right]\right)$$
로 둔다. 직관은 "입력을, 그 입력이 (잡음을 감안해) 양수일 확률로 가중해 통과시킨다"이다. ReLU가 0을 기준으로 통과/차단을 명확히 자른다면, GELU는 0 근처에서 매끄럽게 휘어 작은 음수도 약간은 살려 보낸다. 왜 매끄러움이 이득인가. 첫째, 0에서 미분이 연속이라 최적화가 안정된다 — 경사하강은 매끄러운 지형을 좋아한다(1.3). 둘째, 문턱 부근 입력이 조금 바뀔 때 출력이 튀지 않고 연속으로 변해, 그 근방의 기울기 신호가 살아 죽은 뉴런 문제가 완화된다. BERT·GPT-2/3 등이 GELU를 썼다. 사촌뻘로 SiLU/Swish $= x\cdot\sigma(x)$($\sigma$ 는 시그모이드)도 같은 "부드러운 자기 게이트" 계열로, 뒤의 SwiGLU에서 다시 만난다.
1.5.14 게이팅 — GLU와 SwiGLU라는 도약
여기서 질적 도약이 하나 일어난다. ReLU·GELU·Swish는 입력 하나에 스칼라 비선형을 씌우는 데 그친다. GLU(Gated Linear Unit)는 두 개의 선형 투영을 만들어, 하나로 다른 하나를 원소별로 곱해 조절한다.
$$\text{GLU}(x) = (W_1 x)\odot\sigma(W_2 x)$$
$\sigma(W_2 x)$ 가 0에서 1 사이의 게이트가 되어, $W_1 x$ 의 각 성분을 얼마나 통과시킬지 데이터에 따라 정한다. 단순 활성함수는 "이 값이 양수면 살린다"처럼 입력 자체의 부호로만 통과를 정하는데, 게이트는 별도의 투영이 계산한 문맥으로 통과량을 정한다 — 곱셈적이고 데이터 의존적인 이 상호작용이 스칼라 비선형보다 표현력이 크다는 것이 요지다. 게이트의 활성함수를 무엇으로 두느냐로 변형이 갈린다. 게이트에 GELU를 쓰면 GeGLU, Swish를 쓰면 SwiGLU다.
$$\text{GeGLU}(x) = \text{GELU}(W_1 x)\odot(W_2 x), \qquad \text{SwiGLU}(x) = \text{Swish}(W_1 x)\odot(W_2 x)$$
솔직히 말하면 왜 게이팅이 더 나은지는 완전히 규명되지 않았다. GLU 변형을 체계적으로 비교한 Shazeer(2020)조차 벤치마크에서 일관되게 낫다는 경험적 결과를 보고하면서, 그 이유에 대해서는 설명을 제시하지 않고 반농담으로 "신의 가호(divine benevolence) 덕으로 돌린다"고 적었다. "곱셈적 상호작용이 표현력을 준다"는 그럴듯한 설명이지만 확립된 정리는 아니다. 이 대목은 활성함수 선택을 범용 해법으로 여기지 말라는 경고이기도 하다 — 게이팅의 이득은 관측이지 보장이 아니고, 규모·과제에 따라 차이가 작을 수 있다. 그럼에도 같은 파라미터 예산에서 조금 더 나은 손실을 꾸준히 준다는 경험이 쌓여, 현대 대형 모델의 FFN은 SwiGLU 계열로 많이 넘어갔다.
1.5.15 SwiGLU FFN 조립 — 왜 행렬이 셋, 왜 d_ff를 2/3로
표준 FFN은 차원을 넓혔다 좁히는 두 선형층 사이에 활성함수를 삽입한다: $\text{FFN}(x) = W_2\,\phi(W_1 x) + b$, 여기서 $W_1: d\to d_{ff}$, $W_2: d_{ff}\to d$ 다. $d_{ff}/d$ 가 확장비이고 원조 트랜스포머는 4를 썼다. 넓은 중간 공간에서 더 많은 특징을 비선형으로 조합한 뒤 원 차원으로 접기 위해서다. FFN은 보통 모델 파라미터의 큰 몫(대략 3분의 2, 1.4.15에서 층당 FFN이 어텐션의 두 배임을 셌다)을 차지하므로, 확장비는 모델 크기와 연산량을 좌우하는 큰 조정 변수다.
SwiGLU를 FFN에 넣으면 구조가 바뀌고, 여기서 실무적으로 놓치기 쉬운 결정이 나온다. 게이트를 만들려면 두 개의 상방 투영($W_1$ 은 게이트 가지용, $W_2$ 는 값 가지용)이 필요하고, 여기에 하방 투영 $W_3$ 이 붙는다 — 총 세 개의 행렬이다.
$$\text{FFN}_{\text{SwiGLU}}(x) = W_3\big(\text{Swish}(W_1 x)\odot(W_2 x)\big), \qquad W_1, W_2: d\to d_{ff},\ \ W_3: d_{ff}\to d$$
표준 FFN은 행렬 2개라 파라미터가 $2\,d\,d_{ff}$ 인데, SwiGLU는 3개라 같은 $d_{ff}$ 면 $3\,d\,d_{ff}$ — 1.5배로 커진다. 그러니 SwiGLU가 표준 FFN보다 손실이 낮다고 비교하려면, 파라미터와 연산량을 맞춰야 공정하다. 맞추는 법은 $d_{ff}$ 를 3분의 2로 줄이는 것이다.
$$d_{ff} = \frac{2}{3}\times 4d = \frac{8}{3}d \approx 2.67\,d$$
부근으로 설정하면 행렬이 셋이라도 총 파라미터가 표준 FFN의 $3\times\frac{2}{3} = 2$ 배분, 즉 원래와 같아진다. LLaMA 계열이 이 관례를 대중화했고, 실제 값은 하드웨어 정렬 편의로 반올림된다. 이 조정을 빼먹으면 SwiGLU FFN이 은근슬쩍 1.5배 커져 비교가 불공정해진다 — "SwiGLU가 좋다"의 상당 부분이 실은 "FFN을 키웠다"였을 수 있다는 함정이다. 핵심은 한 줄로 정리된다. SwiGLU는 게이팅으로 표현력을 높이되, 행렬이 하나 늘어난 만큼 은닉 폭을 줄여 예산을 맞춘다.
FFN 전체를 여러 전문가로 분할해 조건부로 실행하는 MoE(전문가 혼합)는 이 FFN 축의 대규모 변형이다 — 파라미터는 키우되 토큰마다 일부 전문가만 켜 연산은 유지하는 것으로, 1.6에서 다룬다.
1.5.16 조립 — 현대 디코더 블록의 기본형
이제 세 축을 한 블록에 추가한다. 오늘날 널리 쓰이는 디코더 블록의 기본형은 대략 Pre-LN(RMSNorm) + RoPE 어텐션 + SwiGLU FFN + 잔차의 조합이다(구체 부품·차원은 모델마다 다르니 골격으로 읽자). 잔차 스트림을 항등 경로로 유지한 채, 정규화된 입력을 어텐션과 FFN에 통과시켜 되더한다.
$$h = x + \text{Attn}_{\text{RoPE}}\big(\text{RMSNorm}(x)\big), \qquad y = h + \text{FFN}_{\text{SwiGLU}}\big(\text{RMSNorm}(h)\big)$$
이 블록을 $N$ 개 쌓고 맨 끝에 최종 RMSNorm과 언임베딩을 붙이면 디코더 본체가 된다(1.4.12의 스택 그림이 이 블록으로 채워진다). 각 부품이 왜 그 자리에 있는지 마지막으로 한 번 더 이으면 이 장 전체가 한 명확해진다. RoPE는 Q·K를 절대 위치로 회전시켜 순열 대칭을 깨고 상대 위치를 매 층에서 주입하되 값 V는 변경하지 않는다. Pre-LN + RMSNorm은 잔차 고속도로를 깨끗이 열어 깊게 쌓아도 학습이 안정되게 하면서(재중심화를 버려 저렴하게) 그 대가로 최종 norm을 요구한다. SwiGLU FFN은 게이팅으로 위치별 변환의 표현력을 높이되 행렬이 셋 늘어난 만큼 $d_{ff}$ 를 줄여 예산을 맞춘다. 그리고 이 셋이 전부 잔차 골격 위에 추가되어, 기울기가 층을 관통해 흐르는 통로 위에서 위치·정규화·게이팅이 각자 제 몫을 더한다.
1.4이 어텐션이라는 핵심을 세우고 이 장이 그것을 깊게 쌓을 몸을 붙였다면, 남은 것은 이 기본 블록을 대규모와 롱컨텍스트로 확장할 때 어디를 어떻게 키우고 줄이느냐다. FFN을 전문가로 분할해 파라미터를 키우는 MoE, KV 헤드를 줄여 추론 메모리를 아끼는 GQA·MQA·MLA, 그리고 방금 1.5.7에서 예고한 RoPE 보간으로 컨텍스트를 훈련 길이 너머로 늘리는 기법들 — 전부 이 블록을 출발점으로 삼는 변형이고, 그것이 1.6이다.