1. ์ํ ์ ๊ฒฝ๋ง
RNN์ ๋ชฉ์ ์ ์ํ์ค ํ
์๋ฅผ ๋ชจ๋ธ๋งํ๋ ๊ฒ์
๋๋ค. RNN์๋ ์ฌ๋ฌ ๋ชจ๋ธ์ด ์๋๋ฐ, ์ด ์ฅ์์๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ด ๋๋ ์๋ง RNN์ ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค. RNN์์๋ ์ํ์ค์ ํํ ํ์ต์ ์ํด ์ํ์ค์ ํ์ฌ ์ํ๋ฅผ ๊ฐ์งํ๋ ์๋ ์ํ ๋ฒกํฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ํ์ฌ ์
๋ ฅ ๋ฒกํฐ์ ์ด์ ์๋ ์ํ ๋ฒกํฐ๋ฅผ ์ด์ฉํ์ฌ ์๋ ์ํ ๋ฒกํฐ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
ย
ย
ํ์ฌ ํ์ ์คํ
์ ์
๋ ฅ ๋ฒกํฐ์ ์ด์ ํ์ ์คํ
์ ์๋ ๋ฒกํฐ๋ ํ์ฌ ํ์ ์คํ
์ ์๋ ์ํ ๋ฒกํฐ์ ๋งคํ๋ฉ๋๋ค. ์๋-์๋ ๊ฐ์ค์น ํ๋ ฌ์ ์ฌ์ฉํด ์ด์ ์๋ ์ํ ๋ฒกํฐ๋ฅผ ๋งคํํ๊ณ ์
๋ ฅ-์๋ ๊ฐ์ค์น ํ๋ ฌ์ ์ฌ์ฉํด ์
๋ ฅ ๋ฒกํฐ๋ฅผ ๋งคํํ์ฌ ์๋ก์ด ์๋ ๋ฒกํฐ๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์ด๋ ์๋-์๋ ๊ฐ์ค์น์ ์
๋ ฅ-์๋ ๊ฐ์ค์น๊ฐ ์ฐ์๋ ํ์ ์คํ
์ ๊ฑธ์ณ ๊ณต์ ๋๋ค๋ ์ ์ด ์ค์ํฉ๋๋ค. ํ๋ จ ๊ณผ์ ์์ ์ด๋ฐ ๊ฐ์ค์น๋ ์์ ๋๋ฉฐ, ํ์ฌ ์
๋ ฅ ์ ๋ณด์ ์ง๊ธ๊น์ง์ ์
๋ ฅ์ ์์ฝํ ์ํ ํํ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋๋ค. ์ด๋ ํ์ ์คํ
์ ์๋์ง ์ ์๋ ์์ง๋ง, ํ ํ์ ์คํ
์์ ๋ค๋ฅธ ํ์ ์คํ
์ผ๋ก ์ด๋ํ๋ฉด์ ์์ค ํจ์๋ฅผ ์ต์ํํ๊ธฐ ์ํด ์ํ ํํ์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ํ์ตํ๊ฒ ๋ฉ๋๋ค.
ย
๋์ผํ ๊ฐ์ค์น๋ฅผ ์ฌ์ฉํด ํ์ ์คํ
๋ง๋ค ์
๋ ฅ์ ์ถ๋ ฅ์ผ๋ก ๋ณํํ๋ ๊ฒ์ ํ๋ผ๋ฏธํฐ ๊ณต์ ์ ํ ์์
๋๋ค. CNN์ ์ปค๋์ด๋ผ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํด ์
๋ ฅ ๋ฐ์ดํฐ์ ๋ถ๋ถ ์์ญ์์ ์ถ๋ ฅ์ ๊ณ์ฐํฉ๋๋ค. ํฉ์ฑ๊ณฑ ์ปค๋์ ์
๋ ฅ์ ๊ฐ๋ก์ง๋ฌ ์ด๋ํ๊ณ ๊ฐ๋ฅํ ์์น๋ง๋ค ์ถ๋ ฅ์ ๊ณ์ฐํจ์ผ๋ก์จ ์ด๋ ๋ถ๋ณ์ฑ์ ํ์ตํฉ๋๋ค. ๋ฐ๋ฉด RNN์ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํด ํ์ ์คํ
๋ง๋ค ์ถ๋ ฅ์ ๊ณ์ฐํฉ๋๋ค. ์ด๋ ์๋ ์ํ ๋ฒกํฐ์ ์์กดํด์ ์ํ์ค์ ์ํ๋ฅผ ๊ฐ์งํ๋ฉฐ, RNN์ ๋ชฉ์ ์ ์ฃผ์ด์ง ์๋ ์ํ ๋ฒกํฐ์ ์
๋ ฅ ๋ฒกํฐ์ ๋ํ ์ถ๋ ฅ์ ๊ณ์ฐํจ์ผ๋ก์จ ์ํ์ค ๋ถ๋ณ์ฑ์ ํ์ตํ๋ ๊ฒ์
๋๋ค. RNN์ ์๊ฐ์ ๋ฐ๋ผ, CNN์ ๊ณต๊ฐ์ ๋ฐ๋ผ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ณต์ ํ๋ ๊ฒ์
๋๋ค.
ย
2. ์๋ง RNN
์๋ ์ฝ๋์ ElmanRNN์ RNNCell์ ์ฌ์ฉํด ์์ ์ธ๊ธํ๋ ์
๋ ฅ-์๋ ๊ฐ์ค์น ํ๋ ฌ๊ณผ ์๋-์๋ ๊ฐ์ค์น ํ๋ ฌ์ ๋ง๋ญ๋๋ค. RNNCell์ ํธ์ถ๋ง๋ค ์
๋ ฅ ๋ฒกํฐ ํ๋ ฌ๊ณผ ์๋ ๋ฒกํฐ ํ๋ ฌ์ ๋ฐ์ ์ด ํ์ ์คํ
์ ์๋ ๋ฒกํฐ ํ๋ ฌ๊ณผ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
ย
class ElmanRNN(nn.Module): """ RNNCell์ ์ฌ์ฉํ์ฌ ๋ง๋ ์๋ง RNN """ def __init__(self, input_size, hidden_size, batch_first=False): """ ๋งค๊ฐ๋ณ์: input_size (int): ์ ๋ ฅ ๋ฒกํฐ ํฌ๊ธฐ hidden_size (int): ์๋ ์ํ ๋ฒกํฐ ํฌ๊ธฐ batch_first (bool): 0๋ฒ์งธ ์ฐจ์์ด ๋ฐฐ์น์ธ์ง ์ฌ๋ถ """ super(ElmanRNN, self).__init__() self.rnn_cell = nn.RNNCell(input_size, hidden_size) self.batch_first = batch_first self.hidden_size = hidden_size def _initial_hidden(self, batch_size): return torch.zeros((batch_size, self.hidden_size)) def forward(self, x_in, initial_hidden=None): """ ElmanRNN์ ์ ๋ฐฉํฅ ๊ณ์ฐ ๋งค๊ฐ๋ณ์: x_in (torch.Tensor): ์ ๋ ฅ ๋ฐ์ดํฐ ํ ์ If self.batch_first: x_in.shape = (batch_size, seq_size, feat_size) Else: x_in.shape = (seq_size, batch_size, feat_size) initial_hidden (torch.Tensor): RNN์ ์ด๊ธฐ ์๋ ์ํ ๋ฐํ๊ฐ: hiddens (torch.Tensor): ๊ฐ ํ์ ์คํ ์์ RNN ์ถ๋ ฅ If self.batch_first: hiddens.shape = (batch_size, seq_size, hidden_size) Else: hiddens.shape = (seq_size, batch_size, hidden_size) """ if self.batch_first: batch_size, seq_size, feat_size = x_in.size() x_in = x_in.permute(1, 0, 2) else: seq_size, batch_size, feat_size = x_in.size() hiddens = [] if initial_hidden is None: initial_hidden = self._initial_hidden(batch_size) initial_hidden = initial_hidden.to(x_in.device) hidden_t = initial_hidden for t in range(seq_size): hidden_t = self.rnn_cell(x_in[t], hidden_t) hiddens.append(hidden_t) hiddens = torch.stack(hiddens) if self.batch_first: hiddens = hiddens.permute(1, 0, 2) return hiddens
ย
ํด๋น RNN์์ ์
๋ ฅ๊ณผ ์๋ ์ํ์ ํฌ๊ธฐ๋ฅผ ํ์ดํผํ๋ผ๋ฏธํฐ๋ก ์ ์ดํ๋ ๊ฒ ์ธ์๋ ๋ฐฐ์น ์ฐจ์์ด 0๋ฒ์งธ์ ์๋์ง ์ง์ ํ๋ boolean๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๋ค. ์ด๋ ๋ชจ๋ ํ์ดํ ์น RNN๊ตฌํ์ ์์ผ๋ฉฐ, True๋ก ์ค์ ์ RNN์ด ์
๋ ฅ ํ
์์ 0๋ฒ์งธ์ 1๋ฒ์งธ ์ฐจ์์ ๋ฐ๊ฟ๋๋ค.
ย
forward()
๋ฉ์๋๋ ์
๋ ฅ ํ
์๋ฅผ ์ํํ๋ฉด์ ํ์ ์คํ
๋ง๋ค ์๋ ์ํ ๋ฒกํฐ๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์ด๊ธฐ ์๋ ์ํ๋ฅผ ๋ฐ๋ก ์ง์ ํ์ง ์๋๋ค๋ฉด ๊ธฐ๋ณธ ์๋ ์ํ ๋ฒกํฐ๋ ๋ชจ๋ 0์ด ๋ฉ๋๋ค. ElmanRNN ํด๋์ค๊ฐ ์
๋ ฅ ๋ฒกํฐ์ ๊ธธ์ด๋งํผ ๋ฐ๋ณตํ๋ฉด์ ์๋ก์ด ์๋ ์ํ๋ฅผ ๊ณ์ฐํ๊ณ , ์ด๋ฐ ์๋ ์ํ๋ฅผ ์์งํด ์์ ๋์ต๋๋ค. ์๋ ์ํ๋ฅผ ๋ฐํํ๊ธฐ ์ ์ batch_first
ํ๋๊ทธ๋ฅผ ๋ค์ ํ์ธํ๋ฉฐ, ์ด ๋งค๊ฐ๋ณ์๊ฐ True๋ผ๋ฉด ์ถ๋ ฅ ์๋ ์ํ์ ๋ฐฐ์น ์ฐจ์์ 0๋ฒ์งธ๋ก ๋ฐ๊ฟ๋๋ค.ย
์ ElmanRNN ํด๋์ค์ ์ถ๋ ฅ์ 3์ฐจ์ ํ
์๋ก, ๋ฐฐ์น์ ์๋ ๊ฐ ๋ฐ์ดํฐ ํฌ์ธํธ์ ํ์ ์คํ
์ ๋ํ ์๋ ์ํ ๋ฒกํฐ์
๋๋ค. ์ด ์๋ ๋ฒกํฐ๋ฅผ ์ฃผ์ด์ง ์์
์ ๋ฐ๋ผ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค. ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๊ฐ ํ์ ์คํ
์ ์ ํด์ง ๋ฒ์ฃผ๋ก ๋ถ๋ฅํ๋ ๊ฒ์ผ๋ก, ์ด๋ ํ์ ์คํ
๋ง๋ค ์์ธก๊ณผ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ์ถ์ ํ๋๋ก RNN ๊ฐ์ค์น๊ฐ ์กฐ์ ๋จ์ ์๋ฏธํฉ๋๋ค. ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ต์ข
๋ฒกํฐ๋ฅผ ์ฌ์ฉํด ์ ์ฒด ์ํ์ค๋ฅผ ๋ถ๋ฅํ ์ ์์ต๋๋ค. ์ด๋ ์ต์ข
๋ถ๋ฅ์ ์ค์ํ ์ ๋ณด๋ฅผ ์ถ์ ํ๋๋ก RNN ๊ฐ์ค์น๊ฐ ์กฐ์ ๋จ์ ์๋ฏธํฉ๋๋ค. ์ด์ด์ง๋ ๋ ์ฅ์์๋ ์์ฐจ ์์ธก์ ์กฐ๊ธ ๋ ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.
ย
ย
๋ค์ ๊ธ ์ฝ๊ธฐ
ย