모델 구현에 있어 자주 만나는 에러이기도 한만큼 잘못 설정할 경우 이와 같은 에러를 만날 수 있다.
본 에러는 문장에서 알 수 있듯, backward를 이미 시행했음에도 후에 이 값을 backward하는 경우가 생겨야만할 때 문제가 된다.
가령 다음과 같은 경우 가장 일반적인 경우라고 볼 수 있다.
for y in dataloader:
y_hat = model.predict(x)
loss = loss_norm(y, y_hat)
optimizer.zero_grad()
loss.backward()
loss2 = loss_norm(loss, norm_dist)
loss2.backward()
optimizer.step()
보이는 바와 같이 loss를 이미 구해 backward를 사용했음에도 이와 관련한 value를 loss2에서 사용하고 backward하는 것이 문제가 된다.
이와 관련한 해결법은 크게 2가지이다.
1. 두 loss가 서로 상충하지 않도록 잘 조율할 필요가 있다.
이 방법은 알아서 조율해야한다.
2. loss.backward(retain_graph=True)를 통해 해결한다.
여러번 호출해야하는 그래프의 값이라면 본 옵션을 통해 그래프 버퍼를 삭제하지 않도록 한다.
다만 이 경우 backward가 2번 된다는 것을 인정하기 때문에 본 의도에 맞게 진행되는 것인지 생각을 정리한 다음 사용할 필요가 있다.
위와 같은 경우가 아니라 간혹 loss에서 사용되는 특정 value를 계산하는데만 사용하는데도 간혹 문제가 될 경우가 있다.
단순한 값만을 계산하는 경우 해당 tensor의 item 혹은 data를 통해 풀어야 본 해결법을 활용할 수 있다.
val = loss.item() * 3 + other_value
val = loss.data[0] * 3 + other_value