티스토리 뷰

카테고리 없음

RNN

비행기 매진 도우미 2017. 10. 17. 20:34





RNN 은 이전의 스테이트가 현재의 스테이트에 영향을 줄수있어야함.


시리즈의 데이터에 적합하다. 종종 위의 그림으로 표현한 것을 구글링 하면 많이 나오게 되는데. 



실제로는 이런형태가 될것임. 위에것은 간략화된 버전. 그 이유는.. 

아래의 함수를 보면 알 수 있다.


사람들이 그림 하나로 표현하는 이유는 각 상태에서 쓰이는 함수 Fw가 모든 RNN에서 동일하기 때문에

가장 기본적인 RNN 은 바닐라 RNN (검색해보길)


일상생활에서 보이는 RNN 의 예로서 

네이버검색창에 내가 평소에 관심 있어하는, 전동킥보드를 검색해보기로하였다.



이렇게 “전동” 두 글자만 입력했는데, 내가 찾고자 하는 전동 킥보드가 검색 추천으로 뜨는 것이 RNN이다. 오 똑똑해 똑똑해!


현재 글씨가 들어왔을 때 다음 글씨를 맞추는 것을 RNN 을 통해서 구현하는것이다 


아 참. One Hot Encoding 이라는 방식을 사용해서 input 인 character 형을 쉽게 Vector 로 표현가능해짐.

\

가장 유명한 예제 hello 에 적용.

여기서 Why 의 차원에 따라서 출력 Yt 의 개수가 달라진다. (행렬 곱) 몇 개의 벡터가 돼야 하나 면, 출력이 글자로 나오기를 원하는 것이니 4개로 되게 하였다.
출력 결과에 SoftMax를 적용한다.



! 그럼이제 훈련을 해봅시다.

Rnn 을 구성할때는 BasicRNNCell 이라는것을쓴다 인자로 rnn_size  Basic 말고 LSTM,GLU 도 있음. 셀은 하나의 네모상자



여기서 별표 state outputstate , 동그라미state 는 입력스테이트다, 고로 처음 시행 시 동그라미 State 에는 0 이 들어간다 (그전상태가 입력으로 없으니까). 나중에 더 많은 학습을 위해서 output state 를 또다른 rnn 에 넣을 때 사용된다.


엄청난 일을 , tensorflow 의 한줄로 가능해진 것.


빨간 네모로 친 부분을 TimeStepSize라고 한다. 가진 데이터 x_data time_step_size 으로 나누어서 split을 시킨다. X_split = tf.split(0,time_step_size,x_data)  


각각의 셀은 앞에서 사이즈를 정해 두었다. 셀을 몇 개 만들 것인가는 여기서 입력형태로 주어진다.  


Shape( 배치사이즈 , 몇 개 만들 것 인가) 4인이유는 단어가 4 개니까 . 배치사이즈는 샘플이 하나라서 1 .(이건 아직 잘 이해가 안됨


                                     여기서부터 조금 복잡하다


Sequence_loss_by_example 의 원하는 데이터 포맷에 맞춰 주는과정이다.  

Logit 에는 output이 들어간다. (결과값)



1: -1 인 이유는 hello 중에서 target  “ello” 니까. 인덱스가 1부터 끝까지.



Logits= 예상된 값.  Targets = 실제 나와야 할 값


Weight 는 모두 동일하게 tf.ones를 써서 1을줌

Sess.run(train_op) 앞서 만들어 둔 train_op 을 실행시킨다.

전체소스코드,


결과 

다른 응용들


RNN 은 이전의 스테이트가 현재의 스테이트에 영향을 줄수있어야함.


시리즈의 데이터에 적합!