rnn_layer
RNN Layer๋?
RNN (Recurrent Neural Network) Layer๋ ์ํ ์ ๊ฒฝ๋ง ๋ชจ๋ธ ์ค ํ๋๋ก, ์ ๋ ฅ ๋ฐ์ดํฐ์ ์์์ ์ํ ์ ๋ณด๋ฅผ ๋ชจ๋ธ๋งํ๋ ๋ฐ์ ์ ํฉํ ๋ชจ๋ธ์ ๋๋ค. RNN์ ์ด์ ์ ๊ณ์ฐ๋ ๊ฐ์ ๋ค์ ํ์ฌ ๊ณ์ฐ์ ํ์ฉํ๊ธฐ ๋๋ฌธ์ ์ด์ ์ ์ ๋ ฅ์ ๋ํ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ๊ณ ์ด๋ฅผ ๋ค์ ๊ณ์ฐ์ ํ์ฉํฉ๋๋ค. ์ด์ ์ ๋ ฅ์ ๋ํ ์ ๋ณด๋ฅผ ํ์ฌ ๊ณ์ฐ์ ํ์ฉํ๊ธฐ ๋๋ฌธ์ ์๊ณ์ด ๋ฐ์ดํฐ์ ๊ฐ์ด ์ ๋ ฅ ๊ฐ์ ์์๊ฐ ์ค์ํ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
RNN Layer๋ ์๊ฐ ์ถ์ผ๋ก ํผ์ณ์ง ํํ์ ๋คํธ์ํฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ฉฐ, ์๊ฐ t์์์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ถ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ฐํ๋ ๋์์ ๋ฐ๋ณต์ ์ผ๋ก ์ํํฉ๋๋ค. RNN Layer์ ๊ฐ ๋ด๋ฐ์ ํ์ฌ ์ ๋ ฅ ๋ฐ์ดํฐ์ ์ด์ ์์ ์ ์ถ๋ ฅ๊ฐ์ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ํ์ฌ ์์ ์ ์ถ๋ ฅ๊ฐ์ ๊ณ์ฐํฉ๋๋ค. ์ด๋ฅผ ์์์ผ๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฌ๊ธฐ์ ๋ ์๊ฐ t์์์ ์ ๋ ฅ ๋ฒกํฐ, ๋ ์๊ฐ t์์์ ์ถ๋ ฅ ๋ฒกํฐ, ๋ ์ ๋ ฅ ๊ฐ์ค์น ํ๋ ฌ, ๋ ์ด์ ์์ ์ ์ถ๋ ฅ๊ฐ๊ณผ ํ์ฌ ์ ๋ ฅ๊ฐ์ ์ฐ๊ฒฐํ ๊ฐ์ค์น ํ๋ ฌ, ๋ ํธํฅ ๋ฒกํฐ, ๋ ํ์ฑํ ํจ์์ ๋๋ค.
RNN Layer๋ ๋ค์ํ ์ข ๋ฅ๊ฐ ์์ผ๋ฉฐ, ๋ํ์ ์ผ๋ก Simple RNN, LSTM(Long Short-Term Memory), GRU(Gated Recurrent Unit) ๋ฑ์ด ์์ต๋๋ค. ์ด๋ค์ ๊ฐ๊ฐ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ ์ฌ์ด์ ์ ๋ณด ํ๋ฆ์ ๋ค๋ฅด๊ฒ ์กฐ์ ํ์ฌ, ๋ค์ํ ์๊ณ์ด ๋ฐ์ดํฐ์ ๋ํ ๋ชจ๋ธ๋ง์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
increment_layer
static void increment_layer(layer *l, int steps)
{
int num = l->outputs*l->batch*steps;
l->output += num;
l->delta += num;
l->x += num;
l->x_norm += num;
}ํจ์ ์ด๋ฆ: increment_layer
์ ๋ ฅ:
layer *l
int steps
๋์:
RNN ๋ ์ด์ด์์ timestep ๋จ์๋ก ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋, ์ด์ timestep์์ ์ถ๋ ฅํ ๊ฒฐ๊ณผ๊ฐ์ ํ์ฌ timestep์์ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด, ํ์ฌ timestep์ ํด๋นํ๋ ๋ ์ด์ด ํฌ์ธํฐ(l)๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฐ์ดํฐ ํฌ์ธํฐ(output, delta, x, x_norm)๋ฅผ steps(ํ์ฌ timestep๊ณผ ์ด์ timestep ๊ฐ์ ์ฐจ์ด)๋งํผ ์ฆ๊ฐ์์ผ์ฃผ๋ ํจ์์ด๋ค.
์ค๋ช :
RNN ๋ ์ด์ด๋ ์ํ์ค ํํ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋, ์ด์ timestep์์ ์ถ๋ ฅํ ๊ฒฐ๊ณผ๊ฐ์ ํ์ฌ timestep์์ ๋ค์ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํ๋ค.
์ด ๋, ํ์ฌ timestep์ ๋ ์ด์ด ํฌ์ธํฐ๊ฐ ์ด์ timestep์์์ ๋ ์ด์ด ํฌ์ธํฐ์ ๊ฐ๋ฆฌํค๋ ๋ฐ์ดํฐ์ ์์น๊ฐ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์, ํ์ฌ timestep์์์ ๋ฐ์ดํฐ ํฌ์ธํฐ๋ฅผ ์ด์ timestep์์์ ๋ฐ์ดํฐ ํฌ์ธํฐ์์ ์ ์ ํ ์ด๋์์ผ์ฃผ์ด์ผ ํ๋ค.
์ด ํจ์๋ ์ด๋ฅผ ์ํํ๋ ์ญํ ์ ํ๋ค. ์ ๋ ฅ์ผ๋ก ํ์ฌ timestep์ ๋ ์ด์ด ํฌ์ธํฐ(l)์ ์ด์ timestep๊ณผ์ ์ฐจ์ด(steps)๋ฅผ ๋ฐ์์, l์ด ๊ฐ๋ฆฌํค๋ ๋ฐ์ดํฐ ํฌ์ธํฐ(output, delta, x, x_norm)๋ฅผ steps๋งํผ ์ฆ๊ฐ์์ผ์ค๋ค.
์ด ๋, ๋ฐ์ดํฐ ํฌ์ธํฐ์ ์ฆ๊ฐ๋์ timestep ๊ฐ์ ์ฐจ์ด์ ๋ฐ์ดํฐ์ ํฌ๊ธฐ(output, delta, x, x_norm)์ ๋ฐฐ์น ํฌ๊ธฐ(batch)๋ฅผ ๊ณฑํ ๊ฐ์ด๋ค.
forward_rnn_layer
ํจ์ ์ด๋ฆ: forward_rnn_layer
์ ๋ ฅ:
layer l (ํ์ฌ RNN ๋ ์ด์ด)
network net (๋คํธ์ํฌ)
๋์:
ํ์ฌ RNN ๋ ์ด์ด๋ฅผ ํฌ์๋ ํจ์คํ๋ ํจ์๋ก, RNN ๋ ์ด์ด์ ์ ๋ ฅ, ์๋ ์ํ, ์ถ๋ ฅ์ ๊ณ์ฐํฉ๋๋ค.
์ ๋ ฅ, ์๋ ์ํ, ์ถ๋ ฅ ๊ณ์ฐ์ ์ํด connected ๋ ์ด์ด๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
RNN ๋ ์ด์ด์ ์ ๋ ฅ์ ํ์ฌ ๋ ์ด์ด ์ด์ ์ ์ถ๋ ฅ๊ณผ ํ์ฌ ์์ ์ ์ ๋ ฅ์ ๋ํ ๊ฐ์ ๋๋ค.
์ด์ ์ ์ถ๋ ฅ์ ๋ํด์ฃผ๋ ์ด์ ๋ RNN์ด ์ด์ ์ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ๊ธฐ ์ํด์์ ๋๋ค.
๋ํ, ํ์ฌ ์์ ์ ์ ๋ ฅ๊ณผ ์๋ ์ํ๋ฅผ ๋ํด์ฃผ๋ ์ด์ ๋ ํ์ฌ ์ ๋ ฅ๊ณผ ์ด์ ์ํ๊ฐ ๋ค์ ์ํ์ ์ถ๋ ฅ์ ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ ์ด์ด์ ์ ๋ ฅ, ์ถ๋ ฅ, ์๋ ์ํ, ๋ธํ ๊ฐ์ด ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
์ค๋ช :
์ด ํจ์๋ RNN ๋ ์ด์ด๋ฅผ ํฌ์๋ ํจ์คํ๋ ํจ์๋ก, ์ด์ ๋ ์ด์ด์์ ์ถ๋ ฅ๋ ๊ฐ์ ํ์ฌ ๋ ์ด์ด์ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
์ด์ ๋ ์ด์ด์์ ์ถ๋ ฅ๋ ๊ฐ๊ณผ ํ์ฌ ์ ๋ ฅ ๊ฐ์ ๋ํ ๊ฐ์ RNN ๋ ์ด์ด์ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํ๋ฉฐ, ์๋ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ์ถ๋ ฅ์ ๊ณ์ฐํฉ๋๋ค.
์ด์ ์ํ์ ํ์ฌ ์ ๋ ฅ์ด ๋ค์ ์ํ์ ์ํฅ์ ๋ฏธ์น๋ฏ๋ก, ์ด์ ์ํ์ ํ์ฌ ์ ๋ ฅ์ ๋ํด์ฃผ๋ ๊ฒ์ ๋๋ค.
์ด ํจ์๋ ๋คํธ์ํฌ๋ฅผ ํ์ต ์ค์ธ์ง ์๋์ง์ ๋ฐ๋ผ ๋คํธ์ํฌ ์ํ๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
๋ํ, RNN ๋ ์ด์ด๋ ์ฐ์๋ ์คํ ์ ๊ณ์ฐํด์ผ ํ๋ฏ๋ก, ์ ๋ ฅ, ์๋ ์ํ, ์ถ๋ ฅ ๋ ์ด์ด๋ฅผ ์คํ ์๋งํผ ๋ฐ๋ณต์ ์ผ๋ก ๊ณ์ฐํฉ๋๋ค.
backward_rnn_layer
ํจ์ ์ด๋ฆ: backward_rnn_layer
์ ๋ ฅ:
layer l: ์ญ์ ํ๋ฅผ ์ํํ RNN ๋ ์ด์ด
network net: RNN ๋ ์ด์ด๋ฅผ ํฌํจํ๋ ์ ๊ฒฝ๋ง
๋์:
RNN ๋ ์ด์ด์ ์ญ์ ํ(backpropagation)๋ฅผ ์ํํ๋ค. RNN ๋ ์ด์ด๋ ์๊ฐ ์คํ (time step)์ด ์๊ธฐ ๋๋ฌธ์, ์ญ์ ํ๋ ์๊ฐ์ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก(step-by-step) ์ํ๋๋ค.
์ค๋ช :
๋จผ์ , ์ ๋ ฅ ๋ ์ด์ด(input_layer), ์๊ธฐ ๋ฐ๋ณต ๋ ์ด์ด(self_layer), ์ถ๋ ฅ ๋ ์ด์ด(output_layer)๋ฅผ ๊ฐ์ ธ์จ๋ค.
๊ฐ ๋ ์ด์ด์ ์ถ๋ ฅ(delta)์ 0์ผ๋ก ์ด๊ธฐํํ๋ค.
RNN ๋ ์ด์ด๊ฐ ํ์ต ๋ชจ๋(train mode)์ผ ๊ฒฝ์ฐ, ์ํ(state)๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ๋ค.
๋ชจ๋ ์๊ฐ ์คํ ์ ๋ํด ๋ฐ๋ณตํ๋ฉฐ, ๋ค์์ ์ํํ๋ค:
input_layer์ ํ์ฌ ์ ๋ ฅ(net.input)์ ๋ฃ๊ณ , forward_connected_layer()๋ฅผ ํธ์ถํ์ฌ input_layer์ ์ถ๋ ฅ(output)์ ๊ณ์ฐํ๋ค.
self_layer์ ์ด์ ์๊ฐ ์คํ ์ ์ํ(l.state)๋ฅผ ๋ฃ๊ณ , forward_connected_layer()๋ฅผ ํธ์ถํ์ฌ self_layer์ ์ถ๋ ฅ(output)์ ๊ณ์ฐํ๋ค.
RNN ๋ ์ด์ด์ ํ์ฌ ์ํ๋ฅผ ๊ณ์ฐํ๋ค. ์ด์ ์ํ(old_state)๋ฅผ ์ ์งํ ํ, input_layer์ self_layer์ ์ถ๋ ฅ์ ๋ํ ๊ฐ์ ํ์ฌ ์ํ(l.state)๋ก ๊ฐฑ์ ํ๋ค.
output_layer์ ํ์ฌ ์ํ(l.state)๋ฅผ ๋ฃ๊ณ , forward_connected_layer()๋ฅผ ํธ์ถํ์ฌ ์ถ๋ ฅ(output)์ ๊ณ์ฐํ๋ค.
input_layer, self_layer, output_layer์ ์ถ๋ ฅ(delta)๋ฅผ ๊ณ์ฐํ๋ค.
net.input์ ๋ค์ ์๊ฐ ์คํ ์ ์ ๋ ฅ์ผ๋ก ์ด๋ํ๋ค.
input_layer, self_layer, output_layer๋ฅผ ํ ์๊ฐ ์คํ ์์ผ๋ก ์ด๋์ํจ๋ค.
๋ชจ๋ ์๊ฐ ์คํ ์ ๋ํด ์ญ์ ํ๋ฅผ ์ํํ๋ฉฐ, ๋ค์์ ์ํํ๋ค:
output_layer์ ์ญ์ ํ(delta)๋ฅผ ๊ณ์ฐํ๋ค.
self_layer์ ์ญ์ ํ(delta)๋ฅผ ๊ณ์ฐํ๋ค.
input_layer์ ์ญ์ ํ(delta)๋ฅผ ๊ณ์ฐํ๋ค.
input_layer, self_layer, output_layer๋ฅผ ํ ์๊ฐ ์คํ ๋ค๋ก ์ด๋์ํจ๋ค.
update_rnn_layer
ํจ์ ์ด๋ฆ: update_rnn_layer
์ ๋ ฅ:
layer l (RNN ๋ ์ด์ด)
update_args a (๊ฐ์ค์น ์ ๋ฐ์ดํธ์ ํ์ํ ์ธ์๋ค)
๋์:
RNN ๋ ์ด์ด์ ์ ๋ ฅ ๋ ์ด์ด, ์๊ธฐ ์ํ ๋ ์ด์ด, ์ถ๋ ฅ ๋ ์ด์ด ๊ฐ๊ฐ์ ๋ํด update_connected_layer ํจ์๋ฅผ ํธ์ถํ์ฌ ๊ฐ์ค์น๋ฅผ ์ ๋ฐ์ดํธํจ.
์ค๋ช :
์ด ํจ์๋ RNN ๋ ์ด์ด์ ๊ฐ์ค์น๋ฅผ ์ ๋ฐ์ดํธํ๊ธฐ ์ํด ํธ์ถ๋ฉ๋๋ค.
RNN์ ์ ๋ ฅ ์ํ์ค๋ฅผ ์ฒ๋ฆฌํ ๋, ์ํ์ค ๋ด ์ด์ ์์ ์์์ ์๊ธฐ ์ํ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก, ์ ๋ ฅ ๋ ์ด์ด, ์๊ธฐ ์ํ ๋ ์ด์ด, ์ถ๋ ฅ ๋ ์ด์ด ๊ฐ๊ฐ์ ๋ํด ๊ฐ์ค์น๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํฉ๋๋ค.
์ด๋ฅผ ์ํด ์ ๋ ฅ ๋ ์ด์ด, ์๊ธฐ ์ํ ๋ ์ด์ด, ์ถ๋ ฅ ๋ ์ด์ด์ ๋ํด update_connected_layer ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
make_rnn_layer
ํจ์ ์ด๋ฆ: make_rnn_layer
์ ๋ ฅ:
batch: intํ, ๋ฐฐ์น ํฌ๊ธฐ
inputs: intํ, ์ ๋ ฅ ๋ฐ์ดํฐ์ ์ฐจ์ ์
outputs: intํ, ์ถ๋ ฅ ๋ฐ์ดํฐ์ ์ฐจ์ ์
steps: intํ, ์ํํ๋ ๋จ๊ณ ์
activation: ACTIVATION ์ด๊ฑฐํ, ํ์ฑํ ํจ์
batch_normalize: intํ, ๋ฐฐ์น ์ ๊ทํ ์ฌ์ฉ ์ฌ๋ถ (1: ์ฌ์ฉ, 0: ๋ฏธ์ฌ์ฉ)
adam: intํ, Adam ์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉ ์ฌ๋ถ (1: ์ฌ์ฉ, 0: ๋ฏธ์ฌ์ฉ)
๋์:
์ ๋ ฅ๊ฐ์ ๋ฐํ์ผ๋ก RNN ๋ ์ด์ด๋ฅผ ์์ฑํ๊ณ ์ด๊ธฐํํ๋ค.
์ ๋ ฅ๊ฐ์ผ๋ก๋ถํฐ ์ฐ๊ฒฐ๋ ๋ ์ด์ด๋ค์ ์์ฑํ๊ณ ์ด๊ธฐํํ๋ค.
์์ฑ๋ ๋ ์ด์ด๋ค ๊ฐ์ ์ํธ ์ฐ๊ฒฐ์ ์ค์ ํ๋ค.
์์ฑ๋ RNN ๋ ์ด์ด๋ฅผ ๋ฐํํ๋ค.
์ค๋ช :
์ ๋ ฅ๊ฐ์ผ๋ก๋ถํฐ RNN ๋ ์ด์ด๋ฅผ ์์ฑํ๊ณ ์ด๊ธฐํํ๋ ํจ์์ด๋ค.
RNN ๋ ์ด์ด๋ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ์ํ ์ ๊ฒฝ๋ง ์ฐ์ฐ์ ์ํํ๋ค.
์ด ํจ์๋ ์ ๋ ฅ๊ฐ์ ๋ฐํ์ผ๋ก ์ฐ๊ฒฐ๋ ์ ๋ ฅ ๋ ์ด์ด, ์๊ธฐ ์ฐ๊ฒฐ ๋ ์ด์ด, ์ถ๋ ฅ ๋ ์ด์ด๋ฅผ ์์ฑํ๊ณ ์ด๊ธฐํํ๋ค.
์ด ํจ์๋ ์์ฑ๋ ๋ ์ด์ด๋ค ๊ฐ์ ์ํธ ์ฐ๊ฒฐ์ ์ค์ ํ๋ค.
์ด ํจ์๋ ์์ฑ๋ RNN ๋ ์ด์ด๋ฅผ ๋ฐํํ๋ค.
Last updated
Was this helpful?