728x90

 지금까지 기본 바닐라 RNN의 그라디언트 플로우를 보면서 그라디언트 폭증, 소멸 문제에 대해 살펴봤다. 그라디언트 소멸 문제를 고치기 위해서 사람들은 이 Vanilla RNN대신 다른 아키텍처를 사용하기 시작하였으며

 

LSTM Long Short Term Memory 장단기 메모리라고 부르는 방법을 주로 사용하고 있다. 한번 보면 다소 복잡해보이고, 햇갈리게 생겼다보니 이 식을 보면 어떻게 돌아가고 이걸로 어떻게 문제들을 푸는지 명확하게 이해하기는 어렵겠다.

 

 LSTM은 기본적으로 하나의 은닉 유닛 벡터만을 사용하는게 아니라 두 은닉 벡터를 사용하는데, 하나는 셀 상태 cell state라고 부르는 c_t와 은닉 상태 hiddent state h_t가 있겠다.

 

 이전 은닉 상태와 현재 입력을 가지고 서로 다른 4개의 게이트 값 i, f, o, g를 계산을 하고, 이 들을 이용해서 갱신된(현재의) 셀 상태와 은닉 상태를 구한다. 여기서 짚고 넘어가고 싶은건 LSTM은 1997년에 나왔다는 점인데, 10년간 잘 알려지지는 않았지만 2013, 2014년경 사람들이 LSTM 아키텍처를 사용하기 시작하면서 점점 대중화되기 시작했고, LSTM 아키텍처가 현재 시퀀스처리에 가장 널리 사용되는 순환 신경망 아키텍처가 되었다.

 

 

 LSTM에 대해서 조금 더 풀어서 매 타임스탭마다 어떻게 동작되는지를 살펴본다면, 입력 x_t와 이전 은닉상태인 h_t-1을 받겠다. 그리고 순환 신경망 처럼 입력 벡터 x_t와 이전 은닉 상태 h_t-1를 연결 concat시키고, 어떠한 가중치 행렬을 곱한다.

https://throwexception.tistory.com/1203

 바닐라 순환 신경망 Elman RNN에서 이 행렬곱 연산의 결과에다가 tanh 비선형 함수를 적용해서 현재 은닉 상태값을 계산하였었지만

  LSTM에서는 각각 크기가 H(H는 은닉층 유닛 개수)인 4개의 서로 다른 벡터를 출력할수 있도록, 행렬곱 연산을 다듬어서 출력을 계산하며 이 출력들을 게이트라고 부른다. 입력 게이트 input gate, 망각 게이트 forget gate, 출력 게이트 output gate, 더 나은 표현이 떠오른는게 없어서 게이트 게이트 gate gate로 4가지가 있다. 

 

 이 슬라이드에 행렬곱으로 출력(은닉 상태에 tanh 적용한것)을 바로 예측하기보다는 4개의 게이트를 예측한 다음에 이 4가지 게이트로 현재(갱신된) 셀 상태와 은닉 상태를 구한다. 

 

 여기서 주의해야할 점은 이 4개의 게이트들은 서로 다른 비선형 함수가 적용되는데, 입력 게이트, 망각 게이트, 출력 게이트는 전부 시그모이드 비선형 함수를 적용시키며, 그러면 0과 1사이 값을 가지게 되겠다. 게이트 게이트의 경우 tanh 함수를 통과 시키며 그러면 -1 에서 1 사이 값을 가지게 되겠다.

 

 그 다음에 c_t에 대한 식을 보면 이전 셀 상태인 c_t-1과 망각 게이트를 원소 단위 곱샘을 하는데, 망각 게이트가 0 ~ 1사이 값을 가지고 있다보니, 망각 게이트는 셀 상태의 원소들을 0으로 리셋을 시키거나 셀 상태를 순방향으로 계속 전파를 시키는것으로 이해할수 있으며 이게 망각 게이트가 하는 일이 되겠다.

 

  그리고 c_t에는 입력 게이트와 게이트 게이트의 원소 단위 곱을 더하고 있는데, 게이트 게이트는 -1 ~ 1 사이 값을 가지는 것으로 셀 상태에 쓰고자 하는 값(반영 하고자 하는 값)을 나타낸다. 입력 게이트는 0과 1사이 값을 가지는데 시그모이드 함수를 적용했기 때문이며, 게이트 게이트와 원소단위 곱샘을 함으로서 정리하자면 게이트 게이트는 1을 더하거나 -1을 빼는 역활을 하고, 입력 게이트는 그 셀의 모든 지점에서 실제로 값들 더할지 뺄지 판단하는 역활을 한다.

 

 

 

 

 이제 최종 출력 상태를 계산하기 위해서는 셀 상태를 tanh 비선형 함수에 적용시키고, 출력 게이트와 원소 단위 곱샘을 하면 되며, 이 과정이 lstm이 lstm은 셀 상태의 일부를 출력 게이트로 조작하여 매 타임스탭마다 드러낼지 말지 를 선택할수 있다. 그래서 출력 게이트는 셀 요소들을 얼마나 밖으로 내보낼지 혹은 은닉 상태로 감출치

 

 최종 출력 상태는 셀 상태를 tanh 비선형 함수에 적용 시키고나서 출력 게이트와 원소 단위 곱샘을 통해서 계산하며, 이 과정을 정리하자면 셀 상태는 lstm에서 처리되는 내부 은닉 상태로서 lstm은 매 타임 스탭마다 어떤 셀 상태를 밖으로 드러낼지 출력 게이트로 정할수 있겠다.

 

 그래서 출력게이트가 ㅎ하는 일은 얼마나 많은 셀들을 드러내거나 은닉 상태로 나둘지를 정한다고 할수있겠다. 출력 게이트의 일부 원소들을 0으로 지정한다면 셀 상태의 원소들은 밖으로 나오지 못한채 은닉 될 것이고, 내부적인 변수로서 lstm에 유지되겠다. 

 

 

 LSTM을 설명하기위한 복잡한 그림들이 많긴한데, 이 걸 보면서 단일 LSTM의 처리 과정을 이해할수 있겠다. 이 그림을 보면 왼쪽에서 이전 셀 상태 c_t-1과 이전 은닉상태 h_t-1을 받고, 이전 은닉 상태와 현재 입력 x_t를 쌓은 다음에 가중치 행렬과 곱하고 있다.

 

 그 결과 4개의 게이트로 나누어져 이 게이트들은 셀 상태 c_t와 은닉 상태 h_t를 계산하는데 사용 되겠다. LSTM을 이 방식으로 살펴보면서 흥미로운 점은 바닐라 RNN과 비교했을때, 그라디언트 플로우에 대해서 다른 관점으로 볼수 있겠다.

 

 한번 현재 셀 상태 c_t로부터 이전 셀 상태 c_t-1로 역전파를 한다고 생각해보자. 그러면 위와 같이 꽤 깔끔하게 그라디언트 경로가 만들어진다. 왜냐면 역전파를 할때 덧셈 노드를 만나는 경우, 역전파에서 덧샘 노드는 그라디언트를 복사 하는 역활을 했지, 정보를 죽이지는 않았었다. 그래서 처음 덧샘 노드를 만났을때, 들어온 그라디언트는 LSTM 내부로 퍼지게 되겠다.

 

 그 다음에 망각 게이트와 원소 단위 곱샘을 역전파하는 경우, 여기서 정보가 제거될 위험이 있다. 그 이유는 시그모이드 비선형 함수를 역전파 과정에서 통과하기 때문이 아니라, 비선형 함수 , 원소 단위로 0과 1사이의 상수값을 곱한것을 역전파하다보니 정보가 사라질 위험을 가지기 때문이다.

 

 망각 게이트가 0에 가깝다면 정보가 사라질 위험이 있으나, 1에 가깝다면 현재 셀 상태에서 이전 셀 상태로 역전파시에 정보들이 사라질 위험은 없겠다. 그렇다보니 어떤 비선형 함수도 지나가지도 않고 행렬 곱 연산도 역전파 과정에서 지나가지 않다보니 LSTM의 탑 레벨 경로가 간단하게 흘러가는걸 볼수 있겠다.

 

-> 이 부분 내용을 정리하면

 

일단 LSTM의 탑래밸에서는 셀 상태 역전파를 보면,  sum 노드에서의 역전파는 분배되다보니 그대로 지나가고,

 

(시그모이드 함수 역전파 때문이 아니라) 원소 단위 곱샘 노드 때문에 정보가 사라질수도 있는데, 

 망각 게이트는 0과 1사이값을 가지고 있으며, 0에 가까우면 순전파시 정보가 사라지지만 1에 가까울때 역전파시에는 정보가 사라지지 않는다

 

 그래서 덧샘 노드와 원소 단위 곱샘 노드를 깔끔하게 지나가는 그라디언트 경로가 만들어지는것 같다.

 

 

 

 여러개의 LSTM 셀들을 연결 시켰을때 시퀀스를 처리하고 나서 맨 위의 셀 상태들이 지나가는 통로를 보면 인터럽트 받지 않은 고속도로같이 되는걸 볼수 있다. 이 통로를 통해서 시간에 따라서 역방향으로 정보가 쉽게 통과할 수 있겠다.

 

 LSTM 모델은 바닐라 RNN과 비교해보면 역전파 진행시 그라디언트 플로우가 더 잘 흘러갈거라고 볼수 있겠다 하지만 여전히 가중치 때문에 문제가 발생할수 있겠는데, 바닐라 RNN의 경우 그라디언트는 시간에 영향을 받아, 아주 긴 타임 스탭을 거친다면 정보들이 훼손되어 제대로 학습을 할수가 없다.

 

 하지만 LSTM에서는 역전파 과정에서도 정보들이 보존되어 흘러갈수 있는 통로가 있다보니, 가중치로 역전파 후에 행렬곱이나 비선형 연산을 지나가더라도 고칠수가 있겠다.

 

 하지만 행렬곱이나 비선형 함수를 지나가면서 역전파를 시킬 필요가 없는 경로가 있었는데, 학습 과정에서 정보가 계속 흘러가도록 하기 위해서 여전히 h_t를 가지고 있도록 하였다.

 

 그래서 LSTM의 셀 상태는 LSTM의 프라이빗 변수라고 보면되고, 은닉상태 h_t는 LSTM의 출력을 내기 위해서/예측하기 위해서 사용한다. 

 

 

 LSTM을 보면 인터럽트 되지 않는 그라디언트 고속도로를 가지도록 설계되었는데, 이와 비슷한 아키텍처를 이전에 한번 본적이 있었습니다. ResNet으로 아주 심층 합성곱 신경망을 학습하는 문제를 해결하기 위해서 스킵 커낵션을 추가시켰고, 그 결과 그라디언트가 아주 많은 계층에서 잘 퍼져나갔습니다. LSTM에도 동일한 아이티어라고 보면 될거같습니다.

 

LSTM과 ResNet은 많은 부분에서 공통점을 가지고 있는다고 볼수 있겠고,  재미있는 신경망으로 고속도로 신경망이 있다. 이 신경망은 ResNet 이전에 나오기는 했지만 LSTM을 닮았으며 한번 확인해보면 좋겠다.

 

 

 

 지금까지 단일 계층 RNN에 대해서 살펴보면서, 입력 시퀀스를 간편하게 처리해서 은닉 층 시퀀스를 만들고, 이 은닉 벡터들의 시퀀스로 출력 시퀀스를 만들어냈다. 지금까지 이미지 처리를 하는 경우를 봤는데 더 많은 계층을 사용하면 모델 성능을 개선 시킬수가 있겠는데 순환 신경망의 경우에도 그렇다.

 

 

  다층을 쌓는 방법은 기존의 순환 신경망의 은닉 상태를 또다른 순환 신경망에다가 입력으로 넣으면 된다. 이렇게 만든 걸 다층 혹은 심층 순환신경망이라 부를수 있겠다. 과정은 첫 입력 시퀀스를 처리해서 은닉 상태 시퀀스를 만들고, 그 은닉 상태 시퀀스를 다음 순환 신경망의 입력 시퀀스로 사용해서, 두번째 은닉 상태 시퀀스를 만들어 낸다.

 

 

 더 깊이 쌓고자 하는 경우 GPU 메모리가 되는 만큼 더 쌓으면 되겠다. 이런 순환 신경망을 여러 층으로 계속 쌓아서 사용해도 되겠지만, 순환 신경망을 실제로 쓴다면 3 ~ 5계층이면 충분하며, 합성곱 신경망 처럼 아주 깊은 모델은 잘 사용되지는 않는다.

 

(질문) 다른 순환 신경망 계층 마다 서로 다른 가중치 행렬을 사용하는가?

 

O. 다른 계층끼리 다른 가중치 행렬을 사용한다.

 

 다루고 싶은 수많은 문제들이 있고, 현재 신경망을 고쳐서 더 나은 수식을 정리해서 문제를 해결할수 있으면 좋겠지만 수많은 다른 순환 신경망 아키텍처를 이용한 논문들이 나오고 있다.

 

 여기서 중요한 방법중 하나로 위 슬라이드 왼편에 있는 gated reccurent unit GRU라고 부르는 방법인데, LSTM의 간편화 시킨 버전이라고 볼수 있겠다. 이 방법에 대해서 깊게 설명하지는 않겠지만 그라디언트 흐름을 개선시키기 위해서 가산 연결을 사용하였다.

 

 그리고 컴퓨터 계산 비용이 점점 저렴해지기 시작하면서 사람들이 부르트 포스 방법을 싸용하기를 시작했는데, 최근 몇년전에 혁신적인 탐색방법을 사용하였는데, 부루트 포스 방법으로 수만개의 수식 공간들을 탐색해서 서로 다른 순환 신경망 모델을 만들어서 찾아보았다.

 

 이 논문에서 찾은 갱신 공신 3가지를 볼수 있는데, LSTM보다 더 잘 동작한다고 볼수있을만한 건 없었다. 비슷한 성능을 보이는 수많은 수식들이 존재하지만 LSTM은 사람들이 가장 처음 발견한 것이고, 사람들이 지금까지 사용하는 역사적으로 좋은 모델이라 할수 있겠다.

 

 이미 몇 강전에 신경망 아키텍처 탐색 방법에 대해서 살펴보았는데, 합성곱 분야에서 다른 신경망 아키텍처를 생성하는 신경망, 간단하게 소개만 하고 자세히 다뤄보지는 않았다. 사람들은 순환 신경망 아키텍처에도 이와 같은 방식을 적용해서 찾아보았다.

 

(내용 조금 남았는데 힘드니까 마무리)

 

 

300x250

+ Recent posts