2024. 3. 18. 21:59ㆍ딥러닝 모델: 파이토치
♣ 파이토치의 nn.RNN( )
파이토치에서는 nn.RNN( )을 통해서 RNN 셀을 구현한다. 실습을 통해 이해해보자.
입력의 크기와 은닉 상태의 크기를 정의한다. 은닉 상태의 크기는 RNN의 대표적인 하이퍼파라미터이다. 입력의 크기는 매 시점마다 들어가는 입력의 크기를 의미한다.
이제 입력 텐서를 정의한다. 입력 텐서는 (배치 크기 × 시점의 수 × 매 시점마다 들어가는 입력)의 크기를 가진다. 여기서는 배치 크기는 1, 10번의 시점 동안 5차원의 입력 벡터가 들어가도록 텐서를 정의한다.
nn.RNN( )을 사용하여 RNN의 셀을 만든다. 인자로 입력의 크기, 은닉 상태의 크기를 정의하고 batch_first = True를 통해 입력 텐서의 첫 번째 차원이 배치 크기임을 알려준다. 여기서는 입력 텐서의 첫 번째 차원이 1이므로 배치 크기가 1이다.
입력 텐서를 RNN 셀에 입력하여 출력을 확인해보자
RNN셀은 두 개의 입력을 리턴하는데, 첫 번째 리턴값은 모든 시점(timesteps)의 은닉 상태들이며, 두 번째 리턴값은 마지막 시점(time step)의 은닉 상태이다. 첫 번째 리턴값을 확인해보자.
inputs에서 input을 하나씩 가져올 때 input의 shape는 (5, ) 이다. 그리고 input과 dot할 Wx의 shape는 (hidden_size, input_size)일 것이기에 (8, 5)가 된다.
(8, 5)의 배열과 (5, )의 배열을 dot으로 곱하면 (8, )의 형태가 된다. 예를 들면 아래와 같이 계산된다.
inputs의 shape이 (1, 10, 5) 이므로 이와 같은 계산이 10번 반복해서 일어나고, 결과값 (8, )이 10개 쌓여서 outputs의 형태는 (1, 10, 8) 이 되는 것이다.
두 번째 리턴값은 마지막 시점의 은닉 상태의 크기이다. hidden_size가 8이므로 은닉 상태의 크기는 (1, 1, 8) 이다.