Transformer 아키텍처가 현대 LLM을 구동하는 방식
요약
현대 LLM의 핵심인 Transformer 아키텍처의 작동 원리를 단계별로 설명합니다. 텍스트가 토큰으로 분해되는 과정부터, 토큰이 고차원 벡터인 임베딩으로 변환되어 의미적 유사성을 갖게 되는 과정을 다룹니다.
핵심 포인트
- Transformer는 2017년에 도입된 시퀀스 예측 알고리즘으로, 임베딩 레이어, Transformer 레이어, 출력 레이어로 구성됩니다.
- 토큰화(Tokenization) 과정을 통해 텍스트는 서브워드나 문자 단위의 기본 단위인 토큰으로 분해됩니다.
- 임베딩(Embeddings)은 토큰 ID를 고차원 벡터로 매핑하여 단어 간의 의미적 관계를 수치화합니다.
- Transformer는 모든 단어를 동시에 처리함으로써 방대한 데이터셋으로부터 복잡한 관계를 학습할 수 있습니다.
GPT, Claude 또는 Gemini와 같은 현대적인 대규모 언어 모델(LLM)과 상호작용할 때, 우리는 인간이 문장을 형성하는 방식과는 근본적으로 다른 과정을 목격하게 됩니다. 인간은 자연스럽게 생각을 구성하고 이를 단어로 변환하는 반면, LLM은 순환적인 변환 과정을 통해 작동합니다. 이 과정을 이해하면 이 강력한 시스템의 능력과 한계를 모두 파악할 수 있습니다. 대부분의 현대적인 LLM의 중심에는 Transformer라고 불리는 아키텍처가 자리 잡고 있습니다. 2017년에 도입된 Transformer는 신경망 레이어(neural network layers)로 구축된 시퀀스 예측(sequence prediction) 알고리즘입니다. 이 아키텍처는 세 가지 필수 구성 요소를 가집니다: 토큰(tokens)을 수치적 표현으로 변환하는 임베딩 레이어(embedding layer), 연산이 일어나는 여러 개의 Transformer 레이어, 그리고 결과를 다시 텍스트로 변환하는 출력 레이어(output layer)입니다. 아래 다이어그램을 참조하십시오: Transformer는 단어를 하나씩 처리하는 대신 모든 단어를 동시에 처리하며, 이를 통해 방대한 텍스트 데이터셋으로부터 학습하고 복잡한 단어 관계를 포착할 수 있습니다. 이 글에서는 Transformer 아키텍처가 어떻게 작동하는지 단계별로 살펴보겠습니다.
1단계: 텍스트에서 토큰으로
어떠한 연산이 일어나기 전에, 모델은 텍스트를 자신이 처리할 수 있는 형태로 변환해야 합니다. 이는 텍스트가 토큰(tokens)이라고 불리는 기본 단위로 분해되는 토큰화(tokenization) 과정에서 시작됩니다. 이것들이 항상 완전한 단어인 것은 아닙니다. 서브워드(subwords), 단어 파편, 또는 개별 문자일 수도 있습니다. 다음 입력 예시를 고려해 보십시오: “I love transformers!” 토크나이저(tokenizer)는 이를 다음과 같이 나눌 수 있습니다: [”I”, “ love”, “ transform”, “ers”, “!”]. “transformers”가 두 개의 별도 토큰이 되었음에 주목하십시오. 어휘집(vocabulary) 내의 각 고유한 토큰에는 고유한 정수 ID가 할당됩니다: “I”는 토큰 150일 수 있고, “love”는 토큰 8942, “transform”은 토큰 3301, “ers”는 토큰 1847, “!”는 토큰 254일 수 있습니다. 이 ID들은 고유한 관계가 없는 임의의 식별자입니다. 토큰 150과 151은 단순히 숫자가 가깝다고 해서 유사한 것이 아닙니다.
전체 어휘(vocabulary)는 일반적으로 모델이 학습 과정에서 습득한 50,000개에서 100,000개의 고유한 토큰(tokens)을 포함합니다.
2단계: 토큰을 임베딩(Embeddings)으로 변환하기
신경망(Neural networks)은 토큰 ID가 단순히 고정된 식별자일 뿐이기 때문에 이를 직접적으로 처리할 수 없습니다. 각 토큰 ID는 벡터(vector), 즉 일반적으로 수백 또는 수천 개의 차원(dimensions)을 포함하는 연속적인 숫자 리스트로 매핑됩니다. 이것을 임베딩(embeddings)이라고 부릅니다. 다음은 5차원을 사용한 단순화된 예시입니다 (실제 모델은 768에서 4096차원을 사용할 수 있습니다):
토큰 “dog”는 [0.23, -0.67, 0.45, 0.89, -0.12]가 됩니다.
토큰 “wolf”는 [0.25, -0.65, 0.47, 0.91, -0.10]가 됩니다.
토큰 “car”는 [-0.82, 0.34, -0.56, 0.12, 0.78]가 됩니다.
“dog”와 “wolf”는 유사한 숫자를 가지는 반면, “car”는 완전히 다르다는 점에 주목하십시오. 이를 통해 관련 개념들이 함께 모이는 의미 공간(semantic space)이 생성됩니다.
왜 여러 차원이 필요할까요? 단어당 하나의 숫자만 사용한다면 모순에 직면할 수 있기 때문입니다. 예를 들어:
“stock”은 5.2 (금융 용어)
“capital”은 5.3 (유사한 금융 용어)
“rare”는 -5.2 (반의어: 드문)
“debt”는 -5.3 (capital의 반의어)
이제 “rare”와 “debt”는 모두 유사한 음수 값을 가지게 되어 서로 관련이 있다는 의미를 내포하게 되는데, 이는 말이 되지 않습니다. 수백 개의 차원을 사용하면 모델이 이러한 모순 없이 복잡한 관계를 표현할 수 있습니다.
이 공간 내에서 우리는 수학적 연산을 수행할 수 있습니다. “king”의 임베딩에서 “man”을 빼고 “woman”을 더하면 대략 “queen”과 같아집니다. 이러한 관계는 텍스트 데이터의 패턴으로부터 학습 과정 중에 나타납니다.
3단계: 위치 정보(Positional Information) 추가하기
Transformer는 본질적으로 단어의 순서를 이해하지 못합니다. 추가 정보가 없다면, “The dog chased the cat”과 “The cat chased the dog”은 둘 다 동일한 토큰을 포함하고 있기 때문에 동일하게 보일 것입니다. 해결책은 위치 임베딩(positional embeddings)입니다. 토큰이 의미 벡터로 매핑되는 것처럼, 모든 위치는 위치 벡터(position vector)로 매핑됩니다.
위치 2에 나타나는 토큰 “dog”의 경우, 다음과 같이 보일 수 있습니다:
단어 임베딩 (Word embedding): [0.23, -0.67, 0.45, 0.89, -0.12]
위치 2 임베딩 (Position 2 embedding): [0.05, 0.12, -0.08, 0.03, 0.02]
결합된 값 (원소별 합, element-wise sum): [0.28, -0.55, 0.37, 0.92, -0.10]
이 결합된 임베딩은 단어의 의미와 사용 문맥을 모두 포착합니다. 이것이 바로 Transformer 레이어로 흘러 들어가는 데이터입니다.
4단계: Transformer 레이어에서의 어텐션 메커니즘 (Attention Mechanism)
Transformer 레이어는 이 모델들을 매우 강력하게 만드는 핵심 혁신인 어텐션 메커니즘 (attention mechanism)을 구현합니다. 각 Transformer 레이어는 모든 토큰에 대해 세 가지 구성 요소인 쿼리 (queries), 키 (keys), 값 (values)을 사용하여 작동합니다. 이를 모델이 찾고 있는 것 (쿼리)을 가능한 모든 답변 (키)과 비교하여 그에 해당하는 값들의 가중치 결합을 반환하는 '퍼지 사전 찾기 (fuzzy dictionary lookup)'라고 생각할 수 있습니다.
구체적인 예시를 통해 살펴보겠습니다. 다음 문장을 가정해 봅시다: “The cat sat on the mat because it was comfortable.” (고양이는 편안했기 때문에 매트 위에 앉았다.)
모델이 “it”이라는 단어를 처리할 때, “it”이 무엇을 가리키는지 결정해야 합니다. 과정은 다음과 같습니다:
먼저, “it”의 임베딩은 본질적으로 “내가 가리키는 명사가 무엇인가?”라고 묻는 쿼리 벡터 (query vector)를 생성합니다.
다음으로, 이 쿼리는 이전의 모든 토큰으로부터 나온 키 (keys)들과 비교됩니다. 각 비교는 유사도 점수 (similarity score)를 생성합니다. 예를 들어:
“The” (관사) 생성 점수: 0.05
“cat” (명사) 생성 점수: 8.3
“sat” (동사) 생성 점수: 0.2
“on” (전치사) 생성 점수: 0.03
“the” (관사) 생성 점수: 0.04
“mat” (명사) 생성 점수: 4.1
“because” (접속사) 생성 점수: 0.1
그 후, 원시 점수 (raw scores)는 합계가 1.0이 되는 어텐션 가중치 (attention weights)로 변환됩니다. 예를 들어:
“cat”이 받는 어텐션 가중치: 0.75 (75퍼센트)
“mat”이 받는 어텐션 가중치: 0.20 (20퍼센트)
기타 모든 토큰: 총 0.05 (합계 5퍼센트)
마지막으로, 모델은 각 토큰으로부터 값 벡터 (value vectors)를 가져와 이 가중치들을 사용하여 결합합니다.
예를 들어: Output = (0.75 × Value_cat) + (0.20 × Value_mat) + (0.03 × Value_the) + ... "cat"의 값은 출력에 75퍼센트 기여하고, "mat"은 20퍼센트 기여하며, 나머지는 거의 무시됩니다. 이 가중치가 적용된 결합은 "it"이 "cat"을 지칭할 가능성이 가장 높다는 문맥적 이해 (contextual understanding)를 포착하여 "it"에 대한 새로운 표현 (representation)이 됩니다. 이러한 어텐션 (attention) 과정은 모든 Transformer 레이어에서 발생하지만, 각 레이어는 서로 다른 패턴을 탐지하도록 학습됩니다. 초기 레이어 (early layers)는 문법이나 흔한 단어 쌍과 같은 기본적인 패턴을 학습합니다. "cat"을 처리할 때, 이 레이어들은 관사와 명사가 서로 연관되어 있다는 것을 학습했기 때문에 "The"에 강하게 어텐션을 줄 수 있습니다. 중간 레이어 (middle layers)는 문장 구조와 구 (phrase) 사이의 관계를 학습합니다. 이들은 "cat"이 "sat"의 주어라는 점과 "on the mat"이 위치를 나타내는 전치사구 (prepositional phrase)를 형성한다는 점을 파악할 수 있습니다. 깊은 레이어 (deep layers)는 추상적인 의미를 추출합니다. 이들은 이 문장이 물리적인 상황을 묘사하며, 고양이가 편안하거나 쉬고 있음을 암시한다는 것을 이해할 수 있습니다. 각 레이어는 점진적으로 표현을 정교화합니다. 한 레이어의 출력이 다음 레이어의 입력이 되며, 각 레이어는 더 많은 문맥적 이해를 추가합니다. 중요한 점은, 오직 마지막 Transformer 레이어만이 실제 토큰 (token)을 예측할 필요가 있다는 것입니다. 모든 중간 레이어는 동일한 어텐션 연산을 수행하지만, 단순히 다운스트림 레이어 (downstream layers)에 더 유용하도록 표현을 변환할 뿐입니다. 중간 레이어는 토큰 예측을 출력하지 않습니다. 대신, 다음 레이어로 흐르는 정교화된 벡터 표현 (vector representations)을 출력합니다. 언어 이해의 서로 다른 측면에 특화된 수많은 레이어를 쌓는 것이 바로 LLM이 복잡한 패턴을 포착하고 일관된 텍스트를 생성할 수 있게 하는 핵심입니다.
5단계: 텍스트로 다시 변환하기
모든 레이어를 통과한 후, 최종 벡터는 반드시 텍스트로 변환되어야 합니다. 언임베딩 레이어 (unembedding layer)는 이 벡터를 모든 토큰 임베딩 (token embedding)과 비교하여 점수를 생성합니다.
예를 들어, “I love to eat”을 완성하기 위해 언임베딩 (unembedding)은 다음과 같은 결과를 생성할 수 있습니다: “pizza”: 65.2, “tacos”: 64.8, “sushi”: 64.1, “food”: 58.3, “barbeque”: 57.9, “car”: -12.4, “42”: -45.8. 이러한 임의의 점수들은 소프트맥스 (softmax)를 사용하여 확률 (probabilities)로 변환됩니다: “pizza”: 28.3 퍼센트, “tacos”: 24.1 퍼센트, “sushi”: 18.9 퍼센트, “food”: 7.2 퍼센트, “barbeque”: 6.1 퍼센트, “car”: 0.0001 퍼센트, “42”: 0.0000001 퍼센트. 유사한 점수를 가진 토큰들(65.2 대 64.8)은 유사한 확률(28.3 대 24.1 퍼센트)을 부여받는 반면, 점수가 낮은 토큰들은 0에 가까운 확률을 받습니다. 모델은 가장 높은 확률을 가진 토큰을 선택하는 것이 아닙니다. 대신, 이 분포 (distribution)로부터 무작위로 샘플링 (randomly samples)합니다. 각 토큰이 자신의 확률에 비례하는 조각을 갖는 룰렛 휠을 생각해보세요. 피자(Pizza)는 28.3 퍼센트를 가져가고, 타코(tacos)는 24.1 퍼센트를 가져가며, 42는 미세한 조각을 가져갑니다. 이러한 무작위성의 이유는 “pizza”와 같은 특정 값만을 항상 선택하게 되면 반복적이고 부자연스러운 출력이 생성되기 때문입니다. 확률에 따라 가중치를 둔 무작위 샘플링 (Random sampling weighted by probability)은 “tacos”, “sushi” 또는 “barbeque”를 선택할 수 있게 하여, 다양하고 자연스러운 응답을 만들어냅니다. 때로는 확률이 낮은 토큰이 선택되어 창의적인 결과물로 이어지기도 합니다.
반복적 생성 루프 (The Iterative Generation Loop)
생성 과정은 모든 토큰에 대해 반복됩니다.
초기 프롬프트가 “The capital of France.”인 예시를 통해 살펴보겠습니다. 트랜스포머 (Transformer)의 각 사이클이 어떻게 진행되는지는 다음과 같습니다:
사이클 1:
입력: [”The”, “capital”, “of”, “France”]
모든 레이어 (Layers)를 통해 처리
샘플링: “is” (80 퍼센트)
현재까지의 출력: “The capital of France is”
사이클 2:
입력: ”The”, “capital”, “of”, “France”, “is”
모든 레이어를 통해 처리 (이제 5개의 토큰)
샘플링: “Paris” (92 퍼센트)
현재까지의 출력: “The capital of France is Paris”
사이클 3:
입력: ”The”, “capital”, “of”, “France”, “is”, “Paris”
모든 레이어를 통해 처리
샘플링: “.” (65 퍼센트)
현재까지의 출력: “The capital of France is Paris.”
사이클 4:
입력: ”The”, “capital”, “of”, “France”, “is”, “Paris”, “.”
모든 레이어를 통해 처리
샘플링: [EoS] 토큰 (88 퍼센트)
루프 중단
최종 출력: “The capital of France is Paris.”
[EoS] 또는 문장 종료 (end-of-sequence) 토큰은 완료를 알립니다. 각 사이클은 이전의 모든 토큰을 처리합니다. 이것이 응답이 길어질수록 생성이 느려질 수 있는 이유입니다. 각 출력이 이전의 모든 출력에 의존하기 때문에 이를 자기회귀 생성 (Autoregressive generation)이라고 부릅니다. 만약 특이한 토큰이 선택된다면 (예를 들어 “I love to eat chalk”에서 0.01 퍼센트의 확률로 “chalk”가 선택되는 경우), 이후의 모든 토큰은 이 선택의 영향을 받게 됩니다.
학습 (Training) 대 추론 (Inference): 두 가지 서로 다른 모드
트랜스포머의 흐름은 학습과 추론이라는 두 가지 맥락에서 작동합니다. 학습 과정 동안 모델은 수십억 개의 텍스트 예시로부터 언어 패턴을 학습합니다. 모델은 무작위 가중치 (Random weights)로 시작하여 이를 점진적으로 조정해 나갑니다.
학습이 작동하는 방식은 다음과 같습니다:
학습 텍스트: “The cat sat on the mat.” (고양이가 매트 위에 앉아 있었다.)
모델이 받는 입력: “The cat sat on the”
무작위 초기 가중치 (Random initial weights) 상태에서 모델은 다음과 같이 예측할 수 있습니다:
“banana”: 25퍼센트
“car”: 22퍼센트
“mat”: 3퍼센트 (정답의 확률이 낮음)
“elephant”: 18퍼센트
학습 과정은 오차 (mat의 확률이 더 높았어야 함)를 계산하고, 역전파 (Backpropagation)를 사용하여 모든 가중치를 조정합니다:
- “on”과 “the”에 대한 임베딩 (Embeddings)이 조정됩니다.
- 96개 모든 레이어 (Layers)의 어텐션 가중치 (Attention weights)가 조정됩니다.
- 언임베딩 (Unembedding) 레이어가 조정됩니다.
각 조정은 매우 미세하지만 (0.245에서 0.247 사이), 수십억 개의 예시를 통해 축적됩니다. 다양한 문맥 속에서 “sat on the” 다음에 “mat”이 오는 것을 수천 번 보고 나면, 모델은 이 패턴을 학습합니다. 학습에는 수천 개의 GPU가 투입되어 수 주가 소요되며 수백만 달러의 비용이 듭니다.
학습이 완료되면 가중치는 고정 (Frozen)됩니다. 추론 (Inference) 단계 동안 트랜스포머 (Transformer)는 고정된 가중치로 실행됩니다:
사용자 질의: “Complete this: The cat sat on the” (다음 문장을 완성하세요: The cat sat on the)
모델은 학습된 가중치를 사용하여 입력을 처리하고 다음과 같이 출력합니다:
“mat” (85퍼센트), “floor” (8퍼센트), “chair” (3퍼센트).
모델은 “mat”을 샘플링하여 반환합니다.
이 과정에서 가중치 변화는 일어나지 않습니다. 모델은 학습된 지식을 사용했을 뿐, 새로운 것을 학습하지는 않았습니다. 대화 내용이 모델의 가중치를 업데이트하지는 않습니다. 모델에게 새로운 정보를 가르치려면 새로운 데이터로 재학습 (Retrain)을 시켜야 하며, 여기에는 상당한 컴퓨팅 자원이 필요합니다.
LLM 실행 흐름의 다양한 단계를 보여주는 아래 다이어그램을 참조하십시오:
결론
트랜스포머 아키텍처는 인간의 언어를 이해하고 생성하는 데 우아한 해결책을 제공합니다. 텍스트를 수치적 표현 (Numerical representations)으로 변환하고, 어텐션 메커니즘 (Attention mechanisms)을 사용하여 단어 간의 관계를 포착하며, 많은 레이어를 쌓아 점점 더 추상적인 패턴을 학습함으로써, 트랜스포머는 현대의 LLM이 일관성 있고 유용한 텍스트를 생성할 수 있게 합니다.
이 과정은 생성되는 모든 토큰(token)에 대해 반복되는 7가지 핵심 단계로 구성됩니다: 토큰화 (tokenization), 임베딩 생성 (embedding creation), 위치 인코딩 (positional encoding), 어텐션 메커니즘 (attention mechanisms)을 포함한 트랜스포머 레이어 (transformer layers)를 통한 처리, 점수로의 언임베딩 (unembedding to scores), 확률로부터의 샘플링 (sampling from probabilities), 그리고 다시 디코딩 (decoding back to)
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기