이것이 기본 구조이다. 겉보기엔 굉장히 심플? 하다.
X는 주어진 데이터의 한문장에서 분리된 한단어(토큰)이라고 보면 된다. A는 추후 나오지만 activation 단계이고, h는 결과 output이다.
키포인트는 펼쳐진 아래그림에서 볼 수 있다.
첫번째 유닛(X-> A -> h 의 계산 한번을 한 유닛으로 부르겠다.) 이 다음 유닛을 계산할 때 영향을 준다는 것이다.
가운데 노드(A) 를 hidden state 라고 칭하는데 hidden state의 값이 다음 출력값의 계산에 영향을 주게 된다.
수식으로 표현하면 아래와 같다.
이전 상태값(t-1) 과 현재 타임스텝(t)의 Input 의 계산결과(activation function) 값이 현재스텝의 상태값(hidden state)이 된다는 내용이다. 모든 스텝에서 같은 activation function 이 적용되기 때문에 저렇게 하나로 무리없이 표현이 가능하다.
좀 더 자세히 보게 되면
activation function 으로 tahn가 사용되었고( 물론 relu등을 사용할 수도 있지만 기본 RNN에서는 tahn을 사용하고 있다.)
뉴럴넷의 핵심은 결국 노드간,레이어간 최적 파라메터(w로 표현) 를 찾는 것이다. RNN에서는 세가지 파라메타가 나오는데,
첫번째는 input(X)에서 hidden-state(A)사이, 두번째는 hidden-state(A_t-1) 와 다음 hidden-state(A_t) 사이, 세번째는 hidden-state(A)와 output(h) 사이에 존재한다.
해당 weight(W) 는 모든 타임스텝에 동일하게 적용이된다.
실제 데이터에 비유하여 알아본다.
케릭터단위 언어모델을 만들어가는 과정이다. 언어모델이란 보통 해당 단어 다음에 올 단어를 맞추는 것이라 이해하면 된다.)
"hello" 라는 문장이 input으로 들어오게 되면. RNN input은 ["h","e","l","l","o" ] 가 되게 된다.
그리고 output에 대응되는 것은 ["e"," l "," l "o","end"] 가 된다. 이런 방식을 학습해 나가면서 언어모델을 만들게 된다.
그럼 어떻게 단어를 벡터화 시킬것인가? 가장 간단한 방법은 사전 기반 one-hot encoding이다.
이 사전은 데이터로부터 만들어야 한다. 여기서는 [h, e, l, o ] 를 vocabulary set으로 만든다(가정)
그리고 이 단어를 기반으로 아래의 데이터를 만든다.
h = [1,0,0,0], e = [0,1,0,0], l = [0,0,1,0], o = [0,0,0,1]. 이 데이터가 input으로 들어가게 된다.
이 input은 초기 parameter(W_xh)와 곱 해지는데 아래와 같은 계산을 통해 값을 구한다.
처음 단어(글자)는 이전 state 정보가 없기 때문에 랜덤 혹은 ㅇㅓ떤 다른방법?으로 초기화된 데이터를 이용하거나 이전 정보 없이 그대로 갈 수도 있겠다.
아래 보이는 것처럼 이전 hidden-state의 값이 다음 hidden-state계산에 관여하는 것을 볼 수 있다.
그 다음은 아래와 같이 ouput을 만들어낸다. 사이즈 역시 해당 W에 의해 결정되는데 우리는 4개의 vocab 을 이용했으므로 사이즈 4의 아웃풋이 각 노드마다 계산되어져 나오게 된다.
그 후 softmax 과정을 거쳐 (가장 큰 값의 인덱스 단어를 예측값으로 취함) 예측 한다. (위 그림은 softmax가 아닌 단순 wx+b 와 같다)
이 후 학습은 BPTT(back propagation through time) 이라고 하는데 기존 neuralnet의 학습(back propagation)과 거의 유사하지만 시간 스텝 파라미터에 대한 미분 과정이 더해진 과정이라고 보면 될 것 같다. 추 후 더 학습하고 정리하기로 한다.
참고 :http://cs224d.stanford.edu/syllabus.html
https://www.youtube.com/user/hunkims
'데이터eng > Tensorflow:MachineLeaning' 카테고리의 다른 글
K-means 를 tensorflow에서 해보기 (0) | 2016.07.03 |
---|