강의 복습 내용
- RNN을 활용하는 방법과 language model
- 순서를 가진 문장을 표현하는데 사용되는 RNN
- language model은 이전에 등장한 단어를 조건(condition)으로 다음에 등장할 단어를 예측하는 모델
- RNN을 이용한 character-level의 language model
얻은 지식
RNN
- Recurrent neural networks
- A모듈이 반복적으로 사용된다.
- 이렇게 풀어서 표현한것을 unrolled라 한다.
- 특정 time steps에서의 하나의 vector를 예측하려 한다.
- 그림은 rolled형태
- 구성요소
- \(h_{t-1}\) old hidden-state vector(이전 RNN에서 계산된것)
- \(x_{t}\) input vector at some time step(입력)
- \(h_{t}\) new hidden-state vector(현재 계산된것)
- \(f_w\) RNN function with parameters W
- \(h_t = f_w(h_{t-1},x_t)\) 같은 함수,W가 매번 사용되는 특징이 있다.
- \(y_{t}\) output vector at time step t(예측값)
- 매타임마다 계산 또는 마지막에만 계산될 수 있다.
- hidden에서 계산되는 방식
\(h_t = tanh(W_{hh}h_{t-1} + W_{xh}x_t)\)
- xt가 3차원, ht-1이 2차원이라 할때 5차원을 생각할수있다.
- 이때 ht를 2차원을 가지므로 계산되는 W는 2차원의 5축을 가진 vector를 생각할 수 있다.
- 이를 행렬곱으로 계산할때, W의 3개의 축은 xt를 담당하고, 나머지2개의 축은 ht-1을 담당하여 계산이 된다.
- xt를 담당하는 W를 Wxh, ht-1부분은 Whh라고 표시한다.
- 이를 계산식으로 하면 ht = Wxh xt + Whh ht-1로 표현된다
- Wxh는 W{xt->ht}, Whh는 W{ht-1 -> ht}라고 알 수 있다.
\(y_t = W_{hy}h_t\)
- 위 식도 h_t를 계산했듯이 생각하면
- W_hy는 W{ht->yt}를 생각 할 수 있다.
type of RNN
- one-to-one
- 입력과 출력이 단 하나
- sequence, time step데이타도 아닌것
- one-to-many
- 입력하나로 여러 출력
- 이미지를 입력, 이미지에 대한 설명을 출력하는 image Captioning
- 입력은 첫번째 timestep에서만 들어간다. 그외에는 0으로된 의미없는 값을 넣는다고 한다.
- many-to-one
- 입력은 timestep마다, 출력은 마지막 time step에서만
- sentiment classification으로 긍정/부정을 예측할때
- sequence-to-sequence(many-to-many)
- machine translation(번역)
- 입력/출력이 분리되어 입력이 다 되고나서 처리한다.
- many-to-many
- 입력이 끝날때까지 기다리는 딜리에가 없이 바로 출력이 진행된다.
- video classification on frame level
- 비디오영상을 입력할때 해당 씬마다 어떤 행동을 하는지 분류할때 사용
character-leve language model
- 다음글자가 뭐가 나올지 예측하는것
- word(단어),character(글자) 단위로 생각이 가능하다.
- hello를 예시하면 [h,e,l,o]라는 vocabulary를 생성
- 각 character를 one-hot vector로 만든다.
- 학습하고나서면, h가 입력되었을때 e를 예측, e가 입력되면 l을 예측하는 방식으로 진행될 것이다.
\(logit = W_{hy}h_t + b\)
- 결과는 vacabulary와 같은 크기로 출력
- softmax로 확률이 나오게된다.
-
예측값과 ground truth를 맞추도록 학습이 진행
- 테스트 할때 입력후 예측된것을 다음 입력으로 사용한다.
- 이를 통해 무한하게 특정단어를 만들어 낼 수 있다.
- 이를 응용하면 주식을 예측할 때 사용이 가능하다.
- 좀더 확장하면 하나의 세익스피어의 희곡같은 긴 문장도 학습이 가능하다.
- 특정 등장인물 대본, 논문, 프로그래밍 코드 등
BPTT
- back propagation through time
- 입력, Wxh,Whh로 ht가 되고, Why로 출력이 나온다.
- 여기서 나온 loss들을 역전파로 계산해야 하지만, 문장이 길어지면 loss계산이 커지고 반영도 잘 안된다.
- 특정 단위로 잘라서 역전파를 진행하게 된다.
학습방식
- 어떻게 학습을 하고, 어떤식으로 rnn에 저장되는지를 분석하는 방법은?
- RNN의 ht라는 hidden state vector에 정보들이 저장된다.
- 이를 역추적 하기위해 hidden state vector 일부값을 고정하여 어떤식으로 변화되는지를 보면서 분석이 가능하다.
- 위의 분석에서의 예시로 큰따음표가 열렸다, 닫혔다를 rnn의 특정 값(cell)이 파악하고 있다는것을 알 수 있다.
RNN의 문제
- vanishing/exploding gradient 문제
- gradient가 너무작아지거나, 너무 커지는 계산이 된다.
- 여러번의 rnn계산을 하나로 표현하게 될때 이를 역전파 계산을 위해서는 편미분을 계산해야한다.
- whh라는 값이 timestep만큼 거듭제곱되어 증폭된다.
LSTM,GRU
- Long short-term memory
-
Gated Recurrent Unit
- 바닐라 RNN의 단점 해결
LSTM
- gradient vanishing을 해결
-
단기기억을 time step을 지나가는데 기억하게 하도록 하는 아이디어
- 이전에 입력이 Ct,ht로 두개가 들어온다.
- c는 cellstate라고 한다.
- 핵심은 cell state이다.
LSTM 계산
- 좌측부터 f,i,g,o이다.
- i(input gate) 입력 - 입력을 사용 할지 말지
- f(forget gate) 잊기 - 지울지 말지
- o(output gate) 출력 - 얼만큼을 출력으로 할지
- g(gate gate) 입력 - 얼만큼을 입력을 사용할지
- 입력 예비군
- tilde라는 위에 ~표시를 한다.
- cell state는 기억해야할 모든정보를 가진다.
- hidden state는 cell state의 모든 정보로부터 필요한 정보를 필터한정도로 생각
GRU
- lstm을 개량
- cell state vector가 사라졌다.
- hidden state vector로 통합되었다.
-
lstm은 f와i라는 두개의 게이트를 통했다면 gru는 z와 1-z로 하나의 게이트로 경량화 계산했다.
- ht라는 출력에 forget되는 z를 통해 나온것을 이용
- 입력xt와 이전 ht-1을 이용하여 forget gate 인 z를 통과
- 입력 xt와 입력게이트r 이전 ht-1을 tanh를통하여 \(\tilde{h_t}\)를 계산
- z를 이용하여 \(\tilde{h_t}\)에는 zt를 ht-1에는 1-zt를 곱하는 방식으로 가중되는 방식으로 계산한다.
역전파
- forget gate를 곱해가고, 덧셈으로 cell state에 업데이트 되기때문에
- 덧셈은 역전파일때 gradient를 복사해주는 연산이된다.
- 편미분이니까
- 멀리있어도 큰 변형없이도 넘어가게된다.
요약
- RNN 유연한 모델
- vanila RNN은 간단하지만, 학습할때 explode 또는 vanish가 발생
- LSTM이나 GRU를 사용
- cell state, hidden state를 사용하며 덧셈을 이용하기때문에 RNN의 단점 해결
좀더 찾아보기
- lstm의 cell state
피어세션 정리
- 마스터클래스 질문 2개 만들기
- nlp를 공부하는데 있어 언어학에대한 공부가 추가적으로 필요할지
- 관련된 도서나 다큐먼트 추천
- 교수님 입장에서는?
- nlp가 다른 딥러닝 분야랑 차별화된 점?
- nlp를 공부하는데 있어 언어학에대한 공부가 추가적으로 필요할지
further question
- bptt이외에 rnn/lstm/gru의 구조를 유지하면서 gradient vanishing/exploding 문제를 완화하는 방법은?
- rnn/lstm/gru 기반의 language model에서 초반 time step의 정보를 전달하기 어려운 점을 완화하는 방법은?
- (문제 내용을 학습이 초반의 내용이 끝까지 영향이 안간다고 생각)resnet의 skip connection을 사용해본다면?