Practice makes perfect

[MachineLearning] 순환신경망: RNN(Recurrent Neural Network) 본문

Anaconda/MachineLearning

[MachineLearning] 순환신경망: RNN(Recurrent Neural Network)

kerpect 2020. 8. 20. 17:20

순환신경망

: RNN(Recurrent Neural Network)는 뉴런의 상태(state)를 저장하고 이를 다음 스텝에서의 입력으로 사용함으로써 긴 순서열에 대해서도 예측을 할 수 있는 신경망 구조이다.

 

- 순차적(sequence) 인 데이터를 입력 받아 결과값을 도출하는데 사용하는 딥러닝 모델
- 대표적으로 자연어 처리에 상당히 많이 사용
- 이전 입력 값들(단어들)이 현재 입력 값(단어)의 출력 값(품사)에 영향을 줌

 

품사가 도출 되도록 프로그램을 만들었는데, google 이라는 단어를 봤을 때 자리에 따라서 동사와 명사로 다른 품사로 출력됩니다. 문장을 통해서 공통점을 찾아 출력될 수 있도록 만듭니다 . 제시된 방향성을 정해줘야지 정확한 데이터를 출력해줍니다. 

 

RNN의 일반적인 구조

 

RNN 의 심층 구조

활성화 함수 : 탄젠트 함수 사용. 

 

시간 차를 두고 순차적인 데이터를 넣습니다. 시계열의 특징을 가지고 있습니다. 

 

RNN 의 구조 메모리 셀

메모리 셀 (memory cell 혹은 간단히 cell)
- 타임 스텝 t 에서 순환 뉴런의 출력은 이전 타임 스텝의 모든 입력에 대한 함수이기 때문에 이를

  일종의 메모리 형태라고 말할 수 있음

- 타임 스텝에 걸쳐서 어떤 상태를 보존하는 신경망의 구성 요소
- 보통 RNN 에서 셀이라고 말할 때는 완전 연결 신경망에서 층 ( 을 의미

일반적으로 타임 스텝 t 에서의 셀의 상태 ℎ𝑡 ℎ는 hidden 을 의미

RNN 네트워크에 셀이 한 개일 경우의 가중치 , 상태값 , 출력값

 

 

import tensorflow as tf
import numpy as np

tf.set_random_seed(777)

# hello 다음을 추천해주게끔 하는...
# 스펠링은 각각의 독립적인 의미를 가지고 있지만
# 'he'를 입력 했을 때, 서로의 연관성을 가지고 추천하게끔 만들어준다.
# 컴퓨터 선택의 최적화 되어 있는 수치로 표현 해야한다.

# h:0 , e:1 , l:2 , o:3 임의의 수를 넣어준다.
# One Hot Encoding

h = [1,0,0,0]
e = [0,1,0,0]
l = [0,0,1,0]
o = [0,0,0,1]

# RNN input_dim(4) -> output_dim(2), hidden_size(2)
hidden_size = 2

cell = tf.contrib.rnn.BasicRNNCell(num_units=hidden_size) 
# contrib : 상당수 많은 개발자들이 미리 구현해서 오픈하거나 공개하는 경우가 많다.
# print("cell:", cell.output_size, cell.state_size)

x_data = np.array([[h,e,l,l,o]],dtype=np.float32)
# print("x_data:", x_data)

output, _states = tf.nn.dynamic_rnn(cell, x_data, dtype=tf.float32)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

    print('output: ',output.eval())
    
eval() : 내부에서 자동적으로 tensor들의 동작이 되어지고 출력되지는 결과값 들을 return 시킨다.

 

입력값이 1x2 행렬이고 , RNN 의 상태값이 1x3 의 행렬일 경우 , W 는 총 5 개의 행을 가지게 됩니다