RNN이란?
입력과 출력을 시퀀스 단위로 처리하는 모델입니다. 번역기를 생각해보면 입력과 출력에 해당되는 문장, 또는 단어가 스퀀스입니다. 이러한 스퀀스들을 처리하는 모델이 RNN입니다.
RNN은 은닉층의 노드에서 활성화 함수를 통해 나온 결과값을 출력층 방향으로도 보내면서, 다시 은닉층 노드의 다음 계산의 입력으로 보내는 특징을 갖고 있습니다. RNN에서 은닉층에서 활성화 함수를 통해 결과를 내보내는 역할을 하는 노드를 셀(cell), 메모리 셀, RNN 셀이라고 합니다.
이 셀은 이전의 값을 기억하려고 하는 일종의 메모리 역할을 수행합니다.
은닉층의 메모리 셀은 각각의 시점(time step)에서 바로 이전 시점에서의 은닉층의 메모리 셀에서 나온 값을 자신의 입력으로 사용하는 재귀적 활동을 하고 있습니다.
메모리 셀이 출력층 방향으로 또는 다음 시점 t+1의 자신에게 보내는 값을 은닉 상태(hidden state)라고 합니다.
다시 말해 t 시점의 메모리 셀은 t-1 시점의 메모리 셀이 보낸 '은닉 상태값'을 t 시점의 은닉 상태 계산을 위한 '입력값'으로 사용합니다.
예를 들어 하나의 입력에 대해서 여러개의 출력(one-to-many)의 모델은 하나의 이미지 입력에 대해서 사진의 제목을 출력하는 이미지 캡셔닝(Image Captioning) 작업에 사용할 수 있습니다. 사진의 제목은 단어들의 나열이므로 시퀀스 출력입니다.
여러 입력에 대해서 하나의 출력을 하는 모델은 입력 문서가 긍정적인지 부정적인지를 판별하는 감성 분류(sentiment classification), 또는 메일이 정상 메일인지 스팸 메일인지 판별하는 스팸 메일 분류(spam detection)에 사용할 수 있습니다.
다 대 다(many-to-many)의 모델의 경우에는 입력 문장으로부터 대답 문장을 출력하는 챗봇과 입력 문장으로부터 번역된 문장을 출력하는 번역기가 있습니다.
RNN 수식과 각 벡터와 행렬의 크기
*keras 기준
hidden_units = 은닉 상태의 크기를 정의. 메모리 셀이 다음 시점의 메모리 셀과 출력층으로 보내는 값의 크기(output_dim)와도 동일합니다. =메모리 셀의 용량
timesteps = 입력 시퀀스의 길이(input_length)라고 표현하기도 합니다. 시점의 수. 몇 개의 데이터를 이용해서 정답을 만들어내는지, 자연어 처리에서는 보통 문장의 길이입니다.
input_dim = 입력의 (차원)크기. RNN 레이어로 한번에 들어가는 데이터 개수
batch_size 한 번에 학습하는 데이터의 개수를 말합니다.
RNN 층은 (batch_size, timesteps, input_dim) 크기의 3D 텐서를 입력으로 받습니다. *배치사이즈는 주로 나중에 설정해준다.
출력값을 예측할 때 이전 시점의 데이터뿐만 아니라, 이후 데이터로도 예측할 수 있다는 아이디어에 기반합니다. 영어 빈칸 채우기 문제 비유해서 생각해보기!
양방향 RNN은 하나의 출력값을 예측하기 위해 기본적으로 두 개의 메모리 셀을 사용합니다. 첫번째 메모리 셀은 앞에서 배운 것처럼 앞 시점의 은닉 상태(Forward States)를 전달받아 현재의 은닉 상태를 계산합니다. 두번째 메모리 셀은 뒤 시점의 은닉 상태(Backward States)를 전달 받아 현재의 은닉 상태를 계산합니다. 그리고 이 두 개의 값 모두가 출력층에서 출력값을 예측하기 위해 사용됩니다.
주의 : 은닉층을 무조건 추가한다고 해서 모델의 성능이 좋아지는 것은 아닙니다. 은닉층을 추가하면, 학습할 수 있는 양이 많아지지만 또한 반대로 훈련 데이터 또한 그만큼 많이 필요합니다.