Understanding how RNN works with an example(2/2)
앞에서는 RNN 을 blackbox로 보고 외부적인 내용을 코드로 구현해 보았습니다. 여기에서는 RNN 내부 클래스를 보도록 하겠습니다.import torch.nn as nn from torch.autograd import Variable class RNN(nn.module): def __init__(self, input_size, hidden_size, output_size): super(RNN, self).__init__() self.hidden_size = hidden_size self.i2h = nn.Linear(input_size+hidden_size, hidden_size) self.i2o = nn.Linear(input_size+hidden_size, output_size) self.softmax = nn.LogSoftmax(dim=1) def forward(self, input, hidden): combined = torch.cat((input, hidden), 1) hidden = self.i2h(combined) output = self.i2o(combined) output = self.softmax(output) return output, hidden def initHidden(self): return Variable(torch.zeros(1, self.hidden_size)
앞의 코드에서 RNN이라는 단어를 제외하면 PyTorch는 많은 역전파의 복잡합을 숨기기 때문에 다른 모든 것은 이전 장에서 사용했던 것과 매우 유사하게 보입니다. init 함수와 forward 함수를 살펴보도록 하겠습니다.
init 함수는 출력 계산을 위한 하나와 state와 hidden vector를 계산하기 위한
2개의 Liner layer를 초기화 합니다. forward 함수는 input vector와 hidden vector (combine)결합하고 출력 vector와 hidden state를 생성하는 두개의 linear layer에 통과 시킵니다. 출력 layer에 대해서는 log_softmax함수를 적용합니다.
torch.cat()은 두개의 텐서를 이어 붙이는 메소드입니다.
initHidden함수는 최초 RNN이 호출을 위해 state가 없을때 hidden vector를 생성하는것을 돕습니다. 지금까지 코드를 그림으로 그려보면 아래와 같습니다.
위 그림은 어떻게 RNN이 동작하는지 보여줍니다.
RNN에 관한 내용은 아래 블로그를 참고하세요.
http://karpathy.github.io/2015/05/21/rnn-effectiveness/
http://colah.github.io/posts/2015-08-Understanding-LSTMs/
다음에는 LSTM이라고 불리우는 RNN 변형에 대해서 배울것입니다.
댓글 없음:
댓글 쓰기