수학 개념 지도
딥러닝과 언어 모델

어텐션(Attention)

쿼리⁠(query)⁠를 모든 키와 내적⁠(dot product)⁠으로 비교해 소프트맥스⁠(softmax)⁠로 가중치⁠(weight)⁠를 만들고, 그 가중치로 값들을 평균⁠(mean)⁠하는 '부드러운 찾기'. 트랜스포머⁠(transformer)⁠의 핵심 연산이다.

Attention⁡(Q,K,V)=softmax⁡ ⁣(QKTd)V\operatorname{Attention}(Q, K, V) = \operatorname{softmax}\!\left(\frac{QK^{\mathsf T}}{\sqrt{d}}\right)V

사전에서 값을 찾을 때는 열쇠가 정확히 맞아야 합니다. '고양이'를 찾으면 '고양이' 칸의 값 하나가 나옵니다. 어텐션은 이 찾기를 부드럽게 만든 것입니다. 찾는 것(쿼리 q)을 모든 열쇠(키 k1,…,knk_1, \dots, k_n)와 내적으로 비교해 점수를 매기고, 소프트맥스로 점수를 합이 1인 양수 가중치로 바꾼 다음, 각 열쇠에 붙은 값(밸류 v1,…,vnv_1, \dots, v_n)을 그 가중치로 평균합니다.

si=q⋅kid,wi=esi∑jesj,출력=∑iwi vis_i = \frac{q\cdot k_i}{\sqrt d}, \qquad w_i = \frac{e^{s_i}}{\sum_j e^{s_j}}, \qquad \text{출력} = \sum_i w_i\, v_i

아래 평면에서 노란 쿼리 q를 끌어 보세요(여기서 d = 2). 그림을 단순하게 하려고 값을 열쇠와 같은 벡터⁠(vector)⁠로 두었습니다(vi=kiv_i = k_i). 그래서 출력(청록 점)은 열쇠 끝점들의 가중 평균입니다. 가중치가 모두 양수이고 합이 1이므로 출력은 언제나 열쇠 끝점들이 이루는 사각형(회색) 안에 있습니다.

파란 화살표가 열쇠, 노란 화살표가 쿼리입니다. 쿼리를 끌면 점수와 가중치(오른쪽 막대)가 바뀝니다. 청록 점이 출력이고, 출력에서 각 열쇠로 가는 청록 선의 굵기가 그 열쇠의 가중치입니다.

쿼리를 한 열쇠 쪽으로 돌리면 그 열쇠의 가중치가 커집니다. 방향은 그대로 두고 원점에서 멀리 끌면 점수 차이가 벌어져, 가중치가 점수가 가장 큰 열쇠로 몰리고 청록 점이 그 열쇠 끝으로 다가갑니다. 쿼리를 한없이 길게 늘인 극한⁠(limit)⁠에서는 내적이 가장 큰 열쇠 하나만 고르는 보통의 찾기가 됩니다(가장 큰 점수가 하나뿐일 때). 열쇠들의 길이가 모두 같다면 이것은 방향이 가장 가까운 열쇠, 곧 최근접 이웃⁠(nearest neighbor)⁠ 찾기입니다. 이 그림처럼 열쇠 길이가 다르면 긴 열쇠가 유리합니다. 반대로 쿼리가 원점에 가까우면 가중치가 고르게 퍼져 출력은 모든 값의 평균에 가까워집니다. 소프트맥스는 이 두 극단 사이를 매끄럽게 이어 주므로 미분⁠(differentiation)⁠할 수 있고, 그래서 '무엇을 볼지'를 역전파⁠(backpropagation)⁠로 배울 수 있습니다.

왜 √d로 나누는가. d는 쿼리와 키의 차원입니다. 학습을 시작할 때처럼 q와 k의 성분이 서로 독립⁠(independence)⁠이고 평균 0, 분산⁠(variance)⁠ 1이라고 합시다. 내적 q⋅k=∑i=1dqikiq\cdot k = \sum_{i=1}^{d} q_i k_i의 각 항은 평균 0, 분산 E[qi2] E[ki2]=1E[q_i^2]\,E[k_i^2] = 1이고, 서로 독립인 항들의 분산은 더해지므로 내적의 분산은 d, 표준편차⁠(standard deviation)⁠는 d\sqrt d입니다. d = 64이면 점수의 표준편차가 8이라, 점수끼리 몇 단위씩 벌어지기 일쑤입니다. 소프트맥스는 점수 차이 1마다 가중치 비율을 e ≈ 2.7배씩 벌리므로, 가장 큰 점수 하나에 가중치 대부분을 몰아 줍니다. 그러면 가중치를 자기 점수로 미분한 값 wi(1−wi)w_i(1 - w_i)가 모든 i에서 0에 가까워져 학습 신호가 거의 끊깁니다. 점수를 d\sqrt d로 나누면 분산이 d와 상관없이 다시 1이 됩니다. 직접 확인해 봅시다. 차원 d = 에서 무작위 쿼리 하나와 키 8개를 300번 뽑아 가장 큰 가중치의 평균을 냈습니다. 나누지 않으면 , d\sqrt d로 나누면 입니다(키가 8개이므로 완전히 고르면 0.125). d를 키워 보면 앞의 값은 1을 향해 커지지만 뒤의 값은 거의 그대로입니다. 2017년 트랜스포머 논문이 이 나눗셈의 이유로 각주에 적은 것이 바로 이 계산입니다. 다만 성분이 독립이라는 가정 아래의 계산이라서, 학습이 진행된 뒤의 q와 k에 대해 무엇을 보장하지는 않습니다.

행렬⁠(matrix)⁠로 한 번에. 실제로는 쿼리 n개를 한꺼번에 처리합니다. 쿼리들을 행으로 쌓은 행렬 Q(n×d), 키 행렬 K, 값 행렬 V를 두면, QKTQK^{\mathsf T}의 (i, j) 칸이 i번째 쿼리와 j번째 키의 내적이므로 모든 점수가 행렬 곱 한 번으로 나옵니다. 행마다 소프트맥스를 하고 V를 곱하면 끝입니다. 토큰⁠(token)⁠ n개가 서로를 모두 보므로 점수 표는 n×n이고, 계산량과 메모리가 길이의 제곱에 비례합니다(O(n2d)O(n^2 d), 점근 표기법⁠(asymptotic notation)⁠). 문맥을 길게 늘리기 어려운 주된 까닭입니다.

셀프 어텐션. 쿼리, 키, 값이 모두 같은 문장에서 나오는 경우입니다. 토큰마다 벡터 x가 있고(임베딩⁠, embedding⁠), 학습되는 행렬 세 개로 q=WQx, k=WKx, v=WVxq = W_Q x,\ k = W_K x,\ v = W_V x를 만듭니다. 누가 누구를 찾을지는 이 행렬들이 정합니다. 아래 표는 손으로 만든 장난감입니다. 낱말마다 '사람, 사물, 시간, 동작'이라는 이름 붙은 특징 4개를 주고(d = 4), 키는 특징 그대로(WK=IW_K = I), 쿼리는 '동작은 사람과 사물을 찾고, 나머지는 동작을 찾는다'가 되도록 WQW_Q를 정했습니다. 학습된 모델의 어텐션은 이렇게 깔끔하지 않습니다. 마스크: , 점수: . 칸에 올리면 점수와 가중치가, 행을 누르면 그 낱말이 어디를 보는지가 아래에 나옵니다.

행 = 쿼리를 낸 낱말, 열 = 키를 낸 낱말. 칸의 수는 가중치이고 행마다 합이 1입니다. 빈 칸은 마스크로 가린 곳(가중치 0)입니다.

인과 마스크⁠(causal mask)⁠는 다음 토큰을 예측하는 언어 모델⁠(language model)⁠이 쓰는 방식입니다. i번째 토큰은 자기와 그 앞만 볼 수 있도록 뒤쪽 점수를 −∞로 두어 가중치를 0으로 만듭니다. 그래서 '산'은 뒤에 올 '책을'을 보지 못하고 앞의 '민수가'를 가장 많이 봅니다. 양방향으로 바꾸면 '산'이 '책을'을 가장 많이 봅니다. 문장 전체를 한꺼번에 읽는 BERT(2018) 같은 모델이 이 방식입니다. √d로 나누지 않으면 같은 점수가 두 배가 되어 각 행이 한 칸으로 더 쏠리는 것도 보입니다.

여러 헤드. 트랜스포머는 이런 어텐션을 여러 벌(헤드) 나란히 돌립니다. 차원 d를 h개로 나눠 헤드마다 d/h차원의 쿼리·키·값을 따로 만들고, 결과를 이어 붙인 뒤 행렬 하나를 곱합니다. 헤드마다 다른 관계를 볼 수 있게 하려는 설계이고, 실제로 바로 앞 토큰을 보는 헤드, 같은 낱말이 앞에 나왔던 자리를 찾아 그 다음 토큰을 베껴 오는 헤드 같은 것이 관찰되었습니다. 그러나 어텐션 가중치를 그대로 '모델이 이 낱말 때문에 이렇게 답했다'는 설명으로 읽어도 되는지는 논쟁거리입니다(2019년의 논문 "Attention is not Explanation"과 그 반론). 가중치는 값을 섞는 비율일 뿐이고, 섞인 값이 뒤에서 어떻게 쓰이는지는 따로 살펴야 합니다.

순서를 모른다. 마스크가 없으면 어텐션에는 순서 개념이 없습니다. 입력 토큰의 순서를 섞으면 출력도 똑같이 섞일 뿐, 각 토큰이 받는 값은 그대로입니다. 가중 평균은 더하는 순서와 무관하기 때문입니다. 영어의 'dog bites man'과 'man bites dog'처럼 같은 토큰으로 된 다른 문장을 구별하려면 위치 정보를 따로 넣어야 하고, 그 방법은 트랜스포머에서 다룹니다. 입력에 위치 벡터를 더하는 방법에서 쿼리와 키를 위치만큼 회전시키는 RoPE까지, 그 방법들이 바뀌어 온 과정은 위치 인코딩⁠(positional encoding)⁠에 따로 모아 두었습니다.

어텐션은 2014년 드미트리 바흐다나우, 조경현, 요슈아 벤지오가 기계 번역⁠(machine translation)⁠에 도입했습니다. 그전의 순환 신경망⁠(recurrent neural network)⁠ 번역기는 원문 전체를 고정된 길이의 벡터 하나에 눌러 담아야 해서 긴 문장에 약했습니다. 그들은 번역할 낱말마다 원문의 어느 부분을 볼지 가중치로 고르게 했습니다. 다만 점수는 내적이 아니라 작은 신경망⁠(neural network)⁠으로 매겼습니다. 2017년 아시시 바스와니 등은 "Attention Is All You Need"에서 순환을 아예 빼고, 이 페이지의 내적 어텐션과 토큰마다 따로 적용하는 작은 신경망만으로 쌓은 트랜스포머를 내놓았습니다.

이어지는 곳. 온도를 낮출수록 한 곳으로 몰리는 소프트맥스의 성질은 디코딩에서 다음 토큰을 고를 때 다시 나오고, 소프트맥스가 왜 지수 꼴인지는 최대 엔트로피 원리⁠(principle of maximum entropy)⁠가 설명합니다. 쿼리와 키를 길이 1로 맞추면 점수는 코사인 유사도⁠(cosine similarity)⁠가 되고, 그때 온도를 0으로 보낸 극한이 최근접 이웃 찾기입니다. 어텐션이 문맥 안에서 쿼리와 가까운 키를 찾아 그 값을 가져오는 일이라면, 문맥 밖의 큰 문서 모음에서 질문과 가까운 글을 찾아 문맥에 넣어 주는 검색 증강 생성⁠(retrieval-augmented generation)⁠은 같은 일을 한 단계 바깥에서 하는 셈입니다. 가까운 점일수록 큰 가중치를 주어 값들을 평균한다는 점에서 통계⁠(statistics)⁠의 커널 회귀(1964년 나다라야와 왓슨)와 같은 모양입니다. 위의 가정(성분이 독립) 아래에서 점수는 독립인 d개 항의 합이므로, d가 크면 중심극한정리⁠(central limit theorem)⁠에 따라 정규분포⁠(normal distribution)⁠에 가까워집니다. √d 계산은 그 분포의 폭을 잰 것입니다. 쿼리·키·값을 만드는 행렬은 선형변환⁠(linear transformation)⁠이고, 이것을 층층이 쌓아 잔차 연결⁠(residual connection)⁠과 정규화로 감싼 것이 트랜스포머입니다.

관련 인물요슈아 벤지오

이 개념이 나오는 긴 글

거리와 유사도 까마귀와 택시 까마귀는 곧장 날고 택시는 블록을 돌아간다. '얼마나 먼가'에는 답이 하나가 아니고, 어떤 거리를 고르느냐가 통계와 기계 학습의 답을 바꾼다. 계산언어학 말을 세는 기계 문법은 규칙일까, 확률일까? 파니니의 문법에서 촘스키의 위계, 섀넌의 영어 엔트로피, 오늘날의 언어 모델까지. 언어 모델 다음 단어를 맞히는 기계 다음 낱말을 짐작하는 일만으로 어디까지 갈 수 있을까? 마르코프의 글자 세기에서 섀넌의 추측 게임, 트랜스포머와 규모의 법칙, 사람의 선호까지. 밑바닥에는 확률의 곱셈 규칙과 로그 하나가 있고, 그 수학은 모델이 왜 그럴듯하게 틀리는지도 말해 준다.

이 개념 위에 세워진 것

이 개념을 언급하는 페이지

이 페이지가 가리키는 개념