단기메모리를 길게 하는 것
은닉상태와 셀상태의 두가지 상태가 순환이 된다.
셀 상태는 출력에 사용되는 것이 아니고 셀 자체 내에서 사용되는 값이다.
셀 안에 4개의 작은 셀이 들어있다.
삭제 게이트 : wf가 있는 셀을 통과해서 셀 상태를 만드는 데 기여
입력 게이트 : 두 셀의 출력이 곱해지는 부분 새로운 정보를 더하는데 기여
출력 게이트 : we와 셀상태를 곱하는 부분
model = keras.Sequential()
model.add(keras.layers.Embedding(500, 16, input_length=100))
model.add(keras.layers.LSTM(8))
model.add(keras.layers.Dense(1, activation='sigmoid'))
# (16인풋 x 8뉴런 + 8순환 x 8뉴런 + 8절편) x 4개의 작은 셀
# 총 800개의 가중치
model12 = keras.Sequential()
model12.add(keras.layers.Embedding(500, 16, input_length=100))
model12.add(keras.layers.LSTM(8, dropout=0.3))
model12.add(keras.layers.Dense(1, activation='sigmoid'))
이전 셀에서 다음 셀에 넘겨줄때 모든 타임스텝의 은닉상태를 다 출력해야한다.
model13 = keras.Sequential()
model13.add(keras.layers.Embedding(500, 16, input_length=100))
model13.add(keras.layers.LSTM(8, dropout=0.3, return_sequences=True))
model13.add(keras.layers.LSTM(8, dropout=0.3))
model13.add(keras.layers.Dense(1, activation='sigmoid'))
LSTM의 좀더 간소화된 버젼이다.
은닉상태와 입력을 곱해서 새로운 은닉상태를 만드는 것은 동일하다.
하지만 여기에는 셀상태가 없다.
텐서플로우에는 오른쪽 그림과 같이 조금 변형이 되어 있다.
왼쪽은 gpu연산을 하지 못한다.
model14 = keras.Sequential()
model14.add(keras.layers.Embedding(500, 16, input_length=100))
model14.add(keras.layers.GRU(8))
model14.add(keras.layers.Dense(1, activation='sigmoid'))
# (16인풋 x 8뉴런 + 8순환 x 8뉴런 + 8절편 + 8개의 추가 절편) x 3개의 작은 셀
# 624개의 파라미터
이로써 마지막 수업이다. 헤매고 있던 나를 구해준 정말 좋은 강의였다.
박해선 선생님 감사합니다!