안녕하세요. 문범우입니다.
이번 포스팅에서는, 그 동안 배운 RNN 내용을 통해서, RNN을 보다 wide하고 deep하게 만들어 보도록 하겠습니다.
* 해당 포스트의 모든 내용은 김성훈 교수님의 '모두를 위한 딥러닝'을 바탕으로 제작되었습니다.
관련한 상세 내용은 아래 링크를 참고해주세요.
1. Long sentence
우리가 지난 번 내용을 통해 'hihello'라는 문자열에 대해 RNN을 이용하여 문자열을 예측하는 모델을 구성해 보았습니다.
그럼, 이러한 모델이 아래와 같은 긴 문장에서도 잘 작동할까요?
결과는 No. 입니다.
위와 같은 긴 문장은 우리가 그전에 만들어보았던 모델에서 제대로 작동되지 않습니다. 왜 그럴까요?
간단하게 생각해보면, 우리의 모델이 보다 wide하거나 deep하지 않기 때문입니다. 즉, 위와 같은 긴 문자열을 다루기에는 우리의 모델이 너무 작습니다.
그럼 당연히 생각해볼 문제는, 우리의 RNN 모델을 더 쌓을수는 없을까? 입니다.
2. Wide & Depp RNN
그럼 RNN 모델을 어떻게 쌓을까요?
이는 어렵지 않습니다.
기존의 코드를 크게 수정할 필요도 없습니다.
이를 Stacked RNN 이라고 하는데, 위의 코드에서 보시다 시피 이전의 코드와 같이 cell을 만드는데 그 아래에서 MultiRNNCell이라는 함수를 새롭게 사용하고 있습니다.
해당 함수를 통해 우리가 얼마나 RNN을 쌓아올릴지 손쉽게 구성할 수 있습니다.
3. Softmax layer
또한 우리가 CNN을 알아보면서 Softmax layer를 사용했던 것처럼, 우리의 RNN모델을 통해 나온 결과를 그대로 사용하지 않고 그 뒤에 Softmax layer를 붙여주면 보다 더 잘 작동할 것 입니다.
이를 위해서 위의 그림과 같이 RNN 모델에서 나오는 결과 값을 softmax 에 넣기 위해 reshape을 진행합니다. 즉, X_for_softmax 를 먼저 만들어주고 이를 softmax layer를 통과시킨후 outputs으로 펼쳐줍니다.
이를 실제로 코드로 살펴보면 위와 같습니다.
위에서 말했던 것처럼, X_for_softmax에 RNN의 outputs를 넣어주며 reshape을 하고 softmax의 w와 b를 정해줍니다.
w를 정할때 입력사이즈(hidden size), 출력사이즈(num classes), 즉 우리가 예측하고자 하는 것의 one-hotd의 크기를 넣어줍니다.
그리고 bias의 값에는 출력사이즈를 넣어줍니다.
이렇게 softmax layer를 통과시키고 나서 다시한번 reshape를 통해 결과를 펼쳐줍니다.
그리고 이러한 outputs를 우리의 sequence_loss에 넣어줍니다.
이전에는 사실, RNN의 결과로 나온 outputs를 그대로 넣었는데 그 값들은 state 값을 가지고 있기 때문에 사실상 틀린 것 입니다. 위와 같이 softmax layer를 통과시켜서 나온 output을 logits으로 넣어주어야 합니다.
그리고 마지막에는 그전과 같이 훈련을 시켜주고, 결과를 출력해주면 됩니다.
'AI & BigData > 모두를 위한 딥러닝(정리)' 카테고리의 다른 글
텐서플로우(Tensor Flow) #20_ Dynamic RNN (0) | 2018.05.27 |
---|---|
텐서플로우(Tensor Flow) #18_ RNN으로 'hihello' 학습하기 (0) | 2018.05.24 |
텐서플로우(Tensor Flow) #17_ RNN Basic (0) | 2018.05.20 |
딥러닝(DeepLearning) #9_NN의 꽃, RNN(Recurrent Neural Network) (0) | 2018.05.17 |
텐서플로우(Tensor Flow) #16_ CNN으로 MNIST 99% (0) | 2018.05.13 |