티스토리 뷰

728x90

Justin Johnson의 Deep Learning for Computer Vision 강의로 Lecture 12: Recurrent Neural Networks 입니다.

 

 

이번 강의에서 다루는 내용은

 

  • RNN, LSTM, GRU
  • Language modeling
  • Sequence-to-sequence
  • Image captioning
  • Visual question answering

 

입니다.

 

이중 RNN, LSTM, GRU 관련된 내용 위주로 다룰 것 같습니다.

 

 

Recurrent Neural Networks

RNN은 sequence를 진행하며 업데이트 해 줄 'internal state'를 갖고 있다는 것이 핵심 아이디어입니다.

 

 

모든 스텝마다 vector $x$의 sequence마다 recurrence formula를 적용하여 진행할 수 있습니다.

 

$h_t = f_W(h_{t-1}, x_t)$

 

 

그리고 같은 함수와 같은 파라미터 세트를 모든 스텝에서 사용합니다.

 

(Vanilla) Recurrent Neural Networks

 

state는 "hidden" vector $h$로 구성되어 있습니다.

 

 

첫 번째 hidden state는 모두 0에서 세팅되어 있고 학습을 시작합니다.

 

 

 

Backpropagation Trough Time

loss를 계산하기 위해 전체 sequence를 forward하고, gradient를 계산하기 위해 전체 sequence를 backward합니다.

 

이 방법의 문제는 긴 sequences는 너무 많은 메모리를 사용하게 된다는 점인데요.

 

그것 때문에 나온 방법이 Truncated Backpropagation Through Time입니다.

 

 

Truncated Backpropagation Trough Time

 

전체 sequence를 대신하여 sequence의 chunk를 통해 forward/backward합니다.

 

 

hidden states를 계속해서 forward해서 가져오지만, backpropagation의 경우엔 한 덩어리만큼 실행합니다. 

 

마지막에 loss가 계산됩니다.

 

 

이제 Gradient가 계산되는 flow를 살펴봅니다.

 

Vanilla RNN Gradient Flow

$h_t = tanh(W_{hh}h_{t-1} + W_{xxt}X_t + b_n$)

 

$=tanh( (w_{hh} \ w_{hh})$ $h_{t-1} \choose x_t$ $ + b_n)$

 

$= tanh (w$ $h_{t-1} \choose x_t$ $ + b_n)$

 

 

$h_t$에서 $h_{t-1}$의 $W$(실제로 $W_{hh}^T$)의 곱들로부터 Backpropagation합니다.

 

 

$h_0$의 gradient 연산은 $W$의 많은 factor를 포함합니다. (repeated tanh)

 

1. Largest singular value > 1 : Exploding gradients
2. Largest singular value < 1 : Vanishing gradients

 

1의 경우 Gradient clipping을 통해 해결할 수 있습니다. 각 norm들이 너무 큰 경우에 gradient를 scale합니다. 코드는 아래와 같습니다.

 

grad_norm = np.sum(grad * grad)
if grad_norm > threshold :
	grad *= (threshold / grad_norm)

 

2의 경우 RNN architecture를 좀 손보면서 해결할 수 있습니다.

 

Long Short Term Memory (LSTM)

 

위에서 살펴보았던 Vanilla RNN은 아래와 같습니다.

 

 

LSTM의 경우 각 timestep마다 두 vector가 있습니다.

 

  • Cell state: $c_t \in R^H$
  • Hidden state: $h_t \in R^H$

 

각 timestep마다 네 gates를 연산합니다.

 

  • Input gate: $i_t \in R^H$
  • Forget gate: $f_t \in R^H$
  • Output gate: $o_t \in R^H$
  • “Gate?” gate: $g_t \in R^H$

 

  • i: Input gate, whether to write to cell
  • f: Forget gate, Whether to erase cell
  • o: Output gate, How much to reveal cell
  • g: Gate gate(?), How much to write to cell

 

 

$i_t$, $f_t$, $o_t$는 시그모이드에 곱해지고, 마지막 $g_t$는 tanh에 곱해집니다.

 

 

 

Long Short Term Memory (LSTM): Gradient Flow

 

 

 

layer가 하나일 때

 

 

layer가 여러 개일 때

 

 

 

첫 번째 레이어에서 나온 hidden state를 다음 RNN의 input으로 전달합니다.

 

 

세 개 이상의 레이어가 있는 경우에서도 동일합니다.

 

 

Other RNN variants (GRU)

 

다른 RNN의 변형으로 GRU가 있습니다.

 

이는 statistical machine translation을 위한 RNN의 encoder-decoder를 사용한 구문 표현 학습입니다.

 

 

 

RNN Architectures: Neural Architecture Search

LSTM의 구조를 살펴볼 수 있습니다.

 

 

 

 

Summary

 

요약하면 아래와 같습니다.

 

  • RNN은 architecture 디자인에 따라 많이 유동적입니다.
  • Vanilla RNN은 단순하지만 효과적으로 잘 작동하는 것은 아닙니다. 
  • 보통 LSTM이나 GRU를 사용합니다. 이는 서로 상호작용을 추가해 gradient 흐름을 유지시킵니다.
  • RNN에서 gradient의 역전파 흐름은 explode 되거나 vanish됩니다.
    • Exploding은 gradient clipping으로 다룰 수 있습니다.
    • Vanishing은 상호작용을 더해 다룰 수 있습니다. (→LSTM)
  • 더 낫고 단순한 아키텍처는 현재 연구에서 주요 관심 분야입니다.
  • 이론과 실증 모두 더 나은 이해가 필요합니다.

 

728x90
댓글