본문 바로가기
Computer Science/[21-22] ML & DL

[LSTM] LSTM unit, cell, layer에 대한 이해

by gojw 2022. 4. 13.

LSTM unit (num_units), cell?
LSTM cell은 3개의 게이트로 구성되어있고, 이를 통해서 기존 RNN보다 긴 시퀀스를 학습할 수 있게된다. 아래 사진은 한개의 cell에 대한 설명이다.

https://towardsdatascience.com/animated-rnn-lstm-and-gru-ef124d06cf45

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

댓글