RNN (Recurrent Neural Network)

2021. 8. 16. 18:22카테고리 없음

    목차
반응형

probability over sequences

 

응용

Audio to Text

Text to text

 

feedforward net

   input   hidden     output
    [] -----> [] ----> []

FCL을 위와 같이 간단하게 표시 각각은 모두 vector

 

yt = f(Wyh*ht + by)

ht = f(whx*xt + bh)

 

RNN 개념

    input   hidden     output
    [] -----> [] ----> []
         ^        |
         +--------+

yt = f(Wyh*ht + by)

ht = f(whx*xt + whh*ht-1 + bh)

 

'hidden state'를 (기억) 지니고 있다는 차이점

지금까지의 입력 데이터를 요약한 정보

모든 입력 처리 후 network에 hidden state는 

sequence 전체를 요약하는 정보가 됨

 

이전까지의 기억을 바탕으로 새로운 단어를 이해

새로운 단어마다 이 과정이 반복

그래서 recurrent (순환적)이라고 함

 

 

Vanilla RNN: unfolding computational graph

    y1     y2   ....   yT-1    yT
    []     []            []    []
     |     |    ...      |     |
    []     []            []    []    <-- hidden
     |     |
    []     [] ...                     <- input

     x1     x2  ....     <-- 시간축임(기존과 달리)

데이터가 한번에 들어가는 것이 아니라, x1, x2,.. 차례대로 들어감

RNN x0, x1, x2, .....

입력의 단위 자연어처리의 경우 한 문장

 

sequence data indance 단위로 학습

 

time-series역시 instance로 학습

대신 자연어처리와 달리 sliding window 방식임

 

time series length를 잡아야 하는데, 3000 ts (time stamps)

 

uni-value의 숫자의 sequence

그런데 multi-var vector sequence가 됨

 

Bidirectional RNN

    [ ] <- [ ] <- [ ]
     |      |      |
    [ ] -> [ ] -> [ ]
     |      |      |
    [ ] <- [ ] <- [ ]
     |      |      |
    [ ] .....     [ ]

    x0             x4
    x1             x3
    x2             x2
    ..             x1

 

LSTM

같은 입력이 4곳으로 들어감

                |                             |
                v                             v
    -> [] -----[x] ------> cell ---> sig --> [x] ---> he
                          ^     |
                          |     |
                            [x]-+
                             ^
                             |
                            sig
                            ^
                            |

    ft = sig(wfx*wt + wfh*ht-1 + bf)

    it = sig(wix*wt + wih*ht-1 + bi)

    ot = sig(wox*wt + woh*ht-1 + bo)

 

RNN back-propagation이 잘 안됨

그래서 forget gate (앞의 것을 잊을래 기억할래를 ML로 학습하는 gate)

or 출력을 줄지 말지 결정하는 gate

 

그래서 sigmoid(0~1 사이 값) 기억 할래 말래를 붙임

 

ct = ft ? ct-1 + it ? tanh(Wcx*xt + Wch*ht-1 + gc)

ht = ot ? tanh(ct)

 

?는 내적에 원 씌움

 

 

sequence-to-sequence

입력 sequence와 출력 sequence를 각각 질문과 대답으로 구성하여 챗봇, 기계 번역을 만듦

Text summarization

STT등에서도 사용

 

RNN을 어떻게 조립했느냐로 seq2seq를 만듦

 

 

encoder와 decoder로 구성

 

1) encoder

입력의 모든 단어들을 순차적으로 입력 후 마지막에 이 모든 단어 

정보를 압축하여 하나의 vector로 만듦

 -> context vector

 

입력 문장 정보가 하나의 context vector로 압축

이후, 이 context vector를 decoder로 전송

 

2) decoder

decoder는 context vector를 받아 번역된 단어를 한 개씩 순차적으로 출력함

 

context vector

보통 수백이상의 차원을 지님

 

3) seq2seq encoder 구조

   +-------------------------------+
   | LSTM -> LSTM -> LSTM -> LSTM ------> context
   +-------------------------------+
      I       am       a     student



                   je      suis    etudiant   <eos>
                    ^
                    |
                 +------------------------------+
    context ---> | LSTM -> LSTM -> LSTM -> LSTM |
                 +------------------------------+
                    ^
                    |
                  <sos>    je       suis    etudiant

decoder는 < sos> 이후 

다음에 등장할 확률이 높은 단어를 예측 

 

첫 time step에서 je를 예측

를 다음 RNN cell에 입력

두 번째 시점에서는 je로 부터 suis를 예측..

이렇게 반복 <eos>까지

 

 

입력 문장은

단어 tokenization을 통해 단어 단위로 쪼개짐

 

단어 token 각각은 RNN 셀의 각 시점의 입력이 됨

모든 단어 입력 후 은닉 상태를 context vector로서 decoder어 넘김

 

context vector는 디코더 RNN 셀의 첫번째 은닉 상태로 사용됨

 

 

반응형