인공지능/트랜스포머 이해

TR-05. 트랜스포머 인코더(Encoder)

FedTensor 2025. 10. 23. 22:56

트랜스포머 모델의 인코더는 입력 시퀀스(예: "나는 학생이다")를 받아, 각 단어(토큰)의 문맥적 의미를 풍부하게 담은 벡터 시퀀스로 변환하는 역할을 합니다. 이 벡터 시퀀스는 디코더가 번역이나 요약과 같은 작업을 수행하는 데 필요한 핵심 정보를 담고 있습니다.

 

인코더는 동일한 구조의 '인코더 레이어(Encoder Layer)'가 N개(오리지널 논문에서는 6개) 쌓여 있는 형태입니다.

1. 인코더의 시작: 입력 처리

본격적으로 인코더 레이어에 들어가기 전에, 입력 텍스트는 두 단계를 거칩니다.

  1. 입력 임베딩 (Input Embedding):
    • 입력 문장의 각 단어(토큰)는 고유한 벡터로 변환됩니다. 예를 들어 "I", "am", "a", "student"라는 단어들이 각각 512차원의 벡터가 됩니다. 이 벡터는 단어의 기본적인 의미를 담고 있습니다.
  2. 포지셔널 인코딩 (Positional Encoding):
    • 이유: 트랜스포머의 핵심인 '셀프 어텐션(Self-Attention)'은 단어 간의 관계는 잘 파악하지만, 단어의 순서 정보는 고려하지 않습니다. "개가 사람을 물었다"와 "사람이 개를 물었다"를 구분하지 못할 수 있습니다.
    • 동작: 이 문제를 해결하기 위해, 각 단어의 위치(첫 번째, 두 번째, ...)를 나타내는 고유한 '위치 벡터'를 만듭니다. (주로 sin, cos 함수를 사용).
    • 적용: 이 위치 벡터를 1번의 단어 임베딩 벡터에 더해줍니다. 이렇게 함으로써 모델은 단어의 의미뿐만 아니라 문장에서의 위치 정보도 함께 학습하게 됩니다.

2. 핵심 구성 요소: 1개의 인코더 레이어

하나의 인코더 레이어는 크게 두 개의 하위 레이어(Sub-layer)로 구성됩니다.

첫 번째 하위 레이어: 멀티 헤드 (셀프) 어텐션 (Multi-Head Attention)

이름에서 알 수 있듯, 인코더에서 사용되는 어텐션은 '셀프' 어텐션입니다.

  • '셀프'의 의미: 입력 문장이 자기 자신을 참조(attend)합니다. 예를 들어, "The animal didn't cross the street because it was too tired."라는 문장에서 'it'이라는 단어의 의미를 파악할 때, 'it'이 'The animal'을 참조한다는 것을 학습합니다.
  • 동작:
    1. 입력된 각 단어의 벡터(포지셔널 인코딩이 더해진)로부터 Query(Q), Key(K), Value(V)라는 세 가지 벡터를 생성합니다.
    2. 각 단어의 Q 벡터가 다른 모든 단어의 K 벡터와 상호작용(내적)하여 '어텐션 스코어(Attention Score)'를 계산합니다. 이 스코어가 바로 단어 간의 연관성 점수입니다.
    3. 이 스코어를 정규화(Softmax)한 뒤, 각 단어의 V 벡터에 곱하여 가중합을 구합니다.
  • 결과: 입력 시퀀스의 모든 단어를 둘러보고 "현재 단어를 이해하는 데 어떤 단어들이 중요한가?"를 파악하여, 문맥이 풍부하게 반영된 새로운 벡터를 생성합니다.'
  • 멀티 헤드'의 의미: 이 어텐션 과정을 한 번만 하는 것이 아니라, 여러 개(예: 8개)의 '헤드'로 나누어 병렬로 수행합니다. 각 헤드는 서로 다른 관점(예: 어떤 헤드는 주어-동사 관계, 다른 헤드는 수식 관계)에서 단어 간의 관계를 학습할 수 있습니다. 마지막에 이 8개의 결과를 다시 하나로 합칩니다.

두 번째 하위 레이어: 위치 기반 피드 포워드 네트워크 (Position-wise FFN)

  • 동작: 간단하게 말해, 2개의 선형 변환(Linear transformation)과 그 사이의 ReLU 활성화 함수로 구성된 신경망입니다.
    • FFN(x) = max(0, xW1 + b1)W2 + b2
  • '위치 기반(Position-wise)'의 의미: 이 신경망은 각 단어(위치)마다 독립적으로 적용됩니다. 즉, "I"에 적용되는 FFN과 "am"에 적용되는 FFN의 파라미터(W, b)는 동일하지만, 계산은 따로따로 수행됩니다.
  • 역할: 어텐션 레이어에서 나온 문맥 정보를 "생각"하고 "처리"하는 단계로 볼 수 있습니다. 비선형 변환을 통해 모델의 표현력을 높이고, 각 단어의 벡터를 더욱 정교하게 다듬습니다.

3. 레이어를 연결하는 핵심 기술

각 인코더 레이어의 두 하위 레이어(어텐션, FFN) 주위에는 동일한 두 가지 기술이 적용됩니다.

  1. 잔차 연결 (Residual Connection / Add):
    • 동작: 각 하위 레이어(예: 어텐션)의 입력(x)을 하위 레이어의 출력(Sublayer(x))에 그대로 더해줍니다.
    • 결과: x + Sublayer(x)
    • 이유: 모델의 층이 깊어질수록(예: 6개, 12개) 기울기 소실(Vanishing Gradient) 문제가 발생하여 학습이 어려워집니다. 잔차 연결은 입력 신호가 다음 층으로 직접 전달되는 '지름길'을 만들어, 정보의 손실을 막고 깊은 네트워크의 학습을 원활하게 합니다.
  2. 층 정규화 (Layer Normalization / Norm):
    • 동작: '잔차 연결'을 거친 출력값의 평균을 0, 분산을 1로 만들어줍니다. (배치 정규화(Batch Norm)와 달리, 배치 내 다른 샘플과 무관하게 각 샘플(단어 벡터) 내의 특징(feature)들에 대해 정규화를 수행합니다.)
    • 이유: 각 층을 통과하는 데이터의 분포를 안정적으로 유지시켜, 학습 과정을 더 빠르고 안정적이게 만듭니다.

4. 인코더의 전체 흐름 (1개 레이어 기준)

  1. (임베딩 + 포지셔널 인코딩) 벡터가 입력 x로 들어옵니다.
  2. [어텐션 블록]
    • x가 멀티 헤드 어텐션(MHA)을 통과합니다. -> MHA_output
    • 잔차 연결: x + MHA_output
    • 층 정규화: sublayer1_output = LayerNorm(x + MHA_output)
  3. [FFN 블록]
    • sublayer1_output이 피드 포워드 네트워크(FFN)를 통과합니다. -> FFN_output
    • 잔차 연결: sublayer1_output + FFN_output
    • 층 정규화: layer_output = LayerNorm(sublayer1_output + FFN_output)
  4. 이 layer_output이 다음 인코더 레이어의 입력으로 들어갑니다.
  5. 이 과정이 N개의 레이어(예: 6개)만큼 반복됩니다.

5. 인코더의 최종 출력

N개의 인코더 레이어를 모두 통과한 최종 출력은 입력 단어들과 동일한 개수의 벡터 시퀀스입니다. (예: 10개 단어 입력 -> 10개 벡터 출력)

 

이 벡터들은 이제 단순한 단어의 의미가 아니라, 문장 전체의 문맥(어순, 단어 간의 관계 등)을 완벽하게 이해하고 압축한 '문맥적 표현(Contextual Representation)'입니다. 이 강력한 정보가 디코더로 전달되어, 디코더가 정확한 번역이나 요약을 생성하는 데 사용됩니다.