Long Short Time Memory
RNN의 경우 입력 데이터의 길이가 길어지면 역전파 과정에서 입력층으로 갈 수록 가중치가 제대로 업데이트 되지 않는 기울기 소실 문제가 일어난다. 이는 이전의 정보를 제대로 기억하지 못하는 문제를 수반한다.
구분 | 단계 | 설명 |
---|---|---|
Cell State | Ct-1 -> Ct![]() | 이전 상태에서 현재 상태까지 유지되는 정보의 흐름 / 오래된 정보를 기억하고 새로운 정보를 적절히 갱신하게 하는 역할 |
Forget Gate | ![]() | 셀의 정보를 지울지 말지 결정. 계산 식이 0이면 지우고 1이면 기억 |
Input Gate | ![]() | 새로운 정보를 반영하는 방법을 결정 -> 기존 정보와 새로운 정보를 적절히 조합, 예측 결과가 더 좋아짐 시그모이드는 어떤 값을 업데이트 할지 결정, 탄젠트는 새로운 후보값을 만듦. 둘을 곱해서 사용한다. |
Cell State 업데이트 | ![]() | 이전 상태인 Ct-1에 forget gate의 결과 값을 곱해 잊어버리기로 했던 정보를 진짜 잊는다. 그리고 input gate의 결과 값을 더한다. |
Output Gate | ![]() | 시그모이드: input 데이터를 받아 cell state의 어느 부분을 output으로 보낼지 결정 cell state를 탄젠트에 넘겨주어 -1과 1 사이의 값으로 계산한 뒤 시그모이드의 결과값과 곱해줌 => 원하는 값만 output으로 보낼 수 있다. |
시그모이드는 출력 여부를 결정하는 함수
class TextGenerator(tf.keras.Model):
def __init__(self, vocab_size, embedding_size, hidden_size):
super().__init__()
self.embedding = tf.keras.layers.Embedding(vocab_size, embedding_size)
self.rnn_1 = tf.keras.layers.LSTM(hidden_size, return_sequences=True)
self.rnn_2 = tf.keras.layers.LSTM(hidden_size, return_sequences=True)
self.linear = tf.keras.layers.Dense(vocab_size)
def call(self, x):
out = self.embedding(x)
out = self.rnn_1(out)
out = self.rnn_2(out)
out = self.linear(out)
return out