연세대 인공지능학회 YAI

[CS224n] 어텐션 (Attention) 본문

강의 & 책/CS224N

[CS224n] 어텐션 (Attention)

_YAI_ 2022. 3. 18. 11:54

어텐션 (Attention)

** YAI 9기 전은지님이 자연어강의팀에서 작성한 글입니다.


1. Introduction

앞선 글에서 설명드렸던 Seq2Seq의 경우 하나의 hidden state가 모든 source text의 정보를 포함하고 있습니다. 이 때문에 sentimental analysis와 같은 단순한 태스크에서는 성능이 괜찮지만, translation과 같은 복잡한 태스크에서는 information bottleneck이 발생할 수 있습니다.

이 문제를 해결하기 위해 attention 모델이 제안되었습니다. Attention은 decoder의 각 step에서 encoder와 direct connection을 활용하여 source sentence의 특정 부분에 집중합니다. 사람이 실제로 번역을 수행할 때, source sentence를 계속 확인하면서 진행하는 것과 유사한 맥락이라고 할 수 있습니다.

2. Issues with RNN

2-1. Linear Interaction Distance

RNN 기반의 모델은 왼쪽에서 오른쪽으로 인코딩을 하게 되는데, 따라서 선형 지역성(linear locality)를 포착해냅니다. 이는 근처의 단어들이 서로 영향을 주므로 이 관계를 잘 포착할 수 있다는 점에서 유용합니다. 그러나 멀리 있는 단어들과 상호작용하기 위해서는 $O(N)$ 스텝이 필요하게 됩니다. 수식하는 단어들만큼의 step이 필요한데, long-distance dependencies (장거리 의존성) 문제가 발생합니다. 이는 훈련에 있어서도 gradient 소실 문제와 같은 문제들이 동작합니다. 따라서 linear order 형태로만 고려하는 것보다는 필요한 정보를 뽑아내는 모델링이 필요합니다.

2-2. Lack of Parallelizability

앞서 언급했듯이, 앞의 hidden states들이 모두 계산되어야 다음 step이 계산될 수 있습니다. 따라서 병렬화가 불가능한 연산(unparallelizable operations)이기 때문에, 병렬 연산에 특화된 GPU 사용에 있어서 큰 효과를 보지 못합니다.

3. If Not Recurrence

RNN을 사용하지 않는 모델로는 아래의 모델을 고려해볼 수 있습니다.

3-1. Word Windows

Word Windows 모델

Word window 모델은 local contexts를 종합(aggregate)합니다. 따라서 이 경우 각 time step별로 자신만 고려하면 됩니다. 여기에 word window layers를 쌓아서(stack) long-distance dependencies를 반영하고자 하였습니다. 따라서 최대 상호작용 거리(maximum interaction distance)는 sequence length를 window size로 나눈 값이 됩니다. 그러나 이 경우에도 마찬가지로 sequence가 너무 길어지면 long-distance context를 반영하지 못합니다.

3-2. Attention

Attention 구조는 병렬화가 가능하고, 최대 상호작용 거리까지 필요한 연산이 $O(1)$으로, 각 단어끼리 바로 상호작용이 가능합니다. 따라서 모든 단어들은 직전 레이어의 모든 단어를 참조(attend)하게 되는 것입니다. 여기서 fully-connected layer와 차이를 살펴보면 좋을 것 같습니다

  • Fully connected layer는 input과 output의 상호작용이 서로들 간에 영향을 미칩니다.
  • 그러나 attention은 각각만 영향을 주고 받기 때문에 parallelize하기 좋습니다.
  • 1) dynamic connectivity 2) not feed forward

Self-attention은 encoder와 decoder가 하나의 sentence에 있는 것을 의미합니다. 즉, Query, Key, Value가 동일한 source에 위치한 것입니다. 이 경우 식은 아래와 같이 작성할 수 있습니다.

 

Self-attention

 

$$
v_i = k_i = q_i = x_i, \space (x \text{: vector for per word; } x_1, \dots, x_T) \
q_i, k_i, v_i \in \mathbb R^d
$$

그리고 dot product self-attention는 아래와 같이 구할 수 있습니다.

일단 key-query affinities를 구하게 됩니다. 여기서 key-query affinities는 T-by-T matrix가 됩니다.

$$
e_{ij} = q_i^\top k_j
$$

그리고 attention weight를 softmax 함수를 통과시켜서 구하게 됩니다. Attention weight는 주어진 query에 대해 모든 key와의 score를 계산합니다.

$$
\alpha_{ij} = \frac{\text{exp}(e_{ij})}{\sum_j \text{exp}(e_ij)}
$$

마지막으로 가중합(weighted sum)의 형태로 출력값을 만들게 됩니다. 즉, attention weights들을 value와 곱한 뒤 다 더하게 됩니다. 따라서 자기 자신을 포함해서 다른 단어들과의 interaction을 계산하는 개념입니다.

$$
output_i = \sum_j \alpha_{ij} v_j
$$

3-3. Self-attention을 building blocks로 사용할 경우의 Issue

순서에 관한 내재된 개념의 부재

Operation on sets, 즉 하나의 집합으로 보고 계산이 이루어집니다. 따라서 순서 등에 관한 정보가 없습니다. 따라서 순서에 관한 정보를 sequence order vector로 하여 추가하게 됩니다.

$$
p_i \in \mathbb R^d \text{, for } i \in {1, 2, \dots, T }
$$

동일한 차원으로 구성되어 있기 때문에 self-attention building block에 통합하기 편합니다.

$$
v_i = \tilde v_i + p_i, q_i = \tilde q_i + p_i, k_i = \tilde k_i + p_i
$$

이때, 순서 정보를 주는 방식은 sinusoids 함수를 이용하는 방법과 일종의 파라미터로 훈련시키는 방법이 존재합니다. Sinosoid 함수를 이용할 경우 장점은 period로 표현되기 때문에 절대적인 위치가 중요하지 않고, 더 긴 sequence가 등장하더라도 extrapolate 시킬 수 있다는 점이 있습니다. 하지만 이 경우에는 학습이 가능한 파라미터가 없고, extrapolation이 실제로는 크게 도움되지 않는다는 점이 있습니다.

학습을 통해 배우게 될 경우에는 $p \in \mathbb R^{d \times T}$를 모두 학습하게 됩니다. 이 경우 flexibility가 가장 큰 장점이라고 할 수 있지만, 정해진 position 길이 이상으로는 학습이 이뤄지지 않는다는 즉, extrapolation이 되지 않는다는 단점이 존재합니다.

이외에도 relative linear position attention, dependency syntax-based attention 등이 등장했습니다.

 

비선형성의 부재

Feed forward network

단순한 self-attention은 weighted average의 형태와 동일하기 때문에 비선형성이 존재하지 않습니다. 따라서 self-attention을 거친 후에 feed-forward network를 추가하여 이때 비선형 함수를 추가하게 됩니다.

$$
m_i = MLP(output_i) = W_2 * \text{ReLU} (W_1 \times output_i + b_1) + b_2
$$

이때, 단순한 MLP가 아닌 다른 방식으로도 nonlinearity를 추가 가능합니다.

 

Don't "look at the future"하도록 만들어주어야 함

RNN 계열 모델들과 달리, attention은 미래에 등장할 단어까지도 함께 attention할 수 있습니다. 그러나 decoder에서 다음 단어를 예측해야 하는데, 미래의 단어들에 대한 정보는 아예 주어지지 않아야 합니다. 이 경우 매 timestep마다 key와 query를 바꿔가며 past words에 대해서만 학습하게 할 수 있습니다. 그러나 이는 매우 비효율적입니다. 대신 미래 단어들에 대해 masking하는 방식을 일반적으로 사용되는데, attention score를 -infinite로두게 됩니다. 이 경우 softmax를 통과시키면 weight가 0이 되기 때문에 과거의 단어들만 살펴보게 됩니다. 매 decoding layer마다 masking 과정을 거치게 됩니다.

4. Transformer

트랜스포머 인코더와 디코더 구조는 아래와 같이 그려집니다. 자세한 아키텍쳐를 살펴보겠습니다.

Transformer Architecture

4-1. Encoder

Encoder architecture

Key-query-value attention

Key-query-value attention

하나의 word embedding에서 k, q, v 벡터들을 구하는 방식은 아래와 같습니다. 일단 $x_1, \dots, x_T$가 transformer encoder의 input vectors $(x_i \in \mathbb R^d)$라고 할 때, keys, queries, values는 다음과 같이 linear하게 계산됩니다.

$k_i = K x_i, q_i = Q w_i, v_i = V x_i$

이때, $K, Q, V \in \mathbb R^{d \times d}$ 행렬은 $x$의 어떠한 부분이 사용되고 key, query, value 생성에서 강조되어야 하는 지를 모델링하게 됩니다.

 

Multi-headed Attention

Multi-headed Attention에서 각 attention head는 독립적으로 attention을 수행합니다. 따라서 다수의 $Q, K, V \in \mathbb R^{d \times d/h}$ 행렬이 존재하게 되며, 이때 $h$는 attention head를 의미합니다. 이때, multi-headed attention을 적용하더라도 single-head일 때와 동일한 연산량만을 필요로 하게 됩니다.

 

Tricks to help with training

Scaled-dot product attention

추가적인 훈련 성능을 높이기 위한 trick으로는 residual connections, layer normalization, scaled dot product 등을 사용합니다.

Residual connection은 $X^{(i)} = X^{(i-1)} + Layer(X^{(i-1)})$의 방식으로 계산하는 것으로, 이제는 "residual"만 학습을 진행하면 되기 때문에 성능을 높여주고, loss landscape을 smoothing하는 효과를 가져서 global minimum을 잘 찾도록 도와줍니다.

Layer normalization은 train을 더 빠르게 도와줍니다. Layer 내에서 normalization을 수행하는데 이 경우 uninformative variation을 제거하여 gradient를 normalize하는 효과를 얻게 됩니다.

Scaled dot product는 dimensionality가 커질수록 dot products의 값도 커지는 것을 해결하게 됩니다. Softmax에 들어가는 input이 커지게 되면 gradient가 작아지게 됩니다. 따라서 score를 scaling하여 차원이 커지더라도 softmax의 input을 보정해주게 됩니다.

4-2. Decoder

Transformer decoder

Decoder는 encoder에서 key와 value를 뽑고 query는 decoder에서 뽑아서 multi-headed cross-attention을 수행합니다. 즉, $h_1, \dots, h_T$가 encoder의 마지막 output이고 $z_1, \dots, z_T$가 decoder의 input이라면, key와 value는 $k_i = K h_i, v_i = V h_i$, 그리고 query는 $q_i = Q z_i$로 구하게 됩니다.

4-3. Results

이러한 attention model을 사용했을 때는 RNN을 이용한 언어 모델에 비해서 번역 태스크에서 높은 BLEU score를 기록하고, 낮은 perplexity와 ROUGE를 기록하게 됩니다.

4-4. What would we like to fix about the Transformer?

Quadratic Computation

모든 pair에 대해 계산해야 하므로 연산량이 급격하게 증가합니다. 즉, 계산 복잡도는 $O(T^2 d)$라고 할 수 있는데, $T \ge 10,000$과 같이 매우 긴 문서의 경우에는 연산량이 매우 높게 됩니다. 이러한 문제를 해결하기 위해 Linformer [Wang et al., 2020]는 sequence length dimension을 낮은 차원의 공간으로 축소시켜서 value와 key를 구하게 됩니다. 혹은 BigBird [Zaheer et al.,]는 모든 쌍의 상호작용을 local window나 random interaction과 같은 형태로 치환하게 됩니다.

그리고 position representations의 경우에도 다른 방법이 존재합니다.

 

다음 글에서는 Subword modeling에 대해서 살펴보겠습니다!

Comments