지난 몇 년간 자연어 처리(NLP) 분야는 가히 혁명적인 변화를 겪었습니다. [cite_start]그 중심에는 2017년 "Attention Is All You Need" [cite: 4] 논문을 통해 등장한 트랜스포머(Transformer)가 있습니다. 이 아키텍처는 단순히 기존 모델을 개선한 것이 아니라, NLP 문제에 대한 접근 방식 자체를 근본적으로 뒤바꾼 패러다임의 전환이었습니다.
오늘, 7월 22일, 저는 스터디 그룹과의 깊이 있는 토론을 마치고 드디어 이 경이로운 모델을 NumPy로 직접 구현해 보려 합니다. 그 전에, 제가 이해한 바를 정리하며 트랜스포머의 아름다움을 공유하고자 이 글을 씁니다.
1. 순차 모델을 뛰어넘는 양자 도약: 왜 트랜스포머인가?
RNN의 고전적 한계
과거 NLP의 왕좌를 차지했던 RNN과 LSTM은 본질적으로 순차적(sequential)입니다. 이는 마치 뉴턴 역학처럼, t
시점의 상태가 t-1
시점의 상태에 의해 결정되는 엄격한 인과 관계를 따릅니다. 이 때문에 하나의 시퀀스를 처리하는 과정은 병렬화가 불가능했고, 이는 딥러닝 시대의 가장 큰 병목이었습니다.
수학적으로 더 깊이 들어가면, 기울기 소실(Vanishing Gradients) 문제가 있습니다. 시간을 거슬러 역전파(Backpropagation Through Time)를 할 때, 1보다 작은 값들을 갖는 야코비안 행렬(Jacobian matrices)이 반복적으로 곱해지면서 기울기가 지수적으로 0에 수렴합니다. 이로 인해 모델은 문장의 시작 부분에 있는 정보를 학습하기 어려워졌습니다. LSTM이나 GRU는 이 문제를 해결하기 위한 영리한 공학적 해법이었지만, 근본적인 순차성의 굴레를 벗어나진 못했습니다.
트랜스포머의 돌파구
트랜스포머는 이 문제를 아예 다른 차원에서 접근합니다. 전체 시퀀스를 상호작용하는 토큰들의 '장(field)'으로 간주하여 모든 토큰을 동시에 처리합니다. [cite_start]이는 고전 역학에서 장 이론(field theory)으로 넘어가는 것과 같은 패러다임의 전환이었습니다. [cite: 17]
2. 아키텍처 설계: 어떻게 가능한가?
[Image of Transformer model architecture diagram]
임베딩: 고차원 벡터 공간의 단어들
[cite_start]모든 것은 단어를 고차원 벡터(논문에서는 $d_{model}=512$ [cite: 82])로 변환하는 것에서 시작합니다. 이 벡터들은 단순한 숫자의 나열이 아닙니다. 이 '의미 공간(semantic space)' 내에서 벡터 간의 상대적 위치와 방향이 단어의 의미를 나타냅니다.
위치 인코딩: 파동으로 순서를 주입하다
순환 구조가 없는 트랜스포머는 단어의 순서를 알 수 없습니다. [cite_start]이를 해결하기 위해 위치 인코딩(Positional Encoding)을 사용합니다. [cite: 162] 이 기법의 이면에는 아름다운 수학과 물리학이 숨어 있습니다.
[cite_start]사용되는 공식은 다음과 같습니다[cite: 167]:
$PE_{(pos, 2i)} = \sin(pos / 10000^{2i/d_{model}})$
$PE_{(pos, 2i+1)} = \cos(pos / 10000^{2i/d_{model}})$
여기서 pos
는 단어의 위치, i
는 임베딩 벡터의 차원을 의미합니다. 각 차원은 서로 다른 파장(주파수)을 가진 사인파와 코사인파에 해당합니다. 이는 마치 신호 처리에서 푸리에 변환(Fourier Transform)을 통해 하나의 신호(위치)를 여러 개의 구성 주파수로 분해하는 것과 유사합니다.
[cite_start]핵심은 삼각함수의 덧셈 정리($\sin(A+B) = \sin(A)\cos(B) + \cos(A)\sin(B)$) 덕분에, 고정된 거리 k
만큼 떨어진 위치 pos+k
의 위치 인코딩 PE(pos+k)
가 PE(pos)
의 선형 변환(linear transformation)으로 표현될 수 있다는 점입니다. [cite: 171] 이 성질 덕분에 모델은 단어의 절대 위치가 아닌 상대적 위치 관계를 매우 쉽게 학습할 수 있습니다.
3. 기계의 심장: 멀티 헤드 셀프 어텐션
셀프 어텐션: 병렬화된 쿼리 시스템
[cite_start]트랜스포머의 심장은 단연 셀프 어텐션입니다. [cite: 44] 이를 정교하고 고도로 병렬화된 데이터베이스 조회 시스템으로 생각할 수 있습니다. 각 단어는 문장 내의 모든 다른 단어에게 쿼리(Query, Q)를 던집니다: "나의 정체성을 고려할 때, 이 문장에서 나와 관련된 단어는 누구인가?"
다른 단어들은 자신의 키(Key, K)를 통해 이 쿼리에 응답하고, 관련성이 높다고 판단되면 자신의 실제 정보인 밸류(Value, V)를 전달합니다.
스케일드 닷-프로덕트 어텐션: 안정성을 위한 수학
[cite_start]이 과정은 다음 수식으로 표현됩니다[cite: 115]:
$$Attention(Q, K, V) = \text{softmax}(\frac{QK^T}{\sqrt{d_k}})V$$
[cite_start]여기서 가장 중요한 부분은 $\sqrt{d_k}$로 나누는 스케일링(scaling) 과정입니다. [cite: 113] 왜 필요할까요? [cite_start]벡터의 차원($d_k$)이 커질수록 내적(dot product) 값인 $QK^T$의 분산도 함께 커집니다. [cite: 121] 이 값이 너무 커지면 소프트맥스 함수는 기울기가 0에 가까운 영역으로 들어가 학습이 멈추게 됩니다. $\sqrt{d_k}$로 나눠주면 내적 값의 분산을 1로 정규화하여, 소프트맥스 함수가 안정적인 기울기를 갖는 영역에서 작동하도록 보장합니다. 이는 학습을 안정시키는 매우 중요한 트릭입니다.
멀티 헤드 어텐션: 다양한 관점의 통합
[cite_start]트랜스포머는 한 번의 어텐션 대신, Q, K, V를 h
개(논문에서는 8개 [cite: 132][cite_start])의 서로 다른 저차원 공간으로 선형 투영(linearly project)한 뒤, 각 '헤드'에서 병렬적으로 어텐션을 수행합니다. [cite: 123, 130]
이는 마치 하나의 대상을 여러 각도에서 동시에 바라보는 것과 같습니다. 어떤 헤드는 동사-목적어 같은 구문론적 관계에 집중하고, 다른 헤드는 유의어 같은 의미론적 관계에, 또 다른 헤드는 "그것"이 무엇을 가리키는지 같은 대명사 해결에 전문화될 수 있습니다. 이를 통해 모델은 단순 평균 이상의, 훨씬 다각적이고 깊이 있는 이해를 하게 됩니다.
4. 인코더와 디코더를 잇는 다리
[cite_start]디코더 스택의 중간에 위치한 인코더-디코더 어텐션은 이 모든 과정을 완성합니다. [cite: 136]
- [cite_start]디코더의 쿼리(Q)는 "내가 지금까지 번역한 내용을 바탕으로, 이제 원문의 어떤 정보를 참고해야 할까?"라는 질문을 던집니다. [cite: 136]
- [cite_start]이 쿼리는 인코더가 완벽하게 이해를 마친 원문 전체의 키(K)와 밸류(V)를 참조합니다. [cite: 136]
이 메커니즘을 통해, 번역을 생성하는 매 순간마다 원문의 가장 적절한 단어에 동적으로 집중할 수 있게 됩니다.
결론: 새로운 시대의 서막
[cite_start]트랜스포머는 Add & Norm 레이어를 통한 잔차 연결(residual connection)과 계층 정규화(Layer Normalization) [cite: 80, 81] 등 딥러닝의 표준적인 기법들도 충실히 따르고 있습니다.
[cite_start]결론적으로, 트랜스포머는 순환 구조를 과감히 버리고 병렬화를 택했으며, 셀프 어텐션이라는 메커니즘을 통해 거리에 상관없이 토큰 간의 의존성을 모델링하는 데 성공했습니다. [cite: 17] 이는 단순한 성능 개선을 넘어, NLP가 나아갈 방향을 제시한 역사적인 사건입니다.
오늘, 저는 단순히 하나의 모델을 구현하는 것이 아니라, 역사의 한 조각을 직접 만들어보려 합니다. 이 흥미진진한 여정에 행운을 빌어주세요!
Top comments (0)