상세 컨텐츠

본문 제목

어텐션 메커니즘 구현하기

Developer/IT 도서

by cepiloth 2025. 11. 28. 16:33

본문

728x90
반응형

긴 시퀀스 모델링의 문제점


어텐션 메커니즘이 개발된 배경은 기존 모델의 한계를 극복하기 위함입니다.

  • RNN 기반 인코더-디코더의 구조: 기존 인코더-디코더 기반 모델은 RNN(Recurrent Neural Network) 층을 사용하여 구현되었습니다. 이 구조에서는 입력 문장(예: 독일어)이 순서대로 들어오면, 마지막 토큰을 처리한 결과인 은닉 상태(Hidden State) 또는 문맥 벡터만을 디코더에게 전달합니다.
  • 정보 압축 문제 (길이 압축): 텍스트가 길어질수록 (예: 100개 토큰), 그 모든 의미를 단 하나의 은닉 상태로 압축하여 디코더가 이를 잘 해석하고 번역을 수행하기는 어렵습니다.
  • 단어 의존성 문제: 또한, 텍스트에 나오는 순서대로 단어별로 번역하는 방식은 언어마다 어순이 다르고 단어 맵핑이 1:1이 아닐 수 있기 때문에 좋은 번역 결과를 만들지 못합니다.
  • 이러한 긴 시퀀스 처리 및 의미 압축 문제를 해결하기 위해 어텐션 메커니즘이 등장했습니다.

어텐션 메커니즘으로 데이터 의존성 포착하기


  • 바흐나다우 어텐션: 초기 어텐션 메커니즘은 디코더가 새로운 토큰을 예측할 때 인코더에 있는 모든 은닉 상태를 참조하도록 하는 것이 기본 아이디어였습니다.

    ◦ 이는 최종 문맥 벡터뿐만 아니라 모든 토큰의 문맥 벡터를 고려하여, 텍스트가 길어져도 앞쪽 토큰에 주의를 기울이고, 중요한 단어에는 더 많은 주의를 기울이게 하는 방식입니다.

  • 초기 어텐션의 한계: 이 방식은 인코더의 모든 중간 은닉 상태를 기록하고 저장해야 하므로, 저장 공간이 많이 필요하고 입력 텍스트 길이에 제한이 생기는 단점이 있었습니다.
  • 셀프 어텐션으로의 발전: 어텐션이 번역 성능을 높이는 것이 입증되자, RNN 층을 아예 없애고 어텐션만 사용하자는 아이디어가 트랜스포머 모델로 이어졌습니다.

    ◦ 트랜스포머에서 사용하는 어텐션을 셀프 어텐션(Self-Attention)이라고 부릅니다. 이는 이전의 인코더 은닉 상태를 참조하는 방식과 달리, 자기 자신의 토큰 위치 간의 어텐션 가중치만을 사용하기 때문입니다.

    ◦ 해당 구현에서 다루는 디코더 기반 트랜스포머는 인코더가 없으므로 인코더-디코더 기반 트랜스포머에서 사용되는 크로스 어텐션(Cross-Attention)은 포함하지 않고, 셀프 어텐션 모듈만을 사용합니다.

 

코잘 어텐션으로 미래의 단어를 감추기


다음 토큰을 예측하는 모델링 과정에서는 신경망이 예측해야 할 미래의 토큰을 미리 알고 있으면 안 됩니다.

  • 가중치 행렬 생성: N개의 입력 토큰이 모두 쿼리 토큰이 되어 어텐션 가중치를 계산하면, N×N 크기의 어텐션 가중치 행렬이 생성됩니다.
  • 마스킹(Masking): 현재 토큰 위치에서 미래의 토큰을 참조하지 못하도록 이 가중치 행렬에 마스킹을 해야 합니다.

    ◦ 마스킹은 행렬의 주대각선의 위쪽(상삼각 행렬 부분)에 있는 모든 원소를 0으로 처리하여 가리는 방식입니다.

  • 코잘 어텐션 (Causal Attention): 이처럼 미래의 정보를 감추는 작업을 통해 구현된 어텐션을 코잘 어텐션(인과 어텐션)이라고 부르며, 이러한 모델을 인과 언어 모델(Causal Language Model)이라고도 합니다.
  • 드롭아웃 (Dropout): 어텐션 가중치 행렬에 드롭아웃을 추가하여 과대적합 위험을 방지할 수 있습니다. 하지만 데이터가 크고 훈련 에포크 수가 적은 최신 LLM들은 드롭아웃을 폭넓게 사용하지 않는 경향이 있습니다 (다만 초기 GPT-2 모델에는 포함되어 있었습니다).

싱글 헤드 어텐션을 멀티 헤드 어텐션으로 확장하기


단일 어텐션 헤드(Single Head Attention)만으로는 입력 텍스트의 다양한 미묘한 패턴이나 문맥의 의미를 모두 감지하기 어려울 수 있습니다.

  • 멀티 헤드 어텐션 (Multi-Head Attention): 여러 벌의 가중치 세트(쿼리, 키, 값 가중치 행렬)를 사용하여 독립적으로 어텐션 계산을 수행하는 방식입니다. 이 한 벌의 계산 단위를 **헤드(Head)**라고 부릅니다.
  • 작동 원리:
  1. 각 헤드는 서로 다른 값으로 초기화되고 훈련된 별개의 가중치 행렬을 사용하여 독립적인 쿼리, 키, 값 벡터를 생성합니다.
  2. 각 헤드는 자신만의 어텐션 가중치 행렬(코잘 마스크 적용)을 계산하며, 이 가중치 행렬은 모델 파라미터가 아닌 계산 결과입니다.
  3. 각 헤드가 계산한 최종 문맥 벡터들은 **나란히 연결(Concatenate)**되어 최종 문맥 벡터를 생성합니다 (더하지 않습니다).
  • 차원 유지의 중요성: 실전 LLM 구현에서는 입력 벡터의 차원과 출력 벡터의 차원이 동일하게 유지됩니다. 이는 어텐션 모듈(더 크게는 디코더 모듈)을 쉽게 반복하여 쌓을 수 있도록 하기 위함입니다. 예를 들어, 입력 차원이 10이고 2개의 헤드를 사용하면, 각 헤드가 5차원의 출력을 만들고 이를 연결하여 10차원의 최종 결과를 만듭니다.
728x90
반응형

관련글 더보기

댓글 영역