Boostcamper's TIL (8)

최현진·2021년 8월 12일
0

boostcamp

목록 보기
8/20

2021/08/12

학습한 내용

Python Basic

LSTM

Sequential model은 입력데이터 길이가 언제 끝날지 모르는 어려움이 있다. input 데이터의 길이가 길어질수록 과거 정보량이 점점 늘어난다.
이러한 문제점에 대한 해결책은 사용할 과거정보를 한정적으로 고정할 수 있는 방법이 있다.
Markov model

RNN(Recurrent Neural Network) 모델은 이전 state를 현재 state를 계산할 때 고려하여 과거 정보를 사용하는 모델로 만들 수 있다. layer가 길어질수록 굉장히 많은 learning rate와 gradient 연산을 해야하며 이로인해 vanishing, exploding 문제가 발생할 수 있다.
vanishing -> sigmoid exploding -> relu

LSTM(Long Shor Term Memory) 모델은 Forget, Input, Output gate 구조를 설계해 RNN에서 발생하는 문제점을 해결하였다.
핵심 아이디어는 layer를 통과하는 동안 밖으로 나가지 않는 Previous cell state가 지나가고 과거 정보를 적절히 잃어버리게 한다. RNN과 마찬가지로 이전 hidden state 정보를 가져와 어떤 정보를 forget, input, output할지 연산한다.

0~t 까지 한번도 밖에 나가지 않는 Previous cell state가 모든 layer를 통과하면서 마치 컨베어 벨트처럼 과거 정보들을 태워 지나간다.

  • Forget Gate : 이전 Hidden state와 현재 데이터를 연산해 어떤 정보를 잃어버릴지 결정한다.
  • Input Gate: 현재 입력을 무조건 올리는 것이 아니라 어떤 정보를 올릴지 결정한다.
  • Update Cell: 버릴 정보를 저이로 어느 값을 올릴지 결정한다.
  • Output Gate: update된 cell state를 사용해 output을 생성한다.

Transformer

한번에 바뀔 수 있는 N개의 단어를 찍어낼 수 있다.(Encoder) 입력과 출력 Sequence는 숫자가 다를 수도 있고 도메인도 다를 수 있다. (ex. 불어 -> 영어) Transformer에서 중요한 개념은 3가지가 있다.

  • Encoder가 어떻게 한번에 N개의 단어를 처리하는지
  • Decoder와 Encoder 사이에 어떤 정보를 주고 받는지
  • Decoder가 어떻게 Generate 하는지

Self-Attention
어떠한 단어 x1에대해서 output을 계산할때 x2, x3,...도 같이 고려한다. 즉, 다른 단어와의 관계성을 보고 어떤 단어와 관련 있는지 학습을 한다.

어떤 단어에 대해 다른 단어와 관계성을 고려하는 방법은 각 단어마다 Queries, Keys, Values (Q,K,V)벡터를 생성하는 것으로 시작한다. "Thinking" 이란 단어의 attention을 구할 때 "Thinking"의 Q와 자기 자신을 포함한 다른 모든 단어들의 K를 내적하여 score를 구한다. 그 다음 score를 nomalization 하는데 sqrt(key의 dimension)으로 나눠준다음 softmax 연산을 수행하면(attention weight) 어떠한 단어와 가장 관계가 있는지 알 수 있고 스스로 학습한다.

scores = torch.matmul(Q, K.transpose()) / np.sqrt(key_dimension) # normalize
attention = F.softmax(scores) 
z = attention.matmul(V) 

attention RNN에서 발생하는 gradient vanishing, exploding의 단점을 어느정도 극복할 수 있다.

Reference

https://colah.github.io/posts/2015-08-Understanding-LSTMs/ (LSTM 동작 원리)
https://jalammar.github.io/illustrated-transformer/ (Transformer)

profile
Boostcamper!

0개의 댓글