[DeepLearning]Part-4 Recurrent Neural Network

Source: Deep Learning on Medium

[DeepLearning]Part-4 Recurrent Neural Network

CNN에서는 이미지와 같이 연속적이지 않은 데이터를 학습 시킬수 있었지만, 대화를 주고받는 챗봇과 같은 데이터를 학습시킬수 없었습니다.
따라서 RNN 에서는 자연어와 같은 Sequence data를 학습시키기 위해 탄생하였습니다.

위의 그림과 같이 입력 X가 주어지게 되면 W와 곱해지면서 A라고 적혀있는 곳에서 State 값이 구해지며, 이 State는 아래그림과같이 다음 A구역에 old state로 인자값이 주어지게 됩니다. 결과 적으로 RNN은 이전 단계에서의 state와 현 단계의 input 인 x 를 받아 각각의 W를 곱해 연산합니다.
다른 NN과 달리 RNN은 전 과정에서 X에 곱해지는 W, oldstate에 곱해지는 W, output을 구해주기 위해 곱해주는 W값은 각각 동일합니다.

자연어와 같은 입력 값을 RNN에 학습시키려면 숫자형태의 데이터이어야 합니다. 따라서 input 과정전, one-hot encoding 과같은 embedding을 거치게 됩니다.

RNN은 input값의 개수와 output 값의 개수에 따라 여러 종류로 나뉠 수 있습니다.

각 종류의 예시를 들어보겠습니다.
one to one : vanilla NN 과같이 한개의 문자를 넣었을때 다음 글자를 예측해주는 방법

one to many : image를 입력했을때 이미지 속 각 부분에 의미를 부여하는 방법

many to one : 댓글을 입력하고 이 댓글이 긍정인지 부정인지 결과로 도출

many to many : 영어를 한글로 번역해 주는 것

many to many : Video classification on frame level

Many to many Bidirectional

기존의 RNN의 방법을 사용하게 되면 첫번째 입력의 RNN은 이전 state가 존재하지 않기 때문에 input 값의 정보에 의해서만 계산되며 단계가 늘어날수록 각 단계마다 참조하게 되는 정보의 양이 차이가 나게 됩니다.

이러한 정보의 편차를 조정하기 위해 RNN 의 반대 방향으로 layer를 한층 더 쌓는 것이 bidirectional 방법입니다. 결과로 각 RNN은 같은양의 정보를 가지고 결과값을 도출할 수 있게 됩니다.

Sequence to Sequence

기존 RNN과의 차이점은 Encoder와 Decoder 를 통해 encoder를 통해 vector 값을 받아 decoder에 참조하여 사용하게 됩니다.
예시로는 챗봇과 같은 자연어 에서는 모든 문맥상 흐름에따라 다음 문장의 의미가 달라지게 되는데 이전의 대화의 내용에따라 다음 대화에 영향을 줄 수 있는 것입니다.

하지만 위 그림상의 C 라는 한개의 vector로 이전의 data를 모두 대변할 수 없는 문제가 생기기 마련입니다. 이러한 문제점을 해결하기 위하여 Attention이라는 개념이 있습니다. 문장에서의 중요한 정보들을 사용하는 것이라고 할수도 있습니다. Attention의 적용으로는 앞서 encoder에서 한가지의 vector가 결과로 나왔지만 attention에서는 encoder 속 각 단계의 결과에 attention weight를 곱해주고 난 후, 그값에 softmax와 cross entropy 를 이용해 context vector를 구합니다. 이 vectore를 decoder의 각 단계의 또하나의 인자값으로 주어 영향을 주게합니다.

Review

tensorflow와 keras의 문법이 익숙하지 않기 때문에 code 실습 부분에서의 이해가 더뎠습니다. 각 code의 단계를 읽어가면서 code가 어떠한 역할을 수행하는지 이해하고 넘어가는 방법을 택했습니다.

DNN,CNN의 기본개념과 적용에서는 각 인자들의 설명이 상세하게 되어있었지만, RNN의 강의들 속에서는 RNN의 개념, 적용분야 등의 설명이 있지만 각인자들의 형태,역할에 대한설명이 부족하여 전체적인 흐름을 이해하는데 어려움을 겪었습니다.

김성훈 교수님의 강의와,이진원님의 강의가 매우 자세하고 쉽게 되어있어 아주 쉽게 이해할 수 있었습니다.

이진원님이 강의한 코딩 작성의 전사적인 작업을 단계별로 나뉘어 구성하는법과 진행 방법을 알려주어 다른강의에서 경험했던 개념만 이해하고 코드로 작성하지 못했던 것과 다르게 쉽게 이해를 했습니다.

DNN,CNN,RNN의 프로젝트 진행을 통해 각 단계를 다시한번 이해하고 손코딩을 하는 작업을 하며 복습이 필요합니다.

하이퍼 파라미터의 설정 방법에 대한 방법은 자세히 설명되어있지는 않았습니다. 하이퍼 파라미터의 값을 어떻게 결정하냐의 따라서 모델의 성능이 결정되는 만큼 하이퍼 파라미터의 설정방법과 그에따른 장단점을ㅇ 새롭게 공부하는 것이 필요합니다.