12-2. RNN - LSTM(Long Short Term Memory) 레이어

2020. 8. 25. 01:20AI/모두를 위한 딥러닝

이 포스트는 허민석님의 유튜브 [딥러닝]LSTM 쉽게 이해하기Christopher olah's blog, Understanding LSTM Networks를 참고하여 작성했습니다. 누구나 이해할 수 있는 수준으로 설명하고자 하였으며 LAB의 코드는 TF2.0에 맞추어 재작성되었습니다.

LSTM은 SimpleRNN의 치명적인 단점을 해결하고자 1997년 Sepp Hochreiter와 Jurgen Schmidhuber에 의해 제안된 레이어입니다. 그렇다면 먼저 SimpleRNN의 문제점이 무엇인지, LSTM은 그 문제점을 어떻게 해결했는지에 대해 알아보겠습니다.

 

  • SipleRNN의 치명적인 단점, 장기 의존성(Long-Term Dependency) 문제 

먼저 SimpleRNN의 치명적인 단점, 장기 의존성 문제에 대해 알아보겠습니다. 장기 의존성 문제란 입력과 출력 사이의 거리가 멀어질수록 연관 관계가 적어지는 문제입니다. RNN에서는 하나의 weight을 반복적으로 사용하는데, 미분을 사용하여 오차를 구할 때 이 weight을 계속 곱하면 값이 엄청나게 커지는 exploding gradient나 엄청나게 작아지는 vanishing gradient 현상이 발생합니다. 먼저 그림으로 보겠습니다.

그림1. SimpleRNN 네트워크 구조(many to many)
그림2. vanishing gradient, exploding gradient

위의 네트워크 구조는 "다음에 나올 단어를 예측하는 모델(word predictor, many to many)"을 구현한 SimpleRNN 구조입니다. gradient descent를 이용해 weight을 업데이트해주며, BPTT(BackPropagation Through Time) 알고리즘으로 오차 E3를 구할 수 있습니다. 그림에서는 chain rule을 이용하여 ∂E3/∂W를 구하는 과정을 수식으로 표현하였는데, ∂H3/∂H2 * ∂H2/∂H1에 주목해 보겠습니다. 이는 H1이 H3에 미치는 영향, 즉 입력 데이터 X1이 X3에 미치는 영향으로 해석할 수도 있습니다. 이때 *로 나눠진 두 부분을 풀어서 보면 ∂H3/∂H2, ∂H2/∂H1로 둘은 하나의 미분 값 weight(Whh)을 가집니다. 즉 하나의 weight을 두 번 곱하는 것으로 생각할 수 있습니다. 이번에는 아래의 그림 2를 보겠습니다. 그림 2는 그림 1과 달리 입력 데이터가 X1, X2... X100, X101로 많습니다. 이렇게 되면 ∂E101/∂W을 구할 때 아래의 수식에서처럼 ∂H2/∂H1 * ∂H3/∂H2 *... * ∂H100/∂H99로 X1이 X101에 미치는 영향을 구할 수 있습니다. 하지만 위의 방법으로 계산 시, 하나의 weight을 100번 곱하는 것으로 해석할 수 있는데, 이때 문제점이 발생합니다. 만약 미분 값이 1보다 작다면, 1보다 작은 값을 100번 곱하는 것이기 때문에 0에 가까운 매우 작은 값이 될 것입니다. 따라서 W=W-∂E/∂W에서 ∂E/∂W가 0에 가깝기 때문에 weight 값이 거의 변하지 않아 학습이 길어지고 비효율적이게 됩니다. 이것을 vanishing gradient 현상이라고 합니다. 반대로 미분 값이 1보다 크다면, 1보다 큰 값을 100번 곱하는 것이기 때문에 매우 큰 값이 될 것이며 이때의 weight은 매우 큰 값을 가질 것입니다. 이것을 exploding gradient 현상이라고 합니다.

그림 3-1. vanishing gradient
그림 3-2. exploding gradient 현상 시의 그래프

이제 위에서 소개한 "다음에 나올 단어를 예측하는 모델"의 예시를 보겠습니다.

이는 장기 의존성 문제를 이해하기에 가장 직관적인 예시입니다. 빨간색 빈칸에 들어가는 알맞은 단어를 예측하는 문제입니다. 위의 문장에서 sky를 유추하기 위한 핵심 단어는 clouds입니다. clouds는 비교적 가까이 있기 때문에 sky라는 단어를 유츄하기까지에는 큰 어려움이 없습니다. 하지만 아래 문장은 French를 유추하기 위해서는 France를 찾아야 하는데, 두 단어 사이의 거리는 매우 길기 때문에 French를 유추하기까지는 길고 비효율적인 학습과정을 필요로 할 것입니다. 그렇다면 이러한 장기 의존성 문제를 어떻게 해결했을까요? 아래를 보겠습니다. 

 

  • LSTM 레이어

장기 의존성 문제를 해결하기 위해 1997년 Sepp Hochreiter와 Jurgen Schmidhuber은 LSTM 레이어를 제안하였습니다. 그렇다면 LSTM 레이어가 SimpleRNN과 어떻게 다른지 살펴보겠습니다.

그림 4. SimpleRNN(위)과 LSTM(아래)

먼저 SimpleRNN에서 필요한 것은 무엇일까요? 바로 특정 정보를 기억하고 잊는 장치가 필요했습니다. John은 남자, Jane은 여자라고 했을 때 위의 문장에서 he라는 단어를 유추하기 위해서는 John이라는 단어를 기억하고 있어야 합니다. 하지만 뒤의 she라는 단어를 유추하기 위해서는 기억하고 있던 John이라는 단어는 잊고, Jane이라는 단어를 다시 기억해야 합니다. 이렇게 네트워크는 데이터를 기억하고 잊는 정보를 공유해야 하는데, LSTM에서는 이 정보를 셀 상태(cell state)라고 합니다. 정확히 cell state는 그림 4의 LSTM(아래) 레이어에 표시되어 있는 윗 선에 해당하며, 밑에서 배우겠지만 LSTM은 gate라는 구조에 의해 cell state에 무엇인가를 더하거나 없앨 수 있습니다. 먼저 첫 번째 forget gate layer의 경우를 먼저 보겠습니다.

그림 5. LSTM forget gate layer, 출처: https://colah.github.io/posts/2015-08-Understanding-LSTMs/

이 과정에서는 Sigmoid를 통해 0과 1의 숫자를 내보내는데, 이 값은 곧 정보를 얼마나 기억할 것인지를 의미합니다. 값이 0이라면 아무것도 기억하지 않는다, 잊는다는 의미이며 값이 1이라면 모든 정보를 기억한다는 의미로 해석할 수 있습니다. 타임스탭 t에서의 LSTM forget layer의 출력은 다음과 같이 나타낼 수 있습니다. 위의 문장을 예로 들면 forget gate layer에서 일어나는 일을 그림 5-2로 표현할 수 있습니다. Jane이라는 입력이 성별을 구분 짓는 데에 유의미한 새로운 정보이기 때문에, John이라는 단어를 20% 정도만 기억하는 것을 알 수 있습니다.

그림 5-1. 타임스탭 t에서의 forget layer의 출력
그림 5-2. forget gate layer를 통과한 정보

다음은 정보들 중 어떤 정보를 cell state에 저장할 것인지를 저장하는 input gate layer입니다. John이라는 정보를 20%만 기억하는 것 외에도, Jane이라는 정보를 cell state에 저장하는 것 또한 매우 중요한 작업입니다. 과정을 순서대로 보면 입력된 정보를 이전의 정보와 합쳐 sigmoid를 통과함으로써 새로운 정보를 어느정도 내보낼 것인지를 결정합니다. 동시에 tan layer를 거쳐 새로운 Ct를 만들고, 이렇게 두 단계에서 나온 정보를 합쳐서 cell state에 더할 준비를 합니다. 결과적으로 새로운 정보로부터 만들어진 Ct와 이전 정보가 담긴 Ct-1을 결합해 LSTM의 cell state를 업데이트합니다. 과정을 그림으로 나타내면 아래와 같습니다.

그림 6. Input gate layer의 과정, 새로운 정보를 처리하고(위) ,이전의 정보와 합쳐 cell state를 업데이트합니다.(아래)
그림 6-1. 업데이트 된 cell state Ct는 "Jane"을 기억하게 됩니다.

마지막으로 출력을 내보내는 output gate layer입니다. output gate에서는 정보를 출력하고 cell state를 다음 cell에 전달해야합니다. 이 과정은 cell state의 정보가 tanh 통해 들어오는 동시에 다음 cell state로 전달되고, 현재의 정보와 이전의 정보가 sigmoid를 통해서 들어와 서로 곱하여 그 값을 output으로 출력하고 동시에 다음 hidden state로 넘어가게 됩니다.

그림 7. output gate layer의 과정 및 수식
그림 7-1. "she"를 유추할 수 있고 다음 cell state에 "Jane"을 넘겨줍니다.

LSTM은 이러한 과정을 통해 이전의 정보가 유의미할때까지 기억하고, 필요 없다면 잊어버리며 현재의 정보와 합쳐 정확한 출력을 내게 됩니다. 사실 수식을 보며 LSTM을 이해하는 것은 처음 LSTM을 접하는 입장에서는 굉장히 어려울 것입니다. 다만 John is my friend.. Jane is his wife... 의 예시로 LSTM을 처음 이해하면, 다소 어렵지 않게 다가갈 수 있고 이후 순서대로 수식을 풀어나가 보면 위의 그림을 모두 이해할 수 있을 것입니다. 물론 LSTM은 앞으로도 매우 유용하게 쓰이기 때문에, 다음 포스트에서는 LSTM 레이어를 이용하여 문제를 해결해 나가는 과정을 코드와 함께 살펴보겠습니다.