-
카테고리
-
세부 분야
딥러닝 · 머신러닝
-
해결 여부
미해결
forward에서 h_t
20.10.03 00:29 작성 조회수 133
0
BasicRNN의 forward함수에서 self.rnn(x, h_0)로부터 나온 아웃풋인 x[:,-1,:]를 h_t로 설정하셨는데,
여기서 [:,-1,:]이 무슨 의미인지 모르겠습니다.
.size()함수를 이용하여 확인해봤더니 x가 [100,779,256] 이런식으로 나오고 h_t가 [100,256]으로 나와서 h_t=x.view(100,256) 이렇게 바꿔서 돌렸더니 "RuntimeError: shape '[100, 256]' is invalid for input of size 25395200"으로 뜹니다
질문1. [:,-1,:]이 .view(배치사이즈,히든사이즈)과 어떤 차이가 있는지 궁금합니다.
질문2. rnn의 아웃풋이 아닌 히든으로 logit을 구해도 무방한가요? ex) x, hidden = self.rnn(x, h_0)
h_t=hidden.view(100,256)
답변을 작성해보세요.
1
Justin
지식공유자2020.10.03
안녕하세요.
Justin 입니다.
self.rnn = nn.RNN(embed_dim, self.hidden_dim, num_layers = self.n_layers, batch_first = True) 의 아웃풋은 (batch, seq, feature) 값의 텐서와, (num_layers * num_directions , batch, hidden_size) 값의 텐서 2개로 출력됩니다.
x[:, -1, :]은 self.rnn의 출력값 중 sequecnce의 가장 마지막 위치에서 출력되는 h_n값을 통해서 레이블값과 비교하기 위해서 설정하는 것 입니다. 시퀀스 내 가장 마지막에서 출력되는 값이 시퀀스 앞에 있는 정보를 반영하고 있기 때문입니다.
오류가 발생한 이유는, [100, 256]은 단순히 배치 사이즈와, RNN 셀에서 계산되어 출력되는 텐서값의 차원을 의미하는데, 이는 sequence 길이를 반영하고 있지 않기 때문에 입력값으로 이용되는 데이터와 연산이 불가능하여 발생되는 에러입니다.
정리하자면 다음과 같습니다.
1. [:, -1, :] 은 각 RNN 셀에서 계산된 값 중 가장 마지막 값에 접근하기 위함입니다.
2. rnn의 아웃풋이 아닌 hidden으로 logit을 구해도 상관은 없습니다만, 통상적으로 rnn의 출력값에는 hidden 값으로 계산된 결과값에 가중치값을 곱하여 비선형 함수를 거친 결과값을 활용하여 logit값을 계산합니다.
감사합니다.
답변 1