📌순환신경망 (Recurrent Neural Network, RNN)
순환신경망 (Recurrent Neural Network, RNN)
- 시퀀스 모델 (입출력을 시퀀스 단위로 처리)
- 은닉층의 노드에서 활성화 함수를 통해 나온 결과값을 출력층 방향으로도 보내면서 다시 은닉층 노드의 다음 계산의 입력으로 보냄.

- RNN 셀(메모리 셀)은 은닉층에서 활성화 함수를 통해 결과를 내보낸다
- 은닉 상태 (hidden state) : 메모리 셀이 출력층의 방향으로 또는 다음 시점 t+1의 자신에게 보내는 값

- 일대다 : 하나의 입력에 대해서 여러 개의 출력 (하나의 이미지에 대해 제목을 출력하는 이미지 캡셔닝)
- 다대일 : 여러 개의 입력 (단어 시퀀스)에 하나의 출력 (스팸 메일 분류)
- 다대다 : 입출력 모두 여러 개 (입력 문장 -> 대답 문자)


가중치 두개 : 입력값을 위한 가중치(Wx), 이전 시점의 은닉 상태 값(Wh)

입력을 단어 벡터로 생각할 수 있다. 가중치 Wx, Wh, Wy는 모든 시점에서 동일한 값이다.
깊은 순환 신경망(Deep Recurrent Neural Network)

다수의 은닉층(그림에서는 2개)를 가진 순환신경망
양방향 순환 신경망(Bidirectional Recurrent Neural Network)

- 시점 t에서 출력값을 예측하려 할 때 이전 시점 뿐만 아니라 이후 데이터로도 출력값을 예측할 수 있다.
- 주황색 : 앞 시점의 은닉 상태 (Forward States)
- 초록색 : 뒤 시점의 은닉 상태 (Backward States)
- 이 두개가 모두 출력값 예측을 위해 사용된다

- 은닉층이 추가 되면 학습 양이 많아지는 대신 훈련 데이터가 많이 필요하다
📌장단기 메모리(Long Short-Term Memory, LSTM)
바닐라 RNN의 한계

- 바닐라 RNN : 가장 단순한 위와 같은 형태의 RNN. 한계 극복을 위해 여러 변형이 나온다
- 한계
- 장기 의존성 문제 (the problem of Long-Term Dependencies) : time step이 길어질수록 뒷쪽에 앞의 정보가 잘 전달되지 않기 때문에 짧은 시퀀스에만 효과가 있다. 앞쪽의 정보의 전체 정보에 대한 영향력이 사라져서 앞쪽에 중요한 정보가 있을 경우 문제가 된다.
바닐라 RNN 내부 열어보기


그림에서는 b는 생략 (그리고 싶으면 xt옆에 tanh로 들어가는 선 하나 추가해주면 된다)
LSTM(Long Short-Term Memory)

- 바닐라 RNN의 한계 극복 : 게이트를 통해 기억해야 할 것들을 정하고 불필요한 것들은 지운다
- hidden state 계산이 복잡해짐
- cell state 값이 추가됨

- Cell state (셀 상태) : 다음 시점의 셀 상태를 구하기 위한 입력으로 사용된다
1. 입력 게이트


- 현재 정보를 기억하기 위한 게이트
- 다음 두 개의 값을 통해 기억할 정보의 양을 구한다
- it : gate 역할. 시그모이드 함수는 값을 0~1 사이의 값으로 만들어주기 위해 사용된다.
- gt : 현재 cell state를 나타냄. 하이퍼볼릭탄젠트 함수는 -1 과 1 사이의 값으로 조정해준다. 기울기 소실 문제 해결을 위해 그래디언트를 최대한 오래 유지할 수 있도록 한다. (미분의 최댓값이 시그모이드보다 큼)
- 💡 왜 시그모이드 / 하이퍼볼릭탄젠트를 각각 쓸까?
it 는 강도를 나타내고 gt 는 방향을 나타내기 때문에 둘 다 그 값의 범위가 대칭이면 일대일 대응이 되지 않고 의도한 대로 되지 않고 값이 꼬이는게 아닐까....추측만 해 봄..
- 💡 ReLu는 왜 안 쓸까?
임계값 이상에서 y=x의 그래프를 갖는 ReLu는 같은 레이어를 반복하는 RNN의 경우는 1보다 큰 값이 들어오면 값이 발산하게 된다. RNN 아닌 다른 모델들에서는 성능이 훨씬 좋다.
2. 삭제 게이트


- 기억 삭제를 위한 게이트
- 시그모이드 함수를 거친 0~1사이의 값이 삭제 과정을 거친 정보의 양이 된다.
- 0에 가까우면 많이 삭제, 1에 가까우면 완전히 기억한 것
3. 셀 상태 (장기 상태)


- 삭제 게이트를 통해 일부 기억을 잃은 상태에서 시작
- 기억할 값 구하기 : 입력 게이트에서 구한 두 값(gt, it)를 entrywise product (같은 위치 성분끼리 곱)
- 현재 시점 t의 셀 상태 : 1에서 선택된 기억할 값을 삭제 게이트의 결과값과 더함, 다음 시점의 LSTM셀로 넘어감 (곱하기만 있는 RNN에 더하는 과정을 넣음으로써 기울기 소실 문제 해결 가능)
- 삭제 게이트는 이전 시점의 입력을, 입력 게이트는 현재 시점의 입력을 얼마나 반영할지 결정한다
- 둘다 하이퍼볼릭탄젠트를 거치면 둘 다 음수가 나왔는데 곱해져서 양수가 되기 때문에 잊고 싶은게 기억된다거나 하는 문제가 생길 수 있다 (내 뇌피셜임)
4. 출력 게이트와 은닉 상태(단기 상태)


- 하나는 출력층으로 하나는 다음 시점에서 쓰이는 현재 시점의 hidden state가 됨
- 출력게이트를 통해 얼마나 다음 단계로 보낼지 계산함 (그냥 내보내지 않음)
게이트 순환 유닛(Gated Recurrent Unit, GRU)
- LSTM처럼 장기 의존성의 문제를 해결하면서 은닉상태 업데이트 하는 계산은 간단하게 함.

- LSTM 3개의 게이트(입력 삭제 출력) 에서 2개의 게이트(업데이트, 리셋)로 간단해짐
- LSTM 보다 속도가 빠르고 성능은 비슷하다고 알려져있지만 경우 (데이터의 양, 매개변수의 양 등)에 따라 LSTM이 더 성능이 좋을 때가 있기 때문에 단정짓긴 힘들다.