
RNN은 은닉층의 노드에서 활성화 함수를 통해 나온 결과값을 출력층 방향으로도 보내면서 다시 은닉층 노드의 다음 계상의 입력으로 보낸다
RNN은 입력과 출력을 시퀀스 단위로 처리하는 시퀀스 모델
LSTM이나 GRU도 RNN에 속한다
셀(cell): RNN에서 은닉층에서 활성화 함수를 통해 결과를 내보내는 역할을 하는 노드, 메모리 셀, RNN 셀이라고 표현하기도 한다
은닉층에서 메모리 셀은 각각의 시점에서 바로 이전 시점에서 은닉층의 메모리 셀에서 나온 값을 자신의 입력으로 사용하는 재귀적 확동을 가진다 시점에서 바로 이전 시점에서 은닉층의 메모리 셀에서 나온 값을 자신의 입력으로 사용하는 재귀적 확동을 가진다
은닉 상태: 메모리 셀이 출력층 방향 또는 다음 시점의 자신에게 보낸는 값
model.add(SimpleRNN(hidden_units, input_shape=(timesteps, input_dim)))
hidden_units = 은닉 상태의 크기를 정의. 메모리 셀이 다음 시점의 메모리 셀과 출력층으로 보내는 값의 크기(output_dim)와도 동일. RNN의 용량(capacity)을 늘린다고 보면 되며, 중소형 모델의 경우 보통 128, 256, 512, 1024 등의 값을 가진다.
timesteps = 입력 시퀀스의 길이(input_length)라고 표현하기도 함. 시점의 수.
input_dim = 입력의 크기.
RNN 층은 batch_size, timesteps, input_dim 크기의 3D 텐서를 입력으로 받는다.
return_sequences = True를 설정하면 메모리 셀이 모든 실점에 대한 은닉 상태값을 출력
False로 지정하면 마지막 시점의 은닉 상태값을 출력
RNN도 다수의 은닉층을 가질 수 있다
깊은 순환 신경망: 은닉층이 2개 이상인 경우
양방향 순환 신경망은 시점 t에서 출력값을 예측할 때 이전 시점의 입력뿐만 아니라, 이후 시점의 입력 또한 예측에 기여한다
이전과 이후의 시점 모두를 고려해서 현재 시점의 예측을 더욱 정확하게 할 수 있도록 고안된 것이 양방향 RNN
기본 RNN은 비교적 짧은 시퀀스에 대해서만 효과를 보이는 단점이 있다
시점이 길어질 수록 앞의 정보가 충분히 전달되지 못하는 현상이 발생 -> 이로 인해 뒤로 갈수록 처음 입력의 영향력은 거의 의미가 없을 수 있다

LSTM은 은닉층의 메모리 셀에 입력 게이트, 망각 게이트, 출력 게이트르 추가해 불필요한 기억을 지우고, 기억해야할 것을 정한다
RNN과 비교해 긴 시퀀스 입력을 처리하는데 좋은 성능을 가진다
입력 게이트
현재 정보를 기억하기 위한 게이트
현재 시점삭제 게이트
기억을 삭제하기 위한 게이트
현재 시점의 x값과 이전 시점의 은닉 상태가 시그모이드 함수를 지니게 된다
0에 가까울 수록 정보가 많이 삭제된 것이고, 1에 가까울수록 정보를 온전히 기억한 것
LSTM에서는 출력, 입력, 삭제라는 3개의 게이트가 있었지만 GRU에서는 업데이트 게이트와 리셋 게이트 두 가지 게이트만 존재
GRU는 LSTM와 비슷한 성능을 가진다