Torch dataloader를 선언할 때 다양한 인자들이 있는데, 모델이나 loss function 등을 제외하고서 실질적인 코딩의 관점에서 이러한 인자들이 생각보다 꽤나 많이 중요하다. 어느정도냐면 단 한가지의 인자를 바꾸기 전과 후가 거의 학습 속도나 stability 관점에서 10배 정도가 차이나는 정도이다.
코드 리팩토링 과정에서 생각없이 쓰다보니 실수로 수정한 하나의 인자 때문에 3일 정도의 시간을 날렸고 덩달아 소중한 GPU의 memory를 3일 정도 허비하기에 이른다.
drop_last 인자는 데이터의 총 개수가 batch_size로 나누어지지 않는 상황에서 마지막 배치에는 자투리 (?) , 조금 더 정확히는 data_size % batch_size 개의 데이터가 들어가게 된다. 필자는 불안정하기로 유명한 GAN 학습을 하다가 이 문제를 발견하게 되었는데, drop_last = False 로 설정 (아무것도 인자를 넘겨주지 않으면 default 가 False 이다) 했는데, batch_size 가 128 정도 되었어서 그런지 마지막에 남아있는 자투리 부분의 학습을 수행하는 게 크나큰 문제가 되었다. drop_last=False인 상황을 예로 들면 데이터의 개수가 129개고 gradient descent를 할 때, 0~127번 인덱스까지의 데이터 한번, 128번 인덱스의 데이터 한번을 gradient descent 하게 된다.
실제로 나는 데이터셋의 길이가 12950개 였고, batch size인 128로 나누면 22개가 남아서, 마지막 batch는 22개 가지고 gradient descent를 하는 충격적인 결과였다.
결론: drop_last 는 웬만하면 True로 설정하자.