6-1 ์ˆœํ™˜ ์‹ ๊ฒฝ๋ง RNN

1. ์ˆœํ™˜ ์‹ ๊ฒฝ๋ง

RNN์˜ ๋ชฉ์ ์€ ์‹œํ€€์Šค ํ…์„œ๋ฅผ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. RNN์—๋Š” ์—ฌ๋Ÿฌ ๋ชจ๋ธ์ด ์žˆ๋Š”๋ฐ, ์ด ์žฅ์—์„œ๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ์—˜๋งŒ RNN์„ ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. RNN์—์„œ๋Š” ์‹œํ€€์Šค์˜ ํ‘œํ˜„ ํ•™์Šต์„ ์œ„ํ•ด ์‹œํ€€์Šค์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ์€๋‹‰ ์ƒํƒœ ๋ฒกํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ž…๋ ฅ ๋ฒกํ„ฐ์™€ ์ด์ „ ์€๋‹‰ ์ƒํƒœ ๋ฒกํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ์€๋‹‰ ์ƒํƒœ ๋ฒกํ„ฐ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
ย 
์ถœ์ฒ˜: ๋ฐ‘๋ฐ”๋‹ฅ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๋”ฅ๋Ÿฌ๋‹2
์ถœ์ฒ˜: ๋ฐ‘๋ฐ”๋‹ฅ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๋”ฅ๋Ÿฌ๋‹2
ย 
ํ˜„์žฌ ํƒ€์ž„ ์Šคํ…์˜ ์ž…๋ ฅ ๋ฒกํ„ฐ์™€ ์ด์ „ ํƒ€์ž„ ์Šคํ…์˜ ์€๋‹‰ ๋ฒกํ„ฐ๋Š” ํ˜„์žฌ ํƒ€์ž„ ์Šคํ…์˜ ์€๋‹‰ ์ƒํƒœ ๋ฒกํ„ฐ์— ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค. ์€๋‹‰-์€๋‹‰ ๊ฐ€์ค‘์น˜ ํ–‰๋ ฌ์„ ์‚ฌ์šฉํ•ด ์ด์ „ ์€๋‹‰ ์ƒํƒœ ๋ฒกํ„ฐ๋ฅผ ๋งคํ•‘ํ•˜๊ณ  ์ž…๋ ฅ-์€๋‹‰ ๊ฐ€์ค‘์น˜ ํ–‰๋ ฌ์„ ์‚ฌ์šฉํ•ด ์ž…๋ ฅ ๋ฒกํ„ฐ๋ฅผ ๋งคํ•‘ํ•˜์—ฌ ์ƒˆ๋กœ์šด ์€๋‹‰ ๋ฒกํ„ฐ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์€๋‹‰-์€๋‹‰ ๊ฐ€์ค‘์น˜์™€ ์ž…๋ ฅ-์€๋‹‰ ๊ฐ€์ค‘์น˜๊ฐ€ ์—ฐ์†๋œ ํƒ€์ž„ ์Šคํ…์— ๊ฑธ์ณ ๊ณต์œ ๋œ๋‹ค๋Š” ์ ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ํ›ˆ๋ จ ๊ณผ์ •์—์„œ ์ด๋Ÿฐ ๊ฐ€์ค‘์น˜๋Š” ์ˆ˜์ •๋˜๋ฉฐ, ํ˜„์žฌ ์ž…๋ ฅ ์ •๋ณด์™€ ์ง€๊ธˆ๊นŒ์ง€์˜ ์ž…๋ ฅ์„ ์š”์•ฝํ•œ ์ƒํƒœ ํ‘œํ˜„์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค. ์–ด๋А ํƒ€์ž„ ์Šคํ…์— ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜๋Š” ์—†์ง€๋งŒ, ํ•œ ํƒ€์ž„ ์Šคํ…์—์„œ ๋‹ค๋ฅธ ํƒ€์ž„ ์Šคํ…์œผ๋กœ ์ด๋™ํ•˜๋ฉด์„œ ์†์‹ค ํ•จ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ƒํƒœ ํ‘œํ˜„์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
ย 
๋™์ผํ•œ ๊ฐ€์ค‘์น˜๋ฅผ ์‚ฌ์šฉํ•ด ํƒ€์ž„ ์Šคํ…๋งˆ๋‹ค ์ž…๋ ฅ์„ ์ถœ๋ ฅ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ณต์œ ์˜ ํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค. 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 ๊ฐ€์ค‘์น˜๊ฐ€ ์กฐ์ •๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด์–ด์ง€๋Š” ๋‘ ์žฅ์—์„œ๋Š” ์ˆœ์ฐจ ์˜ˆ์ธก์„ ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 
ย