자기 주의(self-attention)는 기계 학습에서 각 요소가 시퀀스 내의 다른 모든 요소에 주의를 기울이는 메커니즘으로, 요소 간의 관계에 기반하여 주의 가중치를 계산한다. 인코더와 디코더 시퀀스 간에 작동하던 기존의 주의 메커니즘과 달리, 자기 주의는 동일한 입력 시퀀스에서 쿼리, 키, 값을 도출하여 모델이 전역적 의존성을 직접 포착할 수 있게 한다. 이 개념은 트랜스포머 아키텍처의 핵심으로, 순환 신경망을 주의 메커니즘으로 대체했으며, BERT, T5, 생성적 사전 훈련 트랜스포머(GPT)와 같은 모델의 기반이 되었다.
자기 주의에서 각 토큰은 세 개의 벡터, 즉 쿼리, 키, 값으로 변환된다. 두 토큰 간의 주의 가중치는 한 토큰의 쿼리와 다른 토큰의 키의 내적(dot product)으로 계산되며, 일반적으로 스케일링을 거친 후 소프트맥스 함수를 통과한다. 이러한 가중치는 "소프트" 가중치라고 불리며, 순방향 패스에서만 존재하고 입력 단계마다 변경된다. 이는 훈련 중에 고정되는 "하드" 가중치와 대조된다. 각 토큰의 출력은 값 벡터의 가중 합으로, 가중치는 다른 토큰이 현재 토큰과 얼마나 관련이 있는지를 반영한다.
역사
주의 메커니즘은 순환 신경망(RNN)의 약점을 해결하기 위해 개발되었는데, RNN은 문장에서 나중에 나오는 단어의 정보를 우선시하여 이전 맥락을 약화시키는 경향이 있었다. 초기 주의 설계는 2014년 Bahdanau 등이 설명한 바와 같이 기계 번역을 위한 인코더-디코더 RNN에 주의 메커니즘을 접목했다. 그러나 획기적인 발전은 자기 주의에서 이루어졌는데, 입력 시퀀스의 각 요소가 다른 모든 요소에 주의를 기울여 모델이 전역적 의존성을 포착할 수 있게 되었다. 이 개념은 2017년 Jakob Uszkoreit, Lukasz Kaiser 및 Google 동료들이 발표한 논문 "Attention Is All You Need"에서 제안된 트랜스포머 아키텍처의 핵심이었다. 트랜스포머는 느린 순차적 RNN을 제거하고 더 빠른 병렬 주의에 의존하여 BERT, T5, GPT와 같은 모델로 이어졌다. 딥러닝의 주의 메커니즘에 대한 추가적인 개요는 Niu 등과 Soydaner가 제공했다.
메커니즘
자기 주의는 토큰 임베딩 시퀀스에서 작동하며, 각 임베딩은 벡터로 표현된다. 각 토큰에 대해 모델은 학습된 선형 변환을 통해 쿼리 벡터, 키 벡터, 값 벡터를 계산한다. 토큰 i와 토큰 j 사이의 주의 점수는 query_i와 key_j의 내적으로 계산되며, 차원의 제곱근으로 나누어 그래디언트를 안정화한다. 이러한 점수는 소프트맥스 함수를 통과하여 각 쿼리에 대해 합이 1이 되는 주의 가중치를 생성한다. 토큰 i의 출력은 이러한 가중치를 사용한 모든 값 벡터의 가중 합이다.
이 메커니즘을 통해 각 토큰은 거리와 관계없이 시퀀스의 어떤 부분이든 직접 접근할 수 있어 RNN의 순차적 병목 현상을 극복한다. 실제로 트랜스포머는 다중 헤드 주의(multi-head attention)를 사용하는데, 여러 쿼리, 키, 값 투영 세트가 병렬로 실행되어 모델이 시퀀스의 다양한 측면에 동시에 주의를 기울일 수 있다.
주의 가중치 해석
번역에서 정렬(alignment)은 원문 문장의 단어와 번역된 문장의 단어를 대응시키는 것을 의미한다. 단어 순서를 고려하지 않는 문자 그대로의 번역을 수행하는 네트워크는 정렬 행렬의 대각선을 따라 가장 높은 주의 점수를 보일 것이다. 대각선에서 벗어난 지배적인 점수는 더 복잡한 정렬을 나타낸다. 예를 들어, "I love you"를 프랑스어로 번역할 때, 첫 번째 디코더 단계에서는 주의 가중치의 94%가 "I"에 집중되어 "je"를 생성하고, 두 번째 단계에서는 88%가 "you"에 집중되어 "t'"를 생성하며, 세 번째 단계에서는 95%가 "love"에 집중되어 "aime"를 생성한다. 이는 "love"가 "aime"와 정렬되는 정렬 행렬을 만들어 낸다.
때로는 정렬이 다대다(many-to-many) 관계를 가지기도 하는데, 예를 들어 "look it up"은 "cherchez-le"에 대응된다. 소프트 주의 가중치는 숨겨진 벡터의 가중 합을 생성하므로, 단일 최상의 숨겨진 벡터가 존재하지 않을 수 있는 상황에서 하드 주의(하나의 가중치를 1로 설정하고 나머지를 0으로 설정)보다 더 효과적이다.
변형
많은 주의 변형이 소프트 가중치를 구현한다. 초기 형태로는 고속 가중치 프로그래머(fast weight programmer) 또는 고속 가중치 컨트롤러(1992)가 있는데, 여기서 "느린" 신경망이 외적(outer product)을 통해 다른 네트워크의 "고속" 가중치를 출력하며, 이는 이후 "선형화된 자기 주의"로 불리게 되었다. Bahdanau 스타일 주의는 가산적 주의(additive attention)라고도 하며, Luong 스타일 주의는 곱셈적 주의(multiplicative attention)라고도 하는데, 둘 다 RNN 기반 시스템에서 흔히 사용된다. 현대의 자기 주의와 유사한 초기 주의 메커니즘은 RNN을 사용하여 제안되었지만, 병렬화가 용이한 자기 주의는 2017년에 도입되어 트랜스포머에 사용되었다. 기타 변형으로는 위치 주의(positional attention)와 인수 분해된 위치 주의(factorized positional attention)가 있다. 합성곱 신경망의 경우, 주의는 공간 차원, 채널 차원 또는 이들의 조합에서 작동할 수 있다. 이러한 변형들은 인코더 측 입력을 재결합하여 각 디코더 출력에 재분배하며, 종종 점수 재가중을 위해 상관 관계 스타일의 내적 행렬을 사용한다.
최적화
주의 행렬의 크기는 토큰 수에 따라 제곱으로 증가하므로, 긴 시퀀스의 경우 상당한 GPU 메모리가 필요하다. 2022년에 도입된 Flash Attention은 주의 계산을 GPU의 더 빠른 온칩 메모리에 맞는 블록으로 분할하여 메모리 요구량을 줄이고 정확도를 유지하면서 효율성을 높인다. Meta가 개발한 FlexAttention은 사용자가 소프트맥스 전에 주의 점수를 수정할 수 있게 하며, 최적의 주의 알고리즘을 동적으로 선택한다.
응용
주의 메커니즘은 자연어 처리, 컴퓨터 비전, 음성 인식 등에서 널리 사용된다. NLP에서는 질의 응답과 요약과 같은 작업에서 맥락 이해를 향상시킨다. 비전 분야에서는 시각적 주의가 모델이 관련 이미지 영역에 집중할 수 있게 하여 객체 감지와 이미지 캡셔닝 성능을 높인다. 자기 주의는 GPT와 같은 대규모 언어 모델의 핵심 구성 요소로, 텍스트를 처리하고 생성하는 데 사용된다.
비전 트랜스포머의 주의 맵 해석
원래 비전 트랜스포머(ViT) 논문에서 시작된 주의 점수를 히트맵으로 시각화하는 방법은, 살리언시 맵(saliency map) 또는 주의 맵이라고 불리며, ViT 모델의 의사 결정 과정을 검사하는 일반적인 방법이 되었다. 각 주의 헤드에 대해 모든 레이어에서 주의 맵을 계산할 수 있으며, 더 깊은 레이어일수록 더 의미론적으로 해석 가능한 시각화를 제공한다. 주의 롤아웃(attention rollout)은 연속적인 주의 맵의 내적을 계산하여 모든 레이어의 주의 점수를 결합하는 재귀적 알고리즘이다. 비전 트랜스포머는 일반적으로 자기 지도 방식으로 훈련되기 때문에 주의 맵은 클래스에 민감하지 않은 경우가 많다. 분류 헤드가 추가되면 클래스 판별 주의 맵(CDAM)이 [CLS] 토큰에 대한 그래디언트와 주의 맵을 결합할 수 있다. 합성곱 신경망을 위해 개발된 일부 클래스 민감 해석 방법은 비전 트랜스포머에도 적용될 수 있다.