[Day 9] Boostcamp AI-Tech

donggunseo·2021년 8월 12일
0

Boostcamp AI-Tech

목록 보기
9/34

2021년 8월 12일
2주차 DL Basic
강의수강 : 7강~8강

1. 학습내용 정리

(1) RNN(Recurrent Neural Network)

이론적인 부분은 이 글의 RNN부분을 보면 된다. 다만 몇가지 추가되는 내용들만 다루겠다.

Marcov Model(first-order autoregressive model)은 시퀀스의 발생 probability에 대해서 바로 이전의 input만 담는 모델이다. Joint distribution으로 표현하기 쉽다는 장점이 있지만 잘 쓰이지 는 않는다. 식은 다음과 같다.

p(x1,...,xT)=p(xTxT1)p(xT1xT2)p(x2x1)p(x1)=t=1Tp(xtxt1)p(x_1,...,x_T) = p(x_T|x_{T-1})p(x_{T-1}|x_{T-2})\cdot \cdot \cdot p(x_2|x_1)p(x_1) = \displaystyle\prod_{t=1}^Tp(x_t|x_{t-1})

RNN의 문제는 역전파 과정에서 그레디언트가 소실되거나 폭발되는 문제가 있다. 이는 곧 시퀀스 안에서 멀리 있는 데이터에 대해 정보를 제대로 받지 못한다는 것이다. RNN 계열을 쓰는 이유가 시퀀스 데이터를 순서정보 그대로 다루겠다는 목적인데 이 단점을 극복해야만 했고, 그래서 나온 기법이 LSTM(Long Short Term Memory) 이다.

f=σ(XtWX(f)+ht1Wh(f)+b(f))g=tanh(XtWX(g)+ht1Wh(g)+b(g))i=σ(XtWX(i)+ht1Wh(i)+b(i))o=σ(XtWX(o)+ht1Wh(o)+b(o))Ct=fCt1+giht=otanh(Ct)f=\sigma(X_t W_X^{(f)} + h_{t-1}W_h^{(f)}+b^{(f)}) \\ g=\tanh(X_t W_X^{(g)} + h_{t-1}W_h^{(g)}+b^{(g)}) \\ i=\sigma(X_t W_X^{(i)} + h_{t-1}W_h^{(i)}+b^{(i)}) \\ o=\sigma(X_t W_X^{(o)} + h_{t-1}W_h^{(o)}+b^{(o)}) \\ C_t = f \odot C_{t-1} + g \odot i \\ h_t = o \odot \tanh(C_t)

기본 RNN 구조에서 여러 gate들을 추가해 단점을 극복하고자 하였다. CtC_t라는 Cell을 통해 이전의 정보에 대해 기억 셀을 저장하여 활용하는 것이다. ff는 Forget Gate이며 어떤 정보들을 버릴지 결정하는 Gate이다. iigg는 input gate로 어떤 정보들을 기억 셀에 저장할 지 결정하는 gate이다. CtC_t식은 이전의 기억셀과 gate들을 활용해 기억 셀을 업데이트한다. oo는 output gate로 input을 정리하여 CtC_t와 함께 최종적으로 은닉 셀이자 아웃풋인 hth_t를 만드는 역할을 한다.

zt=σ(XtWX(z)+ht1Wh(z)+b(z))rt=σ(XtWX(r)+ht1Wh(r)+b(r))ht~=tanh(XtWX+(rtht1)Wh+b)ht=(1zt)ht1+ztht~z_t=\sigma(X_t W_X^{(z)} + h_{t-1}W_h^{(z)}+b^{(z)}) \\ r_t=\sigma(X_t W_X^{(r)} + h_{t-1}W_h^{(r)}+b^{(r)}) \\ \tilde{h_t}=\tanh(X_t W_X + (r_t \odot h_{t-1})W_h+b) \\ h_t = (1-z_t) \odot h_{t-1} + z_t \odot \tilde{h_t}

GRU(Gated Recurrent Unit)는 LSTM의 과한 연산량을 줄이며 기억셀의 기능을 그대로 유지시키기 위해 고안되었다. rr은 reset gate, zz은 update gate를 맡는다.

(2) Transformer

Attention is all you need 라는 논문에서 고안된 기법이다. Attention이라는 간단한 셀로 모든 RNN 셀들을 대체하여 성능은 올리고 모델은 가볍게 만들었다. 다음 블로그에서 Transformer에 대한 내용들을 잘 정리하였다.


Encoder는 다음과 같이 Self-Attention 셀 한개와 NN 한개로 구성되어있다. NLP문제라고 가정할 때, 각 단어들을 feature vector로 만드는 역할을 Self-Attention이 한다. 고안된 아이디어는 사실 Attention cell에서 생각해 볼 수 있는데, 어떤 단어와 연관있는 단어가 멀리 떨어져 있다면 일반적인 시퀀스를 다루는 뉴럴넷에선 아무리 해도 그 둘의 연관성을 잘 담기 어렵다. 그래서 어떤 두 단어간의 연관성을 weight sum을 통해 더 잘 표현하겠다는 것이 목적이다.

각각의 단어를 임베딩한 임베딩 벡터가 주어진다. 그 후 각 단어에 대해 Query, Key, Value 벡터로 만들어주는 가중치 행렬 WQ,WK,WVW_Q, W_K, W_V와 이 임베딩 벡터를 곱해 각각의 벡터들을 만든다. 예를 들어 그림속에서 Thinking이라는 단어에 대해 다른 단어들간의 연관성을 측정하기 위해 Thinking의 Query 벡터에 다른 단어들의 Key 벡터와 내적한다. 이후 이를 Query 행렬과 Key 행렬의 dimension이자 최종 attention dimension의 제곱근으로 나눠서 Normalization하고 softmax연산을 하여 weight를 만들고 이를 key 단어의 value벡터와 weight sum 하여 최종 feature vector인 z를 만든다. 실제로는 multi-head attention을 사용하는데 같은 attention cell을 여러개 만들어 나온 여러 z에 대해 concatenate하여 이를 WoW_o와의 곱으로 하나의 feature vector를 만든다.

input에 순서 정보를 좀 더 잘 담기 위해 각 단어 임베딩 벡터에 positional encoding 벡터를 더하게 된다. 다음과 같은 식을 기준으로 positional encoding 벡터가 정해진다.

마지막 인코더는 인코더에서 사용했던 WVW_VWkW_k를 decoder에 넘겨주고 decoder는 autoregressive manner로 output sequence를 만들게 된다. 이때 decoder의 self-attention layer는 이전의 정보들에만 접근하도록 미래 정보에 대해 masking을 하는데 이는 predict를 해야 하기 때문이다. 기본적으로 Encoder와 구조는 거의 같지만 Query 가중치 행렬만 직접 만들고 나머지는 Encoder에서 가져온다는 점에서 다르다. 참고로 encoder와 decoder 모두 residual network 기법을 사용한다.

2. 과제

선택과제 1,2,3번을 한 번에 끝냈다. 선택과제 1번은 Visual Transformer를 구현하는 것인데, Multi-head attention을 이해하고 있다면 간단히 코드 몇줄을 채워 해결할 수 있는 과제였다. 2번은 Adversial Auto-Encoder에 대한 것인데, 그냥 차원수 맞춰서 layer 넣는 문제라 이해가 필요하지 않은 과제였다. 3번은 Mixture Density Network 문제였는데 사실 이게 너무 어려웠다. 글이 많아서도 그렇지만 도무지 쉽게 이해가 가지 않는 내용이었다. 그래도 위에 예시보면서 잘 끝냈다.

3. 피어세션

용범님이 RNN에서 시퀀스 뒤쪽의 정보를 제대로 파악할 수 없는 이유가 무엇인지 여쭤보셨고 역전파가 시퀀스 역순으로 따라가기 때문에 기울기 소실이 일어나서라고 답변해드렸다. 재빈님이 Transformer에서 score가 나오는 과정이 궁금하다고 하셨고, 답변은 위의 학습정리를 통해 충분히 확인 가능하다.

4. 마무리

Transformer에 대해 언젠간 봐야지 봐야지 했는데 이렇게 배우게 되어 훨씬 이해가 빨랐다. 이제 논문을 보면 이해를 더 잘 할 수 있을 것 같다.

0개의 댓글