2 분 소요

본 글은 스탠포드 대학 CS231n Lecture 10(Recurrent Neural Networks) 강의 내용을 바탕으로 정리한 내용이다. 개인 공부 목적으로 작성하였으며, 설명 오류나 오탈자에 대한 피드백을 환영한다.

Introduction to LSTM

  • LSTM은 RNN과 다르게 4개의 변수가 존재한다.
  • LSTM의 구조는 위 그림과 같으며, 왜 탄생되었는지에 대한 해답으로 RNN의 gradient 흐름부터 살펴본다.

Vanilla RNN Gradient Flow

  • 먼저 입력 $x_t$와 이전 hidden state $h_{t-1}$가 결합(stack)된다. 가중치 행렬 $W$와 곱해진 뒤 $\tanh$ 활성화 함수를 거쳐 현재 hidden state $h_t$가 된다.
  • 빨간색 선은 역전파(backpropagation) 경로이다. $h_t$에 대한 손실 기울기를 받아 $h_{t-1}$에 대한 기울기를 계산한다. 그러나 역전파 과정에서 $\tanh$ 도함수와 가중치 행렬 $W$ 곱셈이 시퀀스 길이만큼 반복해서 누적되므로 기울기 소실이나 폭주가 발생하기 쉽다.

  • 따라서 gradient는 여러 timestep에 걸치게 된다. 위 그림은 출력값을 순차적인 RNN 구조를 따라가 gradient를 계산하는 과정이다.

  • 가중치 행렬의 최대 특이값(singular value)이 1보다 크다면 긴 시퀀스에서 기울기가 지수적으로 증가하는 기울기 폭주(exploding gradients)가 발생한다.
  • 기울기 폭주는 기울기 크기가 임계값을 넘을 때 크기를 재조정하는 기울기 클리핑(gradient clipping)을 통해 완화할 수 있다.
  • 반대로 특이값이 1보다 작은 경우, 시퀀스 길이가 길어질수록 기울기가 0에 수렴하는 기울기 소실(vanishing gradients)이 발생한다. 이를 구조적으로 해결하기 위해 덧셈 경로를 기반으로 기울기를 보존하는 LSTM(Long Short Term Memory) 구조가 제안되었다.

Long Short Term Memory

  • 다시 LSTM으로 돌아오면, step $t$에는 hidden state $h_t$와 cell state $c_t$가 있다.
    • 모두 n 크기의 벡터이다.
  • LSTM은 장기 정보를 유지하는 cell state $c_t$를 명시적으로 분리해 유지하는 점이 바닐라 RNN과의 핵심 차이이다.
  • LSTM은 1) 4개의 게이트(input gate, forget gate, output gate, gate gate), 2) cell state, 3) hidden state로 구성된다.
  • cell state 갱신은 게이트 $f, i, g$의 상호작용($c_t = f \odot c_{t-1} + i \odot g$)을 통해 이루어진다.

  • $x_t$ : 입력 벡터
  • $h_{t-1}$ : 이전 hidden 상태
  • $c_{t-1}$ : 이전 cell 상태
  • $h_t$ : 다음 hidden 상태
  • $c_t$ : 다음 cell 상태
  • $\odot$ : 요소별 hadamard 내적

  • g(gate gate) : output gate와 함께 사용되는 중간 계산 캐시1
    • 얼마나 셀에 쓸지, 즉 얼마나 input을 들여보낼지
  • i(input gate) : 이전의 hidden 상태 $h_{t-1}$과 입력 벡터 $x_t$에서 다음 cell 상태 $c_t$에 얼마나 많은 정보를 추가해야 하는지를 제어한다.
    • 시그모이드 함수를 가지며 입력을 0~1 사이의 값으로 변환한다.
    • input gate는 gate gate에 의해 생성된 RNN 출력을 취할 것인지 여부를 결정하고 출력을 input gate와 곱한다. ($i\odot g$에 해당)
  • f(forget gate) : 이전 cell 상태 $c_{t-1}$에서 제거해야 하는 정보의 양을 제어한다. ($f\odot c_{t-1}$에 해당)
  • o(output gate) : 현재 hidden 상태 $h_t$에서 출력으로 표시해야 하는 정보의 양을 제어한다.

  • 설명들을 다시 그림으로 나타내면 위와 같다.

  • cell state를 두었기 때문에, $c_t$에서 $c_{t-1}$로 가는 backpropagation 과정에서 기존 RNN과는 달리 가중치 행렬 $W$를 곱하지 않고, 오직 f 요소만 요소별 곱셈을 하면 된다.

  • 순환 시점(timestep)을 따라 전달되는 cell state는 역전파 시 가중치 행렬 곱셈 없이 요소별 덧셈과 곱셈만 거치므로 기울기 고속도로(gradient highway) 역할을 한다2.
  • forget gate가 1에 가까운 값을 유지하면 이전 시점의 기울기가 손실 없이 이전 시점 셀로 직접 전달된다.
  • 이를 통해 LSTM 구조는 바닐라 RNN에 비해 긴 시퀀스에서도 장기 의존성(long-term dependency) 정보를 보존할 수 있다.

Gated Recurrent Unit

  • RNN의 다른 변형으로 GRU (Gated Recurrent Unit)이 있다.
  • 정확히는 LSTM의 간소화 버전이라 할 수 있다.

이미지 출처: 3

  • update gate : LSTM의 forget gate와 input gate 역할 모두를 담당한다.
    • 과거의 정보를 얼마만큼 가져가고($z_t$) 현재 새로운 정보를 얼마만큼 가져갈지($1-z_t$)를 정해준다.
    • forget gate : $z_t=\sigma(W_{xz}x_t+W_{hz}h_{t-1}+b_z)$
      • 여기서 $b$는 편향(bias) 벡터를 뜻한다.
    • input gate : $1-z_t$
  • reset gate : 이전 정보에서 얼마만큼 선택해서 내보낼지를 결정한다.
    • $r_t=\sigma(W_{xr}x_t+W_{hr}h_{t-1}+b_r)$
  • hidden 상태 : reset gate, update gate를 모두 적용해서 hidden 상태를 계산한다.
    • $\tilde h_t = \tanh(W_{xh}x_t + W_{hh}(r_t\odot h_{t-1}) + b_h)$
    • $h_t = z_t \odot h_{t-1} + (1-z_t)\odot \tilde h_t$

Overview

  • 다음은 RNN, LSTM, GRU의 아키텍처를 비교한 그림이다.

이미지 출처: 4

한계 및 트레이드오프

  • 계산 복잡도 및 메모리 사용량: LSTM은 시점마다 4개, GRU는 3개의 게이트 연산(선형 변환 및 비선형 활성화)을 수행하므로 바닐라 RNN 대비 파라미터 수와 연산량이 약 3~4배 증가한다.
  • 순차 처리 병렬화 한계: 시점 $t$의 계산이 이전 시점 $t-1$의 은닉 상태에 순차적으로 의존하므로, GPU 가속 환경에서도 시퀀스 길이 방향(시간 축) 병렬 연산이 불가능하다.
  • 초장기 의존성 한계: 셀 상태의 덧셈 경로를 통해 기울기 소실이 완화되지만, 시퀀스 길이가 수백~수천 스텝 이상으로 매우 길어지면 정보 누적 및 게이트 포화로 인해 장기 기억 보존 성능이 점차 저하된다.

References

댓글남기기