logo

어텐션 📂머신러닝

어텐션

개요

어텐션 메커니즘attention mechanism은 쿼리, 키, 밸류라는 세 벡터 시퀀스로부터, 각각의 쿼리가 어느 키에 얼마나 주목할지를 점수로 재고 그 점수를 확률로 바꾼 뒤, 그 확률을 가중치로 삼아 밸류들을 섞어 내보내는 연산이다. 좀 더 구체적으로는, 먼저 쿼리와 키가 서로 얼마나 잘 맞는지를 나타내는 스코어score를 계산하고, 그 스코어에 $\operatorname{softmax}$를 취해 합이 $1$인 가중치로 바꾼 다음, 이 가중치대로 밸류들을 볼록결합convex combination하여 가중평균을 낸다.

정의에 앞서 표기에 관해 한 가지 짚어 둘 것이 있다. 수학에서는 열벡터가 기본이므로 이 글에서는 정의 $(1)$, $(2)$처럼 밸류 행렬을 왼쪽에서 곱하는 꼴로 쓴다. 반면 머신러닝 분야에서는 자주 쓰는 프로그래밍 언어 자체가 행우선인 경우가 많아, 벡터를 행으로 쌓는 행벡터 규약과 그에 맞춘 표기가 널리 쓰인다. 행벡터 규약에서는 같은 연산이 아래처럼 밸류를 오른쪽에서 곱하는 꼴로 표현되므로, 머신러닝 문헌이나 코드를 볼 때 이 차이를 염두에 두면 좋다.

$$ \operatorname{Attention}(\mathbf{Q},\mathbf{K},\mathbf{V}) = \operatorname{Softmax}\left(f(\mathbf{Q},\mathbf{K})\right) \mathbf{V} $$

정의

주어진 행렬 $\mathbf{X} = \begin{bmatrix} \mathbf{x}_{1} & \cdots & \mathbf{x}_{N}\end{bmatrix}$에 대해서, 각 열벡터에 소프트맥스 $\operatorname{softmax}$를 취해서 각 열의 합이 $1$이 되게 하는 함수를 $\operatorname{Softmax}$라 정의하자.

$$ \operatorname{Softmax}(\mathbf{X}) := \begin{bmatrix} \underset{\vert}{\overset{\vert}{\operatorname{softmax}(\mathbf{x}_{1})}} & \cdots & \underset{\vert}{\overset{\vert}{\operatorname{softmax}(\mathbf{x}_{N})}} \end{bmatrix} $$

어텐션 메커니즘

세 행렬 $\mathbf{Q} \in M^{d_{k} \times n}$, $\mathbf{K} \in M^{d_{k} \times m}$, $\mathbf{V} \in M^{d_{v} \times m}$를 각각 쿼리 행렬, 키 행렬, 밸류 행렬이라 하자. 쿼리 행렬과 키 행렬에 대한 함수 $f (\mathbf{Q}, \mathbf{K})$를 스코어 함수라 하자.

$$ \begin{align*} f : M^{d_{k} \times n} \times M^{d_{k} \times m} &\to M^{m \times n} \\ (\mathbf{Q}, \mathbf{K}) &\mapsto f(\mathbf{Q}, \mathbf{K}) \end{align*} $$

다음과 같이 정의되는 함수 $\operatorname{Attention} : M^{d_{k} \times n} \times M^{d_{k} \times m} \times M^{d_{v} \times m} \to M^{d_{v} \times n}$를 어텐션attention이라 한다.

$$ \operatorname{Attention}(\mathbf{Q},\mathbf{K},\mathbf{V}) := \mathbf{V} \operatorname{Softmax}\left(f(\mathbf{Q},\mathbf{K})\right) \tag{1} $$

여기서 $\mathbf{V}$와 $\operatorname{Softmax}\left(f(\mathbf{Q},\mathbf{K})\right)$는 행렬곱셈으로 이어져있다. 어텐션의 함숫값을 컨텍스트 벡터(행렬)context vector라 한다.

$$ \mathbf{C} = \operatorname{Attention}(\mathbf{Q},\mathbf{K},\mathbf{V}) $$

어텐션

다음의 꼴은 🔒(26/08/27)트랜스포머 논문에서 소개되어 유명해진 어텐션 함수이다. 스케일드 닷프로덕트 어텐션scaled dot-product attention 혹은 간단히 어텐션attention이라 한다.

$$ \operatorname{Attention}(\mathbf{Q},\mathbf{K},\mathbf{V}) := \mathbf{V} \operatorname{Softmax}\left(\dfrac{\mathbf{K}^{\mathsf{T}}\mathbf{Q}}{\sqrt{d_{k}}}\right) \tag{2} $$

수학 논문에서1 2

수학 논문에서는 좀 더 일반적으로 정의된다. $(1)$은 수학적으로 멀티헤드어텐션에서 $H=1$인 특수한 경우에 불과하므로, 잔차층을 포함하고 스코어함수내적으로 둔 다음의 함수를 어텐션이라 정의한다.

$$ \operatorname{Attention}(\mathbf{X}) = \mathbf{X} + \sum_{h=1}^{H} \left( \mathbf{W}_{h}^{V}\mathbf{X} \right) \operatorname{Softmax} \left[ (\mathbf{W}_{h}^{K}\mathbf{X})^{\mathsf{T}} (\mathbf{W}_{h}^{Q}\mathbf{X}) \right] $$

자세한 것은 🔒(26/08/17)멀티헤드 어텐션 문서를 참고하라.

설명

어텐션은 각각의 쿼리 벡터가 여러 키 벡터들 가운데 어디에 얼마나 주목할지를 정하고, 그 비중대로 밸류 벡터들을 가중평균하는 연산이다. 하나의 쿼리가 모든 키를 훑어보되 관련이 깊은 키에 더 큰 비중을 두는 모습이, 마치 여러 정보 가운데 중요한 것에 주의를 집중하는 것과 같아 '주의를 기울인다'는 뜻의 어텐션이라고 명명되었다.

어텐션이라는 발상 자체는 2014년 바다나우Bahdanau3 등이 순환신경망 기반 기계번역 모델에서 처음 선보인 것이 시초로 꼽힌다. 이들은 디코더가 번역문의 각 단어를 생성할 때 인코더가 내놓은 원문의 은닉 상태 가운데 어느 부분에 집중할지를 학습하게 했고, 이후 발전하여 $(1)$의 형태로 일반화되었다. $(1)$에서 $f$를 어떻게 정의하느냐에 따라 바다나우 어텐션, 루옹Luong 어텐션, 스케일드 닷프로덕트 어텐션 등 여러 종류의 어텐션으로 나뉜다. 특히 2017년 트랜스포머 논문의 성공 이후로는 $f$를 스케일링된 내적으로 두는 스케일드 닷프로덕트 형태가 사실상 표준으로 자리잡아, 흔히 그냥 어텐션이라 하면 이 형태를 가리킨다.

쿼리, 키, 밸류

자연어처리에서 기계번역을 예로 쿼리와 키, 밸류의 의미를 직관적으로 설명하면 다음과 같다. 쿼리 벡터 $\mathbf{q}_{t}$는 신경망이 출력해야할 번역문의 $t$번째 단어에 대한 정보가 추상화된 벡터이다. 키 벡터 $\mathbf{k}_{i}$는 원문의 $i$번째 단어의 문장 내 위치에 대한 추상적 정보이다. 번역문의 $t$번째 단어 정보 $\mathbf{q}_{t}$와 같이 계산되어 $\mathbf{q}_{t}$가 원문의 어디를 참조하면 좋을지를 알려줄 수 있는 정보가 추상화된 벡터이다. 그리고 그 계산을 실행하는 것이 스코어 함수 $f$이다. 스코어 함수 $f$는 $\mathbf{q}_{t}$와 $\mathbf{k}_{i}$를 받아서 두 개의 정보가 서로 관련성이 높을수록 높은 값(스칼라)을 준다. 즉 번역문의 $t$번째 단어가 원문의 $i$번째 단어보다 $j$번째 단어와 더 관련이 깊다면, 스코어 함수는 다음과 같이 작동한다.

$$ f(\mathbf{q}_{t}, \mathbf{k}_{i}) \lt f(\mathbf{q}_{t}, \mathbf{k}_{j}) $$

밸류 벡터 $\mathbf{v}_{i}$는 원문의 $i$번째 단어가 실제로 갖는 문맥상 의미를 추상화한 벡터이다. 각 스코어 $f(\mathbf{q}_{t},\mathbf{k}_{i})$에 소프트맥스를 취해 합이 $1$인 가중치 $a_{ti}$로 바꾼다.

$$ a_{ti} = \frac{\exp\left(f(\mathbf{q}_{t}, \mathbf{k}_{i})\right)}{\sum\limits_{i^{\prime}=1}^{m} \exp\left(f(\mathbf{q}_{t}, \mathbf{k}_{i^{\prime}})\right)} = \left[\operatorname{softmax}\left(f(\mathbf{q}_{t}, \mathbf{K})\right)\right]_{i} $$

이 가중치로 밸류 벡터들을 선형결합하면, 번역문의 $t$번째 단어가 원문의 어디에 있는 어떤 정보를 얼마나 참조해야할지를 표현하는 컨텍스트 벡터context vector가 된다.

$$ \mathbf{c}_{t} = a_{t1} \mathbf{v}_{1} + \cdots + a_{tm} \mathbf{v}_{m} $$

이것이 $\operatorname{Attention}$의 함숫값의 $t$번째 열이다.

$$ \begin{align*} \mathbf{C} &= \begin{bmatrix} \mathbf{c}_{1} & \cdots & \mathbf{c}_{n} \end{bmatrix} \\ &= \operatorname{Attention}(\mathbf{Q},\mathbf{K},\mathbf{V}) \\ &= \mathbf{V} \operatorname{Softmax}\left(f(\mathbf{Q},\mathbf{K})\right) \\ &= \begin{bmatrix} \mathbf{v}_{1} & \cdots & \mathbf{v}_{m} \end{bmatrix} \begin{bmatrix} \underset{\vert}{\overset{\vert}{\operatorname{softmax}(f(\mathbf{q}_{1},\mathbf{K}))}} & \cdots & \underset{\vert}{\overset{\vert}{\operatorname{softmax}(f(\mathbf{q}_{n},\mathbf{K}))}} \end{bmatrix} \end{align*} $$

자세한 것은 아래의 글을 참고하라.

스코어 함수

어텐션에서 스코어score 함수라는 것은 쿼리와 키의 적합도compatibility를 재는 함수이다. 가끔 🔒(26/08/13)유사도 함수similarity를 재는 함수라는 설명도 보이는데, 쿼리와 키가 비슷한지에 대한 점수를 매기는 것이 아니라, 두 정보가 얼마나 관계있는지를 나타내는 지표이기 때문에 유사도라는 말은 그 의미가 제한되어 부적절한 설명이다.

쿼리 벡터 $\mathbf{q} \in \mathbb{R}^{d_{k}}$와 키 벡터 $\mathbf{k} \in \mathbb{R}^{d_{k}}$에 대해, 스코어 함수를 하나의 스칼라를 내놓는 함수 $\operatorname{score} : \mathbb{R}^{d_{k}} \times \mathbb{R}^{d_{k}} \to \mathbb{R}$로 정의하자. 그러면 정의 $(1)$의 스코어 함수 $f(\mathbf{Q}, \mathbf{K})$는 각 쿼리와 키 쌍의 스코어를 성분으로 갖는 행렬이 되며, 그 $(i, j)$ 성분은 $\operatorname{score}(\mathbf{q}_{j}, \mathbf{k}_{i})$다.

$$ f(\mathbf{Q}, \mathbf{K}) = \begin{bmatrix} \operatorname{score}(\mathbf{q}_{1}, \mathbf{k}_{1}) & \operatorname{score}(\mathbf{q}_{2}, \mathbf{k}_{1}) & \cdots & \operatorname{score}(\mathbf{q}_{n}, \mathbf{k}_{1}) \\ \operatorname{score}(\mathbf{q}_{1}, \mathbf{k}_{2}) & \operatorname{score}(\mathbf{q}_{2}, \mathbf{k}_{2}) & \cdots & \operatorname{score}(\mathbf{q}_{n}, \mathbf{k}_{2}) \\ \vdots & \vdots & \ddots & \vdots \\ \operatorname{score}(\mathbf{q}_{1}, \mathbf{k}_{m}) & \operatorname{score}(\mathbf{q}_{2}, \mathbf{k}_{m}) & \cdots & \operatorname{score}(\mathbf{q}_{n}, \mathbf{k}_{m}) \end{bmatrix} \in M^{m \times n} $$

종류

$\mathbf{Q}$, $\mathbf{K}$, $\mathbf{V}$를 각각 쿼리벡터, 키벡터, 밸류벡터들의 행렬이라고 하자.

$$ \mathbf{Q} = \begin{bmatrix} \mathbf{q}_{1} & \cdots & \mathbf{q}_{n} \end{bmatrix}, \quad \mathbf{K} = \begin{bmatrix} \mathbf{k}_{1} & \cdots & \mathbf{k}_{m} \end{bmatrix}, \quad \mathbf{V} = \begin{bmatrix} \mathbf{v}_{1} & \cdots & \mathbf{v}_{m} \end{bmatrix} $$

셀프 어텐션과 크로스 어텐션

이름과 달리 🔒(26/08/15)셀프 어텐션self-attention크로스 어텐션cross-attention은 어텐션 함수 그 자체를 정의하는 것이 아니다. 어텐션 함수는 쿼리, 키, 밸류가 주어져 있을 때 이들을 정의 $(1)$처럼 섞어 컨텍스트 벡터를 내놓는 함수이다. 반면 셀프 어텐션과 크로스 어텐션은 그 쿼리, 키, 밸류를 어떤 데이터에서 만들어 내는지에 관한 구분이다. 쿼리, 키, 밸류가 모두 같은 데이터에서 만들어지면 셀프 어텐션, 쿼리를 만드는 데이터와 키/밸류를 만드는 데이터가 서로 다르면 크로스 어텐션이라 한다.

$$ \begin{align*} \text{Self-Attention:} \quad & \mathbf{Q} = \mathbf{W}^{Q}\mathbf{X}, \quad \mathbf{K} = \mathbf{W}^{K}\mathbf{X}, \quad \mathbf{V} = \mathbf{W}^{V}\mathbf{X} \\ \text{Cross-Attention:} \quad & \mathbf{Q} = \mathbf{W}^{Q}\mathbf{X}, \quad \mathbf{K} = \mathbf{W}^{K}\mathbf{Y}, \quad \mathbf{V} = \mathbf{W}^{V}\mathbf{Y} \end{align*} $$

스케일드 닷프로덕트 어텐션

스케일드 닷프로덕트 어텐션은 2017년 트랜스포머를 제안한 논문 『Attention Is All You Need』에서 소개되었다4. 전체 계산이 행렬곱과 소프트맥스만으로 끝나므로 고도로 최적화된 행렬 연산 라이브러리를 그대로 쓸 수 있어 병렬화에 유리하고, 트랜스포머의 성공과 함께 사실상 어텐션의 표준적인 형태로 자리잡았다.

수식은 이름 그 자체이다. $(1)$의 정의에서 소프트맥스에 들어가는 쿼리와 키의 함수 $f (\mathbf{Q}, \mathbf{K}) = \dfrac{\mathbf{K}^{\mathsf{T}} \mathbf{Q}}{\sqrt{d_{k}}}$가 곧 스케일링된 내적이다. 쿼리와 키의 각 열벡터들끼리 내적하고, 거기에 스케일링 팩터 $\dfrac{1}{\sqrt{d_{k}}}$를 곱한 것이다. 스케일링 팩터 없는 내적을 스코어로 두면 Luong 외 2명이 제안한 🔒(26/08/21)닷프로덕트 어텐션이 된다.

$$ \begin{align*} f(\mathbf{Q}, \mathbf{K}) = \frac{\mathbf{K}^{\mathsf{T}} \mathbf{Q}}{\sqrt{d_{k}}} &= \frac{1}{\sqrt{d_{k}}} \begin{bmatrix} \mathbf{k}_{1}^{\mathsf{T}} \\[1em] \mathbf{k}_{2}^{\mathsf{T}} \\ \vdots \\ \mathbf{k}_{m}^{\mathsf{T}} \end{bmatrix} \begin{bmatrix} \mathbf{q}_{1} & \mathbf{q}_{2} & \cdots & \mathbf{q}_{n} \end{bmatrix} \\[2em] &= \frac{1}{\sqrt{d_{k}}} \begin{bmatrix} \mathbf{k}_{1} \cdot \mathbf{q}_{1} & \mathbf{k}_{1} \cdot \mathbf{q}_{2} & \cdots & \mathbf{k}_{1} \cdot \mathbf{q}_{n} \\ \mathbf{k}_{2} \cdot \mathbf{q}_{1} & \mathbf{k}_{2} \cdot \mathbf{q}_{2} & \cdots & \mathbf{k}_{2} \cdot \mathbf{q}_{n} \\ \vdots & \vdots & \ddots & \vdots \\ \mathbf{k}_{m} \cdot \mathbf{q}_{1} & \mathbf{k}_{m} \cdot \mathbf{q}_{2} & \cdots & \mathbf{k}_{m} \cdot \mathbf{q}_{n} \end{bmatrix} \in M^{m \times n} \end{align*} $$

$$ \operatorname{Attention} (\mathbf{Q}, \mathbf{K}, \mathbf{V}) = \mathbf{V} \operatorname{Softmax} \left( \frac{\mathbf{K}^{\mathsf{T}} \mathbf{Q}}{\sqrt{d_{k}}} \right) $$

Bahdanau 어텐션

Dzmitry Bahdanau, KyungHyun Cho 그리고 Yoshua Bengio의 논문3에서 소개된 어텐션을 말한다. 스코어 함수가 쿼리와 키를 더하는 형태이기 때문에 additive attention이라고도 한다.

$$ \operatorname{score}(\mathbf{q}_{j}, \mathbf{k}_{i}) = \mathbf{w}_{a}^{\mathsf{T}} \operatorname{Tanh}\left( W_{a} \mathbf{q}_{j} + U_{a} \mathbf{k}_{i} \right) $$

여기서 $W_{a}, U_{a} \in M^{d_{a} \times d_{k}}$와 $\mathbf{w}_{a} \in \mathbb{R}^{d_{a}}$는 학습되는 가중치이고, $d_{a}$는 정렬 모델의 은닉 차원이다. $\mathbf{w}_{a}$는 밸류 벡터 $\mathbf{v}_{i}$와는 무관한 별개의 파라미터다. 한편 $W_{a} \mathbf{q}_{j} + U_{a} \mathbf{k}_{i}$는 $\mathbb{R}^{d_{a}}$의 벡터이므로, 여기에 씌우는 것은 스칼라 함수 $\tanh : \mathbb{R} \to \mathbb{R}$이 아니라 벡터의 각 성분에 $\tanh$을 취하는 함수 $\operatorname{Tanh} : \mathbb{R}^{d_{a}} \to \mathbb{R}^{d_{a}}$다.

$$ \operatorname{Tanh}\left( \begin{bmatrix} z_{1} \\ \vdots \\ z_{d_{a}} \end{bmatrix} \right) := \begin{bmatrix} \tanh(z_{1}) \\ \vdots \\ \tanh(z_{d_{a}}) \end{bmatrix} $$

즉 쿼리와 키를 각각 선형변환해 더한 뒤 $\tanh$를 성분별로 취하고 $\mathbf{w}_{a}$와 내적하여 하나의 스칼라 점수를 낸다. 이렇게 얻은 스칼라를 모든 쿼리-키 쌍에 대해 모은 것이 스코어 행렬이다. 이 스코어 행렬을 정의 $(1)$에 대입한 것이 바다나우 어텐션이다.

$$ f(\mathbf{Q}, \mathbf{K}) = \begin{bmatrix} \mathbf{w}_{a}^{\mathsf{T}} \operatorname{Tanh}\left( W_{a} \mathbf{q}_{j} + U_{a} \mathbf{k}_{i} \right) \end{bmatrix}_{ij} \in M^{m \times n} $$

$$ \operatorname{Attention}(\mathbf{Q},\mathbf{K},\mathbf{V}) = \mathbf{V} \operatorname{Softmax}\left( \begin{bmatrix} \mathbf{w}_{a}^{\mathsf{T}} \operatorname{Tanh}\left( W_{a} \mathbf{q}_{j} + U_{a} \mathbf{k}_{i} \right) \end{bmatrix}_{ij} \right) $$

Luong 일반 어텐션

Luong 외 2명의 논문5에서 소개된 어텐션 중 하나이다. 스코어 함수를 쌍선형 변환으로 둔 것이다.

$$ \operatorname{score}(\mathbf{q}, \mathbf{k}) = \mathbf{k}^{\mathsf{T}} \mathbf{W} \mathbf{q} $$

$$ f(\mathbf{Q}, \mathbf{K}) = \mathbf{K}^{\mathsf{T}} \mathbf{W} \mathbf{Q} =\begin{bmatrix} \mathbf{k}_{1}^{\mathsf{T}} \mathbf{W} \mathbf{q}_{1} & \mathbf{k}_{1}^{\mathsf{T}} \mathbf{W} \mathbf{q}_{2} & \cdots & \mathbf{k}_{1}^{\mathsf{T}} \mathbf{W} \mathbf{q}_{n} \\ \mathbf{k}_{2}^{\mathsf{T}} \mathbf{W} \mathbf{q}_{1} & \mathbf{k}_{2}^{\mathsf{T}} \mathbf{W} \mathbf{q}_{2} & \cdots & \mathbf{k}_{2}^{\mathsf{T}} \mathbf{W} \mathbf{q}_{n} \\ \vdots & \vdots & \ddots & \vdots \\ \mathbf{k}_{m}^{\mathsf{T}} \mathbf{W} \mathbf{q}_{1} & \mathbf{k}_{m}^{\mathsf{T}} \mathbf{W} \mathbf{q}_{2} & \cdots & \mathbf{k}_{m}^{\mathsf{T}} \mathbf{W} \mathbf{q}_{n} \end{bmatrix} $$

$$ \operatorname{Attention}(\mathbf{Q},\mathbf{K},\mathbf{V}) = \mathbf{V} \operatorname{Softmax} (\mathbf{K}^{\mathsf{T}} \mathbf{W} \mathbf{Q}) $$

마스크드 어텐션

어텐션의 출력인 컨텍스트 벡터는 각각의 쿼리가 모든 키를 참조하도록 되어있다. 그런데 시계열데이터를 학습하는 상황에서는 이것이 현재 값을 예측하기 위해 미래의 값을 참고하는 것과 같다. 즉 문장의 두번째 단어를 생성할 때 다섯번째, 열번째 단어를 보는 것인데 이는 허용되어서는 안된다. 이를 막기위해 트랜스포머 논문에서 소개한 것이 마스크드 어텐션이다. 논문에서는 $i$번째 쿼리가 자신보다 인덱스가 큰 키를 참조하지 못하도록 다음과 같은 마스크 오퍼레이터를 도입하였다.

$$ \begin{bmatrix} \operatorname{Mask}(\mathbf{K}^{\mathsf{T}} \mathbf{Q}/ \sqrt{d_{k}}) \end{bmatrix}_{ij} = \begin{cases} -\infty & i \gt j \\ \mathbf{k}_{i}^{\mathsf{T}} \mathbf{q}_{j} / \sqrt{d_{k}} & i \le j \end{cases} $$

$$ \operatorname{Attention} (\mathbf{Q}, \mathbf{K}, \mathbf{V}) = \mathbf{V} \operatorname{Softmax} \circ \operatorname{Mask} \left( \frac{\mathbf{K}^{\mathsf{T}} \mathbf{Q}}{\sqrt{d_{k}}} \right) $$


  1. Chulhee Yun et al. Are transformers universal approximators of sequence-to-sequence functions?. arXiv preprint arXiv:1912.10077 (2019). ↩︎

  2. Silas Alberti et al. Sumformer: Universal approximation for efficient transformers. Topological, Algebraic and Geometric Learning Workshops 2023. PMLR, 2023. ↩︎

  3. Dzmitry Bahdanau, Kyunghyun Cho, and Yoshua Bengio. Neural machine translation by jointly learning to align and translate. arXiv preprint arXiv:1409.0473 (2014). ↩︎ ↩︎

  4. Ashish Vaswani et al. Attention is all you need. Advances in neural information processing systems 30 (2017). ↩︎

  5. Minh-Thang Luong et al. Effective approaches to attention-based neural machine translation. Proceedings of the 2015 conference on empirical methods in natural language processing. 2015. ↩︎