RNN regularization
배경
순환 신경망은 입력의 순서와 흐름을 기억하려고 이전 시점의 정보를 다음 시점으로 계속 넘긴다. 그런데 모델을 키우면(레이어 수, 파라미터 수) 훈련 데이터에만 지나치게 맞춰지는 과적합이 심하게 나타났다.
일반적인 딥러닝에서는 과적합을 막으려고 드롭아웃(Dropout)을 쓴다.
드롭아웃이란?
드롭아웃은 과적합을 막는 대표적인 규제(regularization) 기법이다.
신경망의 뉴런들은 서로 연결되어 입력 정보를 바탕으로 정답을 예측한다. 그런데 모든 뉴런이 매번 함께 작동하면 특정 뉴런끼리 서로 과하게 의존하게 되고, 그 결과 모델이 훈련 데이터의 잡음이나 사소한 특징까지 외워버린다.
그래서 드롭아웃은 학습 단계마다 전체 뉴런 중 일정 비율을 무작위로 골라 잠시 꺼둔다(출력을 0으로 만든다). 일부 뉴런이 꺼진 채로 순전파와 역전파를 하는 것이다. 꺼지는 조합이 매번 바뀌니 개별 뉴런은 특정 뉴런에만 기대지 않고 스스로 쓸모 있는 특징을 잡아내게 된다. 매번 조금씩 다른 구조의 신경망 여러 개를 학습시키는 것과 비슷한 효과여서 일반화 성능이 올라간다.
학습이 끝나고 실제로 예측하는 추론 단계에서는 드롭아웃을 끄고 모든 뉴런을 쓴다. 다만 학습할 때는 일부가 꺼진 상태로 가중치가 맞춰졌으므로, 추론 때는 출력에 학습 시 적용한 비율을 곱해 전체 출력 크기를 맞춰준다.
RNN에 드롭아웃을 적용하면 생기는 문제
그런데 이 드롭아웃을 RNN의 시간 축 순환 연결에 그대로 적용하면 과거의 기억이 손실되고 내부 노이즈가 커져서 학습이 제대로 안 된다. 그래서 당시 RNN은 레이어를 1~2개보다 깊게 쌓지 못했고 성능을 올리는 데 한계가 있었다.
식으로 다시 보자.
\[h_t = \tanh(W_{hh} h_{t-1} + W_{xh} x_t + b_h)\]기본 RNN은 시간 단계 t마다 입력 $x_t$와 이전 hidden state $h_{t-1}$을 받아 현재 hidden state $h_t$를 계산한다.
$W_{hh}$는 시간 축을 따라 이전 기억을 전달하는 순환 가중치이고, $W_{xh}$는 현재 입력을 처리하는 입력 가중치이다.
문제는 수평(순환) 연결에 일반 드롭아웃을 적용할 때 생긴다.
드롭아웃은 확률 p로 뉴런을 끄는 마스크 $m \sim \text{Bernoulli}(1-p)$를 곱한다.
이 마스크를 순환 연결($h_{t-1} \to h_t$)에 타임스텝마다 새로 뽑아 적용하면 식이 이렇게 바뀐다.
\[h_t = \tanh(W_{hh} (m_t \odot h_{t-1}) + W_{xh} x_t + b_h)\]- $m_t$: 타임스텝 $t$에서 새로 뽑은 드롭아웃 마스크
- $\odot$: 요소별 곱
먼저 장기 기억이 사라진다. $t=1$부터 $t=T$까지 정보가 전달되는 동안 hidden state에는 매번 다른 마스크($m_1, m_2, \dots, m_T$)가 곱해지고, 과거의 문맥 정보는 시간이 갈수록 기하급수적으로 지워진다.
노이즈가 쌓이고 역전파도 불안정해진다. 순환 경로 $W_{hh}$에는 같은 가중치가 여러 타임스텝에 걸쳐 반복해서 곱해지는데, 거기에 타임스텝마다 무작위 노이즈 $m_t$가 누적되면 gradient를 계산할 때 노이즈가 크게 증폭되어 학습 신호가 흐트러진다.
해결
RNN과 LSTM은 입력을 시간 순서대로 처리하면서 이전 시점의 핵심 정보를 다음 시점으로 넘기도록 설계되어 있다. 그런데 기존 드롭아웃은 뉴런을 무작위로 꺼버리는 방식이라, 시간 방향으로 이어지는 내부 상태 전달에 적용하면 꼭 필요한 과거 정보가 중간에 사라지거나 왜곡된다. 모델이 과거 맥락을 오래 유지하지 못하고 학습도 불안정해진다.
이 논문은 신경망 안의 연결을 두 종류로 나누고, 드롭아웃을 적용할지 말지를 연결 종류별로 다르게 정하는 방법으로 이 문제를 풀었다.
두 경로는 수평(시간) 방향 연결(Horizontal Connection)과 수직 방향 연결(Vertical Connection)이다.
수평 방향 연결은 같은 레이어 안에서 이전 시점(t-1)의 hidden state나 cell state를 다음 시점(t)으로 넘기는 순환 구조이다. 여기에는 드롭아웃을 적용하지 않는다. 먼 과거의 문맥과 기억이 도중에 사라지지 않게 그대로 두는 것이다.
수직 방향 연결은 같은 시점(t)에서 아래 레이어의 출력이 위 레이어의 입력으로 넘어가는 층간 구조이다. 드롭아웃은 오직 이 경로에만 적용한다. 레이어 사이를 오가는 정보에만 무작위로 뉴런을 끄면, 상위 레이어가 하위 레이어의 특정 뉴런 조합에 과하게 의존하는 현상(co-adaptation)을 막아 레이어 간 과적합을 억제할 수 있다. 정리하면 시퀀스 전체를 관통하는 장기 기억은 수평 경로로 안전하게 지키고, 일반화 성능은 수직 경로의 드롭아웃으로 확보하는 구조이다.
flowchart BT
subgraph IN["입력"]
direction LR
x1["x<sub>t-1</sub>"] ~~~ x2["x<sub>t</sub>"] ~~~ x3["x<sub>t+1</sub>"]
end
subgraph L1["1층 LSTM"]
direction LR
a1["t-1"] --> a2["t"] --> a3["t+1"]
end
subgraph L2["2층 LSTM"]
direction LR
b1["t-1"] --> b2["t"] --> b3["t+1"]
end
subgraph OUT["출력"]
direction LR
y1["y<sub>t-1</sub>"] ~~~ y2["y<sub>t</sub>"] ~~~ y3["y<sub>t+1</sub>"]
end
IN -. "dropout 적용 (수직 연결)" .-> L1
L1 -. "dropout 적용 (수직 연결)" .-> L2
L2 -. "dropout 적용 (수직 연결)" .-> OUT
같은 층 안에서 시점 t-1 → t → t+1로 이어지는 실선(수평 연결)에는 드롭아웃을 적용하지 않고, 층과 층 사이의 점선(수직 연결)에만 적용한다. (Zaremba et al. (2014)의 Figure 2를 단순화해 다시 그렸다.)
효과
이 방식 덕분에 과적합과 학습 불안정 때문에 어려웠던 모델 대형화가 가능해졌다. 연구진은 2개 레이어에 레이어당 1500개 은닉 유닛을 가진 큰 LSTM에 이 기법을 적용해 성능을 확인했다. 언어 모델의 대표 벤치마크인 Penn Treebank에서, 기존 단일 LSTM 모델들의 Perplexity 114.5를 78.4까지 낮췄다. Perplexity(PPL)는 언어 모델이 다음 단어를 얼마나 잘 맞히는지 나타내는 지표로, 낮을수록 좋다. 단일 모델로 당시 하나의 벽처럼 여겨지던 100 아래를 넘었다는 점이 의미 있다.
이 regularization 기법은 언어 모델링에만 쓰인 게 아니라 다른 시퀀스 처리 과제에서도 일반화 성능이 좋게 나왔다.
결국 이 연구는 순환 신경망 고유의 구조를 해치지 않으면서 과적합을 줄이는 방법을 제시했다. 덕분에 RNN과 LSTM은 정보 손실 없이 레이어를 더 깊게, 파라미터를 더 많이 쌓을 수 있게 되었고, 자연어 처리, 음성 인식, 기계 번역 같은 시퀀스 기반 연구가 한 단계 나아가는 계기가 되었다.
댓글 남기기