코딩로그
12. Recurrent Neural Network(RNN) 본문
우리가 사용하는 데이터는 시퀀스의 형태이다. 즉, 음성인식을 예로 들어보았을 때 단순히 하나의 단어를 듣고 각각을 이해하는 것이 아니라, 이전의 단어가 다음의 단어에 영향을 미치고, 또 다음 단어는 앞의 단어에 영향을 받는다. 이런 식으로 데이터가 데이터에 영향을 주기 때문에 하나의 learning set이 다른 예측 결과와 상호작용을 해야할 필요성을 느끼게 되었다. 이를 해결하기 위해 고안된 것이 바로 RNN이다.
다음처럼 하나의 learning set이 다음이 learning set에 영향을 미쳐야 한다. 이는 왼쪽과 같이 하나의 그림으로 나타낼 수 있다. 그렇다면 이걸 어떻게 수식으로 구현할 수 있을까? 알아보자.
이처럼 new state의 입력으로 x만을 받는 것이 아닌, old state도 함께 입력으로 받는 방식으로 RNN을 구현할 수 있다.
(RNN에 사용되는 모든 function, weight이 같기 때문에 다음과 같이 반복된다는 의미의 화살표를 사용하여 나타낸다.)
구체적으로 나타내보자.
1. ht(new state ment) : f(x)=wx+b가 neural net을 구성하는 데 있어 가장 주된 소스다. 따라서 다음과 같이 h(old statement)와 x에 각각 w를 곱해주고 이를 더한다. 이후 tanh라는 activation function을 사용한다.
2. yt(currnt output) : ht에 W를 곱한 형태
결론적으로 하나의 learning set은 3개의 weight를 갖게 된다.
이해하기 쉽게 예를 들어보자. character-level language model example을 갖고 예를 들 것인데, 이것은 h라는 철자를 input으로 받았을 때 다음에 올 철자, 그리고 그 다음 e라는 철자를 input으로 받았을 때 다음에 올 철자를 연속적으로 예측하는 것이다. 핸드폰이나 컴퓨터의 자동완성 기능과 같다고 생각하면 된다.
그럼 지금부터 구현을 해보자. 먼저 one-hot incoding을 통해 주어진 input 데이터를 변환시켜야 한다.
그 다음은 hidden layer를 거쳐 ht값을 도출한다. 이건 첫번째 값이므로 ht-1의 값이 존재하지 않는다. 따라서 이값은 0이라고 두도 원래의 input에 대한 wx값만을 계산하고 activation function을 통과시키는 방법으로 값을 낸다.
다음은 조금 다르다. 이전의 ht값을 ht-1값으로 두고, ht-1과 x를 input으로 받아서 새로운 ht값을 도출해낸다.
이를 반복해 모든 input chars에 대한 ht를 구한다. 그런데 여기서 끝이아니다. hidden layer의 경우는 weight값을 나타내기만 한다. 따라서 ht에 또 다른 weight을 곱해 철자의 형태인 yt를 도출해 내야 한다. 아래는 그 결과값이다.
초록색 글씨는 나와야 하는 정답 레이블이다. 즉, 초록색 값이 네개의 벡터중 가장 큰 값을 가져야 한다. 밑을 보면 두번째 값 만-1.0으로 error를 보였으며, 이외에는 모두 예측에 성공하였다.
RNN은 language modeling, 음성 인식, 번역, conversation modeling, image/video captioning 등에 사용할 수 있다.
방금의 예제에서는 다수의 input에 대해 다수의 output을 내보내는 model을 구성했다. 그러나 다음과 같이 input과 output의 수를 자유자재로 바꾸어가며 model을 만들 수도 있다.
'코딩로그 > 모두를 위한 딥러닝' 카테고리의 다른 글
11. Convolutional Neural Networks(실습) (0) | 2020.02.01 |
---|---|
11. Convolutional Neural Networks (0) | 2020.02.01 |
10. Neural Network 2: ReLU and 초기값 정하기 (0) | 2020.02.01 |
9. Neural Network 1: XOR 문제와 학습방법, Backpropagation (0) | 2020.01.27 |
8. 딥러닝의 기본 개념과, 문제, 그리고 해결 (0) | 2020.01.11 |