AI 딥러닝/Sequence

[LSTM] TF2에서 단방향 LSTM 모델 구현 - 2

깊은대학 2022. 7. 23. 10:03

tf.keras.layers.LSTM 의 속성 return_sequences를 True 로 설정하면 각 시퀀스별 은닉 상태(hidden state)를 모두 출력하게 된다.

 

 

다음 그림은 시퀀스 길이가 4 \((t-3, t-2, t-1, t)\), 은닉 상태변수의 차원이 \(\mathbf{h}_t \in \mathbb{R}^3\), 입력 변수의 차원이 \(\mathbf{x}_t \in \mathbb{R}^8\) 인 LSTM 모델을 나타낸 것이다.

 

 

이 모델의 특징은 각 시퀀스에서 은닉 상태가 모두 출력된다는 것이다. 이를 코드로 구현하면 다음과 같다.

 

input = tf.keras.layers.Input(shape=(4, 8)) # (seq length, input dimension)
lstm = tf.keras.layers.LSTM(units=3, return_sequences=True)
out = lstm(input)
print(out.shape)

 

출력의 사이즈는 (4,3) 이 나온다. 4개 시퀀스에서 차원이 3인 은닉 상태가 출력됐기 때문이다. 반면 return_sequences=False로 하면 출력 사이즈가 3이 된다. 마지막 시뭔스에서만 은닉 상태가 출력되기 때문이다. 디폴트는 return_sequences=False 이다.

return_state = True 를 한 경우에는 마지막 시퀀스에서의 출력(은닉 상태), 은닉 상태와 셀 상태 값이 출력된다. 출력은 은닉 상태와 동일하다.

 

input = tf.keras.layers.Input(shape=(4, 8)) # (seq length, input dimension)
lstm = tf.keras.layers.LSTM(units=3, return_state=True)
out, h_st, c_st = lstm(input)
print(out.shape, h_st.shape, c_st.shape)

 

코드에서 out는 출력, h_st는 은닉 상태, c_st는 셀 상태이며 각각의 사이즈는 3, 3, 3 이다.

return_sequences와 return_state를 모두 True로 하게 되면 각 시퀀스별 은닉 상태와 마지막 은닉 상태, 마지막 셀 상태 값이 출력된다.

 

input = tf.keras.layers.Input(shape=(4, 8)) # (seq length, input dimension)
lstm = tf.keras.layers.LSTM(units=3, return_sequences=True, return_state=True)
out, h_st, c_st = lstm(input)
print(out.shape, h_st.shape, c_st.shape)

 

코드에서 out는 출력으로서 각 시퀀스 별 은닉 상태, h_st는 마지막 은닉 상태, c_st는 마지막 셀 상태이며 각각의 사이즈는 (4, 3), 3, 3 이다.

LSTM 을 다층 구조로 만들 수도 있다. LSTM 위에 다른 LSTM을 쌓아 올리는 구조로서 multi-layered LSTM 또는 stacked LSTM 이라고 한다. 다층 LSTM에서는 아래 층의 모든 시퀀스의 출력이 위 층의 시퀀스로 전달되어야 하기 때문에 return_sequences=True 를 사용해야 한다.

다음 그림은 2층으로 된 LSTM을 나타낸다. 시퀀스 길이가 4 \((t-3, t-2, t-1, t)\) 이고 1층의 은닉 상태변수의 차원이 \(\mathbf{h}_t^{(1)} \in \mathbb{R}^3\), 2층의 은닉 상태변수 차원은 \(\mathbf{h}_t^{(2)} \in \mathbb{R}^5\), 입력 변수의 차원이 \(\mathbf{x}_t \in \mathbb{R}^8\) 이라고 가정한다.

 

 

이 모델을 코드로 구현하면 다음과 같다.

 

input = tf.keras.layers.Input(shape=(4, 8)) # (seq length, input dimension)
lstm_1 = tf.keras.layers.LSTM(units=3, return_sequences=True)(input)
lstm_2 = tf.keras.layers.LSTM(units=5)(lstm_1)
model = tf.keras.models.Model(inputs=input, outputs=lstm_2)
model.summary()

 

Model: "model"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 input_1 (InputLayer)        [(None, 4, 8)]            0         
                                                                 
 lstm (LSTM)                 (None, 4, 3)              144       
                                                                 
 lstm_1 (LSTM)               (None, 5)                 180       
                                                                 
=================================================================
Total params: 324
Trainable params: 324
Non-trainable params: 0

 

1층은 모든 시퀀스에서 은닉 상태를 출력해야 하기 때문에 return_sequences=True 를 사용했지만, 2층은 마지막 시퀀스에서만 출력이 필요하기 때문에 이 속성을 사용하지 않았다. 따라서 1층의 출력 사이즈는 (4, 3)이, 2층의 출력 사이즈는 5 가 나온다.