티스토리 뷰

 

 

RNN 모델은 sequential data를 다루는 데 특화된 모델이리고 했다. 
sequential task 중에는 translation이 있다. 하지만 RNN을 활용하여 translation을 수행할 때에는 결과가 그다지 좋지 못하다. 

  • 훈련 데이터에서 벗어난 out of vocabulary words 이거나 
  • train - test domain miss match
  • 롱텀의 context 정보의 해석 문제 
  • 의미가 불명확한 low resource 단어 

등등의 문제가 있기 때문이다. 
이러한 문제를 해결하기 위해 나온 모델이 attention 모델이다.


📌Attention model

기존 오토인코더 기반 RNN 모델의 문제점 

기존 RNN 구조

인코더 RNN: 입력 단어를 받아 인코딩을 하는 RNN 구조, hidden to hidden 으로 이어짐

디코더 RNN: 마지막 인코더로부터 feature 벡터를 받고 디코딩 
  • 병목현상
    • 인코더의 마지막 hidden state에 과거의 모든 정보를 담고 있어야 함 
    • context 정보 등으로 압축하긴 하지만 마지막에 병목현상 발생 

🔷Attention의 아이디어 및 구조 

  • 인코더의 파트에서 가중치(스코어)를 계산
  • 다이렉트 커넥션을 만들어 줌 

  1. 스코어 계산
    • 인코더 RNN의 각 hidden state와 디코더 RNN의 hidden state $h_{k}$ 각각을 행렬곱
    • 각 인코더 hidden state에 대한 스코어를 얻을 수 있음.
    • N개의 스코어 획득.  
  2. softmax
    • 스코어에 softmax 적용 
    • 합이 1인 확률분포로 변환됨 (attention distribution $\alpha$)
    • 이 값이 클수록 디코딩 할 때 더 주목(attention)
  3. attention distribution 과 hidden state 곱 
    • $\alpha$ 와 h를 곱한 것 전체를 더하여 attention output 도출 
  4. attention output 과 디코더 hidden state n을 concatenate 
    • concatenate 시키고 
    • 네트워크에 입력으로 넣어 n 번째 출력 생성 

attention 구조를 도입하여 번역 성능이 비약적으로 향상되었다. 
RNN의 병목현상도 해결했고 사람이 해석하기도 좋은 모델이다. 
때문에 신경망 기반 translation 모델에서 기초가 되는 모델로 사용된다. 

또한 translation 만이 아닌 다른 영역에서도 쓰이는데 
예를 들면 이미지를 보고 주어진 질문에 답을하는 VQA task 에서도 attention 모델을 쓰기도 한다. 


📌Transformer 

attention 모델도 일종의 Fully Connected Layer 라고 볼 수 있다. fully connected 이면서 입력을 보고 hidden state의 출력을 낼 때 어디를 주목할 것인지 보는 모델이다. 때문에 이 부분을 병렬 처리 하는 데 번거롭다는 단점이 있다. 이를 해결하기 위해 등장한 모델이 Self-Attention 모델이다.


🔷Self-Attention 모델 구조

아이디어는 hash table을 사용한다. 파이썬을 생각하면 key 와 value가 있는 dictionary와 같은 역할인데, query가 들어오면 매칭되는 key를 찾고 해당하는 value를 출력하는 형태이다. 여기에 attention을 적용하는 것이다. self attention table의 key에 해당하는 value는 일종의 attention score로 나타낸 것이다.

어떤 단어가 들어왔을 때 벡터로 변환한다. 그리고 세 가지 weight 행렬이 있는데, 각 입력 벡터와 곱하면 query, key, value를 얻을 수 있다. 그 다음 query와 key의 dot product 연산을 통해 attention score를 구한다. 기존 attention 모델과 마찬가지로 softmax를 적용해 $\alpha$ 를 구한다. 역시 $\alpha$ 와 곱한 것의 전체 합을 구해 출력을 구할 수 있다.


🔷Transformer 인코더 구조

input sequence 가 들어와서 self attention을 거쳐서 출력이 나오면 fully connected layer에 입력으로 넣어준다. 

그리고 ResNet의 residual 과 같은 기법과 Norm layer에서 normalization 과 같은 기법을 많이 사용한다. 이를 다시 attention을 거치고 반복한다. (scaled dot product attention) 

- Positional encoding

translation에서는 단어의 순서를 고려해야하는데 attention이나 self attention에서는 순서에 대한 부분을 고려하지 않았다. 때문에 이 부분을 해결하기 위해 트랜스포머에는 인코더에 positional encoding을 넣었다. 입력이 들어오면 순서에 따라 위치정보 (position 벡터)를 넣어주는 것이다. 

position 벡터를 어떻게 attention과 합치냐 하면...
기존 self attention에서 입력 벡터 $\mathbf{x}$ 와 각 weight 행렬을 곱해 query, key, value를 만들었다. 이 부분에 단순히 position 벡터를 더해주는 것이다. 이렇게 포지션을 가진 어떤 self attention 모델을 만들었다고 볼 수 있다. 

- Multi head

인코더에 대한 마지막 아이디어는 multi head를 사용하는 것이다. 

딥러닝에서 동일한 입력에 대해 여러 output(출력)을 만들어낼 수 있다. 이 각 출력을 만드는 부분을 각각의 head라고 하고 여러 attention 출력 결과를 앙상블과 같이 합쳐 최종 출력을 만들어낸다. 이렇게 집단지성처럼 성능을 향상시키는 것이 가능하다. 

Attention is All you Need 논문


🔷Transformer 디코더 구조

이제 인코더로 특정 feature 벡터로 나타냈다면 디코더가 이 벡터를 받아서 결과를 만들어내야 한다. 

마스킹

디코딩 시 문제는 특정 부분을 출력할 때 그 이전 부분만 관측해서 출력을 해야하는 것이다. 아직 나오지 않은 미래 정보를 차단하기 위해 attention score를 $-\infty$ 로 주면서 일종의 마스킹을 한다. 

multi head cross attention 

디코딩 시 입력에서 오는 hidden state와 입력을 둘 다 사용해야 한다. 
cross attention이라고 하는 이유는 인코더와 디코더의 hidden state 모두 사용하기 때문이다. 
디코더가 인코더를 참고하는 단계라고 생각할 수 있다.

디코더 처리 흐름

디코더의 입력 벡터를 z 라고 하면 key 와 value는 weight matrix를 곱해 만들어 준다. query는 z에 해당하는 행렬을 곱해 query 벡터를 만들어준다. 이를 이용해 다시 attention을 계산하면 최종 output을 만들어 낼 수 있다. 

그 다음 인코더와 마찬가지로 fully connected layer를 거치고 일렬로 편 다음 softmax를 거쳐 특정 단어에 대한 확률을 계산한다. 

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함