Research/Deep Learning

순환 신경망(RNN; Recurrent Neural Network)

러피 2021. 7. 23. 13:00

" 시퀀스(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에 구현되어 있음