
Transformer 블록 뜯어보기
다음 토큰 예측이라는 문제 정의에서 출발해, Q·K·V가 왜 그런 형태인지, 토큰을 어떻게 숫자로 바꾸는지, 생성할 때 확률 분포를 어떻게 다루는지, 그리고 위치 정보를 어떻게 넣는지까지 왔습니다. 이제 Transformer 블록 안에서 아직 다루지 않은 부분이 남아 있습니다.
LLaMA 3는 80층, Qwen 2.5는 128층입니다. 매 층마다 어텐션 하나와 “작은 신경망” 하나가 들어 있습니다. 어텐션은 이미 다뤘지만, 그 작은 신경망이 정확히 무엇인지, 층과 층 사이에 붙는 정규화가 무엇인지, 입력을 그대로 더하는 잔차 연결이 왜 필요한지는 아직 설명하지 않았습니다. 이 글에서는 Transformer 블록의 나머지 절반을 채웁니다.
위 그림이 현대 Transformer 블록 하나입니다. 어텐션(회색 상자)은 이미 다뤘으니, 이번에는 강조된 나머지 세 가지를 봅니다. 잔차 연결이 왜 필요한지, 정규화가 무엇을 하는지, 그리고 “작은 신경망”의 정체가 무엇인지를 순서대로 짚겠습니다.
깊이의 대가
신경망은 레이어를 깊이 쌓을수록 복잡한 관계를 잡을 수 있습니다. 한 번의 어텐션은 한 단계 관계만 봅니다. “책을”이 “빌린”을 흡수한 뒤 “돌려줬다”가 그 “빌린 책”을 다시 보려면 레이어가 여러 개 있어야 합니다.
그런데 2015년, 레이어를 더 쌓으면 정확도가 오히려 떨어지는 현상이 보고됩니다(He et al., 2016). 56층 네트워크가 20층보다 훈련 오차도, 테스트 오차도 나빴습니다. 파라미터가 더 많으니 최소한 20층만큼은 할 수 있어야 하는데 그러지 못한 겁니다.
원인은 학습 신호의 전달에 있습니다. 학습은 출력의 오차를 줄이는 방향으로 파라미터를 조정하는 일이고, 그 방향을 알려주는 것이 기울기(gradient)입니다. 기울기는 출력에서 입력 쪽으로 레이어를 하나씩 거슬러 올라가면서 전달됩니다. 문제는 각 레이어를 통과할 때마다 기울기가 곱해진다는 점입니다. 곱하는 값이 1보다 약간만 작아도 100층을 지나면 거의 0이 됩니다. 초기 레이어는 “어느 쪽으로 고쳐야 할지” 신호를 받지 못합니다. 반대로 1보다 약간만 커도 기울기가 폭발합니다. 이것이 기울기 소실(vanishing gradient)과 기울기 폭발(exploding gradient)입니다.
이 문제를 두 가지가 함께 풀었습니다. 잔차 연결과 정규화입니다.
잔차 연결이 여는 고속도로
He et al.(2016)의 통찰은 단순합니다. 레이어가 입력 에서 출력 를 직접 학습하는 대신, 입력을 그대로 더한 를 출력하게 만드는 것입니다. 이렇게 하면 레이어는 “입력을 어떻게 바꿀까”라는 변화량 만 학습하면 됩니다. 최적 변환이 항등 함수에 가까우면 만 배우면 되니 학습이 쉬워집니다.
더 중요한 효과는 기울기 경로입니다. 를 로 미분하면 입니다. 가 아무리 작아도 항등 경로의 1이 항상 살아 있습니다. 100층을 거슬러 올라가더라도 기울기가 흐를 수 있는 고속도로가 생긴 셈입니다.
이 구조를 “잔차 흐름(residual stream)“이라고 부르기도 합니다. 강의 본류가 처음부터 끝까지 흐르고, 각 레이어는 지류처럼 변화량을 보태는 그림입니다. 임베딩 레이어에서 출발한 벡터가 이 흐름을 타고 모든 레이어를 거쳐 마지막 정규화와 lm_head에 도달합니다.
잔차 연결은 오랫동안 라는 고정된 패턴이었습니다. 하지만 2026년에는 이 연결 자체가 설계 대상이 되기 시작했습니다. DeepSeek-V4가 채택한 mHC(Manifold-Constrained Hyper-Connections)는 잔차 흐름을 하나가 아니라 여러 갈래로 확장하고, 레이어 사이에 학습 가능한 혼합 행렬을 둡니다. 혼합 행렬이 자유로우면 신호가 폭발하므로, 모든 행과 열의 합이 1이 되는 이중 확률 행렬(doubly stochastic matrix)로 제약해 안정성을 보존합니다. 아직 한 연구소의 설계이지만, 잔차 연결이 더 이상 “그냥 더하기”가 아니라는 방향을 보여줍니다.
정규화가 크기를 다스리는 법
잔차 연결이 기울기 고속도로를 열었지만, 레이어를 100개 통과하면서 벡터의 크기(norm)는 여전히 드리프트합니다. 어떤 차원은 값이 점점 커지고, 어떤 차원은 줄어듭니다. 정규화는 각 레이어에서 벡터의 스케일을 일정하게 맞추는 장치입니다.
Transformer에서 쓰는 정규화는 LayerNorm(Ba et al., 2016)에서 출발했습니다. 이미지에서 쓰는 BatchNorm과 달리, LayerNorm은 배치가 아니라 하나의 토큰 벡터 안에서 평균과 분산을 구해 정규화합니다. 시퀀스 길이가 문장마다 다르고, 추론 시 배치 크기가 1인 경우가 많은 언어 모델에서는 배치 통계가 불안정하기 때문입니다.
원래 Transformer(2017)에서 정규화는 잔차를 더한 뒤에 붙었습니다. 형태인데, 이를 Post-Norm이라 부릅니다. 이 배치는 학습이 까다로웠습니다. 학습률을 천천히 올리는 워밍업 없이는 훈련 초기에 발산하는 경우가 잦았습니다.
GPT-2(Radford et al., 2019)부터 정규화 위치가 바뀝니다. 서브레이어에 들어가기 전에 정규화하는 Pre-Norm 방식, 입니다. 차이는 잔차 경로에 있습니다. Post-Norm에서는 잔차가 정규화를 통과하면서 기울기 경로에 정규화의 미분이 끼어듭니다. Pre-Norm에서는 잔차 경로가 깨끗하게 유지됩니다. 가 어떤 변환도 거치지 않고 그대로 더해지니, 앞에서 본 기울기 고속도로가 온전히 작동합니다.
지금 쓰이는 정규화는 RMSNorm(Zhang & Sennrich, 2019)입니다. LayerNorm이 평균을 빼고 분산으로 나누는 두 단계를 거치는 반면, RMSNorm은 평균 빼기를 생략하고 제곱평균제곱근(root mean square)으로만 나눕니다.
는 입력 벡터, 는 차원 수, 은 0으로 나누는 것을 막는 작은 상수, 는 학습 가능한 스케일 파라미터입니다. LayerNorm에 있던 평균 빼기와 학습 가능한 편향 가 없습니다. 계산이 줄어든 만큼 빠르고, 실험적으로 성능 차이는 없었습니다. LLaMA, Gemma, Qwen, DeepSeek 등 2023년 이후 주요 오픈 모델은 전부 Pre-Norm + RMSNorm 조합입니다.
마지막으로, 모든 레이어를 통과한 벡터는 lm_head(어휘 확률을 내놓는 마지막 행렬곱)에 들어가기 직전에 RMSNorm을 한 번 더 거칩니다. 이것이 “최종 정규화”입니다. 잔차 흐름을 타고 80층을 지나면서 쌓인 스케일 변동을 마지막에 한 번 더 맞추는 역할입니다.
블록의 나머지 절반
어텐션은 “어떤 토큰을 볼지”를 정합니다. 그런데 본 정보를 가지고 “무엇을 할지”는 어텐션의 몫이 아닙니다. 그 역할이 FFN(Feed-Forward Network)입니다. 블록 구조 그림에서 어텐션 아래에 있던 “작은 신경망”의 정체입니다.
FFN은 각 토큰의 벡터를 위치별로 독립적으로 처리합니다. 다른 위치의 토큰은 보지 않습니다. 토큰 간 정보 교환은 어텐션이 전담하고, FFN은 한 토큰의 표현을 비선형적으로 변환해 용량을 더합니다.
원래 Transformer(2017)의 FFN은 두 단계입니다. 먼저 이 입력 벡터를 더 큰 차원으로 확장합니다. 예를 들어 4,096차원 벡터가 16,384차원이 됩니다. 이 넓은 공간에서 ReLU()가 음수를 전부 0으로 만들어 비선형성을 넣고, 가 다시 4,096차원으로 줄입니다. 좁은 공간 → 넓은 공간에서 변환 → 다시 좁은 공간으로 돌아오는 구조입니다.
ReLU의 문제는 음수를 완전히 차단한다는 점입니다. 한 번 0이 된 뉴런은 기울기도 0이 되어 다시 살아나기 어렵습니다. GELU(BERT, GPT-2에서 채택)는 이를 부드럽게 만들어 작은 음수도 통과시켰습니다. 현재 LLM에서 쓰이는 SiLU도 같은 방향입니다. 로, 시그모이드 가 각 값의 “통과 비율”을 정합니다. 양수는 거의 그대로 통과하고, 음수는 대부분 억제되지만 완전히 0이 되지는 않습니다.
현재 표준은 SwiGLU(Shazeer, 2020)입니다. ReLU나 GELU는 모든 차원에 같은 규칙을 적용합니다. 양수면 통과, 음수면 차단(또는 약하게 통과). SwiGLU는 발상을 바꿉니다. 어떤 차원을 얼마나 열지를 모델이 직접 학습하게 합니다.
구체적으로 봅시다. 입력 가 들어오면 두 갈래로 나뉩니다. 한쪽()은 입력을 넓은 차원으로 변환해 “후보 값”을 만듭니다. 다른 쪽()도 같은 입력을 넓은 차원으로 변환하되, SiLU 활성 함수를 거쳐 각 차원에 0에서 1 사이의 “열림 정도”를 매깁니다. 이 두 결과를 차원별로 곱하면(), 게이트가 0에 가까운 차원은 후보 값이 거의 사라지고, 1에 가까운 차원은 그대로 살아남습니다. 마지막으로 이 결과를 원래 차원으로 압축합니다.
이고 는 시그모이드 함수입니다. 핵심은 와 이 같은 입력을 서로 다른 가중치로 변환한다는 점입니다. 게이트 쪽은 “이 차원을 쓸지 말지”를 판단하고, up 쪽은 “쓴다면 어떤 값을 넣을지”를 정합니다. 이 분업 덕에 모델이 입력에 따라 차원별로 다른 처리를 할 수 있습니다.
가중치 행렬이 3개라서 FFN은 레이어 전체 파라미터의 약 2/3를 차지합니다. MoE(Mixture of Experts) 아키텍처가 이 FFN을 여러 전문가로 쪼개 토큰마다 일부만 활성화하는 이유가 여기에 있습니다. 파라미터의 대부분이 FFN에 집중되어 있으니, FFN을 나누는 것이 가장 효율적인 확장 방법입니다.
마치며
어텐션이 블록의 절반이라면, 잔차 연결과 정규화와 FFN이 나머지 절반입니다. 잔차 연결이 기울기 고속도로를 열고, 정규화가 신호 크기를 다스리고, FFN이 비선형 변환 용량을 더합니다. 이 셋이 없었다면 레이어 하나짜리 어텐션에서 끝났을 것입니다.
다음 글에서는 그 어텐션의 점수 행렬을 한꺼번에 만들지 않고 타일 단위로 계산하는 FlashAttention을 다룹니다.
함께 보면 좋은 글
- LLM은 왜 다음 토큰 하나만 예측할까
- Transformer는 왜 Q, K, V 셋으로 나눴을까
- 토큰은 왜 단어가 아닐까
- 위치 인코딩은 왜 아직도 바뀌고 있을까
- Gemma 4 아키텍처 총정리
참고자료
- Attention Is All You Need (Vaswani et al., NeurIPS 2017)
- Deep Residual Learning for Image Recognition (He et al., CVPR 2016)
- Layer Normalization (Ba et al., 2016)
- Root Mean Square Layer Normalization (Zhang & Sennrich, NeurIPS 2019)
- Language Models are Unsupervised Multitask Learners (Radford et al., 2019)
- GLU Variants Improve Transformer (Shazeer, 2020)
- Hyper-Connections (Zhu et al., 2024)
- DeepSeek-V4 Technical Report (DeepSeek-AI, 2026)