6-6 10라인 TensorFlow 코드로 도전하는 RNN

in #kr5 years ago (edited)

RNN(Recurrent Neural Network)의 가장 기초를 공부하는 단계지만 2018년 현재 시점에서 RNN 이 어떻게 급변하고 있는지 간단하게 알고 난 후 그래도 기초를 다지기로 한다. 최근 인공지능의 급격한 발전에 따라 RNN 과 LSTM(Long Short Term Memory)이 많은 관심과 더불어 응용이 이루어졌지만 이미 그 수준을 넘어가는 새로운 기법들로 대체되고 있는 상황이다. RNN 과 LSTM에 의해 불과 수년 만에 sequence learning 이나 sequence translation 기법에 의해 음성인식 분야에서 놀라울 정도의 성과를 보여주었고 더 나아가 애플의 Siri 라든지 Google voice assiatance 또는 아마존의 Alexa가 부각되게 된 계기가 되었다. 하지만 스크래치 상태로부터 RNN 머신 러닝을 공부하는 초보자들이 점프하여 막바로 새로운 기법들을 받아들이고 더욱 발전시켜 나간다는 것은 거의 불가능에 가까우므로 짧은 시간 내에 이들 알고리듬을 섭렵한 후 새로운 기법에 도전해 보도록 하자.

사람은 매 순간마다 맨바닥에서부터 생각을 시작하지는 않는다. 이 글을 읽고 있는 여러분들도 당연히 이전 문장이나 단어에 대한 이해를 바탕으로 이어지는 각 단어를 이해하고 문맥을 파악하는 것이다. 어느 하나 버리는 것이 없으며 맨 바닥부터 생각하기 시작하는 것이 아니기 때문에 우리의 사고라는 것이 의미를 갖게 되는 것이다. 즉 우리의 사고 과정에 대해서 잘 이해 하도록 해야 겠다.

MNIST 문제 처리와 Iris flowers 데이터 처리과정에서 사용했던 기존의 뉴럴 네트워크를 사용하면서 사람처럼 사고하거나 문맥을 파악해 내는 류의 작업을 할 수 없다고 보아야 할 것이다. 예를 들어 영화 전체에 걸쳐 시점 별로 일어나는 이벤트들을 분류하고 싶다고 가정 해보자. 기존의 뉴럴 네트워크 기법을 사용하여 어떻게 영화의 전반부에서 일어났던 사건에 대한 추론을 사용하여 후반부에 정보를 전달해 주거나 영향을 미칠 수 있는지는 불분명한 것이 사실이다. RNN이 바로 이런 종류의 문제를 해결할 수 있는 네트워크로서 내부적으로 정보가 순환되는 루프가 있어 정보가 지속되도록 하는 기능을 가지고 있음에 유의하자.

텐서 플로우에서 제공하는 RNN 루틴을 알아보자. 가장 기본적인 루틴이 바로 RNN을 시작하는 처음에 배치하는 BasicRNNCell 이다. 물론 BasicRNNCell 외에도 BasicLSTMCell 도 있는데 그 사용법에 차이점이 있을 수 있다.

이들 cell에 기본적으로 요구되는 파라메터로는 뉴럴 네트워크 레이어의 크기로서 즉 num_units가 hidden_size 로 설정되어야 한다. 이글을 읽는 독자 분들께서는 뉴럴 네트워크에 관해서 기초적인 특징을 잘 알고 있다고 본다.

noname01.png

물론 그 크기는 Wide Deep 코딩에서처럼 사용자가 임의의 크기로 설정이 가능하다. 아울러 입력 데이터는 아무래도 여러 문자를 one hot code로 대응시켜 나타내는 것이 편리하다. 본격적인 영문 번역 학습을 시도하려면 알파벳에 더하여 숫자 및 기호를 포함한다면 one hot code 의 길이가 상당히 늘어날 수 있을 것이다.

입력 데이터가 준비되었으면 RNN 컴퓨팅을 위해 dynamic_rnn 루틴을 사용하도록 한다. dynamic_rnn 루틴에 넘겨주어야 할 필수 데이터로는 설정된 cell, 문자 입력 데이터 정보이다. dynamic_rnn에서 생성되는 정보는 출력 값과 상태(state) 정보를 포함한다. 여기까지의 내용을 Computational Graph로 생성하여 저장하기로 한다.

noname02.png

마지막 Session 단계에서 전역 변수들을 초기화한 후에 outputs를 출력하도록 한다. 그런데 이 짧은 코드를 실행에 있어서 tf.reset_default_graph() 명령이 없으면 아나콘다 실행에 에러가 발생한다. 그 원인은 실행 후 생성되었던 Graph 가 지워져야 함에도 불구하고 잔재가 남아서 그 다음번 실행에 지장을 초래하므로 시작 단계에서 한번씩 reset 해 주도록 한다.

cell 의 종류는 BasicCELL 외에도 보다 기능이 뛰어난 BasicLSTM 외에 여러 가지가 있을 수 있는데 초기에 cell 종류를 지정해 주고 dynamic_rnn에 넣어 주면 된다.

hiden_size = 2일 경우에 실행해서 데이터를 출력해 보면 그 값이 –1.0 에서 +1.0 사이의 숫자 데이터들이 리스트 데이터 형태로 얻어진다.

다음 파이선 코드를 실행해보자. 다운로드 시 Session 파트에서 indentation 이 훼손되면 반드시 복원하기 바란다.

#cell_01
import tensorflow as tf
import numpy as np

tf.reset_default_graph()

hidden_size = 2

#cell = tf.contrib.rnn.BasicLSTMCell(num_units=hidden_size, state_is_tuple=True)
cell = tf.contrib.rnn.BasicRNNCell(num_units=hidden_size)
x_data = np.array([[[1,0,0,0]]], dtype=np.float32)
outputs, _states = tf.nn.dynamic_rnn(cell, x_data, dtype=tf.float32)

with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(outputs.eval())

마나마인로고.png

Sort:  

짱짱맨 호출에 응답하였습니다.

Coin Marketplace

STEEM 0.27
TRX 0.11
JST 0.030
BTC 68621.95
ETH 3745.88
USDT 1.00
SBD 3.43