nn.rnn이랑 nn.rnncell이랑 뭐가 다른 건가요?

lstm이랑 gru도 cell이 따로 있던데 어떤 차이가 있는 건가요?

안녕하세요, @user7 님.

제가 알기로 각각의 RNNCell, LSTMCell, GRUCell와 같이 ~Cell이 붙은 클래스들은 말 그대로각각의 input, output, hidden 등을 갖는 하나의 Cell을 구현한 것으로 알고 있습니다.

PyTorch 공식 Discuss에 올라온 답변들 중 아래 그림의 시각화가 참조하실만 할 것 같아 가져와봤습니다.
가장 아래의 빨간 색이 입력(input), 위쪽의 파란 색이 출력(output)이고, 중간의 녹색이 3-layer의 LSTM 모델을 표현한 것일 때, 저 빨간 박스가 쳐진 녹색 칸 하나가 LSTMCell을 나타냅니다.

nn.LSTM을 사용하면 중간의 녹색에 해당하는 3-layer의 전체 LSTM 모델을 바로 사용할 수 있고요.


TowardDataScience의 글 중에 LSTM과 LSTMCell을 설명한 글도 참고해보시면 좋을 것 같은데요,
LSTMCell의 구조에 대한 소개를 그림과 함께 하고 있어 이해하시기가 좋을 것 같습니다.

쉽게 초기화 시에 사용하는 인자들로 비교해보면,

  • nn.LSTMCell은 초기화 시에 각 단계(time step)에서 사용할 입력(input)과 히든(hidden)의 크기를 받습니다.

  • nn.LSTM은 '여러 층(multi-layer)'의 LSTMCell로 구성된 LSTM 모델을 구성할 수 있으며, 초기화 시에 전체 모델의 입력이 되는 데이터의 크기((batch, input_size))와 함께 은닉 상태(hidden state)를 저장할 텐서 h((batch, hidden_size))와 셀 상태(cell state)를 저장할 텐서 C((batch, hidden_size))의 모양을 초기 인자로 받습니다.

따라서 nn.LSTMCell을 사용하여 직접 LSTM 모델을 구현하시는 경우에는 순서의 흐름에 따라 각 단계(time step)에서 이전 단계의 (동일한) LSTMCell에서 출력된 은닉 상태(hidden_state)와 셀 상태(cell state)를 다시 입력으로 넣어주시는 구현을 하셔야 합니다. 여러 층을 갖는 LSTM 모델을 구현하시는 경우에는 여러 개의 LSTMCell을 사용하시고 또 각각의 구현을 하셔야 하고요.

하지만 nn.LSTM을 사용하시면 전체 모델을 PyTorch가 알아서 구성해주고, cuDNN 등을 사용하여 더 빠르기도 합니다.

그래서 더 세밀하고 유연한 구현이 필요하시다면 각각의 Cell들(nn.LSTMCell, nn.RNNCell, nn.GRUCell)을 사용하여 recurrent model을 직접 구현하실 수도 있지만, 일반적으로 빠르게 사용하시려면 각각의 모델(nn.LSTM, nn.RNN, nn.GRU)을 사용하시는 것을 권장하고 있는 것으로 알고 있습니다.

아래 링크한 TowardDataScience의 글을 보시면서 이미지와 코드를 따라하시면 조금 더 자세히 이해하실 수도 있을 것 같습니다. :slight_smile:

1개의 좋아요