RNN은 입력과 출력을 시퀀스 단위로 처리하는 시퀀스 모델이다. 시퀀스(sequence)란 순서가 중요한 데이터의 나열이라고 할 수 있다. 예를 들면 텍스트 데이터나 음성 데이터, 주식 데이터 등과 같은 시계열 데이터이다.
번역기를 생각해보면 쉽다. 입력값과 출력값 모두 단어의 시퀀스이다. 이렇게 시퀀스를 처리하기 위한 모델을 시퀀스 모델이라고 한다.
RNN은 가장 기본적인 인공 신경망 시퀀스 모델이다.

= 입력 벡터, = 출력 벡터
RNN은 은닉층의 노드에서 활성화 함수를 통해 나온 결과값을 출력층으로 보내면서 다시 은닉층 노드의 다음 계산의 입력으로 보낸다.
이 노드를 셀(cell)이라고 한다. 셀은 이전의 값을 기억하려고 하는 메모리 역할을 수행하기 때문에 메모리 셀 또는 RNN 셀이라고 한다.

은닉층의 메모리 셀은 각각의 시점에서 이전 시점의 은닉층 메모리 셀에서 나온 값을 입력으로 사용하는 재귀적 활동을 한다. 위 사진에서 등호를 기준으로 왼쪽과 오른쪽은 RNN을 두가지 방식으로 표현한 것이다.
현재 시점을 변수 t라고 하면 t는 과거 메모리 셀들의 값에 영향을 받은 것이다. t 메모리 셀이 다음 시점인 t+1 메모리 셀에게 보내는 값을 은닉 상태라고 한다.

RNN은 입력과 출력의 길이를 다르게 설정할 수 있어서 다양한 용도로 사용할 수 있다.
일 대 다(one-to-many) : 하나의 이미지 입력에 대한 사진의 제목을 출력하는 이미지 캡셔닝(Image Captioning)
다 대 일(many-to-one) : 입력 문서가 긍정적인지 부정적인지를 판별하는 감성 분류(sentiment classification), 또는 메일이 정상 메일인지 스팸 메일인지 판별하는 스팸 메일 분류(spam detection) 등
다 대 다(many-to-many) : 챗봇, 입력 문장으로부터 번역된 문장을 출력하는 번역기, 개체명 인식, 품사 태깅

= 현재 시점
= 에서의 은닉 상태값
은닉층의 메모리 셀은 를 계산하기 위한 가중치를 두개 가진다.
입력층을 위한 가중치 와 의 이전 시점의 은닉 상태값을 위한 가중치 이다.
를 계산하기 위한 활성화 함수로 하이퍼볼릭탄젠트 함수(tanh)가 사용된다.
를 계산하는 활성화 함수로 이진 분류 문제라면 시그모이드 함수, 다중 클래스 분류 문제라면 소프트맥스 함수를 사용할 수 있다.
수식으로 표현하면 아래와 같다.

RNN도 다수의 은닉층을 가질 수 있다. 위 그림은 은닉층이 2개인 깊은 RNN이다.
양방향 RNN은 t에서 출력값을 예측할때 이전시점과 이후시점의 입력도 예측에 기여할 수 있다는 아이디어에서 기반한다.
"운동을 열심히 하는 것은 [?] 을 늘리는데 효과적이다."
1.근육 2.지방 3.스트레스
위 의 빈칸 채우기 문제를 풀 때 빈칸 앞의 정보만으로는 답을 고르기 어렵다. 하지만 빈칸 뒤 정보도 확인한다면 1.근육을 고를 수 있을 것이다.
이런 미래 시점에도 힌트가 있는 문제가 있는 경우도 많기 떄문에 양쪽의 정보를 통해 더 정확한 예측을 하고자 하는것이 양방향 RNN이다.

양방향 RNN은 하나의 출력값을 예측하기 위해 두개의 메모리 셀을 사용한다.
첫번째 메모리 셀은 앞 시점의 은닉 상태를 계산하고(주황색 셀), 두번째 메모리 셀은 뒤 시점의 은닉 상태를 전달받아 계산한다(초록색 셀). 양방향 RNN 또한 은닉층을 추가할 수도 있다.

RNN은 과거 데이터를 기반으로 현재와 미래를 예측하는 모델로 시계열 데이터 처리에서 강점을 가진다.
은닉층의 순환 구조를 통해 이전 정보를 기억하고 활용하는 방식은 사람의 사고 방식과 유사하다.
다음글에서는 이 글에서 다룬 바닐라 RNN의 장기 의존성 문제와 LSTM을 정리해야겠다. 화🐛이🐛팅🐛