반응형
Index
TDNN (Time Delayed Neural Network)
RNN이 개발되기 전에는 temporal pattern을 갖는 문제를 해결하기 위해 기존의 DNN 구조에 input 으로 시계열 데이터를 시퀀스를 가지고 투입하는 TDNN 이 활용되었다.
- 특정 사이즈(n)의 window를 sliding 시켜가며 시계열 input data를 받는다. (마치 1stride 1D Convolution 같이)
- Input 데이터 안에 window size 만큼의 데이터간에는 순서,dependency가 있을 수 있지만, Input끼리는 independent하다. 즉 input(t) 와 input(t-1)은 shuffle 가능하다.
단점
- window size 가 너무 작으면 longer dependency 포착을 못하고, 너무크면 noise 와 parameter가 과하게 많아진다.
- 과거 데이터(이전 window)에 대한 기억이 없다 (input끼리 i.i.d하기때문). window size만큼씩의 정보에 대해서만 학습한다. 따라서 long memory에 대해 취약하다.
- window size는 상수로 fix되어있다. 따라서 variable length problem 예를들어 NLP문제는 해결 불가능하다.
RNN (Recurrent Neural Network)
- TDNN을 포함한 기존의 DNN구조는 current input에 대해서만 작동한다. 반면 RNN 은 Current + Previous Input에 대해 Recurrent 하게 학습 및 예측하는 구조이다.
- x(t)로 current input data를 받고, h(t)라는 hidden state vector를 통해 past memory (previous input)를 기억한다.
- window size에 대한 제한이 없다.
- W_xh, W_hh, W_hy 는 time step에 무관하게 항상 같은 값 (sharing weight) 즉, 3개 파라미터만 학습하면 된다.
Backpropagation Through Time (BPTT)
- RNN 에서 Backpropagation 을 통한 gradient 계산은 W_xh(U), W_hh(V), W_hy(W)를 구하는 것이다.
- 아래 그림과 같이 RNN을 unfold 시켜 생각했을때, 각 time step 마다의 U,V(0,1,...t)를 각기 다른 가중치로 감안하여 gradient를 계산하고, 각 timestep 에서 계산한 값들의 평균을 U,V의 최종 gradient로 사용한다.
Truncated BPTT (TBPTT)
- BPTT는 timestep이 길어지면 계산속도가 너무 느려지고, gradient 최종값이 vanish/explode 할 수 있는 문제가 있다.
- 그래서 TBPTT는 backpropagation 계산 대상이 되는 time step(=lookback)의 개수를 제한하는 기법이다. 얼만큼의 look back 만큼을 볼지는 truncation length 파라미터 만들어서 설정한다. (lookback ≠ truncation length 다른것이다)
- lookback size는 window size와 비슷한 개념으로 보면되는데, 보통 200까지는 적당한 사이즈이다.
- 요약하면, lookback 은 우리가 현재나 미래를 예측하기 위해 필요한 과거 데이터의 길이, 즉 window size 의 개념이고, truncation lengh 는 그 길이 안에서 gradient 계산할때는 몇step까지 볼지를 의미한다. (따라서, lookback length > truncation length)
- 아래 그림과 같이 lookback 의 크기에 맞춰서 서로 overlap되게 input을 split한걸 subsequence라고 하고, 이러한 subsequence를 batch size 만큼 묶으면 1개의 batch가 된다.
- 다시말해 RNN의 input data는 3D tensor 모양이고, (batch_size, timesteps, input_dim) 이되고, 아래 예시에서는 (5,5,3) 이다.
- minibatch 안에 5개의 subsequence 끼리는 shuffle이 가능한다. (subsequence 안에 데이터끼리는 불가능)
- 다만 stateful = true 로 설정하면 shuffle이 안되는데, statful은 각 subseq의 initial state를 이전 batch 의 같은 순번 subseq로 부터 가져오겠다는 뜻이다.
- 자세히 설명하면 그림에서 두번째 batch에 있는 첫번째 subseq (6번)의 첫번째 데이터 x_t+1 의 W_hh를 계산하려면 직전 timestep 의 input data가 있어야 하는데 없다. 이 경우 stateful 을 사용하지 않으면 random한 값을 사용하지만, stateful = true로 켜두면 직전 batch의 첫번째 subseq(1번)의 final hidden state (h_t)를 사용한다.
- 이렇게 batch 안에서의 subseq의 순번이 중요해 지기 때문에 subseq 간에 더이상 i.i.d하지 않고 shuffle도 불가하다.
반응형
'Study > DL' 카테고리의 다른 글
Attention Mechanism (0) | 2023.07.01 |
---|---|
RNN - 2편 (LSTM) (0) | 2023.07.01 |
CNN - 3편 (Up-sampling, U-Net) (0) | 2023.06.30 |
CNN - 2편 (Bottleneck, ResNet,Dropout) (0) | 2023.06.29 |
CNN - 1편 (CNN의 구조) (0) | 2023.06.29 |
댓글