본문 바로가기

발표

[소학회 RNN 발표 자료]


RNN 발표


<목차>

▷ 1. RNN이란?

 

 2. RNN의 구조와 동작원리

 

 3. RNN 예제

 

 4. RNN 활용

 

 5. RNN 구현(Tensorflow)

 

 6. RNN 구현2(many to one)

 

 7. 당일과제


더보기

▷ 1. RNN이란?

 

순환 신경망(Recurrent Neural Network) RNN. 입력과 출력을 시퀀스 단위로 처리하는 모델

    즉, 순차적 데이터(시퀀스 데이터)를 학습하는 데에 특화된 형태의 인공 신경망.

 

시퀀스 데이터(순차적, 연속적 데이터, Sequential Data) ↔ Non-Sequential Data

   → 시퀀스 데이터란 데이터 내의 각 요소가 순서를 가지고 배열된 데이터.

       ex) 주가 변동, 모션, 동영상 프레임데이터), 음성 데이터, 연속된 문서 텍스트

 

- 왜 RNN이어야 하는가

  → 시퀀스 데이터는 순서와 연속성의 특성을 가지고 있고 앞 뒤 데이터가 서로 연관관계에 있기에

      이를 고려하지 않은 기존의 NN, CNN 모델로는 구현이 어려움.


 

더보기

 2. RNN의 구조와 동작원리

 

RNN은 기본적으로 순환적 구조(형태)를 가짐.
   내부에 sequential(순차적)한 Hidden State가 존재하고 이 HS가 다음 값을 계산할 때

   영향을 주는 형태로, 순차적 데이터를 처리해야 하기 때문에 어떤 시점에서

   해당 값을 계산할 때 이전의 값들이 영향을 미친다는 뜻임.

 

   이전 상태의 정보가 포함되어 현재 출력 Y에 반영되므로 앞 뒤 상황의 연관성을 나타낼 수 있게 되는 것.

 


RNN은 state가 있어서 이를 계산하고, 이 값을 토대로 y를 계산해나가는 구조임.
새로운 state를 구할 때는 이전 RNN 셀의 old state를 입력으로 사용함.

또한 모든 스텝마다 항상 같은 함수가 사용됨.

 

 

연산 시에는 WX 형태를 활용하는 것을 생각해볼 수 있는데 입력이 두개니까 각각의 W를 만들어주어서
각각 곱하고 더하여 tanh(rnn에서 잘 동작하는 함수)에 넣어주면 그 값이 현재의 state 값이 됨.


계산된 ht는 다음 스텝에 쓰임과 동시에, 출력에 쓰일 Why 가중치 값을 곱하면 y값(출력)이 됨.

※ 이때 세 개의 W 가중치 값은 각각 다를 순 있지만, 스텝이 바뀔때는 변화없이 값을 그대로 준다는 것이 특징임.


→ 한 스텝에서 출력값 형태를 보면 ht가 있는데, 이는 잘 생각해보면

    그동안 ht-1, ht-2 ...가 다 반영되었다는 의미로 순차적 데이터가 연속적으로 잘 처리되었다(쌓였다)는 것임.

 

 

- 왜 tanh 함수를 활성화 함수로 사용하는가

  → 역전파를 통해 Gradient를 역으로 보내서 가중치를 업데이트해가는 방식에서
      RNN이 본질적으로 가지는 문제Vanishing Gradient Problem이 발생함.

   이는 RNN이 구조상 연속적이고 순차적이어서 층이 많으며 스텝이 진행될수록 더 깊어지기 때문에,
      본질적인 특성에서 야기된 문제이므로 아예 없앨수는 없고 이를 최소화하기 위해 적합한 tanh를 사용함.

      (sigmoid는 더 많이 소실될 수 있고, ReLu는 양수에서 발산하기 때문에 tanh가 가장 적합.)

 


더보기

 

 3. RNN 예제

 

특정 글자 입력 시 그 다음으로 올 글자를 예측하는 모델 구현 예제

→ 문자열 시퀀스 1, 2, ..., t-1을 통해 다음에 올 문자 t를 예측(ex : 연관검색어 입력)

"hello"를 학습(h→e , e→l, l→o)시켜서 구현해볼 수 있음.
    사용할 문자는[h, e, l, o]이며, "hello"의 경우 한 글자씩 입력으로 생각함.

 

먼저, 문자 하나하나가 원핫 인코딩 과정을 거침.

input layer에서 문자가 해당하는 자리에 1을, 나머지는 0으로 정해줌.

(input lyaer는 위에서부터 순서대로 'h', 'e', 'l', 'o'의 값을 가지고 있다고 설정함.)

 

 

 

이를 RNN 모델에 입력해줌.

첫 번째 스텝(셀)의 경우 이전 state(ht-1)가 없기 때문에 이전 값 h0을 0으로 두고 시작함.
입력에 W_xh 가중치를 곱한 값이 HS(Hidden state)의 값으로 도출됨.

 

두 번째 스텝(셀)의 경우 이전 state의 값에 W_hh를 곱해준 값과
현재의 입력값 x에 W_xh를 곱한 값이 더해져서 계산됨.

 

 

 

 

다음으로 Y(output layer)을 구해주기 위해 hidden layer에 W_hy 가중치를 곱해줌.

 

 

output layer(출력층의 네 개의 값)에서 softmax를 취한다는 개념으로 생각하면,
가장 큰 값에 해당하는 결과에 높은 확률을 부여해 그에 맞는 최종적인 출력 문자가 결정됨.
(이 때 물론 틀린 결과가 나올 수도 있음.)


결과적으로 이런 형태로 모델을 계속해서 학습시키면 우리가 원하는 시스템(문자 예측)을 완성시킬 수 있음.

 


더보기

 4. RNN 활용

 

RNN은 다양한 분야에서 활용될 수 있다.

  1. Language Modeling
  2. Speech Recognition(음성 인식)
  3. Machine Translation(어떤 시퀀스 데이터를 입력하면 새로운 시퀀스 데이터로 출력하는 개념)
  4. Conversation Modeling/Question Answering(대화, 질문 자동 생성)
  5. Image/Video Captioning
  6. Image/Music/Dance Generation

 

또한 RNN 모델을 활용할 때는 다음과 같은 여러가지 형태로 구성될 수 있음.
(one to one의 경우는 일반적인 Vanila Neural Networks를 뜻함.)

one to many의 형태는 대표적인 예로 Image Captioning이 있음.

→ image 형태의 입력을 해당 이미지의 특징을 말해주는

    sequence of words(문자열. 연속적 단어의 조합)로 출력할 수 있음.

 

many to one의 형태는 대표적인 예로 Sentiment Classification이 있음.

 여러 단어(문자열)의 입력을 sentiment의 하나의 출력으로 뽑아낼 수 있음.
   (출력 : 이 문장은 슬픈 문장이다.(Negative) / 이 문장은 기쁜 문장이다.(Positive))

 

many to many의 형태는 대표적인 예로 Machine Translation이 있음.

 어떤 문자열이나 단어의 조합 형태의 입력을 새로운 문자열 형태로 출력할 수 있음(ex : 번역)
   + Video classification on frame level도 예시로 들 수 있는데,
      이는 영상의 프레임 단위의 입력을 비디오를 설명해주는 형태의 출력으로 뽑아낼 수 있음.

 


더보기

 

 5. RNN 구현(Tensorflow)

* Tensorflow 2.0 기준

먼저 tf keras에 포함된 api들을 로드한다.
(구현에는 두 가지 방식이 있는데, 첫 번째 방식은 RNN, LSTM, GRU등 특정 Cell을 선언 후

이를 루프하는 코드를 활용하는 방식이고, 두 번째 방식은 위 두 가지를 결합한 API를 활용하여

구현하는 방식이다.)

 


먼저 입력이 될 예제 데이터로 'h', 'e', 'l', 'o'의 문자가 원핫벡터(one-hot encoding)로 주어져 있다.

첫 번째로 h에 해당하는 한 알파벳만을 데이터로 RNN이 처리하는 과정인데,

shpae이 다음과 같은 이유는 텐서플로우에서 RNN이 입력으로 전달받는 데이터는

(Bath size, sequence length, input dimension)으로 표현되도록 전처리되어야 하기 때문이다.

※ ('h' 한 글자는 sequence length가 1이다.)

hidden_size가 2이므로 출력의 shape이 (1,1,2)임을 확인할 수 있다.

 

 

'h' 값을 RNN이 처리할 수 있도록 전처리 해준다.

 

다음으로 hidden_size가 2인 RNN을 생성한다. 그 후 전처리한 데이터를 RNN에 입력으로 전달한다.

 

RNN이 처리한 결과를 프린트해볼 수 있다.
여기서 outputs변수와 states변수가 값은 같아도 shape의 차이가 생기는 이유는
outputs 변수는 전체 과정(시퀀스)에 해당하는 HS(hidden state)의 값을 가지고,
states 변수는 마지막 HS의 값만 가지고 있기 때문이다.

 

 

이번에는 시퀀스(sequence length)가 1이 아닌 데이터를 RNN으로 처리하는 과정이다.
처음 설명했듯이 예제 데이터는 다음과 같고, RNN이 'hello'라는 알파벳 시퀀스를 입력 받아서 결과를 출력한다.

 

 

여기서 outputs 변수의 맨 마지막 값과 states 변수의 값이 같은 것을 확인해볼 수 있다.

 


더보기

 6. RNN 구현2(many to one)

 

먼저 하나의 문장을 단어의 시퀀스라고 생각하고, 이 문장을 단어 단위로 tokenization해준다,
그리고 이 데이터를 RNN에 활용하여 각각의 토큰을 읽어들이는데
감정을 표현하는 마지막 토큰(단어)를 읽었을 때 문장의 P/N을 분류하는 모델을 구현해본다.
→ many to one을 활용할 수 있는 대표적인 예시임.

 

 

이때 문장의 단어들을 tokenization해주면, 이는 숫자 형태의 값이 아니라 RNN이 바로 처리할 수 없다.

따라서 이런 자연어 처리를 해줄 때는 토큰(단어)을 적절하게 변환해주는 Embedding layer가 존재한다.


따라서 각각의 토큰을 RNN이 처리할 수 있도록 만들어주면, RNN은 토큰을 순서대로 읽어들이고

마지막 토큰을 읽었을 때 나온 출력과 정답간의 loss를 계산하여 이를 기반으로

역전파 알고리즘(Back Propagation)을 통해 학습시키는 것이 일련의 과정이다.

 

 

본격적인 구현 코드는 아래와 같다.

 

데이터 전처리가 우선이 된다.
예제 데이터 단어가 주어져 있고, 이에 대한 긍/부정 정답이 있다.(1은 긍정, 0은 부정)

각각의 단어를 char의 시퀀스로 봐야 하는데, 이를 위해서는 하나의 char(알파벳)과
연결되는 정수 index의 dictionary가 만들어져야 하므로 다음과 같이 정의해준다.

또한 모든 인공지능 학습에서는 배치 단위 학습이 효과적이기 때문에,

RNN을 구현할 때 데이터가 서로 다른 길이를 가졌을 경우 이를 맞춰주기 위해 pad라는 토큰을 사용한다.

데이터의 확인 차 출력 결과를 보면 각각의 토큰이 integer index와 매핑이 되어있는 형태다.

 

 

따라서 생성한 토큰 딕셔너리를 기반으로 단어를 integer(정수) index의 시퀀스로 변환할 수 있다.

x_data를 출력해보면 정상적으로 숫자로 변환됐음을 확인할 수 있다.
→ 'good'의 경우 매핑되는 정수가 6, 7, 7, 4이다.

pad_sequences 함수를 통해서 max_sequence(10) 변수만큼의 길이로 변환해준다.
이 함수는 기본적으로 0 값으로 데이터를 패딩한다.

 

 

Embedding layer를 통해 토큰을 원핫벡터로 표현한다.
특정 토큰의 정수 index에 해당하는 값만 1, 나머지는 0인 벡터이다.


'mask_zero' 파라미터 설정을 통해 이 전 과정에서 0 값으로 패딩된 부분을 알아서 연산에서 제외할 수 있다.

이후에는 RNN 모델을 로드하고 Dense를 이용해 최종적으로 분류함으로서 모델을 완성할 수 있다.

 

 

생성한 모델을 트레이닝하기 위해 모델의 출력(model(x))과 실제 정답(y)을 비교하는 loss_fn을 생성한다.
예제는 분류(Classification) 문제이기 때문에 cross_entropy loss를 계산하는 함수를 활용한다.
y가 integer(1 or 0)이기 때문에 이를 처리해줄 수 있는 텐서플로우의 기능을 활용한다.

트레이닝 해주기 위한 값들을 설정해주고 데이터셋을 준비한 뒤 모델을 트레이닝한다.
진행 중 중간중간 loss 값을 확인해볼 수 있고, 최종적으로 100%의 정확도를 확인할 수 있다.

 

 

 


더보기

 7. 당일과제

1. 다음 세 개 항목이 맞는지 틀리는지 O, X를 구분하시오.

- RNN은 sigmoid 함수를 사용한다. (  )

- RNN에서 사용되는 가중치 값들은 층이 쌓이면서(진행되면서) 값이 계속해서 변한다. (  )

- 시퀀스 데이터는 순서와 연속성을 가지며 앞 뒤 데이터가 서로 연관관계에 있다. (  )

 

2. RNN이 활용될 수 있는 분야를 세 가지만 적어주세요.