순서가 있는 데이터를 위한 딥러닝 기본 - RNN 핵심 이해

아래 내용은 인프런 [처음하는 딥러닝과 파이토치(Pytorch) 부트캠프] 강의를 듣고 공부한 내용입니다.

 

RNN

  • Recurrent Neural Network, 순환 신경망 이라고함
  • 입력과 출력을 시퀀스 단위로 처리하는 시퀀스(Sequence) 모델
    • 시퀀스(Sequence)란 연관된 연속 데이터를 의미하며, 시계열 데이터 등 순서를 가지는 데이터(그 전의 데이터를 가지고 예측해야하니까 시간축이 중요함) 에 적합한 신경망 모델 ( CNN과 마찬가지로 DNN으로도 시계열 데이터 분석 가능하지만 더 성능이 좋음)
    • 번역기의 입력은 단어가 순서를 띄고 나열된 문장 시퀀스이며, 출력도 번역된 단어가 순서를 띄고 나열된 번역 문장 시퀀스임
  • 가장 기본적인 시퀀스 모델이며, 최근에는 RNN을 기반으로 개선된 LSTM과 GRU 모델이 많이 사용됨

 

RNN의 기본 구조

  • ANN(layer 하나), DNN(layer 여러개), CNN은 모두 은닉층에서 활성화 함수를 지난 값은 출력층 방향으로만 적용됨
    • 이를 Feed Forward Neural Network라고 부름
  • 이에 반해, RNN은 은닉층의 노드에서 활성화 함수를 통해 나온 결과값을 출력층 방향 + 은닉층 노드의 다음 계산의 입력으로 보냄 (다시 자기자신의 다음 iteration의 입력으로 들어감)

  • 기존 hidden state의 활성화 함수를 통해 나온 결과값을 내보내는 역할을 하는 노드를 메모리 셀이라고 함 (위  그림에서 자기 자신의 다음 iteration의 입력으로 들어가는 노드)
  • RNN은 은닉층 메모리 셀에서 나온 값을 다음 은닉층의 메모리 셀에 입력하는 구조
기존 hidden state 값을 사용한다는 의미는, 기존 값을 기억한다는 의미로, 컴퓨터 구조의 메모리를 구성하는 플립플롭의 논리 회로와 유사함

 

  • x 입력을 받아서, h 은닉 상태 (hidden state라고 함)를 통과하여, y 출력을 한다고 하면, 다음과 같은 수식을 기반으로 동작함.

** RNN은 내부적으로 은닉층의 출력 결과물이 그 다음 iteration의 해당 노드의 입력으로 들어갈 수 있는 메모리셀을 가지고 있는 구조

** 메모리셀의 계산은 tanh 비선형 함수를 사용하여 계산됨

 

tanh 함수란?

hyperbolic tangent function, 하이퍼볼릭 탄젠트

  • 쌍곡선 함수라고도 칭함
  • 시그모이드 함수와 유사하여, 시그모이드 함수의 대체제로 사용되는 활성화 함수
    • 시그모이드는 0 ~ 1 의 값을 가지는데 반해, tanh 함수는 -1 ~ 1의 값을 가짐
    • 시그모이드는 데이터의 평균이 0.5이지만, tanh 함수는 데이터의 평균이 0임
    • 시그모이드와 비교하여 tanh 함수가 보다 출력 범위가 넓고, 경사면이 큰 범위가 더 크므로, 더 빠르게 수렴하여 학습하는 특징을 가지고 있음

왼쪽은 출력값, 오른쪽은 미분값 -> tanh이 범위가 더 큼 -> 더 빠르게 수렴

  • tanh 함수 수식

  • tanh 함수 미분

 

RNN의 다양한 구조

  • RNN은 입력과, 출력 길이를 다르게 설계할 수 있음
  • 입력은 빨간박스, 은닉층은 녹색박스, 출력은 파랑박스라고 가정하면, 다음과 같이 다양한 형태의 RNN 구성 가능
    • one to one : 가장 단순한 형태 Vanilla RNN이라고 부름 (DNN이 더 잘할수도..)
    • one to many : 하나의 이미지 입력에 대해, 이미지의 다양한 특징을 출력하는 (CNN처럼) 이미지 캡셔닝에 적용 가능
    • many to one : 메일 전체를 입력받아, 메일이 스팸인지, 스팸이 아닌지를 판단하는 등의 문제에 적용 가능
    • many to many : 문장을 입력받아, 문장을 출력하는 챗봇이나 번역기 등의 문제에 적용 가능

다양한 문제에 적용 가능하나, 그 중에서도 순서가 있는 입력과 출력에 성과가 좋은게 RNN