Sequential Models - RNN
- 이미지 classification : one-hot vector or 내가 원하는 class 갯수만큼 바꿔주는 것
- detection : bounding box 찾기
- sementic segmantaion : 이미지 각 픽셀별로 어떤 class에 속하는지
- RNN : 주어지는 입력이 seq
Sequential Model
일상생활에서 접하는 대부분의 데이터는 seq data이다. (음성, 오디오, 비디오, 모션 등)
seq data를 처리하는 데 있어서 가장 큰 어려움은, 우리가 얻고싶은 것은 하나로 정의되는 label일 때가 많은데 seq 데이터는 길이가 언제 끝날지 모르기 때문에 내가 받아야 하는 입력의 차원을 알기 힘들다. fully connected layer, conv neural network 사용할 수가 없다.
따라서 몇 개의 입력이 들어오든 동작하는 모델을 구현해야 한다.
Naive sequence model
- 가장 기본적인 seq 모델
- 이전 데이터가 들어왔을 때, 다음 번 데이터 예측을 하는 것 (ex. language model)
t개의 data가 있을 때, 두번째는 첫 데이터만, 세번째는 1,2 데이터만 .. 이런 식으로 내가 고려해야 하는 vector 수가 점점 늘어난다. 내가 고려해야 하는 정보의 양이 점점 늘어나는 것이 특징이다.
과거 데이터 일정 갯수만큼만 고려하는 간단한 seq model을 알아보자!
Autoregressive model
Markov model (first-order autoregressive model)
- 나의 현재는 과거에만 dependent하다고 가정한다. 이 때 과거는 바로 전의 과거이다.
ex) 내일의 수능 점수는 전날 공부한 것에만 dependent하다
- 이 모델은 많은 정보를 버릴 수밖에 없게 된다.
- joint distribution 표현이 굉장히 쉬워지는 반면 (9강 참조), 과거의 정보를 많이 고려할 수 없고 많은 정보를 버리게 된다.
Latent autoregressive model
- 중간에 hidden state를 하나 넣고, hidden state가 과거의 정보를 summarize하고 있다고 가정한다.
- 다음번 time step은 hidden state 하나에만 dependent하다
- 하나의 과거 정보에만 dependent하는 것 같지만, 이전의 정보를 요약하는 hidden state (laten state)를 고려하는 것
- latent state를 어떻게 만들까?
Recurrent Neural Network (RNN)
도표 이미지 출처 : C. Olah 블로그
- 이런 개념들을 가장 쉽게 설명할 수 있고, 쉽게 구현한 방법
- MLP와 비슷하지만, 자기 자신으로 돌아오는 구조가 있다는 것이 차이점이다
- ht(hidden state)는 xt 뿐 아니라 이전의 xt−1에도 dependent하다.
-
RNN : 시간 순으로 문제를 푼다
-
1 RNN = input : 현재의 입력 + 이전 입력
time step t에서 보는 것은, t-1에서 전달된 정보이다. (시간 순)
-
x0 : A 모델 -> return된 정보+x1 = h1 -> 그 정보+x2 = h2 -> ...
RNN과 같이 recurrent 구조가 있는 것을 시간 순으로 풀게 되면, 입력이 굉장히 많은 fully connected layer로 표현될 수 있고, 이렇게 푸는 것이 RNN 학습방법과 동일하다. (***)
RNN 자체로는 복잡하지만 만약 time을 fix하고, 시간 순으로 unroll한다면 각각의 네트워크가 parameter을 공유하는, input이 매우 큰 하나의 네트워크가 된다.
Short-term dependencies / Long-term dependencies
-
RNN의 가장 큰 단점
-
과거에 얻어진 정보들이 다 취합되어서(summary) 미래에서 고려되어야 하는데, RNN은 이 정보들을 계속 취합하기 때문에 이전의 먼 과거의 정보가 미래까지 살아남기 힘들다.
-
몇 step 전의 short term dependencies는 현재에도 고려가 잘 되지만, 먼 과거의 정보는(long-term dependencies) 고려하기 힘들어 진다.
-
예) 음성인식, 문장이 나오면 답을 내는 문제 : 문장이 길어져도 이전 중요한 정보를 가지고 있다가, 계속 요약해서 필요할 때 써야 하는데, 5초 전의 대화를 기억을 하나도 못한다면, 이 model이 할 수 있는 사고는 매우 제한적이게 된다.
RNN 학습은 왜 어려울까?
-
네트워크를 unroll하면, 굉장히 큰 네트워크(width 가 매우 큰)가 된다.
-
W : 가중치, ϕ : non-linear activation function
h1 = h0에서의 입력값 + 현재 x1값
h2 = h1에서의 입력값 + 현재 x2값
= (h0+x1) + x2
중첩되는 구조가 들어가 있는 것을 확인할 수 있다.
따라서 h0가 h4까지 가기 위해서는 굉장히 많은 (같은 W를 곱하고, activation function 통과) 연산을 거쳐야 한다.
-
Vanishing gradient : 만약 (1) ϕ가 sigmoid 함수라면, (0<=sigmoid<=1. 정보를 줄인다)
h0에서의 정보를 계속 연산시 의미 없는 값이 되어 버린다. (값이 줄어든다)
exploding gradient : (2) activation function이 ReLu이고 W>0이라면, W라는 숫자를 n번 곱하게 되므로 h0 값에 매우 크게 dependent 하게 되고, 학습시 네트워크가 터져 학습이 되지 않는 현상이 발생한다. (그래서 RNN에서는 ReLu 사용을 지양)
Long Short Term Memory (LSTM)
위의 단점을 해결해보자!
vanilla RNN 구조
- x -> 네트워크 통과(W) + 이전 데이터 concat -> 네트워크 통과(W) , activation function 통과 -> .. -> output이 다음 번 네트워크의 input
LSTM 구조
- 훨씬 복잡해졌다!
- 각각의 component의 동작 방법, 왜 long term dependency를 잡는 데 도움이 되는지 알아보자
- xt : t번째 time step 의 입력
- previous cell state
- 네트워크 내부에서 0~t까지의 t+1 정보를 summarize
- previous hidden state (previous hidden output)
- output이 위/아래로 흘러가면 -> t+1번째 lstm의 previous hidden state로 들어간다
- lstm의 입력
- 이전의 출력값
- 이전의 previous hidden state
- previous cell state
- 입력 3, 출력3 (실제로 나가는 것은 hidden state 하나)
Core idea
cell state : time step t까지의 정보를 요약한 것
gate : 컨베이너 벨트라고 보면, 매번 t마다 벨트에 물건이 올라올 때, 어떤 물품을 올리고 어떤 물품을 내릴지에 대한 정보
Gate
LSTM을 이해할 때, gate 위주로 하면 좋다.
(1) Forget gate
- 어떤 정보를 버릴지. 입력으로 들어가는 것은 현재의 입력 xt, 이전의 출력 ht−1 -> 시그모이드를 통과한 후, ft 출력 (0<=ft<=1)
- ft : previous hidden state와 현재의 입력으로, 이전의 cell state에서 넘어온 정보 중 취할 것/버릴 것 결정한다.
(2) Input gate
- 현재 입력값을 검증 후 cell state box에 올린다
- it : 어떤 정보를 cell state에 추가할지 결정.
- C~t(cell state candidate) : 모든 값이 -1~1로 정규화 된 값. C~t가 현재 정보, 이전 출력값으로 만들어 진 일종의 cell state 예비군
- 이전 cell state와 , 현재 정보, cell state candidate로 update하게 된다.
Update cell
- Forget gate에서 나온 ft값에, 이전 Ct−1을 곱하고 (버릴 것 결정) + input gate에서 나온 C~t와 it로 어느 값을 올릴 지 결정한다
(3) Output gate
- 이전의 결과물을 그대로 출력할 수도 있다 (GIU)
- LSTM : 어떤 값을 밖으로 출력할지 결정하는 GATE. gate만큼 연산해서 다음 hidden state로 흘러가게 된다
-
previous cell state
, previous hidden state
, Xt
가 neural network 안으로 들어온다
-
이전 cell state 중 지울 것 정하고 (Forget gate
)
previous hidden state
, Xt
로 어떤 값을 올릴지, C~t 정한다
-
그 후 update 된 cell state
, candidate state
로 새로운 cell state
만들고,
-
그 정보 중 밖으로 보낼 정보를 선택한다.
Gated Recurrent Unit(GRU)
-
recet gate, update gate 2개 (recet gate = forget gate와 비슷)
-
앞의 lstm과의 차이점은 , hidden state가 곧 output이라는 점 (cell state X) -> output gate가 필요없다
-
같은 task에 대해, lstm을 활용할 때보다 GRU를 활용할 때 params 가 더 적고, 성능이 올라가는 경우를 꽤 많이 본다.
둘 다 요즘은 많이 활용되지 않는다
-
--> transformation 구조
적은 params로 동일한 output을 내면 generalization performance가 좋아지기 때문