RNN 에 대하여

RNN에 대하여 공유할 일이 생겨서 작성하는 RNN에 대한 포스트 입니다.


RNN?

RNN은 순차적인 데이터를 학습하는 뉴럴네트워크 입니다. 구글 번역기로 대표적인 자연어처리가 그 한 예 입니다.

  • RNN의 입력값은 아래의 데이터처럼 순차적인 데이터인 𝓍가 들어 갑니다.𝓍의 예시로는 문장이 될 수 있습니다.
  • 우리가 원하는 출력값인 о는 아래와 같이 입력값 처럼 순차적인 시퀀스 데이터가 나올 수 있습니다.
  • 중간의 s는 Hidden State로 중간중간 결과마다 State값을 매긴 결과 이고, 수식은 s_t=f(Ux_t+Ws_t-1). 으로 나타낼 수 있습니다. 아래 그림처럼 볼 수 있듯이 각 State마다 결과 값 о를 출력 할 수 있습니다.
  • W,U,V는 파라미터 값 이고, 모든 State 마다 공유 합니다.


RNN (https://aikorea.org/blog/rnn-tutorial-1/)

Tensorflow로 짠 RNN Core

Oreilly의 Learning TensorFlow의 RNN예제를 분석 하려고 합니다.
아래 그림은 Tensorboard를 통해서 텐서플로우 코드를 도식화 한 그림 입니다.
RNN의 Flow라기 보다는 딥러닝 자체의 플로우로 봐도 무방 해 보입니다.
RNN 학습 로그를 Tensorboard로 분석한 결과


Input, Transpose

아래 코드는 RNN 예제 데이터인 mnist 데이터를 불러오고, 데이터를 Transpose 합니다.

RNN States

아래는 Hidden State를 구하는 부분 입니다.

RNN Output

아래 코드는 RNN의 출력값 o를 나타 냅니다. 출력값은 선형 방식을 사용하였습니다.

RNN Train, Test

아래 코드는 위에서 쌓은 Tensor 객체를 통해서 Train과 Test를 진행 합니다.

결과

아래처럼 정확도는 97퍼센트로 나쁘지 않습니다.
Iter 0, Minibatch Loss= 2.302837, Training Accuracy= 7.03125
Iter 1000, Minibatch Loss= 1.187517, Training Accuracy= 56.25000
Iter 2000, Minibatch Loss= 0.601766, Training Accuracy= 82.81250
Iter 3000, Minibatch Loss= 0.380846, Training Accuracy= 85.93750
Iter 4000, Minibatch Loss= 0.118226, Training Accuracy= 97.65625
Iter 5000, Minibatch Loss= 0.102771, Training Accuracy= 96.87500
Iter 6000, Minibatch Loss= 0.083136, Training Accuracy= 97.65625
Iter 7000, Minibatch Loss= 0.153865, Training Accuracy= 95.31250
Iter 8000, Minibatch Loss= 0.074156, Training Accuracy= 98.43750
Iter 9000, Minibatch Loss= 0.049012, Training Accuracy= 98.43750
Test Accuracy: 97.65625

텐서플로우 내장 함수

아래 코드는 텐서플로우에서 내장되어 있는 RNN Core 코드 입니다. 위의 직접 구현한 코드에서 Hidden State 및 Output 부분을 지원 해 줍니다. 관련 코드



RNN의 문제점, LSTM

위의 RNN의 Hidden State의 구조를 보면, Hidden State✖Wh의 곱연산 입니다.
이로 인하여 순차 데이터가 들어간다고 하지만, wh가 1보다 작으면 영향력이 점점 작아질 수 있고, 1보다 크면 무한이 커진다는 단점이 있을 텐데 그를 해소하기 위한것이 LSTM(Longest Short Term Memory) 입니다.
LSTM의 구조는 자세히 공부하지 않아서 다음 기회로~
LSTM

양방향 RNN, Bidirectional RNN

문장을 순차적으로 읽는것도 중요하지만, 전후관계에 따라서 해석이 달라 질 수 있습니다. 예를 들어 빈칸 찾기 문제가 적절한데요. 그러기 위해서 이전 데이터와 이후 데이터를 모두 사용하는 양방향 RNN이 있습니다. 이는 RNN을 양쪽으로 만들어서 한 State에는 두개의 RNN이 영향을 주는 구조 입니다.
양방향 RNN의 경우 Kaggle의 답안중 높은 순위로 자주 나오곤 합니다.
Bidirectional RNN

댓글

이 블로그의 인기 게시물

고려대학교 야간대학원 중간 후기

포켓몬 고 17셀 확인 포고맵 사용 방법

HTTP 오류 500.19 - Internal Server Error 에러 처리법