coursera 강의를 정리해서 스스로 이해를 돕기 위해 만든 자료입니다.
RNN 등장
-
위 그림은 X를 time series data라고 하면 X가 RNN을 거쳐 Vector로 출력되는 걸 나타낸다.
-
X는 window_size가 30인 series이다. 즉 과거 30개의 data를 통해 다음 값을 예측하는 것이라고 볼 수 있다. 각 X는 batch 크기 만큼(위 그림에선 4) 입력으로 들어가고 RNN내부 Mem Cell에서 Unit 크기 만큼, 곱해진 크기로 출력한다.
-
Mem Cell의 unit이 3이라면 위에서 30개의 Y는 각각 4(batch_size) x 3(unit 개수) 크기 만큼의 matrix 형태를 가진다. 일반적인 RNN의 경우 각 mem cell의 H는 이전 Y 값과 동일하다.
-
sequence_to_vector의 경우, 이런식으로 전파돼서 마지막에 나오는 Y값만을 출력하게 된다. (4 x 3)이 나오고, 이를 Dense(1) 로 이어주면 최종 출력은 (4 x 1)이 되어 (4 x 30) 입력 데이터에 대한 예측을 수행할 수 있는 것이다.
LSTM?
RNN의 경우 문제점이 있다.
초기 X_0에서 생성된 H_0가 전파될수록 그 값이 점점 왜곡된다. text 데이터일 경우, 길이가 긴 문장이 입력될 경우 초기의 입력값의 영향은 문장이 긴만큼 줄어들게 되는 것이다.
LSTM의 경우 모든 cell state 간에 이 정보를 연결시켜서 최종 출력과 먼 초기 입력값의 영향을 더 잘 유지할 수 있게 해준다.
위 그림에서 c^<0> ~ c^<3> 까지의 값이 학습된 게이트의 가중치에따라 모두 똑같은 값을 가질 수도 있다. RNN과 달리 처음값에 대한 기억을 조절할 수 있는 것이다.
Huber loss?
In statistics, the Huber loss is a loss function used in robust regression, that is less sensitive to outliers in data than the squared error loss. A variant for classification is also sometimes used.
특정값 보다 작은 값에 대해선 mse와 같은 2차 함수 형태를 띄지만, 특정 값보다 큰 값에 대해선 linear한 값을 띈다. outlier의 경우 square하면 그 값이 매우 커져서 error가 지나치게 크게 나타날 수 있다. huber loss를 쓰면 outlier에 대해 square가 적용되지 않으므로 상대적으로 outlier에대해 robust하다고 할 수 있다.
notebook) 지난 주 대비 추가된 점
1. tf.keras.layers.Lambda
-
Lambda layer는 lambda 함수를 입력으로 받아, 임의의 연산을 model 내에 수행할 수 있게 해준다. RNN network의 input_shape의 경우 3차원이다.
-
원래 첫번째 dim은 batch_size인데 이는 입력하지 않아도 자동으로 받아주기에 pass
-
None으로 지정된 건 time step의 개수이다. (RNN은 어떤 time step이든 input으로 받을 수 있단 말). 마지막에 expand_dims로 1이 추가된건 time에 관해서만, univariate하기 때문이다.
-
2. tf.keras.layers.LSTM
-
return_sequences를 true로 하면 각 state마다 vector를 출력해서 sqeunce_to_sequence 가 된다.
-
이를 다음 LSTM이 입력으로 받는다. return_sequences의 default값은 False이므로 마지막 vector를 출력한다.
-
예를들어 입력의 shape이 (64, 30, 1) 이라면(batch size =64, timestep 길이 = 30, feature 개수 = 1), LSTM(16)을 거친 출력 shape는 (64, 16)이 된다. 만약 return_sequences = True라면 (64, 30, 16) 이 출력 형태가 될 것이다.
-
위에선 Bidirectional을 썼으므로, LSTM의 unit 인자의 2배 만큼 출력된다. 아래 model.summary()를 보면 이 설명이 다 이해될 것이다.
예측 결과 성능이 이전 mathmatical method, DNN, simpleRNN에 비해 상당히 좋아진 것을 확인할 수 있다.
Quiz)
- If X is the standard notation for the input to an RNN, what are the standard notations for the outputs?
- Y (x)
- Y(hat) and H (o)
- What is a sequence to vector if an RNN has 30 cells numbered 0 to 29
- The Y(hat) for the last cell (o)
- The total Y(hat) for all cells (x)
- vector는 마지막 vector만 나타냄, return_sequence = True로 할 경우는 vector가아닌 seqeunce임
- What does the axis parameter of tf.expand_dims do?
- Defines the axis around which to expand the dimensions (x)
- Defines the dimension index at which you will expand the shape of the tensor (o)
- 아리송하다. 비슷한 말 같은데...?
다음은 CNN + 실제 데이터 적용이라고 합니다.