LSTM unit (num_units), cell?
LSTM cell은 3개의 게이트로 구성되어있고, 이를 통해서 기존 RNN보다 긴 시퀀스를 학습할 수 있게된다. 아래 사진은 한개의 cell에 대한 설명이다.
keras LSTM의 인풋 중 하나인 num_units는 hidden state (output)의 차원이다. 위 사진의 빨간색 동그라미의 개수가 num_units이다. 따라서 위의 그림은 2개의 units를 가진 하나의 LSTM cell이다. 그리고 다음 cell이 전 hidden state (units, ht)와 input (xt)를 더하고 세개의 게이트를 지나서, 다음 hidden state (units, ht+1)를 계산한다. (= layer의 num_units에 지정해준 개수) 반복되는 LSTM cell의 개수는 전체 time step (t)의 개수와 같다.
LSTM layer?
hidden cell을 포함한 hidden layer을 여러층을 쌓아서 모델을 만들 수 있다. LSTM의 첫번째 layer에는 input_size를 넣어줘야하고, 두번째 layer부터는 이전 layer의 아웃풋 사이즈가 input_size가 된다.
일반적으로 성능 향상에 hidden units의 개수를 늘리기보다, 더 많은 hidden layer을 쌓는게 효과적이라고 한다.
예시)
def BuildNN():
model = keras.models.Sequential([
keras.layers.Input(shape=(60, 13)),
keras.layers.LSTM(1024, return_sequences=True, name='LSTM_0'),
keras.layers.LSTM(512, return_sequences=True, name='LSTM_1'),
keras.layers.LSTM(256, return_sequences=True, name='LSTM_2'),
keras.layers.LSTM(128, return_sequences=True, name='LSTM_3'),
keras.layers.Flatten(),
keras.layers.Dense(64, activation="swish"),
keras.layers.Dense(1, activation="sigmoid")
])
input_shape의 length (=60, time step)는 변하지 않지만, feature의 개수가 num_unit의 개수에 따라 변한다. (LSTM을 통해서 인풋의 length에는 변화를 줄 수 없음)
unit을 늘리는건 데이터의 차원을 늘리는 것을 뜻하고, 이는 모델이 데이터를 더 잘 설명할 수 있게 만든다. layer을 늘리는건 더 복잡한 모델을 만드는 것을 뜻하고, 이는 모델이 더 많은 패턴을 학습할 수 있음을 뜻한다. unit, layer을 늘리면서 성능을 향상시킬 수 있지만, 오버피팅이 발생할 수 있다. cv 점수를 확인하면서 오버피팅이 발생하면 dropout layer을 추가하거나 residual connection을 이용할 수 있다.
정리
참고:
https://stackoverflow.com/questions/55385906/whats-the-input-of-each-lstm-layer-in-a-stacked-lstm-network
https://tung2389.github.io/coding-note/unitslstm
'Computer Science > [21-22] ML & DL' 카테고리의 다른 글
[cv] 시계열 데이터 Cross Validation - GroupKFold (0) | 2022.04.16 |
---|---|
[FE] 시계열 데이터 lag feature 추가하기 (0) | 2022.04.15 |
[LSTM] keras.layers.LSTM()의 input_shape (0) | 2022.04.10 |
[DL] Andrew Ng 교수님의 논문 읽는 법 (0) | 2022.01.05 |
[cv] LOOCV vs K-Fold and bias-variance trade-off (0) | 2021.11.22 |
댓글