코딩하는 해맑은 거북이

딥러닝 기초 다지기 (4) 본문

AI

딥러닝 기초 다지기 (4)

#CJE 2022. 12. 26.
본 게시물의 내용은 '딥러닝 기초 다지기(부스트코스)' 강의를 듣고 작성하였다.
해당 글은 4. Recurrent Neural Networks (RNN) 2가지 파트를 다룬다.
1. Sequential Models - RNN
2. Sequential Models - Transformer

 

1. Sequential Models - RNN

- Sequential Model

Sequential 데이터를 처리하는데 가장 큰 어려움은

분류문제는 우리가 얻고 싶은 정보는 하나의 label일 경우가 많은데

Sequential 데이터는 길이가 언제 끝날 지 모른다. 받아들여야하는 입력의 차원을 알 수 없다는 것이다.

그래서 몇 개의 입력들이 들어오든 상관없이 모델이 동작할 수 있어야 한다.

 

1) Naive sequence model

가장 기본적인 Sequential Model

입력이 여러개 들어왔을 때, 다음번 입력에 대한 예측을 하는 것. ex) language model

고려해야하는 정보량이 점점 늘어난다.

 

2) Autoregressive model

가장 간단히 만든 model

과거의 정보를 몇개만 보겠다고 고정해두는 것.

즉, 과거의 timespan을 고정한다.

 

3) Markov model (first-order autoregressive model)

마르코프 가정(Markov assumption)을 가지는 모델

Markov property의 특성은 내가 가정하기에 나의 현재는 바로 전과거에만 dependent하다는 것.

그래서 이 모델은 많은 정보를 버릴 수 밖에 없게 된다.

이 모델을 사용했을 때 가장 큰 장점은 joint distribution을 표현하는게 굉장히 쉬워진다!

4) Latent autoregressive model

Markov Model의 가장 큰 단점은 사실 과거의 많은 정보를 고려해야하는데 이를 할 수 없는 것이다.

그래서 Latent autoregressive model은 중간에 hidden state가 들어가서 과거의 정보를 요약하고 있다고 본다.

즉, 다음번 timestep은 hidden state 하나에만 dependent 하는 것이다.

그래서 ouput만 봤을 때는 하나의 과거정보에만 dependent 한데, 하나의 과거가 이전의 정보를 요약하는 hidden state로 보는 것이다.

이를 보통 latent state라 하고, Latent autoregressive model이라 부른다.

물론 여기서 얼마나 많은 latent state를 만드느냐에 많은 차이는 발생한다.

 

 

 

 

 

- RNN (Recurrent Neural Network)

앞서 설명한 Sequential Model들을 가장 잘 설명할 수 있는 것이 RNN 구조이다.

자기 자신으로 돌아오는 구조가 하나 있다!

RNN은 시간순으로 정보를 푼 것이다.

자기 자신으로 돌아오는 RNN 구조는 사실 시간상으로 풀게되면, 입력이 굉장히 많은 fully connected layer로 표현될 수 있다.

그래서 오른쪽과 같이 푸는 것이 RNN을 학습하는 것과 동일하다.

 

Short-term dependencies

RNN의 가장 큰 단점

과거에 얻어진 정보들이 전부 취합되서 미래에 고려되어야하는데, RNN 자체는 하나의 Fixed Rule로 이 정보를 계속 취합하기 때문에, 과거에 있던 정보가 미래까지 살아남기 힘들다.

즉, 한참 과거에 있는 정보는 잘고려되지 않는다.

 

그러나, Short-term dependencies 하기엔 쉽지만, Long-term dependencies 를 잡기에는 굉장히 어렵다.

>> 이를 해결하기 위한 것 : Long Short Term Memory

 

RNN 학습이 어려운 이유

네트워크를 풀게되면 굉장히 큰 네트워크가 된다.

h1에서 h4로 갈수록 이전의 구조가 중첩되어 있는 것을 볼 수 있다.

cf) activation function이

sigmoid 인 경우, vanishing gradient 현상

ReLU인 경우 exploding gradient 현상이 발생한다.

 

 

 

 

 

- Long Short Term Memory (LSTM)

cf) Vanilla RNN : 앞서 봤던 기본적인 RNN 구조

Vanilla RNN

 

 

Long Short Term Memory

 

Previous cell state는 이전의 정보들을 다 취합(summarization)해둔 것.

 

 

LSTM의 가장 큰 아이디어는 중간에 흘러가는 cell state 이다.

마치 컨베이너벨트로 정보를 보내고, 이 정보가 유용한지 아닌지에 따라 gate를 거친다.

그림에서 ⓧ 표시들이 다 gate 이다.

 

 

 

- Forget Gate : 이전의 cell state에서 나온 정보 중 어떤 정보를 버릴지 살릴지를 결정하는 게이트

(sigmoid 함수를 통과하기 때문에 \(f_t\)는 항상 0~1 사이의 값을 가진다.)

- Input Gate : 현재 입력을 무조건 cell state에 올리는 것이 아니라 새로운 정보 중 어떤 정보를 올릴지 말지를 결정하는 게이트

- Update cell : Forget Gate와 Input Gate의 \(\tilde{C}_t\) 를 어느 값을 올릴지 정해서 두 값을 combine한 것을 새로운 cell state로 업데이트 한다.

- Output Gate : 어떤 값을 내보낼지 한번 더 조작해서 결정하는 게이트

 

>> 이러한 4가지를 잘 조합한 것이 LSTM 이다.

 

Gated Recurrent Unit (GRU)

LSTM과 다른점은 Gate가 Reset Gate, Update Gate로 2개 있고, cell state가 없어서 hidden state가 곧 output이다.

그래서 Output Gate가 필요없다.

일반적으로 많은 논문에 알려져 있는 것이 보면, 똑같은 task에 대해서 LSTM을 활용할 때보다 GRU를 활용할 때 성능이 더 올라가는 경우를 꽤 볼 수 있다. 그래서 GRU가 네트워크 파라미터 개수가 더 적은 관점에서 좋다 느껴서 많이 활용한다.

근데 요즘에는 Transformer가 나오면서 LSTM, GRU를 많이 활용하지 않음.

 


2. Sequential Models - Transformer

http://jalammar.github.io/illustrated-transformer/

 

The Illustrated Transformer

Discussions: Hacker News (65 points, 4 comments), Reddit r/MachineLearning (29 points, 3 comments) Translations: Arabic, Chinese (Simplified) 1, Chinese (Simplified) 2, French 1, French 2, Japanese, Korean, Persian, Russian, Spanish 1, Spanish 2, Vietnames

jalammar.github.io

Q. 왜 sequential model을 다루기 어려운가?

문장에서 중간에 구조가 빠져 있거나, 밀리거나 하는 경우에 이런것을 모델링 하는 것이 어렵다. 그래서 이러한 문제를 해결하기 위해 Transformer가 등장하였다.

 

- Transformer

Transformer은 RNN 같은 재귀적인 구조가 없고 attention이라고 불리는 구조를 활용했다.

 

* 기계어 번역(MLT)에 관련된 Transformer를 알아보자.

문제 : Input (불어) → Transformer → output (영어)

 

위의 그림에서 알 수 있는 것은 Input은 3개의 단어로 되어있고, Output은 4개의 단어로 되어있다.

→ Input와 Output은 서로 갯수, 도메인이 다를 수 있다. 단, 모델은 1개이다.

동일한 구조를 갖지만, 네트워크 파라미터가 다르게 학습되는 encoder와 decoder가 6개씩 stack 되어있다.

 

Encoder

Encoder를 보면, N개의 단어가 한번에 들어간다.

1개의 Encoder는 Self-Attention과 Feed Forward Neural Network를 거친다.

이를 거친 출력값이 2번째 Encoder로, 또 3번째 Encoder로 stack이 되게 된다.

* Self-Attention : Transformer가 왜 잘되게 되었는지 나타낸다. 

1개의 Encoder 구조

 

3개의 단어마다 기계가 번역할 수 있도록 특정 숫자의 벡터로 표현한다. 즉 3개의 벡터가 된다.

 

Self-Attention은 하나의 벡터가 z1으로 갈때, 단순히 x1의 정보만 활용하는 것이 아니라 x2, x3의 정보도 같이 활용한다. 

그래서 Self-Attention은 dependency가 있다. 

Feed-Forward는 dependency가 없다. 

 

 

* 조금 더 단순하게 생각해보기 위해 2개의 단어 Thinking, Machines만 주어졌다고 해보자.

cf) 'it' 이라는 단어는 문장 속에서 interaction을 보면 animal과 굉장히 관계성이 높다.

 

Self-Attention은 3가지 벡터(Query, Key, Value)를 만들어 낸다. 이는 단어마다 3개의 벡터를 만들어내고, 이를 통해서 x1에 대한 Embedding 벡터를 새로운 벡터로 바꿔준다.

* Score Vector : Query 벡터와 key 벡터(자기자신을 포함한 나머지 벡터)를 내적한다. ▶ Attention

   → 나머지 n개의 단어와 얼마나 유사도가 있는지 확인

* Divide by 8 : Score 벡터를 8로 나눠줘서 Normalize 해준다. 8은 key 벡터의 dimension(파라미터로 입력받음)의 제곱근

* Softmax : Normalize된 Score에 softmax를 취해줘서 각 단어마다의 연관성을 본다. ▶ Attention weights

* Softmax x Value / Sum : value 벡터들의 weights의 Sum을 구한다. 

- 주의점

  1) Query 벡터와 Key 벡터는 항상 차원이 같아야한다. → 내적을 위함

  2) 한 단어의 Encoding된 벡터의 차원은 Value 벡터의 차원과 동일하다.

 

* 행렬로 계산해보자.

* n개의 단어가 주어지면 nxn attention map을 만들어야한다. 그래서 길이가 길어길수록 이를 처리할 수 있는 한계가 있다. 그러나, RNN보다 훨씬 더 Flexible하고 많은 것을 표현할 수 있는 네트워크를 만들 수 있다.

 

- Multi-headed attention (MHA)

하나의 Encoding된 벡터에 대해 Query, Key, Value를 1개만 만드는 것이 아니라 여러개를 만드는 것.

n번의 attention을 반복하게 되면  n개의 encoding된 벡터를 만들 수 있다.

embedding된 차원과 encoding된 벡터가 차원이 같아야 한다. 

그래서 n개의 encoding된 벡터들을 concat을 한 다음에 차원이 같아지도록 행렬곱셈을 통해 차원을 줄여준다.

* Positional encoding : 입력에 특정 값을 더해주는 것.

  → 데이터를 병렬 처리하면서 데이터가 입력된 순서에 대한 정보가 사라지는 문제가 발생하게 된다. 이 문제를 개선하기 위하여 말 그대로 위치 정보를 Encoding 하는 역할을 한다.

 

Decoder

Input에 대한 단어들을 Decoder에 있는 출력하고자 하는 단어들에 대해 attention map을 만들려면, Input에 해당하는 단어들의 key 벡터와 value 벡터가 필요하다. 그래서 Transformer은 key 벡터와 value 벡터를 보내준다.

최종 출력은 autoregressive 하게 하나의 단어씩 만들게 된다.

k, v 전달

<end of sentence>라는 special token이 나오게 되면 끝나게 된다.

학습할때는 이전 단어들만 dependent하게 하고 뒤에 단어들은 dependent하지 않게 위해 masking을 하게 된다.

 

Encoder-Decoder Attention : 이전의 생성된 단어들만 가지고 Query를 만들고, key, value는 encoder에서 나온 것을 가지고 활용한다.

 

단어들의 분포를 만들어서 매번 샘플링하는 방식으로 돌아간다.

 

 

활용영역

- Vision Transformer

이미지 분류할 때, Transformer의 encoder를 활용한다. (비전영역에서도 활용하고 있는 것을 알자)

 

- DALL-E

문장이 주어지면 문장에 대한 이미지를 나타낸다. transformer의 decoder를 활용한다.

→ 문장 : An armchair in the shape of an avocado.

 

 

'AI' 카테고리의 다른 글

[딥러닝] RNN (Recurrent Neural Network)  (0) 2022.12.31
[딥러닝] CNN (Convolutional Neural Network)  (0) 2022.12.31
딥러닝 기초 다지기 (3)  (0) 2022.12.25
딥러닝 기초 다지기 (2)  (0) 2022.12.25
딥러닝 기초 다지기 (1)  (0) 2022.12.25
Comments