LSTM 구조
기본 순환 신경망과 달리 LSTM 셀은 2개의 출력이 순환된다. 그중 하나만 다음 층으로 전달된다.
셀로 순환만 되는 출력을 셀 상태(C)라고 부른다.
LSTM 셀에서는 이전 타임 스텝의 은닉 상태 H_p와 셀 상태 C_p를 사용해 어떤 계산을 수행하는지 살펴보자.
s는 시그모이드 활성화 함수를 의미하고 t는 tanh 활성화 함수를 의미한다.
x와 +는 각각 원소별 곱셈과 덧셈을 의미한다.
이전 타임 스텝의 은닉 상태 H_p와 입력 X가 가중치와 곱해져서 Z_f, Z_i, Z_j, Z_o를 만든다.
이 계산은 순환 신경망의 기본 셀에서 수행했던 것과 동일하다.
Z에 대해서는 모두 동일한 방식으로 계산하지만 모두 다른 가중치를 사용한다.
먼저 Z_f는 시그모이드 활성화 함수를 적용한 다음 이전 타임 스텝의 셀 상태 C_p와 요소별 곱셈을 하여 F를 만든다.
Z_i, Z_j에 시그모이드 활성화 함수와 tanh 함수를 각각 적용한 다음 요소별 곱셈을 하여 I를 계산한다.
이렇게 구한 F와 I를 더하여 새로운 셀 상태 C를 만든다. 마지막으로 새로운 은닉 상태 H는 새로운 셀 상태 C에 tanh 함수를 적용하고 Z_o에 시그모이드 함수를 적용한 다음 요소별 곱셈을 한다.
F 계산식이 이전 셀 상태의 내용을 삭제하는 역할을 한다고 하여 삭제 게이트(forget gate)라고 한다.
I 계산식은 새로운 정보를 추가하는 역할이라는 뜻에서 입력 게이트(input gate)라고 한다.
마지막 H를 계산하는 식을 출력 게이트(output gate)라고 한다.
텐서플로 LSTM 순환 신경망
from tensorflow.keras.layers import LSTM, Embedding, Dense
from tensorflow.keras.models import Sequential
model_lstm = Sequential()
model_lstm.add(Embedding(1000, 32))
model_lstm.add(LSTM(8))
model_lstm.add(Dense(1, activation='sigmoid'))
model_lstm.summary()
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.legend(['loss','val_loss'])
plt.show()
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.legend(['accuracy','val_accuracy'])
plt.show()
loss, accuracy = model_lstm.evaluate(x_val_seq, y_val, verbose=0)
print(accuracy)