머신러닝

Recurrent Neural Network의 Sequence 데이터 입력

coding art 2019. 2. 25. 16:01
728x90

파이선 코딩을 배우는 초보자도 머신 러닝에 한번 도전해 보자.

머신 러닝을 배우려는 파이선 코딩 초보자들이 가지게 될 의문점들을

하나하나 찾아내어 실제 풀어보고 결과를 확인해볼 수 있는 머신 러닝!

인터넷 교보문고에서 450페이지19900원에 판매중입니다.
















단 하나의 데이터만 입력하여 처리해도 뭔가 출력은 얻어질 수 있으나 그 다음에 입력해서 처리해야 할 데이터와의 아무런 관계 설정이 없음을 알 수 있다. 이런 간단한 cell 구조를 바닐라(Vanila) 셀이라고 한다. 따라서 RNN 코드를 작성하기 위해서는 하나의 cell 로 표현된 뉴럴 레이어를 글자 수만큼 펼쳐서(Unfolding) 첫 번째 cell에서부터 계산된 내부 데이터를 다음 cell로 이전시켜 이어지는 셀에서 입력된 데이터를 처리하는 과정에 반영해 나가야 할 것이다. 그렇게 함으로서 앞에서 입력된 글자와 그 다음에 입력되는 글자 사이에 관련성이 개입되게 된다.

 

다음 그림의 예에서는 영어 알파벳 문자 하나에 대해서 4자리 수로 one hot encoding 하여 뉴럴 네트워크에 입력하여 학습시키게 되면 2개의 성분들이 출력 되며 뉴럴 레이어 내부에서 연산된 웨이트(weight) 값들이 그 다음 단계로 이전되는 모습을 보여준다.

 

순차적으로 펼쳐진(Unfolding) RNN 레이아웃에서 “hello” 라는 단어를 학습시키도록 하자. 각 문자는 이미 one hot encoding 기법으로 표현이 가능하며 5개의 글자를 한 단위로 sequence_length = 5 로 설정하는데 이런한 문자 단위들이 여러 묶음 입력 될 경우 batch_size 로 둘 수 있다. 이 문자 데이터가 batch_size = 1 이고 sequence_length = 5 라면, 3차원 형태로 shape=( 1, 5, 4 )로 정의할 수 있을 것이다.

 

뉴럴 레이어의 출력 데이터는 임의로 2개로 설정하였지만 그 갯수는 사용자가 임의로 설정이 가능하다. 어차피 머신 러닝이란게 학습 단계를 거쳐야 하므로 출력 정보가 어떤 값에 수렴하는 것을 확인할 수 있도록 처음에는 한 자리 숫자로 설정하는 것도 좋은 방법인데 여러 번 학습 진행에 따라서 출력 값의 수렴하는 성향을 쉽게 모니터 해 볼 수 있는 장점이 있다.

 

반면에 출력 단계에서 Softmax를 사용하여 출력 값이 어떠한 문자를 의미하게 되는지 확률적으로 판정하려면 사용하는 문자 단어장(vocabulary) 규모 즉 여기서는 “h”,“e”,“l”,“o” 4 글자에 맞춰 4로 설정하는 것이 좋을 듯하다. 반면에 뉴럴 레이어의 출력 수는 일반적으로 Wide 하면서 Deep 하게 상당히 큰 값으로 택하는 경향이 있으나 가급적 최소화 하여 앞서 언급했던 문자 단어장 규모보다 조금 큰 정도가 좋을 것이다.

 


출력을 시켜보면 아직은 학습을 진행하는 단계가 아니기 때문에 즉 초기에 뉴럴 네트워크에 난수를 설정하는 단계이므로 입력 벡터인 x_data 와 초기에 생성된 랜덤 number 와 곱해진 임의의 랜덤한 값이 hidden_size에 맞춰 출력된다. 위 그림의 상단에 출력 사례를 보기 바란다.

 

따라서 학습을 시키려면 learning rate 값 설정과 아울러 학습 횟수를 지정해 주어야 하며 동시에 학습 목표로서 실 예를 들면 MNIST 문제에서는 수기 문자 데이터와 함께 class 라벨 명에 해당하는 one hot codeplacehoderfeed_dict{X: x_data Y: y_data} 형식으로 처리하듯이 주로 one hot coding 된 목표 값을 부여해야 한다.

 

코딩해야 할 cell 의 종류로는 가장 기본적인 BasicRNNCell을 사용하고 있으나 BasicRNNCell 에 비해 파라메터가 좀 늘어나는 RNN에서 가장 폭 넓게 사용되는 BasicLSTMCell로 교체해서 사용하도록 하자.

 

앞으로 여러 개의 문자열로 이루어진 Batch 데이터 입력 준비 단계를 거쳐 학습 단계로 넘어가기로 하자.

 

#cell_02.py