딥러닝 논문/논문 읽기 스터디

순환신경망에 대하여(2) - 순환신경망의 순환과정

에멜라 2023. 4. 23. 23:50

https://emela12.tistory.com/37

 

순환신경망에 대하여(1) - 순환신경망의 필요성

이와 관련한 포스팅 목적은 대표적 순환신경망 모델들에 대한 간단한 이해를 위해 작성되었다. 순환신경망이 뭐지 하고 구글에서 다음과 같은 이미지로 순환신경망을 마주친다면, 사실 이해가

emela12.tistory.com

 

우리는 이전 포스팅에서, 순서형 데이터에 대해서 크게 두가지의 필요성을 느꼈었다.

 

1. 순서 정보에 대한 데이터를 모델이 기억할 필요가 있음.

2. input 길이와 output 길이를 기존에 정해두는 것이 아닌, 상황에 맞게 유동적으로 쓸 필요가 있음

 

그리고 이러한 문제들을 처리하는데 있어 기존의 피드 포워드 신경망 및 회귀모델은 한계가 있었음을 알 수 있었다. 이러한 문제들에 대해서 순환신경망은 어떻게 해결해 나가는지, 또 어떻게 동작하는지 알아보자.

 

 


 

순환신경망의 순환 구조 이해하기

 

데이터가 순서를 지닌다는 것에 대해 조금 더 생각해보자. 이전에 설명했던 시계열 데이터의 일종인 주식데이터 기준으로 생각해보면, 오늘날의 T 시점의 주식가격을 예측하기 위해 우리는 과거의 주식 가격과 추세를 사용하여 예측하고자 함을 알 수 있다. 

 

이때 명확하게 짚고 넘어가면 미래 시점인 T+1, T+2, ... 등의 정보는 지금 현재 T 시점에서 알수도 없고, 활용할 수도 없다. 즉 우리는 순차 데이터에서 예측을 위해 수집 가능한 과거 시점의 추세만을 가져올 수 있는 것이다. 그러면, 우리는 주어진 y1 (우리가 가져올 수 있는 가장 오래된 데이터) 부터, yt (우리가 예측하고자 하는 가장 최근 시점의 데이터) 까지의 예측을 아래와 같이 단순화 할 수 있다.

 

 

y2  :  y1 을 이용해 예측

y3  :  y2, y1 을 이용해 예측

...

yt  :  yt-1, yt-2, yt-3, ... y2, y1 을 이용하여 예측

 

 

이를 그대로 피드 포워드 신경망에 단순히 넣어보면 아래와 같다. 

 

 

 

 

여기서 보다시피, 과거 데이터를 모조리 yt 의 예측에 활용할 때, 최종적인 output node 와 hidden state node는 고정시킬 수 있지만 input 크기가 계속해서 달라져야 하는 문제가 발생한다. 그러면 이를 조금더 고안하여 모든시점의 계산에 대해 하나의 일반화된 방식으로 표현할 수는 없을까?

 

 

 

여기서 크게 두가지의 발상을 생각해보자.

 

첫번째로 재귀적 성질을 이용하자는 아이디어가 있을 수 있다. 먼저 y1에 대해서 살펴보면, 이는 y2 를 예측하는데 사용되고, 또 y2와 함께 y3를 예측하는데 사용되며, y2, y3 와 함께 y4를 예측하는데도 사용된다. 그런데 이는 조금 비효율적인 방식이다. 왜냐하면 y1으로 예측한 y2 예측값에 이미 y1 에 대한 정보가 반영되었기 때문이다. 그러므로 y3를 예측할 때 y1을 그대로 쓰기보다 y2를 예측할 때 쓰였던 y1에 대한 정보를 그대로 활용한다면 이는 계산과정을 더 줄일 수 있는 방식이 될것이다. 그러면 이를 연쇄적으로 적용하여, y4를 예측할때는 y3를 예측할때 썼던 y2 정보와, 그리고 그안에 담겨있던 y1에 대한 정보까지 받아올 수 있을것이다.

 

 

y2  :  y1 을 이용해 예측

y3  :  y2, y1 을 이용해 예측

...

yt  :  yt-1, yt-2, yt-3, ... y2, y1 을 이용하여 예측

 

=>

 

y2  :  y1 을 이용해 예측

y3  :  y2, y2_pred_information 을 이용해 예측

y4  :  y3, y3_pred_information 을 이용해 예측

...

yt  :  yt-1, yt-1_pred_information 을 이용하여 예측

 

 

또한 한가지 생각해 볼 수 있는 점은, 먼 시점의 과거 데이터보다, 현 시점과 매우 가까운 최근 가격 동향이 오늘날의 시점의 데이터에 영향을 많이 끼치는 것 역시 생각해 볼 수 있다. 특히 이전시점의 데이터에서 다음시점의 데이터에 미치는 영향이 가장 클 것이다.

 

그러므로 우리는 다음과 같이 데이터를 예측해보자. T 시점의 예측을 시행하기 위해 T-1 시점의 데이터(T시점에 가장 영향을 많이 미치는 데이터)와 T-1 시점까지 이어져 온 과거의 데이터 정보(재귀적 방법을 통해 얻어온 과거데이터) 두가지를 사용하여 예측하는 아래와 같은 방식을 생각해볼 수 있다. 

 

 

즉 다시 풀어 설명하자면, 이전시점에서 y1과 선형결합을 실시한 두개의 hidden state 의 node 들은 y1 정보를 그대로 가지고 있으므로, y3 예측에 y2와 함께 input으로서 hidden state 의 node 계산에 이용되며, 이때 계산에서 사용된  hidden state 의 node 들은 y1과 y2의 정보를 담고 있으므로 y3와 함께 y4를 예측하는데 계산된다.

 

 


 

이제 어느정도 납득이 될것이다. 이것으로 순환신경망에 대한 발상은 끝났다. 

 

근데 잠깐, 어....그래서 순환은 언제한다는거야?

 

사실은 이해를 위해 그림에서는 input 노드와 이전 시점의 hidden state 의 위치를 맞추어 곂겹이 쌓았지만, 사실 저 모델은 하나의 rnn 모델 안에서 일어나는 일이다. 즉 y2를 예측하고자 하는 시점의 hidden state를 계산과정에서 그대로 가지고 있다가, y3를 예측할때 그대로 재사용하는 셈이다. 이는 아래와 같이 표현 가능하다. 

 

 

 

 

 

자, 이제 정말 많이 돌아와서 다시 처음으로 돌아가자. 우리는 처음의 단 하나의 순환고리로 연결된 아래와 같은 그림을 이해하기 위하여 많은 길을 돌아왔다. 이제는 이 그림을 보고 이 모델이 어떻게 돌아가는지, 그리고 왜 필요한지에 대해 깨닫게 되었다. 자 그럼 추가적으로, 이 포스팅의 첫 문제를 우리 모델은 해결했을까?

 

1. 순서 정보에 대한 데이터를 모델이 기억할 필요가 있음.

2. input 길이와 output 길이를 기존에 정해두는 것이 아닌, 상황에 맞게 유동적으로 쓸 필요가 있음

 

1번의 경우, 더 먼 과거 데이터 정보일 수록 input으로서 계속해서 가중치를 곱해지며 순환하므로, 각 순차에 들어간 데이터까리의 구분이 이제는 가능해진다. 2번의 경우에도, 모델이 과거정보를 계속 기억하고 있는 한 계속해서 순환이 가능하므로 해결 가능하다.

 

 

 

 

 


 

사실 너무나 길고 길었던 포스팅이였다..ㅎㅎ;

원래는 Seq2Seq 논문리뷰를 위해, 먼저 인공지능을 처음 배우고, rnn을 처음 배우는 분들께 쉽게 알려드리고자 수식 없이 바닥부터 써내려가기 시작했는데, 그러다 보니 다른 책에서는 두 문단으로 된 내용을 길게 풀어쓰는 꼴이 된것 같다.

 

그러나 사실 실제로 공부해보면 너무 전문분야다 보니, 책의 글로만 공부하기에는 용어들도 너무 어렵다. 또 나는 쉽게 이해가 되던데 하시는 분들도, 실제로는 그 단어들의 의미, 문장들의 의미를 상대적으로 가볍게 지나가는 분들이 많다고 생각한다.  

 

이정도로 풀어 쓴 글은 어디에도 없기도 하고, 또 통계 개념과 엮어서 설명하고자 시도했기에, 사실 그에 따른 변변한 참고 문서 하나 제대로 없이 작성된 글이기에 작성에 신중을 기하게 됐다. 혹여나 설명이 너무 부족하게 넘어갔거나, 이해가 충분히 됐는데도 반복된 설명이 있거나,  또는 잘못된 부분이 있다면 피드백 후에 다음에는 꼭 더 다른사람들에게 도움이 되는 방향으로 수정해 나가고 싶다.