순환 신경망(RNN; Recurrent Neural Network)
" 시퀀스(sequence) 및 시계열(time series)을 활용해 예측하는 인공 신경망 구조"
- 자동 번역과 같은 자연어 인식 및 처리, 주식 거래, 문장 및 문서 인식 등과 같이 연속적이고 순서에 의미가 있는 데이터들의 처리
- 입력층-> 출력층 (feed-forward) 방향
- 순환 신경망은 은닉층의 결과를 다음 상위층으로 보내면서 다시 현재 은닉층에서의 다음 계산 입력으로 보낼 수 있도록 순환적 구조를 가지고 있는 신경망
- 즉 , 각각의 노드들은 외부의 입력과 함께 자신의 이전 상태를 받아서 자신의 현재 상태를 갱신한다.
- 순환뉴런(Recurrent Neuron)
- 각 타임 스텝(time step) 마다 직전 타임 스텝의 출력을 입력 받은 뒤 계산 결과인 출력을 상위층으로 내보내고 , 이와 함께 자기 자신에게도 그 출력을 보낸다
※그림 출처 : 핸즈온 머신러닝 , p482, 한빛미디어
- 순환 뉴런의 층 ~ 메모리 셀 (memory cell)
- 순환 뉴런으로 구성된 층 역시 마찬가지로 , 각 타임 스텝마다 해당 층의 모든 뉴런들은 하위층의 입력과 직전 타임 스텝의 출력을 입력 받는다.
※그림 출처 : 핸즈온 머신러닝 , p483, 한빛미디어
=> h(t) = f( x(t), h(t-1) ) (h(t):현재상태, x(t): 입력값)
- 순환신경망에서는 tanh 사용함 (relu는 이전의 상태가 돌아오므로 계속 증폭됨 / sigmoid는 층이 깊어지면 경사소실)
시퀀스 입출력의 형태
(1) 시퀀스-투-시퀀스(sequence-to-sequence; seq2seq)
연속적인 입력(sequential inptut)을 받아서 연속적인 출력 (sequence output)을 생성
ex) 8 월 19 일부터 8 월 21 일까지의 주식 데이터를 입력 받아서 8 월 20 일부터 8 월 22 일까지의 주식을 예측한다.
(2) 시퀀스-투 -벡터(sequence-to-vector)
연속적인 입력에 대하여 중간의 연속적인 출력은 무시하고 마지막 결과만 유효한 출력으로 간주할 수 있다.
ex) 사용자 리뷰에 있는 3개의 단어 "추천해요", "굉장히", "좋다"를 입력 받아서 추천 점수 95점을 출력한다.
(3) 벡터-투-시퀀스(vector-to-sequence)
처음의 입력만 유효한 입력으로 간주하여 출력 시퀀스를 내보낼 수도 있다.
ex) 고양이 이미지 파일을 입력 받아서 그 이미지에 대한 캡션들 'cat', 'cute', 'meow'를 출력한다.
(4) 지연된 시퀀스-투-시퀀스(delayed sequence-to-sequence)
시퀀스-투-벡터 망(인코더; encoder)과 벡터-투-시퀀스 망(디코더;decoder)을 연결하여 입력 시퀀스에 대해 지연된 출력 시퀀스를 내보낼 수도 있다.
ex) 한국어 문장-> 영어로 번역
# RNN의 문제점
- 입력 시퀀스가 길어질수록 타임 스텝의 수가 많아져 타임 스텝에 따라 펼친 네트워크는 매우 깊어짐
- 앞 부분의 정보를 이용하여 현재를 추론하려고 하는 경우, 그 정보와 현재 시점이 너무 멀리 떨어져 있다면 제대로 예측 불가
-> 그래디언트 소실 => 장기의존성(long-term dependencies) 문제
장단기 메모리(LSTM; Long Short-Term Memory)
- 장기 의존성 문제를 해결하기 위해 도입된 발전형 RNN => 게이트(gate) 개념 추가
※ 그림 출처 : https://colah.github.io/posts/2015 08 Understanding LSTMs/
- 셀 상태 추가 : 이전 상태 h(t)는 단기 기억 상태로 관리하고 메모리 셀 상태 C(t)를 장기 상태로 추가
- 게이트 연산 : 셀 상태에서 정보를 선택적으로 추가하거나 삭제하는 스위치 역할 (입력, 망각, 출력)
(시그모이드 층의 결과에 대한 곱셉 -> 1이면 모든 정보 유지, 0이면 모든 정보 제거)
수행절차
1. 장기 기억 C(t-1) 이 망각 게이트 (forget gate)를 거쳐서 일부 기억을 망각한다
- 현재 입력값 x(t)과 이전 단기상태 h(t-1)을 받아서 이전 셀의 정보를 망각할 것인지 결정
(1에 가까울 수록 많이 기억)
2. 입력 게이트 (input gate) 에서 선택한 기억을 추가하여 장기 기억 C(t) 를 갱신한다
- 현재 입력값 x(t)과 이전 단기상태 h(t-1)을 받아서 현재 셀에 얼마나 방영할 것인지 결정
(1에 가까울 수록 많이 반영)
3. 처리게이트 : 현재 셀 상태 값 후보 C(t) 생성 (tanh값->1에 가까울 수록 현재 정보를 비례해서 반영)
4. 현재 셀 상태 갱신 : 이전 셀 상태(기억)에서 일부를 망각하고, 현재 입력 값(정보)일부를 추가한 결과
5. 장기 기억 C(t)의 복사본이 출력 게이트 (output gate) 를 거쳐 단기 기억 h(t) 를 생성한다
- 갱신된 셀의 현재 상태 C(t)를 -1과 -1사이로 조절한 뒤 출력 게이트의 값 곱해 출력
+GRU : LSTM가 좀 더 간소화된 판 -> 다 keras에 구현되어 있음