데이터 시각화는 사용자가
값은 설명용 예시입니다. 왼쪽 '예문'에서 골라 보세요.
온도

0.8

샘플링

k=5

트랜스포머란 무엇일까요?

트랜스포머(Transformer)는 인공지능의 접근 방식을 근본적으로 바꾼 신경망 구조입니다. 2017년 기념비적인 논문 "Attention is All You Need"에서 처음 소개되었고, 이후 딥러닝 모델의 표준 구조로 자리 잡았습니다. OpenAI의 GPT, Meta의 Llama, Google의 Gemini 같은 텍스트 생성 모델이 모두 트랜스포머를 기반으로 합니다. 텍스트뿐 아니라 오디오 생성, 이미지 인식, 단백질 구조 예측, 심지어 게임 플레이에도 쓰이며, 다양한 분야에서 폭넓게 활용되고 있습니다.

텍스트 생성 트랜스포머 모델의 기본 원리는 다음 토큰 예측(next-token prediction)입니다. 사용자가 입력한 문장(프롬프트) 뒤에 이어질 가장 그럴듯한 다음 토큰(단어 또는 단어의 일부)이 무엇인지 맞히는 것입니다. 트랜스포머의 핵심 혁신이자 강점은 셀프 어텐션(self-attention) 메커니즘에 있습니다. 덕분에 문장 전체를 한꺼번에 처리하고, 멀리 떨어진 단어 사이의 관계도 이전 구조보다 훨씬 잘 파악할 수 있습니다.

GPT-2 계열 모델은 텍스트 생성 트랜스포머의 대표적인 예입니다. 이 한국어판 Transformer Explainer는 GPT-2 (small)과 같은 구조를 가진 한국어 모델 KoGPT2 (skt/kogpt2-base-v2, 파라미터 약 1억 2,500만 개)를 가정해 설명하며, 화면의 값은 흐름을 보여 주기 위한 설명용 예시입니다. 최신 모델이나 가장 강력한 모델은 아니지만, 현재 최첨단 모델에서 쓰이는 구조와 원리를 상당 부분 공유하고 있어 기본 개념을 이해하는 출발점으로 알맞습니다.

트랜스포머의 구조

모든 텍스트 생성 트랜스포머는 다음 세 가지 핵심 요소로 이루어져 있습니다.

  1. 임베딩(Embedding): 입력 텍스트를 토큰이라는 작은 단위(단어 또는 단어 조각)로 나눕니다. 각 토큰은 임베딩이라는 숫자 벡터로 바뀌며, 이 벡터에 단어의 의미가 담깁니다.
  2. 트랜스포머 블록(Transformer Block): 입력 데이터를 처리하고 변환하는 모델의 기본 구성 단위입니다. 각 블록은 다음을 포함합니다.
    • 어텐션 메커니즘(Attention Mechanism): 트랜스포머 블록의 핵심입니다. 토큰끼리 서로 정보를 주고받게 하여 문맥과 단어 사이의 관계를 파악합니다.
    • MLP(다층 퍼셉트론) 층: 각 토큰을 독립적으로 처리하는 순방향 신경망입니다. 어텐션 층이 토큰 사이에 정보를 전달하는 역할이라면, MLP는 각 토큰의 표현을 더 정교하게 다듬는 역할을 합니다.
  3. 출력 확률(Output Probabilities): 마지막 선형 층과 소프트맥스 층이 처리된 임베딩을 확률로 바꿉니다. 이 확률로 모델은 다음에 올 토큰을 예측합니다.

임베딩

트랜스포머 모델로 문장을 이어서 생성한다고 해 봅시다. 이 한국어판에서는 미리 준비된 예문 중 하나를 고르는데, 예를 들어 “데이터 시각화는 사용자가”라는 문장을 골랐다고 하겠습니다. 이 입력은 모델이 이해하고 처리할 수 있는 형태로 바뀌어야 합니다. 이때 필요한 것이 임베딩입니다. 임베딩은 텍스트를 모델이 다룰 수 있는 숫자 표현으로 바꿔 줍니다. 프롬프트를 임베딩으로 바꾸려면 1) 입력을 토큰화하고, 2) 토큰 임베딩을 구하고, 3) 위치 정보를 더한 뒤, 4) 토큰 임베딩과 위치 인코딩을 합쳐 최종 임베딩을 만듭니다. 각 단계를 차례로 살펴보겠습니다.

그림 1. 임베딩 층을 펼쳐 본 모습으로, 입력 프롬프트가 벡터 표현으로 바뀌는 과정을 보여 줍니다. 과정은 (1) 토큰화, (2) 토큰 임베딩, (3) 위치 인코딩, (4) 최종 임베딩 순서로 진행됩니다.

1단계: 토큰화

토큰화(tokenization)는 입력 텍스트를 토큰이라는 더 작고 다루기 쉬운 조각으로 나누는 과정입니다. 토큰은 하나의 단어일 수도 있고 단어의 일부일 수도 있습니다. 자주 쓰이는 단어는 통째로 하나의 토큰이 되지만, 그렇지 않은 단어는 여러 토큰으로 쪼개집니다. 한국어는 조사와 어미가 붙기 때문에 "사용자가"처럼 어절 하나가 여러 토큰으로 나뉘는 경우가 많습니다. 실제로 어떻게 나뉘는지는 위의 시각화에서 직접 확인할 수 있습니다. 토큰의 전체 목록(어휘 사전)은 모델을 학습하기 전에 정해집니다. KoGPT2는 한국어 텍스트로 학습한 자체 BPE 토크나이저를 쓰며, 어휘 사전에는 51,200개의 고유한 토큰이 있습니다. 입력 텍스트를 각자 고유 ID를 가진 토큰으로 나누었으니, 이제 임베딩에서 각 토큰의 벡터 표현을 가져올 수 있습니다.

2단계: 토큰 임베딩

KoGPT2는 GPT-2 (small)과 마찬가지로 어휘 사전의 각 토큰을 768차원 벡터로 나타냅니다(벡터의 차원은 모델마다 다릅니다). 이 임베딩 벡터들은 (51,200, 768) 모양의 행렬에 저장되며, 파라미터 수가 약 3,900만 개에 이릅니다. 이 거대한 행렬 덕분에 모델은 각 토큰에 의미를 부여할 수 있습니다. 즉, 쓰임새나 의미가 비슷한 토큰은 이 고차원 공간에서 가까이 놓이고, 서로 다른 토큰은 멀리 떨어지게 됩니다.

3단계: 위치 인코딩

임베딩 층은 각 토큰이 입력 프롬프트의 몇 번째 위치에 있는지에 대한 정보도 함께 담습니다. 위치 인코딩(positional encoding) 방식은 모델마다 다릅니다. GPT-2 계열(KoGPT2 포함)은 위치 인코딩 행렬을 처음부터 직접 학습하며, 이를 학습 과정에 그대로 포함시킵니다.

4단계: 최종 임베딩

마지막으로 토큰 임베딩과 위치 인코딩을 더해 최종 임베딩을 얻습니다. 이렇게 합친 표현에는 토큰의 의미와 입력 문장 속 위치가 모두 담깁니다.

트랜스포머 블록

트랜스포머 처리의 핵심은 트랜스포머 블록입니다. 트랜스포머 블록은 멀티헤드 셀프 어텐션과 MLP(다층 퍼셉트론) 층으로 구성됩니다. 대부분의 모델은 이런 블록을 여러 개 차례로 쌓아 올린 구조입니다. 토큰의 표현은 첫 번째 블록부터 마지막 블록까지 층을 거치며 점점 발전하고, 모델은 이를 통해 각 토큰을 깊이 있게 이해하게 됩니다. 이렇게 층을 쌓는 방식 덕분에 입력에 대한 더 높은 수준의 표현을 만들 수 있습니다. 여기서 살펴보는 KoGPT2 모델은 이런 블록 12개로 이루어져 있습니다.

멀티헤드 셀프 어텐션

셀프 어텐션 메커니즘은 문장 속 토큰 사이의 관계를 파악해, 각 토큰의 표현이 다른 토큰의 영향을 받도록 합니다. 어텐션 헤드가 여러 개 있으면 이런 관계를 서로 다른 관점에서 볼 수 있습니다. 예를 들어 어떤 헤드는 가까운 단어 사이의 문법적 연결을, 다른 헤드는 더 넓은 의미상의 문맥을 파악할 수 있습니다. 아래에서 멀티헤드 셀프 어텐션이 어떻게 계산되는지 단계별로 살펴보겠습니다.

1단계: 쿼리, 키, 값 행렬

QKVij=(∑d=1768Embeddingi,d⋅Weightsd,j)+Biasj QKV_{ij} = ( \sum_{d=1}^{768} \text{Embedding}_{i,d} \cdot \text{Weights}_{d,j}) + \text{Bias}_j
그림 2. 원래의 임베딩에서 쿼리, 키, 값 행렬을 계산하는 과정.

각 토큰의 임베딩 벡터는 세 개의 벡터, 쿼리(Q), 키(K), 값(V)으로 변환됩니다. 이 벡터들은 입력 임베딩 행렬에 Q, K, V 각각에 대해 학습된 가중치 행렬을 곱해서 얻습니다. 이 행렬들을 직관적으로 이해할 수 있도록 웹 검색에 비유해 보겠습니다.

  • 쿼리(Q)는 검색창에 입력하는 검색어입니다. "더 알아보고 싶은" 토큰에 해당합니다.
  • 키(K)는 검색 결과 화면에 나오는 각 웹 페이지의 제목입니다. 쿼리가 주목할 수 있는 후보 토큰들을 나타냅니다.
  • 값(V)은 실제로 보여지는 웹 페이지의 내용입니다. 검색어(쿼리)와 관련 있는 결과(키)를 찾았다면, 이제 가장 관련 있는 페이지의 내용(값)을 가져오는 것입니다.

모델은 이 QKV 값으로 어텐션 점수를 계산합니다. 어텐션 점수는 예측을 만들 때 각 토큰에 얼마나 주목할지를 결정합니다.

2단계: 멀티헤드로 나누기

쿼리, 키, 값 벡터는 여러 개의 헤드로 나뉩니다. KoGPT2(GPT-2 small과 동일)의 경우 12개의 헤드로 나뉩니다. 각 헤드는 임베딩의 일부분을 독립적으로 처리하면서 서로 다른 문법적, 의미적 관계를 파악합니다. 이런 설계 덕분에 다양한 언어적 특징을 병렬로 학습할 수 있어 모델의 표현력이 높아집니다.

3단계: 마스킹된 셀프 어텐션

각 헤드에서는 마스킹된 셀프 어텐션을 계산합니다. 이 메커니즘은 입력에서 관련 있는 부분에 집중하되, 아직 나오지 않은 미래의 토큰은 보지 못하게 막으면서 문장을 생성하도록 합니다.

그림 3. 쿼리, 키, 값 행렬로 마스킹된 셀프 어텐션을 계산하는 과정.
  • 내적(Dot Product): 쿼리 행렬과 키 행렬의 내적으로 어텐션 점수를 구합니다. 그 결과 모든 입력 토큰 사이의 관계를 나타내는 정사각 행렬이 만들어집니다.
  • 스케일링 · 마스킹: 어텐션 점수의 크기를 조정(스케일링)하고, 어텐션 행렬의 위쪽 삼각형 부분에 마스크를 씌워 그 값을 음의 무한대로 설정합니다. 이렇게 해서 모델이 미래의 토큰을 보지 못하게 합니다. 모델은 미래를 “엿보지” 않고 다음 토큰을 예측하는 법을 배워야 하기 때문입니다.
  • 소프트맥스 · 드롭아웃: 마스킹과 스케일링을 거친 어텐션 점수는 소프트맥스 연산으로 확률로 바뀌고, 필요에 따라 드롭아웃으로 규제됩니다. 행렬의 각 행은 합이 1이 되며, 해당 토큰 왼쪽(앞쪽)에 있는 각 토큰이 얼마나 관련 있는지를 나타냅니다.

4단계: 출력과 결합

모델은 마스킹된 셀프 어텐션 점수를 값 행렬과 곱해 셀프 어텐션 메커니즘의 최종 출력을 얻습니다. KoGPT2에는 셀프 어텐션 헤드가 12개 있고, 각 헤드는 토큰 사이의 서로 다른 관계를 파악합니다. 이 헤드들의 출력을 이어 붙인(결합한) 뒤 선형 변환(projection)을 거칩니다.

MLP: 다층 퍼셉트론

그림 4. MLP 층으로 셀프 어텐션 표현을 더 높은 차원으로 변환해 모델의 표현력을 높이는 과정.

여러 셀프 어텐션 헤드가 입력 토큰 사이의 다양한 관계를 파악하고 나면, 결합된 출력은 모델의 표현력을 높이기 위해 MLP(다층 퍼셉트론) 층을 거칩니다. MLP 블록은 두 번의 선형 변환과 그 사이의 GELU 활성화 함수로 이루어져 있습니다.

첫 번째 선형 변환은 입력의 차원을 768에서 3072로 네 배 늘립니다. 이렇게 차원을 넓히면 토큰 표현을 더 높은 차원의 공간으로 옮길 수 있고, 원래 차원에서는 드러나지 않던 더 풍부하고 복잡한 패턴을 잡아낼 수 있습니다.

두 번째 선형 변환은 차원을 다시 원래 크기인 768로 줄입니다. 이 압축 단계는 표현을 다루기 쉬운 크기로 되돌리면서도, 확장 단계에서 얻은 유용한 비선형 변환의 효과는 그대로 유지합니다.

토큰 사이의 정보를 통합하는 셀프 어텐션과 달리, MLP는 각 토큰을 독립적으로 처리합니다. 각 토큰의 표현을 한 공간에서 다른 공간으로 옮겨 주는 역할만 하며, 이를 통해 모델 전체의 표현력을 높입니다.

출력 확률

입력이 모든 트랜스포머 블록을 통과하고 나면, 그 출력은 토큰 예측을 위해 마지막 선형 층을 거칩니다. 이 층은 최종 표현을 51,200차원 공간(KoGPT2 어휘 사전의 크기)으로 변환하며, 어휘 사전의 모든 토큰마다 로짓(logit)이라는 값이 하나씩 대응됩니다. 어떤 토큰이든 다음 단어가 될 수 있으므로, 이 과정을 거치면 각 토큰이 다음 단어가 될 가능성에 따라 순위를 매길 수 있습니다. 그런 다음 소프트맥스 함수를 적용해 로짓을 합이 1인 확률 분포로 바꿉니다. 이 확률에 따라 다음 토큰을 샘플링(선택)하게 됩니다.

그림 5. 어휘 사전의 각 토큰에는 모델이 출력한 로짓을 바탕으로 확률이 매겨집니다. 이 확률이 각 토큰이 문장의 다음 단어가 될 가능성을 결정합니다.

마지막 단계는 이 확률 분포에서 샘플링해 다음 토큰을 정하는 것입니다. 여기서 온도(temperature) 하이퍼파라미터가 중요한 역할을 합니다. 수학적으로는 아주 간단한 연산으로, 모델이 출력한 로짓을 온도 값으로 나누기만 하면 됩니다.

  • 온도 = 1: 로짓을 1로 나누므로 소프트맥스 결과에 아무 변화가 없습니다.
  • 온도 < 1: 온도가 낮으면 확률 분포가 뾰족해져서 모델이 더 확신에 차고 결정적으로 동작합니다. 그 결과 더 예측 가능한 출력이 나옵니다.
  • 온도 > 1: 온도가 높으면 확률 분포가 완만해져서 생성되는 텍스트에 무작위성이 더 커집니다. 이를 흔히 모델의 “창의성”이라고 부르기도 합니다.

또한 top-k와 top-p 파라미터로 샘플링 과정을 더 세밀하게 조정할 수 있습니다.

  • top-k 샘플링: 확률이 가장 높은 상위 k개 토큰만 후보로 남기고, 가능성이 낮은 나머지 토큰은 제외합니다.
  • top-p 샘플링: 확률을 높은 순서대로 더해 누적 확률이 기준값 p를 넘는 가장 작은 토큰 집합만 후보로 삼습니다. 가능성이 높은 토큰만 남기면서도 어느 정도 다양성을 유지할 수 있습니다.

온도, top-k, top-p를 조절하면 결정적인 출력과 다양한 출력 사이에서 균형을 잡아, 원하는 목적에 맞게 모델의 동작을 조정할 수 있습니다.

보조 구조 요소

트랜스포머 모델의 성능을 높여 주는 보조적인 구조 요소가 몇 가지 있습니다. 모델 전체 성능에는 중요하지만, 구조의 핵심 개념을 이해하는 데 꼭 필요한 것은 아닙니다. 레이어 정규화, 드롭아웃, 잔차 연결은 특히 학습 단계에서 중요한 요소입니다. 레이어 정규화는 학습을 안정시키고 모델이 더 빨리 수렴하도록 돕습니다. 드롭아웃은 뉴런을 무작위로 끄는 방식으로 과적합을 막습니다. 잔차 연결은 기울기(gradient)가 신경망을 직접 통과해 흐르게 하여 기울기 소실 문제를 막아 줍니다.

레이어 정규화

레이어 정규화(layer normalization)는 학습 과정을 안정시키고 수렴을 개선합니다. 입력을 특징(feature) 방향으로 정규화해 활성값의 평균과 분산을 일정하게 유지하는 방식입니다. 이 정규화는 내부 공변량 변화(internal covariate shift)와 관련된 문제를 줄여, 모델이 더 효과적으로 학습하고 초기 가중치에 덜 민감해지도록 합니다. 레이어 정규화는 각 트랜스포머 블록에서 두 번 적용됩니다. 한 번은 셀프 어텐션 앞에서, 또 한 번은 MLP 층 앞에서입니다.

드롭아웃

드롭아웃(dropout)은 신경망의 과적합을 막는 규제 기법으로, 학습 중에 모델 가중치의 일부를 무작위로 0으로 만듭니다. 이렇게 하면 모델이 특정 뉴런에 덜 의존하고 더 견고한 특징을 배우게 되어, 처음 보는 새로운 데이터에도 잘 일반화됩니다. 모델 추론 시에는 드롭아웃을 끕니다. 이는 사실상 학습된 여러 하위 네트워크의 앙상블을 사용하는 셈이어서 더 좋은 성능으로 이어집니다.

잔차 연결

잔차 연결(residual connection)은 2015년 ResNet 모델에서 처음 소개되었습니다. 이 구조적 혁신은 매우 깊은 신경망의 학습을 가능하게 하여 딥러닝에 큰 변화를 가져왔습니다. 잔차 연결은 하나 이상의 층을 건너뛰는 지름길로, 어떤 층의 입력을 그 층의 출력에 그대로 더해 줍니다. 이를 통해 기울기 소실 문제를 줄여, 트랜스포머 블록을 여러 겹 쌓은 깊은 신경망도 쉽게 학습할 수 있습니다. GPT-2(그리고 KoGPT2)에서는 각 트랜스포머 블록 안에서 잔차 연결이 두 번 쓰입니다. 한 번은 MLP 앞에서, 또 한 번은 MLP 뒤에서입니다. 덕분에 기울기가 더 쉽게 흐르고, 역전파 과정에서 앞쪽 층도 충분히 업데이트됩니다.

직접 해 볼 수 있는 기능

Transformer Explainer는 트랜스포머의 내부 동작을 직접 탐색할 수 있도록 만들어졌습니다. 이 한국어판에서 사용할 수 있는 기능은 다음과 같습니다.

  • 예문 5개 중 하나를 선택해 모델이 문장을 어떻게 처리하고 다음 단어를 예측하는지 살펴보세요. 어텐션 가중치, 중간 계산 과정, 최종 출력 확률이 어떻게 계산되는지 확인할 수 있습니다. (이 한국어판은 자유 입력 대신 미리 계산된 예문만 제공합니다.)
  • 온도 슬라이더로 모델 예측의 무작위성을 조절해 보세요. 온도 값을 바꾸면 모델 출력이 더 결정적으로, 또는 더 창의적으로 바뀌는 모습을 볼 수 있습니다.
  • top-k, top-p 샘플링 방식을 선택해 추론 중 샘플링 방식을 조정해 보세요. 값을 바꿔 가며 확률 분포가 어떻게 달라지고 모델의 예측에 어떤 영향을 주는지 확인할 수 있습니다.
  • 어텐션 맵을 직접 다뤄 보며 모델이 입력 문장의 어떤 토큰에 주목하는지 살펴보세요. 토큰 위에 마우스를 올리면 해당 토큰의 어텐션 가중치가 강조되어, 모델이 문맥과 단어 사이의 관계를 어떻게 파악하는지 알 수 있습니다.

영상 튜토리얼 (영어, 원본 GPT-2 버전)

Transformer Explainer는 어떻게 구현되었나요?

원본 Transformer Explainer는 브라우저 안에서 GPT-2 (small) 모델을 실시간으로 실행합니다. 이 모델은 Andrej Karpathy의 nanoGPT 프로젝트에 있는 PyTorch 기반 GPT 구현을 바탕으로 하며, 브라우저에서 바로 실행할 수 있도록 ONNX Runtime 형식으로 변환되었습니다. 화면은 JavaScript로 만들었고, 프론트엔드 프레임워크로 Svelte를, 동적 시각화에는 D3.js를 사용했습니다.

이 한국어판은 브라우저에서 모델을 실행하지 않습니다. 대신 한국어 예문 5개에 대해 흐름을 보여 주기 위한 설명용 예시 값을 넣어 두었습니다. 모든 내용은 HTML 파일 하나에 담겨 있어 인터넷 연결 없이도 작동합니다.

Transformer Explainer는 누가 만들었나요?

Transformer Explainer는 조지아 공과대학교(Georgia Institute of Technology)의 Aeree Cho, Grace C. Kim, Alexander Karpekov, Alec Helbling, Jay Wang, Seongmin Lee, Benjamin Hoover, Polo Chau가 만들었습니다.

한국어판 안내

  • 원본: Transformer Explainer (Polo Club of Data Science, Georgia Tech, MIT License)
  • 이 페이지는 원본을 한국어로 번역하고, 한국어 모델 KoGPT2를 가정해 설명한 스터디 학습용 버전입니다.
  • 가정한 모델: KoGPT2 (SK텔레콤, CC BY-NC-SA 4.0, 비상업적 이용)
  • 예문 5개의 토큰 분할, 어텐션 값, 다음 토큰 확률은 흐름을 보여 주기 위한 설명용 예시 값입니다. 실제 모델의 계산 결과와 다를 수 있습니다.