Closed Ldoun closed 3 years ago
https://github.com/kh-kim/simple-nmt/blob/master/train.py#L242 get_crit() 함수를 호출할 때 pad 토큰에 대해서는 loss를 구하지 않도록 하는데 그럼 RNN의 input으로 EOS가 들어가 label이 pad인 곳의 y_hat을 구했다면 EOS를 통한 예측은 gradient에 반영이 안되는 것 아닌가요? 그렇다면 위의 y_hat = engine.model(x, mini_batch.tgt[0][:, :-1]) 이 코드를 y_hat = engine.model(x, mini_batch.tgt[0]) 이렇게 바꾸어도 결과에는 영향이 안 미치는 것 아닌가요?
@Ldoun 님 안녕하세요.
말씀하신 부분이 맞습니다. 하지만 -1을 해야 하는 이유가 또 있는데요. 예를 들어 n개의 토큰이 있다고 했을 때, BOS와 EOS가 붙으므로 n+2가 된다고 생각할 수 있겠죠. 이때 -1을 하지 않고 그냥 넣어준다고 하면 n+2개의 출력이 발생해야 할겁니다. -- 이때 출력은 BOS가 빠지고 나오겠죠. 따라서 y와 y_hat을 수월하게 비교하기 위해서는 자르고 넣어주는게 좋다고 생각합니다.
감사합니다.
답변 감사합니다
https://github.com/kh-kim/simple-nmt/blob/master/simple_nmt/trainer.py#L62
tgt[0][0:2] = [[ 'bos','awegsd','e','ads','dfa','eos'], [ 'bos','asd','adsf','as','eos','pad']]
mini_batch.tgt[0]가 pad token을 가지고 있을 때 y_hat = engine.model(x, mini_batch.tgt[0][:, :-1]) mini_batch.tgt[0] 이렇게 텐서를 조작하면 EOS 토큰이 아닌 PAD가 제거 되지 않나요?