셀프어텐션과 크로스어텐션
도입
이름과 달리 셀프 어텐션self-attention과 크로스 어텐션cross-attention은 어텐션 함수 그 자체에 대한 정의가 아니다. 어텐션 함수는 쿼리 행렬 $\mathbf{Q}$, 키 행렬 $\mathbf{K}$, 밸류 행렬 $\mathbf{V}$가 주어져 있을 때 다음과 같이 계산되는 함수를 말한다.
$$ \operatorname{Attention}(\mathbf{Q},\mathbf{K},\mathbf{V}) = \mathbf{V} \operatorname{Softmax}\left(f(\mathbf{K},\mathbf{Q})\right) \tag{1} $$
- $\mathbf{Q} \in M^{d_{k} \times n}$
- $\mathbf{K} \in M^{d_{k} \times m}$
- $\mathbf{V} \in M^{d_{v} \times m}$
이때 $\operatorname{Softmax}$는 주어진 행렬 $\mathbf{X} = \begin{bmatrix} \mathbf{x}_{1} & \cdots & \mathbf{x}_{N}\end{bmatrix}$에 대해서, 각 열벡터에 소프트맥스 $\operatorname{softmax}$를 취해서 각 열의 합이 $1$이 되게 하는 함수를 의미한다.
$$ \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} $$
$(1)$에서 $f$를 구체적으로 어떻게 정의하느냐에 따라서 어텐션 함수가 달라지는데, 셀프 어텐션과 크로스 어텐션은 어텐션 함수를 정의하는 방법이 아니라, 쿼리/키/밸류 행렬을 정의하는 방법에 관한 것이다.
정의
데이터 행렬 $\mathbf{X} \in M^{d \times n}$와 학습되는 가중치 행렬 $\mathbf{W}^{Q} \in M^{d_{k} \times d}$, $\mathbf{W}^{K} \in M^{d_{k} \times d}$, $\mathbf{W}^{V} \in M^{d_{v} \times d}$가 주어졌다고 하자. 쿼리, 키, 밸류 행렬을 모두 같은 데이터 $\mathbf{X}$로부터 얻는 방법을 셀프 어텐션이라 한다.
$$ \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} $$
반면 서로 다른 두 데이터 행렬 $\mathbf{X} \in M^{d_{x} \times n}$, $\mathbf{Y} \in M^{d_{y} \times m}$에 대해서, 쿼리 행렬은 $\mathbf{X}$로부터, 키와 밸류 행렬은 $\mathbf{Y}$로부터 얻는 방법을 크로스 어텐션이라 한다.
$$ \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} $$
이때 가중치 행렬의 크기는 $\mathbf{W}^{Q} \in M^{d_{k} \times d_{x}}$, $\mathbf{W}^{K} \in M^{d_{k} \times d_{y}}$, $\mathbf{W}^{V} \in M^{d_{v} \times d_{y}}$이다.
설명
어텐션 함수꼴로 요약하면 아래와 같다.
$$ \begin{align*} \text{Self-Attention:} \quad &\operatorname{Attention}(\mathbf{W}^{Q}\mathbf{X}, \mathbf{W}^{K}\mathbf{X}, \mathbf{W}^{V}\mathbf{X}) \\ &= \mathbf{W}^{V}\mathbf{X} \operatorname{Softmax}\left( \left( \mathbf{W}^{K}\mathbf{X} \right)^{\mathsf{T}} \left( \mathbf{W}^{Q}\mathbf{X} \right) \right) \end{align*} $$
$$ \begin{align*} \text{Cross-Attention:} \quad &\operatorname{Attention}(\mathbf{W}^{Q}\mathbf{X}, \mathbf{W}^{K}\mathbf{Y}, \mathbf{W}^{V}\mathbf{Y}) \\ &= \mathbf{W}^{V}{\color{red}\mathbf{Y}} \operatorname{Softmax}\left( \left( \mathbf{W}^{K}{\color{red}\mathbf{Y}} \right)^{\mathsf{T}} \left( \mathbf{W}^{Q}\mathbf{X} \right) \right) \end{align*} $$
셀프 어텐션은 시퀀스가 자기 자신에게 어텐션을 취하는 것이다. 쿼리, 키, 밸류가 전부 같은 데이터 $\mathbf{X}$에서 나오므로 쿼리의 개수와 키/밸류의 개수가 같고($m = n$), $\mathbf{X}$의 각 열벡터, 예컨대 문장의 각 단어가 같은 문장 안의 다른 모든 단어와 스코어를 재고 그 비중대로 밸류를 섞는다. 그 결과 각 단어의 표현이 자신이 속한 문장 전체의 문맥을 반영하도록 갱신된다. 이를테면 '그것'과 같은 대명사가 문장 안의 어떤 명사를 가리키는지가 셀프 어텐션의 가중치로 드러난다. 트랜스포머의 인코더가 대표적으로 셀프 어텐션을 사용하며, 인트라 어텐션intra-attention이라고도 불린다.
크로스 어텐션은 서로 다른 두 시퀀스 사이에서 한쪽이 다른 쪽을 참조하는 것이다. 기계번역이 대표적인 예로, 디코더가 만들고 있는 번역문 쪽 특징벡터가 쿼리 $\mathbf{X}$가 되고, 인코더가 내놓은 원문 쪽 특징벡터가 키와 밸류 $\mathbf{Y}$가 된다. 순환신경망 기반 seq2seq 모델에 처음 어텐션을 도입한 바다나우 어텐션이 바로 이 꼴이고, 트랜스포머 디코더에서 인코더의 출력을 참조하는 어텐션 층도 크로스 어텐션이다. 이런 맥락에서 크로스 어텐션은 인코더-디코더 어텐션encoder-decoder attention이라고도 불린다.

저희들의 저서 「줄리아 프로그래밍」이 2024 세종도서 학술부문에 선정되었습니다!

