트랜스포머 모델이란? 어텐션 원리부터 LLM 구조까지 완전 해설

트랜스포머 모델이란? 어텐션 원리부터 LLM 구조까지 완전 해설

한 문장으로 붙잡는 트랜스포머의 정체

트랜스포머(Transformer)는 문장 속 모든 토큰이 서로에게 얼마나 주목할지를 계산하는 '자기어텐션(self-attention)'을 핵심으로 삼아, 순환 구조 없이 병렬로 문맥을 읽어내는 신경망 구조다. 2017년 구글 연구진이 발표한 논문 「Attention Is All You Need」에서 처음 제안했고, 지금 우리가 쓰는 거의 모든 대규모 언어모델(LLM, Large Language Model)이 이 구조 위에 서 있다. ChatGPT의 GPT, 구글의 BERT, 그 밖의 수많은 모델이 모두 트랜스포머의 후손이다.

이름부터가 특이하다. 회로 이론의 변압기(transformer)와는 아무 상관이 없다. 여기서 '변환'은 입력 토큰의 표현을 층층이 거치며 점점 더 문맥이 반영된 표현으로 바꿔 나간다는 뜻에 가깝다. 즉 '고양이'라는 토큰이 처음에는 단어 자체의 의미만 담고 있다가, 층을 지날수록 '앞에 나온 문장에서의 고양이'라는 맥락까지 흡수한 표현으로 다듬어진다.

트랜스포머를 제대로 이해하려면 먼저 한 가지 관점을 받아들여야 한다. 언어모델이 하는 일은 결국 '지금까지의 문장을 보고 다음 토큰으로 가장 그럴듯한 것을 하나 고르기'의 반복이다. 트랜스포머는 바로 이 '고르기'를 계산하는 엔진이다. 문장을 토큰으로 쪼개고, 각 토큰을 의미의 좌표로 바꾸고, 토큰끼리 서로 주목하게 한 뒤, 다음 토큰의 확률 분포를 뽑아낸다.

순환 신경망의 병목 — 왜 새 구조가 필요했나

트랜스포머 이전, 기계 번역이나 문장 생성 같은 작업의 주역은 순환 신경망(RNN)과 그 개량형인 LSTM이었다. 「Sequence to Sequence Learning with Neural Networks」로 대표되는 이 계열은 문장을 왼쪽에서 오른쪽으로 한 단어씩 순서대로 읽었다. 첫 단어를 처리해 상태를 만들고, 그 상태에 둘째 단어를 얹고, 다시 셋째 단어를 얹는 식이다. 사람이 글을 읽는 방식과 닮아 직관적이었다.

문제는 두 가지였다. 첫째, 순서대로만 계산할 수 있어 병렬화가 어려웠다. 다섯째 단어를 처리하려면 넷째까지가 끝나야 했다. GPU가 아무리 많아도 순차 의존성 때문에 속도를 내기 힘들었다. 둘째, 문장이 길어지면 앞부분 정보가 뒤로 갈수록 흐려졌다. 문장 전체를 하나의 고정된 벡터에 욱여넣다 보니 긴 문장의 초반 내용이 병목에 걸려 사라지곤 했다.

이 병목을 완화하려는 시도가 어텐션(attention)이었다. 「Neural Machine Translation by Jointly Learning to Align and Translate」는 번역할 때 출력 단어마다 입력 문장의 어느 부분을 볼지 그때그때 가중치를 두어 참조하게 했다. 문장 전체를 한 벡터로 압축하지 않고, 필요할 때마다 원문의 관련 부분을 직접 들여다본 것이다. 성능이 눈에 띄게 올라갔다.

그러자 자연스러운 질문이 나왔다. 순환 구조를 보조하는 장치가 어텐션이라면, 아예 순환을 걷어내고 어텐션만으로 문장을 처리하면 어떨까? 「Attention Is All You Need」라는 도발적인 제목이 그 답이었다. 순서 의존성을 없애자 문장의 모든 위치를 동시에 계산할 수 있게 됐고, GPU 병렬 처리의 이점을 온전히 끌어냈다. 트랜스포머가 대규모 학습의 시대를 연 결정적 계기다.

문장을 숫자 좌표로 — 토큰화와 임베딩

트랜스포머에 문장이 들어가기 전, 두 단계의 준비가 필요하다. 컴퓨터는 글자를 그대로 읽지 못하고 숫자만 다루기 때문이다. 첫 단계는 토큰화(tokenization)다. 문장을 토큰이라는 조각으로 자른다. 토큰은 단어일 수도, 단어의 일부일 수도, 글자 하나일 수도 있다. 예를 들어 'cyberpunk' 같은 드문 단어는 'cyber'와 'punk'로 쪼개 조립한다. 자주 뭉쳐 다니는 덩어리는 통째로, 드문 것은 잘게 자르는 절충인데, 이렇게 하면 정해진 수의 조각만으로 세상의 온갖 단어를 표현할 수 있다.

여기서 언어별 차이가 생긴다. 영어는 대체로 토큰 하나가 네 글자쯤에 대응하고, 한국어는 같은 뜻을 담아도 조각이 더 잘게 난다. 그래서 같은 분량의 글이라도 한국어가 토큰 한도에 더 빨리 닿고, 사용량만큼 과금하는 서비스에서는 더 비싸게 계산되기도 한다. OpenAI의 토크나이저 도구에 문장을 넣어 보면 조각과 그 개수가 색으로 표시되는데, '문장이 숫자 조각으로 바뀐다'는 개념이 이 짧은 실험으로 구체적인 사실이 된다.

토큰에는 저마다 고유 번호가 붙는다. 그런데 번호는 이름표에 지나지 않는다. '고양이'가 5번, '강아지'가 8721번이라 해도, 두 번호만 봐서는 이들이 얼마나 비슷한 뜻인지 알 길이 없다. 그래서 두 번째 단계로 임베딩(embedding)이 등장한다. 토큰 하나를 숫자 하나가 아니라 숫자 여러 개의 묶음, 곧 좌표로 바꾼다. 이 좌표 공간을 '의미의 지도'라고 부를 만하다. 뜻이 가까운 토큰은 지도 위에서 가깝게, 먼 토큰은 멀리 놓인다.

토큰을 벡터로 바꾸는 임베딩 — 트랜스포머의 입력 표현

임베딩 벡터는 학습을 통해 자리를 잡는다. 방대한 글을 읽으며 비슷한 문맥에 자주 등장하는 토큰끼리 좌표가 가까워지도록 조정된다. 여기에 위치 정보(positional encoding)를 더한다. 트랜스포머는 순환 구조가 없어 토큰의 순서를 저절로 알지 못하므로, 각 토큰이 문장에서 몇 번째인지를 좌표에 얹어 준다. 순서를 잃지 않으면서 병렬 처리의 이점을 챙기는 장치다.

자기어텐션 — 단어들이 서로 주목하는 법

멀티헤드 어텐션 — 여러 개의 '돋보기'가 구문·의미·위치·상호참조를 동시에 살핀 뒤 하나로 결합한다

트랜스포머의 심장은 자기어텐션(self-attention)이다. 문장 속 각 토큰이 다른 모든 토큰을 둘러보며 '누구에게 얼마나 주목할지'를 스스로 계산한다. '그 은행 앞 강가에 앉았다'라는 문장에서 '은행'이 금융기관이 아니라 강둑을 뜻한다는 걸 파악하려면, '은행'이 '강가'라는 토큰에 강하게 주목해야 한다. 자기어텐션이 바로 이 주목의 세기를 수치로 뽑는다.

작동 방식을 직관적으로 풀면 이렇다. 각 토큰은 세 가지 역할의 벡터를 만든다. 질의(Query)는 '나는 무엇을 찾고 있는가', 키(Key)는 '나는 어떤 정보를 갖고 있는가', 값(Value)은 '내가 실제로 전달할 내용'이다. 한 토큰의 질의를 다른 모든 토큰의 키와 맞춰 보고, 잘 맞을수록 높은 점수를 준다. 이 점수를 확률처럼 정규화해 가중치로 삼은 뒤, 각 토큰의 값을 그 가중치로 섞는다. 결과적으로 각 토큰은 자기와 관련 깊은 토큰들의 정보를 끌어모은 새 표현으로 갱신된다.

여기서 '멀티헤드(multi-head)'라는 개념이 붙는다. 주목을 한 방향으로만 하면 놓치는 관계가 생긴다. 그래서 여러 개의 어텐션 '머리'를 나란히 두고, 각 머리가 서로 다른 관점에서 관계를 살피게 한다. 어떤 머리는 문법적 관계에, 어떤 머리는 의미적 연관에 집중하는 식이다. 여러 머리의 결과를 합치면 문맥을 훨씬 풍부하게 담아낸다.

이 구조의 강점은 거리에 구애받지 않는다는 점이다. 순환 신경망에서는 멀리 떨어진 두 단어를 연결하려면 그 사이 모든 단계를 거쳐야 했다. 트랜스포머에서는 문장 첫 토큰과 마지막 토큰이 한 번의 어텐션 계산으로 직접 연결된다. 긴 문장에서 앞뒤 맥락을 잇는 능력이 여기서 나온다. 동시에 모든 토큰 쌍을 계산하므로 계산량이 문장 길이의 제곱에 비례해 늘어난다는 대가도 함께 진다.

인코더와 디코더 — 두 갈래로 갈린 계보

원래 트랜스포머는 번역을 위해 인코더(encoder)와 디코더(decoder) 두 부분으로 설계됐다. 인코더는 입력 문장 전체를 앞뒤 양방향으로 훑어 문맥이 배어든 표현을 만든다. 디코더는 그 표현을 참조하면서 출력 문장을 한 토큰씩 생성한다. 이때 디코더는 아직 생성하지 않은 미래의 토큰을 미리 보지 못하도록 가려 둔다. 이 '마스킹'이 자기회귀 생성의 핵심 장치다.

이후 연구는 두 부분을 따로 떼어 쓰는 방향으로 갈라졌다. 인코더만 쓰는 계열의 대표가 BERT다. 「BERT: Pre-training of Deep Bidirectional Transformers」는 문장을 양방향으로 읽어 문맥을 깊이 이해하는 데 강하다. 문장 분류, 개체명 인식, 질문에 대한 답 찾기처럼 '이해'가 중요한 작업에 잘 맞는다. 문장 중간의 일부 토큰을 가린 뒤 맞추게 하는 방식으로 학습한다.

디코더만 쓰는 계열의 대표가 GPT다. 왼쪽에서 오른쪽으로만 읽으며 다음 토큰을 예측하도록 학습한다. 문장을 이어 쓰고 대화를 생성하는 데 특화됐고, 오늘날 우리가 쓰는 대화형 LLM 대부분이 이 계열이다. 인코더-디코더를 모두 쓰는 계열은 번역이나 요약처럼 입력을 받아 다른 형태의 출력을 내놓는 작업에 쓰인다.

트랜스포머 블록 구조 — 어텐션과 피드포워드망(FFN)을 층층이 쌓고 잔차 연결(residual)과 레이어 정규화로 잇는다

다음 토큰을 고르는 순간 — 확률 분포와 디코딩

트랜스포머의 마지막 층을 지나면 각 위치마다 다음에 올 토큰의 점수가 나온다. 이 점수를 소프트맥스(softmax)라는 함수로 정규화하면 어휘 전체에 걸친 확률 분포가 된다. 예를 들어 '오늘 날씨가 참' 다음에 '좋다'가 0.62, '맑다'가 0.15, '춥다'가 0.08 하는 식으로 후보마다 확률이 매겨진다. 언어모델의 생성은 이 분포에서 토큰을 하나 골라 문장 끝에 붙이고, 늘어난 문장을 다시 입력으로 넣어 다음 토큰을 고르는 반복이다. 이 되먹임을 자기회귀(autoregressive)라 부른다.

'어떻게 고를 것인가'를 조절하는 손잡이가 디코딩 파라미터다. 가장 단순한 방법은 확률이 가장 높은 토큰만 계속 고르는 것이지만, 그러면 문장이 뻔하고 반복적으로 흐른다. 그래서 확률에 따라 무작위로 뽑되, 그 무작위성의 정도를 조절한다. 온도(temperature)를 낮추면 높은 확률 후보에 더 쏠려 보수적이고 일관된 문장이 나오고, 높이면 분포가 평평해져 다양하지만 엉뚱해질 위험이 커진다.

후보를 추리는 방식도 있다. Top-k는 확률 순으로 상위 k개만 남기고 그 안에서 뽑는다. Top-p(누적 확률 샘플링)는 확률을 높은 순으로 더해 가다 합이 p에 이를 때까지의 후보만 남긴다. 상황에 맞는 후보 수가 자동으로 조절되는 셈이다. 이 파라미터들을 함께 쓰면 창의성과 안정성 사이에서 균형을 잡을 수 있다.

파라미터 하는 일 낮추면 높이면
temperature 분포의 날카로움 조절 보수적·일관적 다양·엉뚱 위험
top-k 상위 k개만 후보로 안정적 다양성 증가
top-p 누적 확률 p까지 후보로 좁은 선택 넓은 선택

정리하면 트랜스포머의 생성은 '토큰화 → 임베딩 → 어텐션 → 확률 분포 → 선택'이 하나의 루프로 맞물려 돌아가는 과정이다. 유창해 보이는 대답도 실은 이 다섯 동작을 토큰 하나마다 반복한 결과다.

실무에서 트랜스포머를 마주하는 자리

대부분의 개발자는 트랜스포머를 밑바닥부터 구현하지 않는다. 이미 학습된 모델을 불러와 쓰는 것이 일반적이다. 예컨대 파이썬의 트랜스포머 라이브러리를 쓰면 몇 줄로 사전학습 모델을 불러와 문장을 요약하거나 감정을 분류할 수 있다. 이때 알아 둘 것은 앞서 다룬 개념들이 그대로 실무 감각으로 이어진다는 점이다. 토큰 수를 계산할 줄 알아야 길이 제한과 비용을 가늠하고, 디코딩 파라미터를 이해해야 원하는 문체와 안정성을 얻는다.

파인튜닝(fine-tuning)은 사전학습된 트랜스포머를 특정 작업이나 도메인에 맞게 추가 학습하는 기법이다. 법률 문서에 강한 모델, 의료 상담에 특화된 모델을 만들 때 쓴다. 다만 전체를 다시 학습하려면 비용이 크기 때문에, 최근에는 모델의 일부 작은 파라미터만 조정하는 경량 기법이 널리 쓰인다.

검색 증강 생성(RAG, Retrieval-Augmented Generation)은 트랜스포머 모델의 약점을 보완하는 대표적 방법이다. 모델은 학습 시점 이후의 정보나 회사 내부 문서를 알지 못한다. RAG는 질문이 들어오면 관련 문서를 먼저 검색해 그 내용을 프롬프트에 함께 넣어 준다. 이때 문서를 임베딩 벡터로 바꿔 의미가 가까운 것을 찾는데, 바로 트랜스포머가 만든 그 임베딩 공간을 활용하는 것이다. 모델을 다시 학습하지 않고도 최신 지식이나 사내 자료를 반영할 수 있어 실무에서 자주 쓴다.

자주 걸려 넘어지는 오해와 구조적 한계

가장 흔한 오해는 '트랜스포머가 문장의 뜻을 사람처럼 이해한다'는 생각이다. 실제로 모델이 하는 일은 방대한 글에서 배운 통계적 패턴을 바탕으로 다음 토큰의 확률을 계산하는 것뿐이다. 그럴듯한 문장을 만드는 능력과 사실을 아는 능력은 다르다. 그래서 존재하지 않는 사실을 자신 있게 지어내는 환각(hallucination)이 생긴다. 확률적으로 가장 그럴듯한 이어짐이 반드시 참은 아니기 때문이다.

구조적 한계도 뚜렷하다. 자기어텐션은 모든 토큰 쌍을 계산하므로 문맥이 길어질수록 계산과 메모리 부담이 급격히 늘어난다. 문장 길이의 제곱에 비례하는 이 비용이 처리 가능한 문맥 길이를 제약한다. 긴 문맥을 다루려는 여러 개선 기법이 나왔지만 근본적인 부담은 남아 있다.

또 하나, 트랜스포머는 학습한 데이터에 담긴 편향을 그대로 물려받는다. 데이터에 특정 관점이나 차별이 배어 있으면 출력도 그 경향을 띤다. 모델의 판단이 중립적이거나 객관적이라고 믿는 것은 위험하다. 실무에서는 출력을 검증하고 걸러 내는 안전장치를 함께 두어야 한다.

마지막으로 토큰화 자체의 한계도 있다. 한국어처럼 조각이 잘게 나는 언어는 같은 뜻을 더 많은 토큰으로 표현하고, 드문 단어나 오타는 예상치 못한 방식으로 쪼개진다. 이것이 길이 제한, 비용, 때로는 모델의 이해도에까지 영향을 미친다.

위치를 알려주는 좌표 — 포지셔널 인코딩의 속사정

자기어텐션에는 치명적인 맹점이 하나 있다. 단어들이 서로 주목하는 강도만 계산할 뿐, 그 단어가 문장의 몇 번째에 놓였는지는 전혀 모른다. "개가 사람을 물었다"와 "사람이 개를 물었다"는 어텐션 입장에서 구성 토큰이 똑같으므로, 위치 정보를 따로 주입하지 않으면 두 문장을 구별하지 못한다. 순환 신경망은 토큰을 순서대로 하나씩 먹으면서 순서를 자연히 알았지만, 트랜스포머는 문장 전체를 한꺼번에 병렬 처리한다. 그 대가로 순서 감각을 잃었고, 이를 되돌려 주는 장치가 포지셔널 인코딩(positional encoding)이다.

원논문이 제안한 방식은 사인·코사인 함수를 쓰는 고정 인코딩이다. 위치 pos와 차원 인덱스 i에 대해 짝수 차원에는 sin(pos/10000^(2i/d)), 홀수 차원에는 cos(...)를 채운다. 주기가 서로 다른 파동을 여러 개 겹쳐 각 위치마다 고유한 벡터 지문을 만드는 셈이다. 이 방식의 묘미는 상대 위치를 선형 변환으로 표현할 수 있다는 데 있다. pos+k 위치의 인코딩은 pos 위치 인코딩의 회전으로 얻어지므로, 모델이 "세 칸 뒤" 같은 상대적 거리를 학습하기 수월하다. 학습 없이 계산으로 구하므로 훈련 때 본 적 없는 긴 문장에도 그럭저럭 대응한다.

최근 대규모 언어모델은 고정 인코딩 대신 회전 위치 임베딩(RoPE, Rotary Position Embedding)을 널리 쓴다. RoPE는 위치 정보를 벡터에 더하지 않고, 쿼리와 키 벡터를 위치에 비례한 각도만큼 회전시킨다. 두 토큰의 어텐션 점수가 자연스럽게 상대 거리에만 의존하게 되어, 긴 문맥 확장에 유리하다. 실제로 라마(LLaMA) 계열을 비롯한 다수의 오픈 모델이 RoPE를 채택했고, 회전 각도의 기저를 조정하는 방법으로 문맥 길이를 사후에 늘리는 기법도 활발히 연구된다.

실무에서 위치 인코딩은 평소엔 존재를 잊고 지내다가 문맥 길이를 늘릴 때 갑자기 발목을 잡는다. 4천 토큰까지 훈련한 모델에 3만 토큰을 밀어 넣으면, 훈련 분포를 벗어난 위치 신호가 들어와 성능이 급격히 무너진다. 이 문제를 다루는 실전 기법이 위치 보간(position interpolation)이나 NTK 스케일링이다. 문맥 창을 확장한 모델을 고를 때 어떤 위치 인코딩을 쓰는지, 어떤 방식으로 확장했는지 확인하는 습관이 성능 예측에 큰 도움이 된다.

멀티헤드 어텐션은 왜 머리를 여러 개 둘까

자기어텐션을 한 번만 계산해도 단어 사이 관계는 잡힌다. 그런데 트랜스포머는 어텐션을 여러 갈래로 쪼개 동시에 굴린다. 이것이 멀티헤드 어텐션(multi-head attention)이다. 직관은 이렇다. 문장 하나에도 문법적 의존 관계, 의미적 유사성, 대명사가 가리키는 대상 같은 서로 다른 종류의 관계가 겹겹이 존재한다. 어텐션 헤드 하나가 이 모두를 한꺼번에 담기는 벅차다. 그래서 표현 공간을 여러 부분 공간으로 나누고, 각 헤드가 서로 다른 관점에서 관계를 살피게 한다.

구체적으로는 모델 차원 d를 헤드 수 h로 나눠 각 헤드가 d/h 차원에서 독립적으로 쿼리·키·값을 만든다. 예를 들어 d가 512이고 헤드가 8개면 헤드마다 64차원에서 어텐션을 계산한 뒤 결과를 이어 붙이고 다시 선형 변환한다. 흥미롭게도 실제 학습된 모델을 뜯어보면 어떤 헤드는 바로 앞 단어에만 주목하고, 어떤 헤드는 문장 끝의 마침표를 추적하며, 또 어떤 헤드는 특정 구문 구조에 반응한다. 물론 모든 헤드가 뚜렷한 역할을 맡지는 않는다. 상당수 헤드는 제거해도 성능이 거의 떨어지지 않는다는 연구 결과가 있고, 이는 모델에 상당한 잉여가 존재함을 보여 준다.

추론 속도가 중요한 실무에서는 헤드 구조가 곧 비용이다. 표준 멀티헤드 어텐션은 헤드마다 키와 값을 따로 저장하므로, 긴 문맥을 생성할 때 이 키·값 캐시(KV cache)가 메모리를 잡아먹는다. 이를 줄이려고 여러 쿼리 헤드가 키·값을 공유하는 그룹 쿼리 어텐션(GQA, Grouped-Query Attention)이나 극단적으로 하나만 공유하는 멀티쿼리 어텐션(MQA)이 등장했다. 아래 표는 세 방식의 차이를 정리한 것이다.

방식 키·값 헤드 장점 대가
멀티헤드(MHA) 쿼리 헤드마다 각각 표현력 최대 KV 캐시 큼, 느림
그룹 쿼리(GQA) 그룹당 하나 공유 균형점 약간의 품질 손실
멀티쿼리(MQA) 전체가 하나 공유 캐시 최소, 빠름 품질 저하 위험

최신 오픈 모델 다수가 GQA를 기본값으로 택한 이유가 여기 있다. 품질을 크게 훼손하지 않으면서 생성 속도와 메모리를 동시에 잡기 때문이다. 트랜스포머를 서빙할 때 배치 크기와 문맥 길이가 늘어날수록 병목은 연산량보다 KV 캐시 메모리로 옮겨 간다. 어떤 어텐션 변형을 쓰는지가 서빙 비용을 좌우한다는 점을 기억해 둘 만하다.

층을 깊게 쌓아도 무너지지 않는 이유 — 잔차 연결과 정규화

트랜스포머는 어텐션 블록 하나로 끝나지 않는다. 같은 구조를 수십 층 쌓는다. GPT 계열 대형 모델은 수십에서 백 단위의 층을 쌓기도 한다. 신경망을 깊게 쌓으면 기울기가 소실되거나 폭발해 학습이 안 되는 게 상식인데, 트랜스포머는 어떻게 이 깊이를 견딜까. 핵심 장치가 잔차 연결(residual connection)과 층 정규화(layer normalization)다. 둘은 화려하지 않지만, 이것이 빠지면 깊은 트랜스포머는 학습 자체가 되지 않는다.

잔차 연결은 각 서브층의 출력에 입력을 그대로 더해 준다. 수식으로는 출력이 x + f(x)가 된다. 이렇게 하면 역전파 때 기울기가 f를 거치지 않고도 항등 경로를 따라 곧장 아래층으로 흐른다. 층이 깊어져도 기울기가 지수적으로 줄지 않는 고속도로가 생기는 셈이다. 덕분에 각 층은 입력을 통째로 다시 만들 필요 없이, 필요한 만큼의 보정치만 학습하면 된다. 학습 부담이 크게 줄어든다.

층 정규화는 각 토큰 벡터의 값을 평균 0, 분산 1 부근으로 다듬어 층을 거치며 값의 크기가 제멋대로 커지거나 작아지는 것을 막는다. 초기 트랜스포머는 서브층 뒤에 정규화를 두는 사후 정규화(post-LN)를 썼지만, 이 방식은 아주 깊은 모델에서 학습이 불안정했다. 그래서 요즘 대형 모델은 서브층 앞에 정규화를 두는 사전 정규화(pre-LN)를 표준으로 삼는다. 사전 정규화는 학습 초기 안정성이 훨씬 좋아 워밍업 없이도 큰 학습률을 견딘다. 여기에 계산이 가벼운 RMSNorm으로 갈아탄 모델도 많다.

실무에서 이 부분은 대개 프레임워크가 알아서 처리하므로 직접 만질 일이 드물다. 다만 모델을 직접 파인튜닝하거나 구조를 손볼 때, 학습 손실이 초반부터 발산한다면 정규화 위치와 학습률 워밍업을 먼저 의심하는 게 정석이다. 잔차 연결과 정규화는 모델 성능표에 이름을 올리는 화려한 요소는 아니지만, 오늘날의 초거대 모델을 물리적으로 가능하게 만든 조용한 토대다.

제곱으로 불어나는 계산량 — 긴 문맥의 진짜 비용

트랜스포머의 병렬성은 축복이자 저주다. 자기어텐션은 모든 토큰이 모든 토큰을 본다. 토큰이 n개면 어텐션 행렬은 n×n 크기가 된다. 문맥 길이가 두 배가 되면 연산량과 메모리는 네 배로 뛴다. 이 제곱 복잡도가 긴 문맥을 다루는 트랜스포머의 근본 병목이다. 문서 요약, 코드베이스 분석, 긴 대화 기억처럼 문맥이 길수록 좋은 작업에서 이 비용은 곧바로 지갑과 지연 시간으로 돌아온다.

이 문제를 정면으로 공략한 대표적 성과가 플래시어텐션(FlashAttention)이다. 발상의 전환이 인상적이다. 거대한 n×n 어텐션 행렬을 통째로 메모리에 올리지 않고, 작은 블록으로 쪼개 GPU의 빠른 온칩 메모리 안에서 계산하고 버린다. 수학적 결과는 표준 어텐션과 완전히 같지만, 느린 메모리를 오가는 횟수를 확 줄여 실제 속도를 크게 끌어올린다. 정확도를 한 톨도 희생하지 않고 순수하게 구현 방식만으로 속도를 얻은 사례라 의미가 크다.

다른 갈래는 어텐션의 범위를 아예 줄이는 접근이다. 모든 토큰을 다 보지 않고 가까운 이웃 몇 개와 소수의 전역 토큰만 보게 하는 희소 어텐션(sparse attention), 어텐션을 저차원으로 근사하는 선형 어텐션 계열이 여기 속한다. 이론상 복잡도를 선형에 가깝게 낮추지만, 실제로는 품질 손실이나 하드웨어 효율 문제로 표준 어텐션을 완전히 밀어내지는 못했다. 정확한 계산을 유지한 플래시어텐션이 오히려 더 널리 자리 잡은 것이 현실이다.

실무 관점에서 이 비용 구조를 이해하면 판단이 명확해진다. 문맥에 무작정 자료를 다 밀어 넣는 대신, 검색 증강 생성(RAG)으로 정말 필요한 조각만 추려 넣는 편이 비용과 정확도 양쪽에서 유리할 때가 많다. 문맥 창이 아무리 넓어져도 제곱 비용은 사라지지 않고, 게다가 긴 문맥의 중간에 놓인 정보를 모델이 놓치는 현상도 보고된다. 문맥 창의 크기와 실제로 잘 활용되는 정보량은 별개라는 점을 늘 염두에 두어야 한다.

인코더-디코더에서 순수 디코더로 — 설계 철학의 대이동

초기 트랜스포머는 인코더와 디코더를 나란히 둔 번역기였다. 인코더가 원문을 이해해 표현을 만들고, 디코더가 그 표현을 참고해 번역문을 생성했다. 그런데 오늘날 화제를 모으는 대규모 언어모델은 대부분 디코더만 남긴 순수 디코더(decoder-only) 구조다. 왜 절반을 버리는 방향으로 진화했는지 살펴보면 트랜스포머 계보의 큰 흐름이 보인다.

순수 디코더 모델은 오직 한 가지 목표로 학습한다. 앞 토큰들을 보고 다음 토큰을 맞히는 것이다. 이 단순한 목표가 강력한 이유는 세상의 거의 모든 텍스트가 그대로 학습 데이터가 되기 때문이다. 정답 라벨을 사람이 붙일 필요 없이, 인터넷의 방대한 텍스트를 순서대로 흘려보내기만 하면 된다. 규모를 키우기가 압도적으로 쉽고, 규모가 커질수록 성능이 매끄럽게 오르는 스케일링 법칙(scaling law)이 관측되면서, 업계는 이 노선에 자원을 쏟아부었다.

반면 BERT로 대표되는 순수 인코더 모델은 문장 전체를 양방향으로 읽어 이해하는 데 강하다. 문장 분류, 개체명 인식, 의미 유사도 계산 같은 이해 중심 작업에서 여전히 효율이 좋다. 검색과 RAG의 핵심인 임베딩 생성에도 인코더 계열이 널리 쓰인다. 한편 T5처럼 인코더-디코더를 유지한 모델은 요약·번역처럼 입력과 출력이 뚜렷이 구분되는 작업에서 깔끔한 구조적 장점을 지닌다. 아래 표에 세 계보를 정리했다.

구조 대표 모델 강점 작업 학습 방식
순수 인코더 BERT 계열 분류·임베딩·이해 마스크 복원
순수 디코더 GPT·LLaMA 계열 생성·대화·추론 다음 토큰 예측
인코더-디코더 T5 계열 번역·요약 시퀀스 변환

결국 어떤 구조가 절대적으로 우월하다기보다, 풀려는 문제의 성격이 선택을 좌우한다. 생성과 범용성을 원하면 디코더, 문서를 벡터로 바꿔 검색하려면 인코더가 자연스러운 출발점이다. 다만 최근에는 디코더 모델의 규모와 일반화 능력이 워낙 압도적이라, 예전에 인코더가 맡던 이해 작업까지 디코더 모델이 프롬프트만으로 처리하는 경우가 늘고 있다. 트랜스포머라는 한 가지 뼈대 위에서 어느 절반을 살리고 어떻게 학습하느냐가 모델의 성격을 통째로 바꾼다는 점이 이 구조의 진짜 매력이다.

더 깊이 파고들려면 — 이어지는 개념들

원전을 직접 읽는 것이 가장 확실하다. 「Attention Is All You Need」는 트랜스포머의 출발점이고, 이해하기 어렵다면 그림으로 풀어낸 「The Illustrated Transformer」나 코드와 함께 한 줄씩 짚어 주는 「The Annotated Transformer」를 곁들이면 좋다. 인코더 계열과 양방향 학습이 궁금하면 BERT 논문을, 트랜스포머 이전의 흐름과 어텐션의 기원을 알고 싶다면 시퀀스 투 시퀀스와 정렬 어텐션 논문을 함께 보면 맥락이 잡힌다.

개념의 연결 고리도 챙겨 두면 좋다. 토큰화와 임베딩은 벡터 검색과 RAG로, 자기어텐션은 멀티헤드와 위치 인코딩으로, 확률 분포와 디코딩은 온도·top-k·top-p 같은 실전 파라미터로 뻗어 나간다. 여기에 프롬프트 엔지니어링, 파인튜닝, 경량 학습 기법을 얹으면 트랜스포머 기반 LLM을 실무에서 다루는 그림이 완성된다.

무엇보다 트랜스포머를 '다음 단어 예측기'라는 한 문장으로 붙잡아 두는 것이 좋다. 화려한 대화도, 긴 문서 요약도, 코드 생성도 결국 토큰을 하나씩 골라 붙이는 반복이다. 이 뼈대를 잡고 나면 새로 등장하는 모델이나 기법도 '이 다섯 동작 중 어디를 어떻게 개선했나'라는 눈으로 읽어낼 수 있다.

출처

  1. Attention Is All You Need
  2. Sequence to Sequence Learning with Neural Networks
  3. Neural Machine Translation by Jointly Learning to Align and Translate
  4. BERT: Pre-training of Deep Bidirectional Transformers
  5. The Illustrated Transformer
  6. The Annotated Transformer
뉴스레터로 매주 받아보기 ← 기술블로그 목록