<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Andy Cho</title>
    <description>The latest articles on DEV Community by Andy Cho (@airmanand).</description>
    <link>https://dev.to/airmanand</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3360957%2F4546b622-f94f-4c30-957c-8536a9523ad2.png</url>
      <title>DEV Community: Andy Cho</title>
      <link>https://dev.to/airmanand</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/airmanand"/>
    <language>en</language>
    <item>
      <title>트랜스포머 해부: 벡터와 파동에서 NLP 혁명까지</title>
      <dc:creator>Andy Cho</dc:creator>
      <pubDate>Mon, 21 Jul 2025 16:50:55 +0000</pubDate>
      <link>https://dev.to/airmanand/teuraenseupomeo-haebu-begteowa-padongeseo-nlp-hyeogmyeongggaji-14m0</link>
      <guid>https://dev.to/airmanand/teuraenseupomeo-haebu-begteowa-padongeseo-nlp-hyeogmyeongggaji-14m0</guid>
      <description>&lt;p&gt;지난 몇 년간 자연어 처리(NLP) 분야는 가히 혁명적인 변화를 겪었습니다. [cite_start]그 중심에는 2017년 "Attention Is All You Need" [cite: 4] 논문을 통해 등장한 &lt;strong&gt;트랜스포머(Transformer)&lt;/strong&gt;가 있습니다. 이 아키텍처는 단순히 기존 모델을 개선한 것이 아니라, NLP 문제에 대한 접근 방식 자체를 근본적으로 뒤바꾼 패러다임의 전환이었습니다.&lt;/p&gt;

&lt;p&gt;오늘, 7월 22일, 저는 스터디 그룹과의 깊이 있는 토론을 마치고 드디어 이 경이로운 모델을 NumPy로 직접 구현해 보려 합니다. 그 전에, 제가 이해한 바를 정리하며 트랜스포머의 아름다움을 공유하고자 이 글을 씁니다.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;1. 순차 모델을 뛰어넘는 양자 도약: 왜 트랜스포머인가?&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;RNN의 고전적 한계&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;과거 NLP의 왕좌를 차지했던 RNN과 LSTM은 본질적으로 &lt;strong&gt;순차적(sequential)&lt;/strong&gt;입니다. 이는 마치 뉴턴 역학처럼, &lt;code&gt;t&lt;/code&gt; 시점의 상태가 &lt;code&gt;t-1&lt;/code&gt; 시점의 상태에 의해 결정되는 엄격한 인과 관계를 따릅니다. 이 때문에 하나의 시퀀스를 처리하는 과정은 병렬화가 불가능했고, 이는 딥러닝 시대의 가장 큰 병목이었습니다.&lt;/p&gt;

&lt;p&gt;수학적으로 더 깊이 들어가면, &lt;strong&gt;기울기 소실(Vanishing Gradients)&lt;/strong&gt; 문제가 있습니다. 시간을 거슬러 역전파(Backpropagation Through Time)를 할 때, 1보다 작은 값들을 갖는 야코비안 행렬(Jacobian matrices)이 반복적으로 곱해지면서 기울기가 지수적으로 0에 수렴합니다. 이로 인해 모델은 문장의 시작 부분에 있는 정보를 학습하기 어려워졌습니다. LSTM이나 GRU는 이 문제를 해결하기 위한 영리한 공학적 해법이었지만, 근본적인 순차성의 굴레를 벗어나진 못했습니다.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;트랜스포머의 돌파구&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;트랜스포머는 이 문제를 아예 다른 차원에서 접근합니다. 전체 시퀀스를 상호작용하는 토큰들의 &lt;strong&gt;'장(field)'&lt;/strong&gt;으로 간주하여 모든 토큰을 동시에 처리합니다. [cite_start]이는 고전 역학에서 장 이론(field theory)으로 넘어가는 것과 같은 패러다임의 전환이었습니다. [cite: 17]&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;2. 아키텍처 설계: 어떻게 가능한가?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;[Image of Transformer model architecture diagram]&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;임베딩: 고차원 벡터 공간의 단어들&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;[cite_start]모든 것은 단어를 고차원 벡터(논문에서는 $d_{model}=512$ [cite: 82])로 변환하는 것에서 시작합니다. 이 벡터들은 단순한 숫자의 나열이 아닙니다. 이 '의미 공간(semantic space)' 내에서 벡터 간의 상대적 위치와 방향이 단어의 의미를 나타냅니다.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;위치 인코딩: 파동으로 순서를 주입하다&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;순환 구조가 없는 트랜스포머는 단어의 순서를 알 수 없습니다. [cite_start]이를 해결하기 위해 &lt;strong&gt;위치 인코딩(Positional Encoding)&lt;/strong&gt;을 사용합니다. [cite: 162] 이 기법의 이면에는 아름다운 수학과 물리학이 숨어 있습니다.&lt;/p&gt;

&lt;p&gt;[cite_start]사용되는 공식은 다음과 같습니다[cite: 167]:&lt;br&gt;
$PE_{(pos, 2i)} = \sin(pos / 10000^{2i/d_{model}})$&lt;br&gt;
$PE_{(pos, 2i+1)} = \cos(pos / 10000^{2i/d_{model}})$&lt;/p&gt;

&lt;p&gt;여기서 &lt;code&gt;pos&lt;/code&gt;는 단어의 위치, &lt;code&gt;i&lt;/code&gt;는 임베딩 벡터의 차원을 의미합니다. 각 차원은 서로 다른 파장(주파수)을 가진 사인파와 코사인파에 해당합니다. 이는 마치 신호 처리에서 &lt;strong&gt;푸리에 변환(Fourier Transform)&lt;/strong&gt;을 통해 하나의 신호(위치)를 여러 개의 구성 주파수로 분해하는 것과 유사합니다.&lt;/p&gt;

&lt;p&gt;[cite_start]핵심은 &lt;strong&gt;삼각함수의 덧셈 정리&lt;/strong&gt;($\sin(A+B) = \sin(A)\cos(B) + \cos(A)\sin(B)$) 덕분에, 고정된 거리 &lt;code&gt;k&lt;/code&gt;만큼 떨어진 위치 &lt;code&gt;pos+k&lt;/code&gt;의 위치 인코딩 &lt;code&gt;PE(pos+k)&lt;/code&gt;가 &lt;code&gt;PE(pos)&lt;/code&gt;의 &lt;strong&gt;선형 변환(linear transformation)&lt;/strong&gt;으로 표현될 수 있다는 점입니다. [cite: 171] 이 성질 덕분에 모델은 단어의 절대 위치가 아닌 &lt;strong&gt;상대적 위치 관계&lt;/strong&gt;를 매우 쉽게 학습할 수 있습니다.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;3. 기계의 심장: 멀티 헤드 셀프 어텐션&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;셀프 어텐션: 병렬화된 쿼리 시스템&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;[cite_start]트랜스포머의 심장은 단연 &lt;strong&gt;셀프 어텐션&lt;/strong&gt;입니다. [cite: 44] 이를 정교하고 고도로 병렬화된 데이터베이스 조회 시스템으로 생각할 수 있습니다. 각 단어는 문장 내의 모든 다른 단어에게 &lt;strong&gt;쿼리(Query, Q)&lt;/strong&gt;를 던집니다: "나의 정체성을 고려할 때, 이 문장에서 나와 관련된 단어는 누구인가?"&lt;/p&gt;

&lt;p&gt;다른 단어들은 자신의 &lt;strong&gt;키(Key, K)&lt;/strong&gt;를 통해 이 쿼리에 응답하고, 관련성이 높다고 판단되면 자신의 실제 정보인 &lt;strong&gt;밸류(Value, V)&lt;/strong&gt;를 전달합니다.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;스케일드 닷-프로덕트 어텐션: 안정성을 위한 수학&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;[cite_start]이 과정은 다음 수식으로 표현됩니다[cite: 115]:&lt;br&gt;
$$Attention(Q, K, V) = \text{softmax}(\frac{QK^T}{\sqrt{d_k}})V$$&lt;/p&gt;

&lt;p&gt;[cite_start]여기서 가장 중요한 부분은 $\sqrt{d_k}$로 나누는 &lt;strong&gt;스케일링(scaling)&lt;/strong&gt; 과정입니다. [cite: 113] 왜 필요할까요? [cite_start]벡터의 차원($d_k$)이 커질수록 내적(dot product) 값인 $QK^T$의 분산도 함께 커집니다. [cite: 121] 이 값이 너무 커지면 소프트맥스 함수는 기울기가 0에 가까운 영역으로 들어가 학습이 멈추게 됩니다. $\sqrt{d_k}$로 나눠주면 내적 값의 분산을 1로 정규화하여, 소프트맥스 함수가 안정적인 기울기를 갖는 영역에서 작동하도록 보장합니다. 이는 학습을 안정시키는 매우 중요한 트릭입니다.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;멀티 헤드 어텐션: 다양한 관점의 통합&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;[cite_start]트랜스포머는 한 번의 어텐션 대신, Q, K, V를 &lt;code&gt;h&lt;/code&gt;개(논문에서는 8개 [cite: 132][cite_start])의 서로 다른 저차원 공간으로 선형 투영(linearly project)한 뒤, 각 '헤드'에서 병렬적으로 어텐션을 수행합니다. [cite: 123, 130]&lt;/p&gt;

&lt;p&gt;이는 마치 하나의 대상을 여러 각도에서 동시에 바라보는 것과 같습니다. 어떤 헤드는 동사-목적어 같은 &lt;strong&gt;구문론적 관계&lt;/strong&gt;에 집중하고, 다른 헤드는 유의어 같은 &lt;strong&gt;의미론적 관계&lt;/strong&gt;에, 또 다른 헤드는 "그것"이 무엇을 가리키는지 같은 &lt;strong&gt;대명사 해결&lt;/strong&gt;에 전문화될 수 있습니다. 이를 통해 모델은 단순 평균 이상의, 훨씬 다각적이고 깊이 있는 이해를 하게 됩니다.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;4. 인코더와 디코더를 잇는 다리&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;[cite_start]디코더 스택의 중간에 위치한 &lt;strong&gt;인코더-디코더 어텐션&lt;/strong&gt;은 이 모든 과정을 완성합니다. [cite: 136]&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[cite_start]디코더의 &lt;strong&gt;쿼리(Q)&lt;/strong&gt;는 "내가 지금까지 번역한 내용을 바탕으로, 이제 원문의 어떤 정보를 참고해야 할까?"라는 질문을 던집니다. [cite: 136]&lt;/li&gt;
&lt;li&gt;[cite_start]이 쿼리는 인코더가 완벽하게 이해를 마친 원문 전체의 &lt;strong&gt;키(K)와 밸류(V)&lt;/strong&gt;를 참조합니다. [cite: 136]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;이 메커니즘을 통해, 번역을 생성하는 매 순간마다 원문의 가장 적절한 단어에 동적으로 집중할 수 있게 됩니다.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;결론: 새로운 시대의 서막&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;[cite_start]트랜스포머는 &lt;strong&gt;Add &amp;amp; Norm&lt;/strong&gt; 레이어를 통한 잔차 연결(residual connection)과 계층 정규화(Layer Normalization) [cite: 80, 81] 등 딥러닝의 표준적인 기법들도 충실히 따르고 있습니다.&lt;/p&gt;

&lt;p&gt;[cite_start]결론적으로, 트랜스포머는 순환 구조를 과감히 버리고 병렬화를 택했으며, 셀프 어텐션이라는 메커니즘을 통해 거리에 상관없이 토큰 간의 의존성을 모델링하는 데 성공했습니다. [cite: 17] 이는 단순한 성능 개선을 넘어, NLP가 나아갈 방향을 제시한 역사적인 사건입니다.&lt;/p&gt;

&lt;p&gt;오늘, 저는 단순히 하나의 모델을 구현하는 것이 아니라, 역사의 한 조각을 직접 만들어보려 합니다. 이 흥미진진한 여정에 행운을 빌어주세요!&lt;/p&gt;

</description>
      <category>paper</category>
      <category>review</category>
      <category>transformer</category>
      <category>math</category>
    </item>
  </channel>
</rss>
