Mac에서는 다소 쉽게 설치가 가능하지만, window나 ubuntu에서는 Jdk를 설치해야하는 번거로움과 추가적인 설정이 필요해 불편함이 있다. 이를 해결하는 깃허브 설명하는 링크를 공유한다.
이 코드에서 나온 여러가지 코드들을 리뷰해보려한다.
RNN을 이용한 언어모델을 만드는 코드이며, RNNModel 코드에서 forward에 해당하는 코드를 살펴보자.
def forward(self, input, hidden):
emb = self.drop(self.encoder(input))
output, hidden = self.rnn(emb, hidden)
output = self.drop(output)
decoded = self.decoder(output)
decoded = decoded.view(-1, self.ntoken)
return F.log_softmax(decoded, dim=1), hidden
RNN에 input과 hidden_state을 넣어준다. 여기서 각각의 Dimension은 다음과 같다.
Input : (Seq_length, Batch)
hidden : (Num_layersdir, Batch, Hidden_dimension)
이 때, Input은 Encoder를 통과하게 되는데, Encoder는 nn.Embedding을 사용해서 단어 벡터를 embedding dim에 맞게 바꿔준다. 따라서 emb의 dimension은 아래와 같다.
이 때, output은 각 타임스텝의 hidden states가 모여있는 형태로 나오게 된다.
그 다음 언어모델에 맞게 각 타임스텝의 hidden state들을 decoding해주는 과정을 거친다. decoding은 Hidden_dimntokens nn.Linear 선형 변환 모듈이며, 결과에 대한 Softmax를 통해 특정 단어로 변환해준다. decoded는 결과적으로 (Seq_length, Batch, ntoken)의 형태이고 이를 view 함수를 써서 (-1, ntoken)의 2차원 데이터로 변환해준다.
예를 들어, Seq_len이 35, batch_size가 20, Num_layersdir가 1, ntoken이 3000이라고 가정하면
즉, 이 모델을 통해 어떠한 Seq_len를 가진 batch_size만큼의 문장 데이터들을 입력으로 받으면, 해당하는 단어들의 다음에 올 단어를 미리 지정해놓은 Corpus의 사이즈(ntoken)에 맞게 예측해주게 되는 것이다.