함께하는 데이터 분석

[RNN] 순환 신경망 본문

데이터분석 공부/ML | DL

[RNN] 순환 신경망

JEONGHEON 2022. 9. 20. 19:29

순환 신경망의 발달 과정

순환 신경망(RNN)은 합성곱 신경망보다 먼저 나왔음

 

위키피디아에 따르면 1982년 존 홉필드가 순환 신경망의 기본적인 형태를 대중화했다고 알려져 있지만, 해당 아이디어가 이때 처음 나온 것은 아니고 이전에도 언급된 적이 있음

 

이때 만들어진 순환 신경망이 오늘날의 순환 신경망의 형태로 오기까지는 꽤 많은 시간이 걸렸는데, 발전된 연산 능력과 데이터의 증가로 인해 성과를 보일 수 있게 된 것

 

특히 발전 과정에서 나온 LSTM(long short-term memory)GRU(gated recurrent unit)같은 변형 모델들은 오늘날에도 많이 사용되고 있음

 

순환 신경망이 왜 필요한지를 살펴보면 TRIANGLE과 INTEGRAL이라는 글자는 같은 알파벳들의 나열이지만 순서가 다르기 때문에 완전히 다른 의미를 가지게 됨

 

이처럼 순서가 존재하는 데이터를 시퀀스(sequence) 데이터라고 하며 대표적으로는 우리가 사용하는 언어가 여기에 포함됨

 

주가와 같은 데이터는 똑같이 순서가 존재하지만 특별히 시간에 따른 의미가 존재하는 데이터

 

이러한 데이터를 흔히 시계열(time series) 데이터라고 함

 

여기에서 숨은 패턴을 찾아냄으로써 어떠한 상관관계나 인과관계를 찾아내기도 하고 이처럼 순환 신경망은 순서가 있는 데이터에서 의미를 찾아내기 위해 고안된 모델

 

 

 

순환 신경망의 작동 원리

앞서 살펴봤던 일반적인 인공 신경망

 

여기에 '순환성'을 추가하면 그림이 다음과 같이 변함

 

이 예제 그림에서는 3개의 입력이 들어와서 4개의 노드를 가진 은닉층 두 개를 거치는데, 여기서 노드 수를 다 1개로 바꾸면 다음 그림처럼 변함

 

즉 첫 번째 은닉층의 값이 다음번에 다시 해당 은닉층의 입력으로 들어가는 것

 

매 시간마다 새로운 입력값이 들어오고 결괏값이 계산된다고 하면, 시간 t=0일 때 이미 한 번 값들이 계산될 테고 그러면 t=1일 때는 다음과 같이 계산됨

 

t=1일 때 은닉층 각 노드의 값은 이전 시간(t=0)의 은닉층 값과 현재 시간(t=1)의 입력값의 조합으로 값이 계산됨

 

pytorch라는 단어로 예를 들면, 전에 p라는 단어가 들어왔었다는 것을 기억하고 있는 상태로 이번에 y가 들어왔을 때 다음에 나와야 할 알파벳이 무엇인지 예측하는 방식

 

이러한 경우 앞에 들어왔던 입력값에 대한 정보가 없다면 어떠한 맥락도 모르기 때문에 제대로 예측 불가

 

두 번째 은닉층에서 값들이 계산되는 방식도 마찬가지

 

그다음도 마찬가지

 

이렇게 순환하는 부분들을 시간 단위로 풀어서 보면 이제 다른 글들에서 왜 순환 신경망을 그런 그림으로 그렸는지 알 수 있음

 

이상을 정리하면 은닉층의 노드들은 어떠한 초깃값을 가지고 계산이 시작되고 첫 번째 입력값이 들어온 t=0 시점에서 입력값과 초깃값을 조합으로 은닉층의 값들이 계산

 

이 시점에서 결괏값이 도출되면 t=1 시점에서는 새로 들어온 입력값과 t=0 시점에서 계산된 은닉층의 값과의 조합으로 t=1일 때 은닉층의 값과 결괏값이 다시 계산

 

이러한 과정이 지정한 시간만큼 반복되고 일정 시간 동안 모든 값이 계산되면 모델을 학습하기 위해 결괏값과 목푯값의 차이를 손실 함수를 통해 계산하고 역전파해야 하는데 기존의 역전파와 다르게 순환 신경망은 계산에 사용된 시점의 수에 영향을 받음

 

예를 들어 t=0에서 t=2까지 계산에 사용됐다면 그 시간 전체에 대해 역전파를 해야 하는 것

 

이를 시간에 따른 역전파(backpropagation through time)라고 부름

 

이것이 그냥 역전파와 다른점을 밑의 그림에서 살펴봄

 

t가 0, 1, 2인 시점에서 각각 결괏값이 나오고 목푯값과 비교되는 것을 볼 수 있음

 

다시 단어 pytorch를 예로 들면 t=0에서 입력값으로 p가 들어오고 결괏값으로 y가 나오길 기대하기 때문에 target_0에는 y가 들어가고, 결과가 y와 같지 않다면 손실이 생길 것

 

t=1에서 y가 들어가면 이번에는 target_1은 t이고 t=2에서는 입력값이 t, target_2는 o가 됨

 

이때 모델을 학습하려면 t=2인 시점에서 발생한 손실을 역전파하기 위해서는 손실을 입력과 은닉층들 사이의 가중치로 미분하여 손실에 대한 각각의 비중을 구해 업데이트

 

하지만 이 연산 과정에서 은닉층의 이전 시점의 값들이 연산에 포함되게 되는데 이전 시점의 값들은 내부적으로 다시 가중치, 입력값, 이전 시점의 값들의 조합으로 이루어져 있음

 

순환 신경망은 각 위치별로 같은 가중치를 공유하므로 t=2 시점의 손실을 역전파하기 위해서는 결과적으로 t=0 시점의 노드 값들에도 다 영향을 줘야 함

 

즉 시간을 역으로 거슬러 올라가는 방식으로 각 가중치들을 업데이트 해야 하기 때문에 시간에 따른 역전파라는 이름이 붙음

 

가중치를 표시하면 다음과 같이 표시됨

 

이 그림에서 t=2인 시점만 떼어내 수식으로 써보면 아래와 같은 그림으로 표현

 

기본적으로 순환 신경망에서는 하이퍼볼릭 탄젠트 활성화 함수를 사용하기 때문에 이 수식에서도 하이퍼볼릭 탄젠트를 사용할 것

 

수식 부분을 살펴보면

 

여기서 w_22에 대한 기울기를 보면 h2_in을 미분하는 부분이 있는데 이를 계산해보면 h2_t=1이 나옴

 

그런데 사실 h2_t=1 값은 이전 시점의 값들의 조합으로 이루어져 있고 내부적으로도 w_22를 포함하고 있기 때문에 이 값을 제대로 미분하기 위해서는 t=0인 시점까지 계속 미분을 해야 함

 

시점별로 정리해보면 t=2 시점에서 발생한 손실은 t=2, 1, 0 시점에 전부 영향을 주고 t=1 시점의 손실은 t=1, 0에 영향을, t=0 시점의 손실은 t=0의 가중치에 영향을 주고 실제로 업데이트할 때는 가중치에 대해 시점별 기울기를 다 더해서 한 번에 업데이트함


https://www.hanbit.co.kr/store/books/look.php?p_code=B7818450418 

 

파이토치 첫걸음

딥러닝 구현 복잡도가 증가함에 따라 ‘파이써닉’하고 사용이 편리한 파이토치가 주목받고 있다. 파이토치 코리아 운영진인 저자는 다년간 딥러닝을 공부하고 강의한 경험을 살려 딥러닝의

www.hanbit.co.kr