๐ ๋ชฉ์ฐจ
1. preview
2. RNN
3. LSTM
4. GRU
5. Gradient Clipping
๐ ๊ธ์ ๋ง์น๋ฉฐ...
1. Preview
์์ฐ์ด ์ฒ๋ฆฌ๋ถ์ผ๋ ๋ฌธ์ฅ ๋ด ๋จ์ด๋ค์ด ์๋ค ์์น์ ๋ฐ๋ผ ์๋ก ์ํฅ์ ์ฃผ๊ณ ๋ฐ๋๋ค.
๋ฐ๋ผ์ ๋จ์ํ y = f(x)๊ฐ์ ์์์ ๊ฐ๋ ์์ด ์ ๋ ฅ์ ๋ฃ์ผ๋ฉด ์ถ๋ ฅ์ด ๋์ค๋ ํจ์์ ํํ๊ฐ ์๋,
์์ฐจ์ (sequential)์ ๋ ฅ์ผ๋ก ์ ๋ ฅ์ ๋ฐ๋ฅธ ๋ชจ๋ธ์ hidden state๊ฐ ์์ฐจ์ ์ผ๋ก ๋ณํ๋ฉฐ,
์ํ์ ๋ฐ๋ผ ์ถ๋ ฅ๊ฒฐ๊ณผ๊ฐ ์์ฐจ์ ์ผ๋ก ๋ฐํ๋๋ ํจ์๊ฐ ํ์ํ๋ค.
์ด๋ฐ ์๊ฐ๊ฐ๋ ์ด๋ ์์์ ๋ณด๋ฅผ ์ฌ์ฉํด ์ ๋ ฅ์ ํ์ตํ๋ ๊ฒ์ sequential modeling์ด๋ผ ํ๋ค.
์ ๊ฒฝ๋ง์ผ๋ก๋ RNN ๋ฑ์ผ๋ก, ์ ๊ฒฝ๋ง ๋ฟ๋ง ์๋๋ผ HMM, CRFs(Hidden Markov Model์ด๋ Conditional Random Fields)๋ฑ์ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์์ ๋ฌธ์ ์ ์ ๊ทผํ ์ ์๋ค.
2. RNN
2.1 Feed Forward
๊ธฐ๋ณธ์ ์ธ RNN์ ํ์ฉํ ์์ ํ ๊ณ์ฐํ๋ฆ์ ์์๋ณด์.
๋ค์ ๊ทธ๋ฆผ์ ๊ฐ time-step๋ณ๋ก ์ ๋ ฅ xt์ ์ด์ time-step ht๊ฐ RNN์ผ๋ก ๋ค์ด๊ฐ ์ถ๋ ฅ o๋ฅผ ๋ฐํํ๋ค.
์ด๋ ๊ฒ ๋์ถํ o๋ค์ y_hat์ผ๋ก ์ผ์์ ์ ๋ต์ธ y์ ๋น๊ต ํ, ์์ค L์ ๊ณ์ฐํ๋ค.
์ด๋ฅผ ์์์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
2.2 BPTT (Back Propagation Through Time)
์์ ํ ์ดํ time-step์ RNN์ ์ฌ์ฉ๋ parameter θ๋ ๋ชจ๋ ์๊ฐ์ ๊ณต์ ๋์ด ์ฌ์ฉ๋๋ค.
๋ฐ๋ผ์ ์์ ๊ตฌํ ์์ค L์ ๋ฏธ๋ถ์ ํตํด ์ญ์ ํ๋ฅผ ์ํํ๋ฉด, ๊ฐ time-step๋ณ๋ก ๋ค๋ก๋ถํฐ θ์ ๊ธฐ์ธ๊ธฐ๊ฐ ๊ตฌํด์ง๊ณ , ์ด์ time-step(t-1)θ์ ๊ธฐ์ธ๊ธฐ์ ๋ํด์ง๋ค.
์ฆ, t๊ฐ 0์ ๊ฐ๊น์์ง์๋ก RNN์ parameter θ์ ๊ธฐ์ธ๊ธฐ๋ ๊ฐ time-step๋ณ ๊ธฐ์ธ๊ธฐ๊ฐ ๋ํด์ ธ ์ ์ ์ปค์ง๋ค.
์๋ ๊ทธ๋ฆผ์์ ์ข์ธก์ผ๋ก ๊ฐ์๋ก ๊ธฐ์ธ๊ธฐ๊ฐ ๋ํด์ ธ ์ ์ ์ปค์ง๋ ์์ฑ์ ๊ฐ๋๋ฐ,
์ด ์์ฑ์ '์๊ฐ ์ถ์ ๋ํด ์ํ๋๋ ์ญ์ ํ ๋ฐฉ๋ฒ'์ด๋ผ๋ ๋ป์ผ๋ก BPTT๋ผ ํ๋ค.
์ด๋ฐ RNN ์ญ์ ํ์ ์์ฑ์ผ๋ก ์ธํด, RNN์ ๋ง์น time-step ์๋งํผ layer๊ฐ ์กด์ฌํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ํ๊ฐ ๋๋ฏ๋ก time-step์ด ๊ธธ์ด์ง์๋ก Deep RNN๊ณผ ์ ์ฌํ๊ฒ ๋์ํ๋ค.
2.3 Gradient Vanishing
์์ ์ค๋ช ํ๋ฏ, BPTT๋ก์ธํด RNN์ ์ญ์ ํ ์ ๋ง์น time-step๋งํผ์ ๊ณ์ธต์ด ์๋๊ฒ๊ณผ ๋น์ทํ ์์ฑ์ ๊ฐ๋๋ค.
ํ์ง๋ง ์์ RNN ์์์ ๋ณด๋ฉด ํ์ฑํํจ์๋ก tanhํจ์๊ฐ ์ฌ์ฉ๋๋ค.
tanh์ ์ ๋ ๊ธฐ์ธ๊ธฐ๊ฐ -1๊ณผ 1๋ก ์๋ ด(๊ธฐ์ธ๊ธฐ๋ 0์ ๊ทผ์ )ํ๋ค.
๋ฐ๋ผ์ tanh ์ ๋์ ๊ฐ์ ๋ฐํํ๋ ์ธต์ ๊ฒฝ์ฐ, ๊ธฐ์ธ๊ธฐ๊ฐ 0์ ๊ฐ๊น์์ง๋ค.
์ด๋ ๊ฒ๋๋ฉด ๊ทธ ๋ค์์ผ๋ก ๋ฏธ๋ถ๊ฐ์ ์ ๋ฌ๋ฐ์ ์ธต์ ์ ๋๋ก๋ ๋ฏธ๋ถ๊ฐ(๊ธฐ์ธ๊ธฐ)์ ์ ๋ฌ๋ฐ์ ์ ์๊ฒ ๋๋ค.
์ถ๊ฐ์ ์ผ๋ก tanh์ sigmoid์ ๋ํจ์๋ ๋ชจ๋ ๊ธฐ์ธ๊ธฐ ๊ฐ์ด 1๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ผ๋ฏ๋ก
โ๏ธ์ธต์ ๊ฑฐ์น ์๋ก ๊ธฐ์ธ๊ธฐ์ ํฌ๊ธฐ๋ ์์์ง ์ ๋ฐ์ ์๋ค!! → gradient vanishing
๋ฐ๋ผ์ RNN๊ฐ์ด time-step์ด ๋ง๊ฑฐ๋ ์ฌ๋ฌ์ธต์ ๊ฐ๋ MLP์ ๊ฒฝ์ฐ, ์ด๋ฐ ๊ธฐ์ธ๊ธฐ์์ค๋ฌธ์ ๊ฐ ์ฝ๊ฒ ๋ฐ์ํ๋ค.
๋ค๋ง MLP์์ ReLU์ Skip-Connection์ ๋ฑ์ฅ์ผ๋ก ๋๋ฌด ํฐ ๋ฌธ์ ๊ฐ ๋๋ ๊ฒ์ ์๋๋ค.
2.4 Deep RNN
๊ธฐ๋ณธ์ ์ผ๋ก time-step๋ณ RNN์ด ๋์ํ๋ค.
๋ค๋ง, ์๋์ฒ๋ผ ํ๋์ time-step๋ด์์ ์ฌ๋ฌ์ธต์ RNN์ ์์ ์๋ ์๋ค.
๋น์ฐํ ์ธต๋ณ๋ก parameter θ๋ฅผ ๊ณต์ ํ์ง ์๊ณ ๋ฐ๋ก ๊ฐ๋๋ค.
ํ๋์ ์ธต๋ง ๊ฐ๋ ๊ธฐ์กด RNN์ ๊ฒฝ์ฐ, hidden state์ ์ถ๋ ฅ๊ฐ์ด ๊ฐ์ ๊ฐ์ด์๋ค.
์ฌ๋ฌ ์ธต์ด ์์ฌ ์ด๋ค์ง RNN์ ๊ฒฝ์ฐ, ๊ฐ time-step์ RNN ์ ์ฒด ์ถ๋ ฅ๊ฐ์ ๋งจ ์์ธต hidden state๊ฐ ๋๋ค.
์ถ๋ ฅํ ์์ ํฌ๊ธฐ์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ๋ค.
โ ๋จ์ผ RNN: |h1:n| = (batch_size, n, hidden_size)
โ Deep RNN: |ht| = (#layers, batch_size, hidden_size)
2.5 Bidirectional RNN
์ด์ RNN์ ๋ฐฉํฅ์ ๊ดํด ์ด์ผ๊ธฐํด๋ณด์.
์๋ฐฉ์ RNN์ ์ฌ์ฉํ๋ฉด ๊ธฐ์กด ์ ๋ฐฉํฅ์ ์ญ๋ฐฉํฅ๊น์ง ์ถ๊ฐ๋์ด
๋ง์ง๋ง time-step์์๋ถํฐ ๊ฑฐ๊พธ๋ก ์ญ๋ฐฉํฅ(reverse direction)์ผ๋ก ์ ๋ ฅ๋ฐ์ ์งํํ๋ค.
๋น์ฐํ ์ ๋ฐฉํฅ๊ณผ ์ญ๋ฐฉํฅ์ parameter θ๋ ๊ณต์ ๋์ง ์๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก, output์ ๊ณผ๊ฑฐ์ ๋ฏธ๋ ๋ชจ๋์ ์์กดํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ถ๋ ฅํ ์์ ํฌ๊ธฐ์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ๋ค.
โ |ht| = (#direction × #layers, batch_size, hidden_size)
2.6 NLP ์ ์ฉ์ฌ๋ก
2.7 ์ ๋ฆฌ
NLP์์ ๊ฑฐ์ ๋๋ถ๋ถ์ ์ ์ถ๋ ฅํํ๋ ๋ชจ๋ ๋ถ์ฐ์์ ์ธ ๊ฐ์ ๊ฐ๋๋ค.
์ฆ, regression๋ณด๋ค๋ classification์ ๊ฐ๊น๋ค.
๋ฐ๋ผ์ Cross-Entropy Loss function์ ์ฌ์ฉํด ์ ๊ฒฝ๋ง์ trainํ๋ค.
์ด์ฒ๋ผ RNN์ ๊ฐ๋ณ๊ธธ์ด์ ์ ๋ ฅ์ ๋ฐ์ ์ถ๋ ฅ์ผ๋ก ๊ฐ๋ณ๊ธธ์ด๋ฅผ ๋ฐํํ๋ ๋ชจ๋ธ์ด๋ค.
ํ์ง๋ง ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ Vanilla-RNN์ time-step์ด ๊ธธ์ด์ง์๋ก ์์ data๊ธฐ์ต์ด ์ด๋ ต๋ค.
3. LSTM (Long Short Term Memory)
3.1 LSTM
โ RNN์ ๊ฐ๋ณ๊ธธ์ด์ sequential dataํํ ์ ๋ ฅ์ ์ ์๋ํ์ง๋ง ๊ทธ ๊ธธ์ด๊ฐ ๊ธธ์ด์ง์๋ก ์์์ ๋ ฅ๋ data๋ฅผ ๊น๋จน๋ ์น๋ช ์ ์ธ ๋จ์ ์ด ์กด์ฌํ๋ค. ์ด๋ฅผ ๋ณด์ํ๊ณ ์ LSTM์ด ๋์ ๋์๋ค. (์ฌ์ ํ ๊ธด ๊ธธ์ด์ data์ ๋ํด ๊ธฐ์ตํ์ง๋ ๋ชปํจ, ๋ณด์๋ง ํจ)
LSTM์ ๊ธฐ์กด RNN์ ์๋์ํ ์ด์ธ์ ๋ณ๋์ cell state๋ฅผ ๊ฐ๊ฒํ์ฌ ๊ธฐ์ต๋ ฅ์ ์ฆ๊ฐํ๋ค.
์ถ๊ฐ์ ์ผ๋ก ์ฌ๋ฌ gate๋ฅผ ๋ฌ forget, output ๋ฑ์ ํจ๊ณผ์ ์ผ๋ก ์ ์ดํ๋ค.
๊ทธ ๊ฒฐ๊ณผ, ๊ธด ๊ธธ์ด์ data์ ๋ํด์๋ ํจ์จ์ ์ผ๋ก ๋์ฒํ ์ ์๊ฒ ๋์๋ค.
๋ค๋ง, ๊ตฌ์กฐ์ ์ผ๋ก ๋์ฑ ๋ณต์กํด์ ธ์ ๋ ๋ง์์ง parameter ํ์ต์ ์ํด ๋ ๋ง์ data๋ฅผ ์ด์ฉํด ํ๋ จํด์ผํ๋ค.
์๋๋ LSTM์ ์์์ด๋ค.
๊ฐ gate์ sigmoid(σ)๊ฐ ๋ถ์ด 0~1๊ฐ์ผ๋ก gate๋ฅผ ์ผ๋ง๋ ์ด๊ณ ๋ซ์์ง๋ฅผ ๊ฒฐ์ ํ๋ค.
3.2 LSTM์ ์ญ์ ํ
4. GRU (Gated Recurrent Unit)
4.1 GRU
GRU๋ LSTM์ ๊ฐ์ํ ๋ฒ์ ์ผ๋ก ๊ธฐ์กด์ ๋นํด ๋ ๊ฐ๋จํ์ง๋ง ์ฑ๋ฅ์ด ๋น์ทํ ๊ฒ์ด ํน์ง์ด๋ค.
σ๋ก ๊ตฌ์ฑ๋ rt(reset gate)์ zt(update gate)๊ฐ ์กด์ฌํ๋ค.
σ๋ก ์ฌ์ ํ data์ ํ๋ฆ์ ์ด๊ณ ๋ซ์ ์ ์ดํ ์ ์์ผ๋ฉฐ,
๊ธฐ์กด LSTM๋๋น gate์ ์ซ์๋ ์ค๊ณ ๋ฐ๋ผ์ gate์ ๋ธ๋ ค์๋ parameter ์๋ ๊ทธ๋งํผ ์ค์ด๋ ๋ค.
GRU์ ์์์ ์๋์ ๊ฐ๋ค.
GRU๋ LSTM๋ณด๋ค ๋ชธ์ง์ด ์๊ธดํ์ง๋ง LSTM์ด ํ์ ํ ์ฌ์ฉ๋น๋๊ฐ ๋ ๋์๋ฐ,
์ฑ๋ฅ์ฐจ์ด๋ณด๋ค๋ LSTM๊ณผ GRU์ ํ์ต๋ฅ , hidden_size๋ฑ์ hyper-parameter๊ฐ ๋ค๋ฅด๊ธฐ์
์ฌ์ฉ๋ชจ๋ธ์๋ฐ๋ผ parameter setting์ ๋ค์ ์ฐพ์๋ด์ผ ํ๋ค.
5. Gradient Clipping
5.1 Gradient Clipping
RNN์ BPTT(Back Propagation Through Time)์ ํตํด ์๊ฐ์ญํ์ผ๋ก ๊ธฐ์ธ๊ธฐ๋ฅผ ๊ตฌํ๋ค.
๋งค time step๋ง๋ค RNN์ parameter์ ๊ธฐ์ธ๊ธฐ๊ฐ ๋ํด์ง๋ฏ๋ก ์ถ๋ ฅ์ ๊ธธ์ด์๋ฐ๋ผ ๊ธฐ์ธ๊ธฐํฌ๊ธฐ๊ฐ ๋ฌ๋ผ์ง๋ค.
์ฆ, ๊ธธ์ด๊ฐ ๊ธธ์๋ก ์์นซ ๊ธฐ์ธ๊ธฐ์ ํฌ๊ธฐ์ธ norm์ด ๋๋ฌด ์ปค์ง๋, gradient exploding๋ฌธ์ ๊ฐ ์ผ๊ธฐ๋ ์ ์๋ค.
โ๏ธ๊ธฐ์ธ๊ธฐ์ ํฌ๊ธฐ๊ฐ ๋๋ฌด ์ปค์ง ๋, ๊ฐ์ฅ ์ฌ์ด ๋์ฒ๋ฒ: ํ์ต๋ฅ ์ ์์ฃผ ์๊ฒ ์ค์
๋ค๋ง, ํ๋ จ์๋๊ฐ ๋งค์ฐ ๋๋ ค์ง ์ ์๋ค๋ ๋จ์ ์ด ์กด์ฌํ๋ฉฐ local optima์ ๋น ์ง ์ ์์
์ฆ, ๊ธธ์ด๊ฐ ๊ฐ๋ณ์ด๊ธฐ์ ํ์ต๋ฅ ์ ๋งค๋ฒ ์๋ง๊ฒ ์ต์ ์ ๊ฐ์ ์ฐพ๋ ๊ฒ์ ๋ฌด์ฒ ์ด๋ ต๊ธฐ์
์ด๋, Gradient Clipping์ด ํฐ ์๋ ฅ์ ๋ฐํํ๋ค.
Gradient Clipping์ parameter θ์ norm(๋ณดํต L2 norm)๋ฅผ ๊ตฌํ๊ณ
์ด norm์ ํฌ๊ธฐ๋ฅผ ์ ํํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ฆ, gradient vector๋ ์ ์ง, ํฌ๊ธฐ๋ฅผ ํ์ต์ ์ํฅ์ฃผ์ง ์๋ ๋งํผ ์ค์ด๋ ๊ฒ์ด๋ค.
์์์ ๋ณด๋ฉด, ๊ธฐ์ธ๊ธฐ norm์ด ์ ํด์ง ์ต๋๊ฐ(threshold)๋ณด๋ค ํฌ๋ค๋ฉด ์ต๋๊ฐ๋ณด๋ค ํฐ ๋งํผ์ ๋น์จ๋ก ๋๋ ์ค๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ํญ์ ๊ธฐ์ธ๊ธฐ๋ threshold๋ณด๋ค ์์์ง๊ฒ ๋๋ฉฐ, ์ด๋ ํ์ต์ ๋ฐ์ฐ์ ๋ฐฉ์งํ๊ณ ๊ธฐ์ธ๊ธฐ์ ๋ฐฉํฅ์์ฒด๋ฅผ ๋ฐ๊พธ์ง ์๊ณ ์ ์ง์์ผ parameter θ๊ฐ ํ์ตํด์ผํ๋ ๋ฐฉํฅ์ฑ์ ์์ง ์๊ฒ ํด์ค๋ค.
์ฆ, ์์คํจ์๋ฅผ ์ต์ํํ๊ธฐ ์ํ ๊ธฐ์ธ๊ธฐ์ ๋ฐฉํฅ์ ์ ์งํ๊ณ , ํฌ๊ธฐ๋ง ์กฐ์ ํ๊ธฐ์ ํ์ต๋ฅ ์ 1๊ณผ ๊ฐ์ด ํฐ ๊ฐ์ผ๋ก๋ ํ์ต์ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
๋ค๋ง, Adam๊ณผ ๊ฐ์ ๋์ ํ์ต๋ฅ ์ ๊ฐ๋ optimizer๋ ์ฌ์ฉํ ํ์์ฑ์ด ์๊ณ SGD์ ๊ฐ์ ๊ฒฝ์ฐ ์ ์ฉํ๋ ํธ์ด ์ข๋ค.
์๋์ ๊ฐ์ด pytorch์์ Gradient Clipping๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.
import torch.optim as optim import torch.nn.utils as torch_utils learning_rate = 1. max_norm = 5 optimizier = optim.SGD(model.parameters(), lr=learning_rate, weight_decay=0.01) # ๊ธฐ์ธ๊ธฐํญ๋ฐ์ ํผํ๊ธฐ ์ํด gradient clipping์ ๋์ torch_utils.clip_grad_norm_(model.parameters(), max_grad_norm) optimizer.step()
๋ง์น๋ฉฐ...
์ด๋ฒ์๊ฐ์๋ RNN์ ํ์ฉํ ์์์ ๋ณด๋ฅผ ๊ฐ์ง ์์ฐจ๋ฐ์ดํฐ, ์๊ณ์ด๋ฐ์ดํฐ๋ฅผ ํ์ตํ๋ ๋ฐฉ๋ฒ์ ์ตํ๋ค.
๊ธฐ์กด์ ์ ๊ฒฝ๋ง๊ณผ ๋ฌ๋ฆฌ RNN์ ์ด์ time step์ ์๊ธฐ์์ ์ ์ฐธ์กฐํด ํ์ฌ ์์ ์ state๋ฅผ ๊ฒฐ์ ํ๋ค.
๋ฐ๋ผ์ time step๋ง๋ค RNN์ ์ ๊ฒฝ๋ง๊ฐ์ค์น๋ ๊ณต์ ๋์ง๋ง ๊ธฐ์ธ๊ธฐ์์ค, ์ฅ๊ธฐ๊ธฐ์ต ๋ฑ์ ๋ฌธ์ ๋ก ๊ธด ์์ฐจ๋ฐ์ดํฐ์ฒ๋ฆฌ์ ์ด๋ ค์์ ๊ฒช๋๋ค.
LSTM๊ณผ GRU์ ๊ฒฝ์ฐ, ์ด๋ฐ RNN์ ๋จ์ ์ ๋ณด์ํด ์ฌ๋ฌ gate๋ฅผ ์ด๊ณ ๋ซ์(by sigmoid)
์ ๋ณด์ ํ๋ฆ์ ์กฐ์ ํจ์ผ๋ก์จ ์ฅ๊ธฐ๊ธฐ์ต๋ ฅ์ ๋ ๋์ ์ฑ๋ฅ์ ๋ณด์ฌ์ค๋ค.
RNN์ ์ญ์ ํ์๊ณ ๋ฆฌ์ฆ์ธ BPTT๋ ์๊ฐ์ ๋ํด์๋ ์ด๋ค์ง๋๋ฐ,
time-step์ด ๋ง์ data์ผ์๋ก time-step๋ณ ๊ธฐ์ธ๊ธฐ๊ฐ ๋ํด์ ธ ์ต์ข ๊ธฐ์ธ๊ธฐ๊ฐ ์ปค์ง๋ค.
๊ธฐ์ธ๊ธฐ๊ฐ ํด ๋, ๋๋ฌด ํฐ ํ์ต๋ฅ ์ ์ฌ์ฉํ๋ฉด ํด๋น ํ์ต์ ๋ฐ์ฐํ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
๋ฐ๋ผ์ ๊ธฐ์ธ๊ธฐ๊ฐ ์ ํด์ง ์๊ณ์น๋ณด๋ค ์ปค์ง์ง ์๋๋กํ๋ Gradient Clipping์ ํตํด ๋ฐฉํฅ์ ์ ์ง, ํฌ๊ธฐ๋ง ๊ฐ์์์ผ
ํ์ต๋ฅ 1๊ณผ ๊ฐ์ ๋งค์ฐ ํฐ ๊ฐ๋ ํ์ต์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋ค.