Skip to content

셀프 어텐션의 전체 단계를 설명하라

셀프 어텐션, 왜 중요한가

셀프 어텐션은 입력 시퀀스 내부에서 각 토큰이 다른 모든 토큰과의 관계를 학습해 문맥 정보를 재구성하는 메커니즘이다. 이 과정을 거친 출력은 이후 피드포워드 네트워크나 다음 레이어로 전달되어 문장 수준의 의미를 정교하게 표현하게 된다.

0단계. 쿼리(Query)·키(Key)·밸류(Value) 추출 단계

  • 무엇을 하는 단계인가
    입력 임베딩에 세 종류의 가중치 행렬을 곱해 쿼리, 키, 밸류 벡터를 생성하는 단계이다.

  • 이 단계가 필요한 이유
    셀프 어텐션은 “질문·답변·정보”라는 세 가지 관점으로 입력을 바라본다. 쿼리는 질문자, 키는 질문에 응답할 수 있는 응답자, 밸류는 실제 정보를 담는 역할을 담당한다. 이렇게 역할을 분리함으로써 토큰 간 상호작용을 유연하게 모델링할 수 있다.

  • 결과
    토큰마다 세 개의 벡터가 생기며, 이후 단계에서 상대적 중요도를 계산하는 재료가 된다.

1단계. 쿼리–키 내적 연산 단계

  • 무엇을 하는 단계인가
    쿼리 벡터와 모든 키 벡터의 내적을 계산해 유사도 행렬을 얻는 단계이다.

  • 내적을 사용하는 이유
    내적은 두 벡터의 방향 유사도(코사인 유사도에 비례)를 빠르게 측정할 수 있는 계산량이 적은 연산이다. 각 토큰이 자신과 다른 토큰 간 의미적 관련도를 직관적으로 파악할 수 있으므로 어텐션 가중치의 기초 자료로 적합하다.

  • 결과
    행마다 n개의 스코어(각 토큰이 다른 토큰을 얼마나 참고할지에 대한 점수)를 포함한 행렬이 만들어진다.

2단계. 스케일링(√dk로 나누기) 단계

  • 무엇을 하는 단계인가
    내적 결과를 키 벡터 차원의 제곱근 값으로 나누어 값을 축소하는 단계이다.

  • 나누는 이유
    벡터 차원이 커질수록 내적값 분포가 넓어져 소프트맥스 입력이 과도하게 커질 수 있다. 값이 커지면 소프트맥스가 매우 작은 영역에서만 변화하여 학습이 불안정해진다. 차원의 제곱근으로 나누면 값의 범위를 적절히 좁혀 그래디언트 소실·폭발 위험을 줄일 수 있다.

  • 결과
    수치적으로 안정적인 스코어 행렬을 다음 단계에 전달할 수 있다.

3단계. 소프트맥스 정규화 단계

  • 무엇을 하는 단계인가
    스케일링된 스코어 행렬의 각 행에 소프트맥스를 적용해 확률 분포로 변환하는 단계이다.

  • 소프트맥스를 사용하는 이유
    소프트맥스는 음수·양수 값을 모두 0~1 범위의 확률값으로 변환하고, 행마다 총합이 1인 분포를 만든다. 이를 통해 “어느 토큰에 얼마만큼 집중할지”를 직관적으로 해석할 수 있으며, 역전파 시 안정적 그래디언트를 보장한다.

  • 결과
    각 토큰이 다른 토큰에 부여할 주목도가 명확한 확률 분포 형태로 완성된다.

4단계. 어텐션 가중합(Z) 계산 단계

  • 무엇을 하는 단계인가
    소프트맥스로 얻은 가중치를 밸류 벡터들에 곱한 뒤 합산해 최종 어텐션 출력을 생성하는 단계이다.

  • 이 단계가 필요한 이유
    가중합 결과는 각 토큰이 시퀀스 전반에서 얻은 문맥 정보를 반영한 새로운 표현이다. 이후 레이어에서 이 표현을 사용해 문장 의미를 더욱 깊이 있게 이해할 수 있다.

  • 결과
    어텐션 출력 Z가 생성되며, 이는 잔차 연결·레이어 정규화를 거쳐 다음 서브레이어나 다음 트랜스포머 블록으로 전달된다.

0단계에서 쿼리·키·밸류를 분리 투영하고, 1단계와 2단계에서 유사도를 안정적으로 계산하며, 3단계에서 정규화된 가중치를 만들고, 4단계에서 문맥이 반영된 표현을 얻게 되는 흐름이 셀프 어텐션의 핵심이다.

이러한 단계적 설계 덕분에 트랜스포머 모델은 긴 문장에서도 관계를 효과적으로 학습하고, 번역·요약·질문 답변 등 다양한 자연어 처리 과제에서 높은 성능을 발휘하게 된다.