와 를 더할 때, 더해지는 의 비율을 조정하여 또는 과 같은 방식으로 두 숫자를 더한다고 생각해봅시다. 에 곱해지는 가중치를 로 두고, 위 식을 일반항으로 작성해보면 다음과 같습니다.
위 식에서 는 0과 1 사이의 값을 갖습니다. 0일 경우에는 식의 결과가 단순히 로, 가 아무런 영향력을 끼치지 못합니다. 반대로 1일 경우에는 식의 결과를 로, 영향력이 최대가 됩니다. 이러한 방식으로 값에 따라 가 미칠 수 있는 영향력이 결정되므로, 위 식에서 는 스위치 또는 게이트의 역할을 수행한다고 할 수 있습니다. 이것이 게이팅 메커니즘이 작동하는 방식이며, 아래에서는 이를 엘만 RNN의 은닉 벡터 업데이트 과정에 적용하는 것을 살펴보겠습니다.
엘만 RNN을 단순한 구조로 나타내면 오른쪽 이미지와 같습니다. 여기에서, 게이팅을 이용한 은닉 벡터를 업데이트 하는 방식을 알아보겠습니다.
먼저, 게이팅이 적용되기 전의 업데이트 방식을 보겠습니다.
위 식에서 F 함수는 RNN의 순환 연산으로, 앞서 예시로 언급한 의 형태를 보이고 있습니다. 따라서 단순히 이러한 형태로 모델을 구성하면, 앞서 7-1 엘만 RNN의 문제점 에서 언급했던 문제점들이 나타나게 됩니다. 여기에 가중치로 게이트 역할을 해줄 를 넣어보겠습니다.
위 식에서는 이전 상태의 은닉 벡터 와 순환 연산 의 합이 게이트에 의해 제어되며, 현재 입력에 대한 정보가 다음 은닉 벡터에 얼마나 들어갈 지를 가 컨트롤하고 있습니다. 이 값은 0과 1 사이에서 현재 입력값에 따라 값이 달라지며, 일반적으로는 시그모이드 함수 등을 이용해 입력값을 제어합니다.
이렇게, 입력 값을 얼마나 남길지, 저장된 값을 얼마나 활용할 지에 대해 제어하면서, 문장에서 중요한 의미를 갖는 단어들을 강조하며 조금 더 의미있는 단어들(벡터들)에 대한 정보를 많이 담을 수 있습니다. 이를 통해 문장의 길이가 길어지더라도 중요한 단어들의 가중치가 은닉 벡터에 덜 희석되며, 뒷 단어들에서도 이 정보를 활용할 수 있게 됩니다.
LSTM
위 개념에서 확장하여, 은닉 벡터의 영향력을 줄이기도(저장된 정보를 삭제하기도) 합니다.
위 식에서는 앞의 항 에 또 다른 게이트인 가 곱해져, 다음 은닉 벡터를 계산할 때 이전 은닉 벡터를 얼마나 남길지를 결정하고 있습니다. 이 게이트 또한 현재 입력값에 따라 값이 달라지며, 0과 1 사이의 값을 갖습니다.
2개의 게이트를 적용한 RNN 네트워크를 Long-Short Term Memory Network(LSTMs)라고 부릅니다. 아래 두 구조 이미지는 기본적인 RNN 네트워크와 LSTM 네트워크의 구조를 담은 이미지입니다. 기본적인 구조의 RNN과 다르게, LSTM 구조에서는 훨씬 더 복잡하게 다양한 게이트가 적용되고 있음을 볼 수 있습니다.
기본적인 RNN 구조. 여기에서는 가중치 연산에 tanh 함수를 활용하였다.
LSTM RNN 구조. 연산에 다양한 게이트가 활용되고 있음을 알 수 있다.
LSTM의 동작
LSTM에는 입력, 은닉 벡터 외에도 상태를 나타내는 Cell State를 가지고 있습니다. LSTM은 입력 값과 은닉 벡터에 의해 계산되는 값들을 이 Cell State에 저장하며 정보를 전달하게 됩니다.
우선 입력 값 ,와 를 가져와 기존 Cell State의 정보들 중에서 얼마나 정보를 남기고, 얼마나 정보를 지울지 선택합니다. 이 과정은 (시그모이드 함수)에 의해 결정되며, 0과 1 사이의 값을 에 곱하게 됩니다. Jenny has her pen and Peter has his pencil 라는 문장이 있다고 해봅시다. 문장에서 성별에 따른 대명사를 결정할 때, Jenny - her / Peter - his 라는 쌍을 만들어줄 때, Jenny가 여성이라는 사실이 Peter가 his라는 대명사와 매치될 때 중요하지 않으므로 Cell State에서 정보를 지워줄 수 있습니다. 이러한 역할을 이 단계가 수행해줍니다.
그 다음, Cell State에 어떤 정보를 저장할 지에 대해 선택합니다. 시그모이드를 통해 어떤 값들을 업데이트할 지 정하고, tanh에 의해 만들어진 후보 Cell State 벡터를 만들어줍니다. 이 두 값을 이용해 새로운 Cell State 값을 형성하게 됩니다.
앞서 Cell State를 얼마나 남길지, 업데이트 해줄 Cell State 값을 구했으므로, 이를 적용해 이번 타임 스텝(입력 값)에 대한 Cell State 를 구합니다.
마지막으로, Cell State를 바탕으로 만들어진 output을 전달하게 됩니다. 입력 벡터와 은닉 벡터에 시그모이드를 적용해, Cell State의 어떤 부분을 다음 은닉 벡터로 내보낼 지를 결정합니다. 이 값을 바탕으로, Cell State에 곱해 다음 은닉 벡터를 계산하고, 를 output으로 반환합니다.
이러한 과정을 통해 핵심적인 중요한 정보들을 위주로 Cell State에 담아 관리하면서, 문장이 길어지더라도 그 의미를 잘 반영할 수 있게 됩니다.
본문에 작성된 LSTM에 관한 내용은 LSTM에 대해 설명해둔 매우 저명한 블로그인 Christopher Olah의 블로그를 참고해 작성하였습니다. 소개한 기본 형태의 LSTM 말고도 조금 더 복잡하지만 개선된 다양한 형태의 LSTM이 소개되어 있으니, LSTM에 대해 공부하고 싶다면 아래 링크를 확인해보세요!
GRU
LSTM과 유사한 방식으로, Gated Recurrent Unit(GRU) 이라는 네트워크도 존재합니다. LSTM 아키텍처처럼, input 값과 기존의 state를 모두 활용하여 다음 state vector를 만듭니다. GRU는 LSTM과 유사한 역할을 수행하지만, LSTM보다 내부 Gate 수와 Output 수가 적어, 구성이 단순하고 연산량을 줄였다는 장점을 갖고 있습니다.
GRU의 동작
GRU의 내부는 아래 그림처럼 4단계의 layer로 구현됩니다.
1.
Reset Gate - 과거의 누적된 정보를 어느정도 제거할 지를 결정하는 비율 r을 계산합니다.
( W×h + U×x )에 sigmoid 함수를 적용하여 0~1의 값을 만들어냅니다.
2.
Candidate - Input 데이터와 Reset Gate를 통해 줄어든 과거 정보를 합쳐 정보 후보군을 계산합니다.
( W×h×r + U×x )에 tanh 함수를 적용하여 후보군 ~h를 뽑아냅니다.
3.
Update Gate - Hidden을 계산하는 과정에서 과거의 정보와 현재 정보의 비율을 u를 계산합니다.
( W×h + U×x )에 sigmoid 함수를 적용하여 0~1의 값을 만들어냅니다.
W와 U의 가중치는 Reset Gate와 다른 가중치를 사용합니다.
4.
Hidden - Update Gate를 통해 현재 정보와 과거 정보를 조합하여 hidden vector를 계산합니다.
(1-u) × h + u × ~h = hidden vector
과거 정보와 현재 정보에 update gate에서 구한 비율을 적용해 벡터를 구합니다.
이전 입력으로 압축된 벡터에 데이터가 입력되어 GRU를 거치면 고정된 크기의 벡터 형태로 정보가 압축됩니다. 입력 문자열에 대해 연속으로 데이터를 입력시키면 결과적으로 문장 전체 정보를 압축한 hidden vector를 얻을 수 있습니다.
LSTM과 GRU는 모든 입력 벡터를 은닉 벡터에 반영하는 것이 아니라, 선택적으로 중요한 정보만 반영한다는 공통점을 가지고 있습니다. 이러한 특성은 7-1 엘만 RNN의 문제점 에서 언급했던 문제점인 1. 멀리 떨어진 정보를 활용하기 힘들다, 2. 그레디언트 값이 불안정하다 를 해결해주기 때문에 RNN 모델 구성에 있어서 많이 활용되고 있습니다.
이전 글 읽기
다음 글 읽기