2 minute read

RNN의 한계

RNN은 이전 단계의 정보를 계속해서 전달받아 다음 단계의 출력에 영향을 미치도록 설계되었다. 하지만 여기서 처리해야 하는 데이터의 길이가 길어지면 문제가 생긴다.

데이터가 신경망의 여러 단계를 거쳐 흘러가는 동안, 이전에 있던 정보의 Gradient가 계속 곱해지면서 0에 가깝게 줄어든다. 즉 vanishing gradient 현상이다.

결과적으로 RNN은 바로 직전의 몇 단어(단기 정보)는 기억하지만, 문장 앞부분에 있던 정보(장기 정보)는 잊어버리게 된다. 예를들어 문장 맨 앞에 나온 주어가 단수인지 복수인지에 따라 문장 맨 뒤의 동사 문법을 맞춰야 할 때, RNN은 이것을 처리하지 못한다. (e.g. The cat (that lived in the small village with three other pets for ten long years) was sleeping. 에서 pets나 years에 솎아서 was 대신 were를 생성하는 오류가 생길 수 있다.)

또한 Exploding Gradient도 생길 수 있다.

Cell State

LSTM은 이런 장기 기억 문제를 해결하기 위해서 RNN의 Hidden State 외에 Cell State라는 새로운 정보 전달 경로를 도입했다.

Cell State는 정보가 전달되는 메인 경로 역할이다. 즉, 장기 메모리이다. 복잡한 연산을 거의 거치지 않고 전체 시퀀스를 따라 일직선으로 흘러가서 이전 단계의 중요한 정보가 손실되거나 변형되지 않고 먼 뒤쪽 단계까지 원형에 가깝게 전달될 수 있다.

Hidden State는 단기 메모리이다. 현재 시점 t의 입력데이터 x_t와 정제된 셀 상태 C_t를 반영하여 즉각적인 출력 결과를 도출하고 다음 시점으로 전달되는 상태 정보이다.

Gate 구조

Lstm은 Cell State에 어떤 정보를 추가하거나 삭제할지 정밀하게 제어하기 위해 Gate라는 세 가지 구조를 사용한다.

Gate는 Sigmoidal 신경망 레이어와 곱셈 연산으로 구성되어 있으며, 0과 1 사이의 값을 출력하여 정보의 통과 비율(0~100%)을 결정한다.

  1. Forget Gate Forget Gete는 이전 Cell State의 정보 중 어떤 것으르 버릴지 결정한다.
\[f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f)\]
  • $x_t$: 현재 시점의 입력 벡터
  • $h_{t-1}$: 이전 시점의 은닉 상태(단기 기억) 벡터
  • $W_f, b_f$: 망각 게이트의 가중치 행렬과 편향
  • $\sigma$: 결과값을 0과 1 사이로 변환하는 시그모이드 함수. $f_t$의 각 요소가 0에 가까우면 이전 정보 $C_{t-1}$을 버리고, 1에 가까우면 이전 정보를 그대로 보존
  1. Input Gate 및 후보 셀 상태 ($\tilde{C}_t$) Input Gate는 현재 들어온 새로운 정보 중 어떤 것을 Cell State에 저장할지 결정한다.
\[i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i)\] \[\tilde{C}_t = \tanh(W_c \cdot [h_{t-1}, x_t] + b_c)\]
  • $i_t$ (입력 게이트): 현재 입력 정보 중 새롭게 저장할 양(0~1 사이)을 결정
  • $\tilde{C}_t$ (후보 셀 상태): 현재 시점에서 셀 상태에 더해질 수 있는 새로운 후보 정보의 내용입니다. $\tanh$ 활성화 함수를 사용하여 정보를 -1과 1 사이의 값으로 구성

먼저 Sigmoid layer가 어떤 정보를 업데이트할지 선택하고, hanh layer가 현재 들어온 정보를 바탕으로 Cell State에 추가할 새로운 후보값들을 만든다. 이후 디 두값을 곱해서 저장할 새로운 정보의 양과 내용을 결정한 뒤 Forget Gate를 거친 기존 Cell State에 더해준다. 즉, Cell State가 최종 업데이트되는것이다.

  1. 셀 상태 업데이트 (Cell State Update, $C_t$) 이전 장기 기억 $C_{t-1}$을 망각 게이트로 선별하고, 새로 들어온 후보 정보 $\tilde{C}_t$를 입력 게이트로 선별한 뒤, 두 값을 더하여 새로운 장기 기억 $C_t$를 완성한다.
\[C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t\]
  • $\odot$: 요소별 곱셈(Element-wise multiplication, Pointwise multiplication)을 의미
  • $f_t \odot C_{t-1}$: 이전 셀 상태에서 잊어버리기로 결정한 부분을 걸러내고 남은 정보
  • $i_t \odot \tilde{C}_t$: 이번 시점에서 새롭게 선택하여 축적하기로 한 정보

이 덧셈(+) 연산 구조 덕분에 기울기(Gradient)가 시점을 거슬러 전파될 때 큰 손실이나 변화 없이 지속적으로 유동할 수 있어 기울기 소멸 문제가 발생하지 않는다.

  1. Output Gate 및 은닉 상태 업데이트 ($h_t$) 새롭게 업데이트된 장기 기억 $C_t$를 바탕으로 현재 시점의 최종 출력이자 다음 시점으로 넘겨줄 은닉 상태 $h_t$를 계산한다.
\[o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o)\] \[h_t = o_t \odot \tanh(C_t)\]
  • $o_t$ (출력 게이트): 업데이트된 장기 기억 $C_t$ 중에서 얼마만큼을 현재 시점의 출력으로 노출시킬지 결정하는 제어값(0~1 사이)입니다.
  • $\tanh(C_t)$: 새로 완성된 장기 기억 $C_t$를 -1과 1 사이의 수치 범위로 다듬어줍니다.

최종적으로 이 다듬어진 장기 기억에 출력 게이트값 $o_t$를 곱해주면 현재 시점의 은닉 상태 $h_t$가 도출되며, 이 값은 현재 시점의 예측 및 다음 시점의 입력으로 쓰인다.

Tags:

Categories:

Updated:

Leave a comment