본문 바로가기
딥러닝(Deep Learning)/D&A Deep Session

[D&A Deep Session] 9차시 - 15. Attention, Transformer

by rahites 2022. 5. 24.

 

## 지금까지 Sequence data를 처리하는데 사용한 RNN계열의 알고리즘은 t-1번째 hidden state와 t번째 input data를 활용하여 recurrent model을 만들었다. 하지만 Sequence가 진행됨에 따라 Sequence 앞에 존재하던 원소의 영향은 약해지게 된다. 따라서 앞에 존재하는 원소가 뒤에 존재하는 원소에 중요한 영향을 미치는 경우에 그 영향력을 제대로 계산하지 못하는 경우가 발생하는데, 이를 Long-Term Dependency Problem이라고 한다. RNN에서는 특히 입력되는 Sample Sequence의 길이에 따라 은닉층의 계산이 반복되기 때문에 더 큰 문제를 가지고, RNN을 개선한 모델인 LSTM과 GRU에서도 이러한 문제가 남아 있기 때문에 Attention이라는 매커니즘이 제안되었다. 

 

 

# Attention

: Attention is all you need 논문에 소개된 일종의 매커니즘으로 기존의 방법이 input의 정보가 decoder에 효과적으로 전달될 수 없다는 점에 주목하여 "Decoder의 모든 예측시점마다 예측해야할 단어와 연관이 있는 input부분을 좀더 집중(Attention)해서 보자!" 라는 핵심 아이디어를 가진다. 

 

- 이러한 아이디어를 적용하기 위해 일단 Encoder의 모든 hidden state를 모두 Decoder로 보내고, 거기에서 중요한 것을 뽑아서 쓰는 방법을 채택한다. (이 때 Encoder의 모든 hidden state는 벡터를 행렬로 쌓아 Decoder의 모든 예측시점으로 전달한다)

 

 

* 그렇다면 이렇게 Decoder로 보내진 행렬에서 중요한 정보는 어떤 기준으로 뽑을 것인가??

 

1. hidden state 행렬의 각 벡터들 중 중요한 벡터를 선택할 경우

: 단순 선택하는 작업은 미분이 불가능하기 때문에 오차 역전파법을 사용할 수 없다.

 

2. 미분이 가능한 연산으로 중요한 정보를 뽑아오기

: hidden state 행렬의 각 벡터의 중요도를 계산하여 가중치 합을 구한다. 이 때 중요도는 Decoder의 각 예측시점에서의 hidden state 값과 hidden state 행렬의 벡터들이 얼마나 유사한지를 의미한다. 또한 중요도는 다음과 같은 순서로 계산된다. 

  • hidden state 행렬의 각 벡터들과 Decoder hidden state의 유사도 구하기
  • 각 유사도를 중요도(가중치)로 바꾸기 위해 softmax 함수로 정규화 ( 0 ~ 1 사이의 값으로 만듦 )

위의 방법말고도 Attention의 중요도를 구하는 방법은 아래와 같이 여러가지 방법이 존재한다. ( 위의 방법은 dot 방식 ) 

위의 방법으로 구한 가중합 벡터를 Context Vector (맥락 벡터)라고 부른다. 즉 Decoder 특정 시점의 맥락벡터 c는 Decoder 특정 시점에서 만들어진 중요도를 가중치로 삼아 hidden state 행렬의 가중치 합을 계산한 것이다. 이와 같은 방식을 사용하면 기존 seq2seq 모델의 Affine 계층에서 LSTM의 hidden state 벡터만을 input으로 받은 것과 달리 추가로 Attention 계층이 출력한 Context Vector를 같이 입력받게된다. 

 

** 참고 **

1) 어텐션 메커니즘 (Attention Mechanism) - 딥 러닝을 이용한 자연어 처리 입문 (wikidocs.net)

 

1) 어텐션 메커니즘 (Attention Mechanism)

앞서 배운 seq2seq 모델은 **인코더**에서 입력 시퀀스를 컨텍스트 벡터라는 하나의 고정된 크기의 벡터 표현으로 압축하고, **디코더**는 이 컨텍스트 벡터를 통해서 ...

wikidocs.net

 

 

# Transformer

: Attention 매커니즘을 사용해서 기존 RNN 모델을 보정하는 용도이다. 

 

Attention is all you need ( Transformer 구조 )

위의 그림은 Transformer model의 구조를 나타낸다. Transformer는 input과 output의 교류가 없는데 Attention이 적용되었다는 점입니다. ( Encoder와 Decoder 각자의 input만을 사용하여 attention을 적용한다. ) 

 

* Encoder

- N = 6인 동일한 layer로 구성되어 있다. 각각의 layer는 2가지의 sub-layer를 가지고, 이 중 첫번째는 multi-head self-attention mechanism이고, 두번째는 position-wise fully connected feed-forward network이다. Layer 정규화에 따라 각각의 2가지 sub-layer들에 residual connection(잔차 연결)을 진행한다. 각각의 sub-layer의 output은 LayerNorm(x+Sublayer(x))형태이기 때문에 이 때 residual connections를 용이하게 하기 위해 sub-layer의 output dimension을 embedding dimension과 맞춰준다. 

 

1. 임베딩 벡터에 positional encoding 값을 더해 인코더에 입력

2. Input으로 query, key, value를 계산해 Multi-Head attention에 입력

3. Add&Norm에서 잔차 연결과 정규화 진행

4. Feed Forward층에서 선형변환과 활성화 함수 적용

5. Add&Norm에서 잔차 연결과 정규화 진행

6. Encoder의 output 배출

 

* Decoder

- N = 6인 동일한 layer로 구성되어 있다. Encoder에서 존재하던 2개의 sub-layer에 더하여 multi-head attention을 수행하는 3번째 sub-layer를 추가한다. 또한 Encoder와 같이 layer 정규화에 따라 sub-layer들에 residual connection을 적용한다. 여기서 Encoder와 다른점이 존재하는데, Decoder에서는 순차적인 결과를 만들어야하기 때문에 self-attention을 수정해주어야 하고 이 방법을 masking이라고 부른다. Masking은 position i보다 이후에 있는 position에 attention을 주지 못하게 하는 방법으로 결국 position i에 대한 예측은 오직 i이전의 position들에 대한 알려진 output에 의존한다.

 

1. 임베딩 벡터에 positional encoding 값을 더해 디코더에 입력

2. query, key, value를 계산해 Multi-Head attention에 입력

3. Add&Norm에서 잔차 연결과 정규화 진행

4. 다음 Multi-head attention에 query 전달

5. Add&Norm에서 잔차 연결과 정규화 진행

6. Feed Forward층에서 선형변환과 활성화 함수 적용

7. Add&Norm에서 잔차 연결과 정규화 진행

8. 선형 변환

9. Softmax 함수 적용

 

* Masking

: Query와 key를 사용해 구한 Attention Score Matrix에서 현재시점보다 미래의 단어들을 가려준다. Transformer에서는 문장의 행렬을 입력받아 모든 시점의 output 시퀀스를 참고할 수 있다. 따라서 현재 시점을 포함해 이전 시점에 입력된 단어들만 참고할 수 있도록 현재 시점 이후의 단어들을 masking해주는 것이다. 

 

* Attention 계층 

: 특정 정보에 좀 더 주의를 기울이는 것을 말한다. ( 앞의 모든 token이 비슷한 중요도를 갖는 것이 아닌 특정 token이 더 큰 중요도를 가지게 만드는 것!! )

 

1. Query : 특정 시점의 Decoder의 hidden state(h) ( Decoder의 self-attention 계층의 출력 ) 

2. Key : 모든 시점의 encoder의 hidden state(hs) ( Encoder의 Output )

3. Value : 모든 시점의 encoder의 hidden state(hs) ( Encoder의 Output  )

 

- Transformer에서는 같은 입력 단어에 다른 3개의 가중치를 적용하여 3가지 값을 만듦 ( 행렬 연산으로 일괄 처리 )

- Attention에 적용되는 3가지 값의 출처가 같다. ( self-attention )

 

* Scaled Dot-Product Attention

$$ Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}})V $$

- input은 \(d_k\) dimension의 query와 key들,  \(d_v\) dimension의 value들로 이루어져 있다. 이 때 모든 query와 key에 대한 dot-product를 계산하고 각각을 \(\sqrt{d_k}\)로 나누어주며, softmax 함수를 적용해 value값들에 대한 weights를 얻어낸다. 

- key와 value는 Attention이 적용되는 위치와 상관없이 같은 값을 갖고, 이 때 query와 key에 대한 dot-product 연산을 적용하면 각각의 query와 key사이의 유사도를 구할 수 있다. 이 때 \(\sqrt{d_k}\)로 scaling을 진행하는 이유는 dot-product의 값이 커질수록 softmax 함수에서의 기울기가 변화가 거의 없어지기 때문이다. 

- softmax 함수를 거친 값을 value에 곱해준다면, query와 유사한 value일수록, 즉 중요한 value일수록 더 높은 값을 가지게 된다. ( Attention이 중요한 정보에 집중한다는 점을 생각!! ) 

 

* Multi-Head Attention

$$ MultiHead(Q,K,V) = Concat(head_1, ...., head_h)W^O $$

- \(d_{model}\) dimension의 key, value, query들로 하나의 Attention function을 수행하는 것보다 key, value, query들을 가지고 h번의 linearly project를 하는 것이 더 좋다( key, value, query에 각기 다른 weight(W)를 곱해준다 ). 이 때 project 된 key, value, query들은 병렬적으로 Attention 기능을 수행한다(\(d_v\) dimension의 output). 이후 여러개의 head들을 concatenate -> projection 하여 최종적인 \(d_{model}\)의 dimension output 값을 얻게 된다. 이 과정을 순서로 나타내면 아래와 같다. 

 

1. (입력값 차원 수 / multihead 개수)의 차원으로 Q, K, V 생성

2. 각 Q, K, V를 h개의 버전으로 선형 변환

3. Q, K, V를 사용해 여러 버전의 Scaled Dot-Product Attention 진행

4. 각 버전을 concat

5. Concat한 값을 다시 한번 선형 변환

 

* Position-wise Feed Forward

$$ FFN(x) = max(0, xW_1 + b_1)W_2 + b_2$$

: Encoder와 Decoder의 각각의 layer에는 Fully connected feed forward network를 포함한다. 이 때 position마다 적용되기 때문에 position-wise라고 부르고, 이 네트워크에서는 2번의 선형 변환이 이루어지는데 이 2번의 선형 변환 사이에 ReLU함수가 적용된다. 

 

* Add&Norm

$$ LN = LayerNorm(x+Sublayer(x))$$

: 잔차 연결(Add) 이후 정규화(Norm)을 진행한다. 

 

- 잔차 연결 : 상위 layer의 gradient 값이 변하지 않고 하위 layer에 전달되는 것으로 layer를 거칠수록 gradient가 사라지는 gradient vanishing 문제를 완화해준다.

https://arxiv.org/abs/1603.05027

 

Identity Mappings in Deep Residual Networks

Deep residual networks have emerged as a family of extremely deep architectures showing compelling accuracy and nice convergence behaviors. In this paper, we analyze the propagation formulations behind the residual building blocks, which suggest that the f

arxiv.org

- Layer Normalization : gradient가 exploding하거나 vanishing하는 문제를 완화시키고 gradient를 더 빨리 학습시킬 수 있다

https://arxiv.org/abs/1607.06450

 

Layer Normalization

Training state-of-the-art, deep neural networks is computationally expensive. One way to reduce the training time is to normalize the activities of the neurons. A recently introduced technique called batch normalization uses the distribution of the summed

arxiv.org

 

* Positional Encoding

: Transformer는 recurrence나 convolution한 구조를 가지지 않기 때문에 단어의 Sequence를 파악하기 위해서는 단어의 위치 정보를 추가해주어야 한다( 단어를 순차적으로 입력 받는 방식이 아니기 때문 ). 따라서 Encoder와 Decoder의 Input 연산에서 Positional Encoding을 수행해주고, 임베딩 벡터에 Positional Encoding 값을 구해 더해준다. 

$$ PE(pos, 2i) = sin(pos/10000^{2i/d_{model}}) $$

$$ PE(pos, 2i+1) = cos(pos/10000^{2i/d_{model}}) $$

pos : Position ( 입력 문장에서 임베딩 벡터의 위치 )

i : dimension ( 임베딩 계층 차원 인덱스 )

\(d_{model}\) : 임베딩 계층의 출력 차원

 

 

-- 고정된 크기의 context vector를 사용하던 이전과 달리 Attention과 Transformer의 등장 이후 입력 시퀀스 전체에서 정보를 추출하는 방향으로 발전하였다. 2021년 기준 최신 고성능 모델들은 Transformer 아키텍처를 기반으로 하고있다.

 

ex. GPT : Transformer의 Decoder 아키텍처를 활용

      BERT : Transformer의 Encoder 아키텍처를 활용

 

 

 

** 참고 **

https://pozalabs.github.io/transformer/

 

Attention is all you need paper 뽀개기

Transformer paper review

pozalabs.github.io

 

댓글