2018/11/14 - [Research/Artificial Intelligence] - Recurrent Neural Network (RNN)에서 소개했던 RNN은 기존의 신경망이 갖던 단점을 극복했지만 그렇다고 완벽한 것은 아니다. RNN의 아이디어를 적극적으로 활용하면서 높은 효과를 누릴 수 있어 가장 많이 활용되는 분야가 언어모델이다. 예를 들어 이전 단어를 어떻게 선택했는지를 활용해 다음에 입력될 단어를 예측하는 언어 모델을 가정했을 때 "the clouds are in the sky" 라는 문장에서 "the clouds are in the" 까지 입력을 받았을 때 다음 단어는 문맥과 관계없이 "sky"가 될 확률이 높다. (이 부분에서 한글로 예를 들고 싶었지만 한글은 어순과 문맥의 특성이 조금 독특해서 영어 예를 그대로 가져왔다.) 이렇게 제공받는 데이터와 학습할 정보의 위치 차이(Gap)가 크지 않을 때 RNN은 효과적으로 과거의 데이터를 기반으로 학습을 할 수 있다.
하지만 보편적으로 우리는 저런 단순한 상황보다 더 많은 문맥에 따라 다음의 단어가 결정되는 복잡한 경우가 더 많다. 앞서 생략했던 한글의 예시를 적용해보면 같은 말이라도 "구름은 하늘에 있다" 라는 말에서 "구름은" 을 입력받고 "하늘에"가 나올 확률이 영어일 때보다 극도로 낮아지는 것을 확인할 수 있다. 즉 이전의 문장들에서 구름의 위치를 말하고자 한다라는 근거가 되는 표현의 위치가 멀어지는 문제가 발생하는 것이다. 그리고 이러한 Gap이 커질수록 RNN은 두 정보의 문맥을 연결하기 힘들어지고 이러한 장기 의존성 문제를 RNN으로는 해결할 수 없다. 그리고 이것이 해결할 수 없다는 것에 대한 근거는 Hochreiter (1991)과 Bengio, et al. (1994)가 다루었다.
그리고 이러한 장기 의존성 문제를 해결한 것이 "LSTMs"라고 불리는 Long Short Term Memory networks이다. Hochreiter & Schmidhuber (1997)에 의해 제안된 LSTM은 장기 의존성 문제를 해결할 수 있다고 알려졌으며 대중에게 알려지면서 기존보다 더 대중화되고 더 다양한 문제에 적용되기 시작했다. LSTM은 장기 의존성 문제를 해결하기 위해 명시적으로 디자인되었다. 기존의 RNN은 신경망의 반복적인 체인으로 구성되어 있다. 표준 RNN에서 이런 반복 모듈은 단순 구조를 가지고 있다. 아래 그림과 같은 단일 tanh레이어가 있다고 가정해보자.
싱글 레이어를 갖고 반복되는 표준 RNN모듈
LSTM도 이와 동일한 체인구조를 가지고 있지만 반복되는 모듈은 다른 구조를 가지고 있다. LSTM은 단일 신경망 레이어를 가지는 것 대신 4개의 상호작용 가능한 특별한 방식의 구조를 가지고 있다.
LSTM에 들어있는 4개의 상호작용 레이어가 반복되는 모듈
LSTM에 대한 보다 정확한 이해를 위해 단계별로 접근할 필요가 있다. 그리고 이를 위해 다음과 같은 기호를 먼저 알아두면 좋을 것 같다. 아래 다이어그램에서 각 라인은 온전한 vector를 포함한다. 각 출력값은 다른 노드의 입력값이 되는데 분혹색 원은 점 단위의 연산을 표현한다. 그리고 노란색 네모는 신경망의 단위이다. 하나로 합쳐지는 4번째 기호는 집중을 의미한다. 반면 하나의 화살표가 두개로 나눠지는 5번째 기호는 결과값이 서로 다른 두 노드에 복사됨을 의미한다.
LSTMs의 핵심 아이디어는 셀 스테이트(the cell state)이다. 다이어그램 상단에 있는 수평선을 말하는데 셀 스테이트는 하나의 컨베이어 벨트와 같다. 이는 아주 낮은 수준의 선형 연산을 거치면서 전체 체인을 관통한다. 이 구조로 인해 정보는 큰 변함없이 계속적으로 다음 단계에 전달되게 된다.
LSTM은 셀 스테이트에 신중하게 정제된 구조를 가진 게이트(gate)라는 요소를 활용하여 정보를 더하거나 제거하는 기능을 가지고 있다. 각 게이트는 선택적으로 정보들이 흘러들어갈 수 잇또록 만드는 장치이다. 이들은 시그모이드 뉴럴 넷 (Sigmoid neural net layer)와 점단위 곱하기 연산으로 이루어져 있다.
시그모이드 레이어
활성화 함수로 쓰이는 시그모이드 레이어는 0혹은 1의 값을 출력한다. 그리고 각 구성요소가 얼마만큼의 영향을 주게 될지를 결정하는 역할을 하게 된다. 활성화 함수에 대해서는 2018/11/15 - [Research/Artificial Intelligence] - 활성화 함수(Activation Function)에서 다시 다루었다. 0이라는 값을 가지면 해당 구성요소가 미래의 결과에 아무런 영향을 주지 않도록 만든다. 반면 1이라는 값은 해당 구성요소가 확실히 미래의 예측결과에 영향을 주도록 데이터가 흘러가게 만든다. 그리고 LSTM은 셀 스테이트를 보호하고 컨트롤하기 위한 세가지 게이트들로 이루어져 있다. 이렇게 만들어진 LSTM은 대부분의 RNN으로 문제를 해결하고자 하는 부분에서 놀라운 결과를 제공하고 있다. 물론 이 글에서는 LSTM의 각 단계별 작동법까지는 다루지 않았지만 굉장히 탄탄한 알고리즘과 수식들로 무장되어 있다. 하지만 LSTM이 모든 문제를 해결할 수 있는 것은 아니다. 다음 단계에서 언급하게 될 Attention이 또 하나의 역할을 하게 될 것이고 이는 RNN의 단계가 더 큰 정보의 집합에서 더 자세히 그 정보들을 확인하고 들여다 보는 효과를 나타낼 수 있을 것이다.
이 글의 원문: http://colah.github.io/posts/2015-08-Understanding-LSTMs/
'코드와 오류 기록' 카테고리의 다른 글
심층학습 기반의 사춘기 연령 골연령 측정 방법에 관한 연구 (0) | 2018.11.15 |
---|---|
활성화 함수(Activation Function) (0) | 2018.11.15 |
Recurrent Neural Network (RNN) (0) | 2018.11.14 |
Transport Security has Blocked a cleartext HTTP 해결 (0) | 2016.04.30 |
cocoapods swift (0) | 2016.04.28 |