일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 그래프이론
- 다시보기
- mrc
- 파이썬 3
- 정렬
- 부스트캠프_AITech3기
- dfs
- 부스트캠프_AITech_3기
- 글또
- dp
- 알고리즘_스터디
- Level1
- U_stage
- python3
- 그리디
- 주간회고
- 알고리즘스터디
- 이진탐색
- 최단경로
- 이코테
- 구현
- 단계별문제풀이
- Level2
- 개인회고
- 백트랙킹
- Level2_PStage
- 백준
- ODQA
- 프로그래머스
- 기술면접
- Today
- Total
국문과 유목민
[일일리포트] Day 34 (RNN, LSTM) 본문
해당 일일리포트에서는 네이버 커넥트에서 진행하는 '부스트캠프 AI Tech 3기'에서 배운 내용을 다루고 있습니다. 저작권 이슈 때문에 관련 자료를 올릴 수는 없기에 핵심 이론과 코드를 요약해서 올리고 있기에 내용이 부족할 수 있습니다.
▶ Today I Learned (핵심 요약 정리)
RNN
Sequence data가 주어질 때, 매 time step마다 입력을 받아 현재 time step바로 전까지의 계산결과를 이용해 현재의 time step을 계산한다. RNN은 공통된 모듈 A를 계속 재귀적으로 호출하기 때문에 Recurrent Neural Network라는 이름이 붙게 되었다. 우리가 많이 본 아래 그림은 RNN의 Unrolled된 버전이다.
$$h_t = f_W(h_{t-1}, x_t)$$
- $y_t$는 output인데, 매 time-step마다 계산할 수도 있고, 마지막에 한 번만 계산할 수도 있다. (task에 따라서 달라짐)
- $f_W$에서 W는 모든 time-step에서 공통으로 사용한다.
$$h_t = tanh(W_{xh}x_t+W_{hh}h_{t-1}) \\ y_t = W_{hy}h_t$$
- $W_{xh}: x_t$를 $h_t$로 바꾼다
- $W_{hh}: h_{t-1}$를 $h_t$로 바꾼다
- $W_{hy}: h_{t}$를 $y_t$로 바꾼다
- hidden vector의 노드 수는 하이퍼파라미터이다.
- 이진분류의 경우 output vector의 차원은 scalar가 되고, sigmoid function을 활용해서 확률 계산한다.
- 멀티클래스 분류의 경우 output vector의 차원은 클래스 수만큼의 vector가 되고 softmax function을 해서 클래스 수만큼 확률분포를 얻을 수 있다.
Types of RNNs
- One-to-One
- One-to-Many: Image Captioning, 이 경우 매 timestep마다 사이즈만 맞춰서 0으로 채워진 입력을 넣어준다.
- Many-to-One: Sentiment Classification, 입력을 Sequence of text로 넣어서 출력에는 Positive/Negative 형태로 넣어준다.
- Many-to-Many: Machine Translation, hidden state에서는 입력을 받은 이후 출력을 위한 hiddenstate를 거쳐서 output이 생성된다.
- Many-to-Many: Video classification on frame level, 입력이 주어지면 바로 출력을 낼 수 있는 구조
Character-level Language Model
가장 기본적인 언어 모델이며 다음에 나올 단어를 추측하는 방법이다. Character-level Language Model의 경우 문장 단위의 계산에도 사용될 수 있다.
$$Logit = W_{hy}h_t + b$$
Logit을 계산해서 Softmax 함수에 넣어준다.
- $W_{xh}, W_{hh}, W_{hy}$는 backprop을 통해 Weight를 학습시킨다. 그리고 단어의 순서는 이전 연산의 결과를 통해 정보를 받을 수 있다.
- 점화식처럼 긴 sequence의 data를 예측할 수 있다.
BPTT(Backpropagation through time)
Input으로 주어진 Sequence 데이터의 길이가 길어지면 학습이 어렵기 때문에 이를 chunk로 나눠 계산을 한다.
- Quote detection cell, If statement cell:을 통해서 RNN이 어떻게 일하는지 확인할 수 있다.
Vanishing/Exploding Gradient problem
RNN의 아이디어는 훌륭하지만 일반적을 Vanila RNN은 사용하지 않는다. 계속 $W_{hh}$가 반복되어 곱해지게 되면서 Gradient가 기하급수적으로 커지거나 작아지게 된다. 따라서 Gradient가 사라지거나 폭발적으로 증가하게 되기 때문이다. 이러한 문제를 Long term dependency문제라고 한다.
LSTM
RNN이 가지는 Long Term Dependency문제를 해결하기 위한 방법이다. 단기 기억을 길게 유지할 수 있다는 뜻에서 Long Shor Term Memory이다.
$$\{c_t, h_t\} = LSTM(x_t, c_{t-1}, h_{t-1})$$
- $c_{t-1}$: cell state vector라고 한다
LSTM's ifog
- i: Input gate, Whether to write to cell
- f: Forget gate, Whether to erase to cell
- o: Output gate, How much to reveal cell
- g: Gate gate, How much to write to cell, tanh(-1~1값을 갖게 한다.)
W벡터는 4hx2h의 값을 가진다.
- Forget gate: $f_t = \sigma(W_f\cdot[h_{t-1}, x_t]+ b_f)$
- Input gate: $i_t = \sigma(W_i\cdot[h_{t-1}, x_t]+ b_i)$
- Gate gate: $\tilde{C_t}=tanh(W_C\cdot[h_{t-1}, x_t]+ b_c)$, -1~1 사이의 값을 갖는다.
Generate New Cell State all state by adding current information to previous cells state
$$C_t = f_t\cdot C_{t-1} + i_t\cdot\tilde C_t$$
한 번의 선형변환만으로 $C_{t-1}$에 더해줄 정보를 만들기 어려운 경우, 더해주고자 하는 값보다 조금 더 큰 값들로 구성된 정보를 Gate gate형태로 만들어 준 후, 특정 비율만큼의 정보를 덜어줘서 $C_{t-1}$에 더해주고자 하는 정보를 두 단계에 걸쳐서 만들기 위해 사용한다.
- $h_t = o_t\cdot tanh(C_t)$
- $o_t =$ 0~q사이의 값을 가진다.
$C_t$는 기억해야할 모든 정보를 가지고 있는 벡터라고 볼 수 있지만, $h_t$는 현재 timestep에서 예측값을 내는 output레이어의 입력으로 사용되는 벡터라는 점에서 해당 timestep의 예측값에 직접적으로 필요한 정보만을 담았다. 지금 당장에 필요한 정보만 필터링했다는 의미이다.
GRU
lstm의 모델 구조를 경량화해서 적은 메모리와 빠른 구동 시간이라는 장점을 가진다. Cell state벡터와 Hidden state vector를 일원화해서 $h_t$하나만 있다는 차이점이 있지만 구동 방식은 LSTM과 유사하다. 하지만 GRU의 $h_t$는 LSTM의 Cell state $C_t$와 더 유사하다.
$$h_t = (1-z_t)\cdot h_{t-1}+ z_t \cdot \tilde{h_t} \\
cf.\quad C_t = f_t\cdot C_{t-1} + i_t\cdot\tilde C_t$$
- LSTM의 forget gate의 역할을 ($1-z_t$)가 수행한다. 따라서 GRU는 가중평균의 형태로 값이 계산되게 된다.
- GRU는 LSTM보다 더 간단한 반면, 비슷한 혹은 더 좋은 성능을 보여준다.
Backpropagation
Backprop과정에서는 Cell state가 update되는 과정에서 i, g단계에서 덧셈으로 계산이 되기 때문에, Gradient Vanishing과정이 사라진다. 덧셈연산은 backprop을 진행할 때 Gradient를 복사하는 형태가 되기 때문이다. 따라서 Gradient에 큰 변화없이 길게 전파될 수 있다.
Summary
- RNN은 다양한 길이의 Sequence data에 특화된 유연한 딥러닝 모델 구조이다.
- Vanilla RNNS은 구조가 간단하지만, GradientVanishing 문제가 있다. (Long Term dependency 발생)
- LSTM이나 GRU가 더 많이 사용되기 때문에 gradient 연산을 더 수월하게 할 수 있다. (Long Term dependency 해결)
▶ Review (생각)
강의는 오늘로 다 끝냈는데 정리를 천천히 제대로 하고 싶어서 하루에 2강씩 정리하기로 해서 오늘은 LSTM과 GRU를 정리했다. 어제도 얘기했지만, 주재걸 교수님의 강의가 굉장히 좋았기에 하나도 허투루 넘기기 싫었다. LSTM과 GRU의 경우 Transformer 이전에 매우 중요했던 개념이고, 후에도 계속 나오는 개념이기에 잘 정리해둘 필요가 있다고 생각해서 좀 꼼꼼하게 정리하고자 했다.
오늘 피어세션 시간에는 기본과제 1에 대해서 코드리뷰와 질의응답을 진행했다. 이전 팀도 그랬지만 이번 팀분들도 잘하시는 분들이 많아 배울 점이 많았었다. 내가 생각해보지 않았던 방식으로 짜인 코드를 보는 것도 도움이 됐고, 사용하지 않았던 메소드들을 직접 물어보면서 이해할 수 있었던 것도 도움이 됐다. 그리고 추가적으로 어제 과제를 진행하면서 Konlpy 품사 tag가 나와서, 품사에 대해서 아는 내용을 살짝 발표(?)하기도 했다. 다들 모르시는 내용이라서 흥미롭게 들으셨다고는 하는데, 설명이 매끄럽지 못했어서 아쉬웠다. 다음번에 하게 될 일이 있으면 좀 더 준비해서 해야겠다.
'IT 견문록 > 2022_부스트캠프 AITech 3기(100일)' 카테고리의 다른 글
[일일리포트] Day 36 (0) | 2022.03.11 |
---|---|
[일일리포트] Day 35 (Seq2Seq, BEAM) (0) | 2022.03.10 |
[일일리포트] Day 33 (NLP Basic) (0) | 2022.03.07 |
[7주차] 개인 회고 (Level1_프로젝트 정리) (0) | 2022.03.05 |
[일일리포트] Day 32 (Level1_PStage_6) (0) | 2022.03.04 |