Pytorch 모델을 업데이트하려고 optimizer를 쓰는데 loss가 전혀 변하지 않는 것을 보고 업데이트 된 것인지 확인하고 싶었다.
다음 코드와 같이 일치하지 않는 부분이 있는지 확인하였다.
optimizer.zero_grad()
a = list(model.parameters())[0]
print(list(model.parameters())[0].grad) # gradient가 잘 계산되었는지 확인, None이면 이상한 것
loss.backward()
optimizer.step()
b = list(model.parameters())[0]
print(torch.equal(a.data, b.data)) # a와 b가 일치하는지 확인
업데이트 전 후의 parameter 값을 비교함으로써 업데이트되는지 확인할 수 있다.
다만 주의할 점은 learning rate를 너무 작게 잡고 gradient가 작으면 한 스텝마다 거의 업데이트되지 않는다. 이 와중에 자료형이 float32이면 분명 업데이트 되었음에도 수치적으로 표현이 되지 않아 a,b가 동일하게 나올 수 있다.
그래서 이런 경우에는 동일한 input을 넣어서 model의 output이 동일한지 비교해보도록 한다.
나의 경우에는 업데이트가 되지 않는 것을 위의 코드로 확인했고
알고보니 model을 optimizer를 정의한 후에 만들어서 그런 것이었다(...멍청)