Gradient 계산 도중에 값이 바뀌었다며 에러를 띄우던 문제 해결! 충격 솔루션 대 공개 #13
Closed
HyeAnn-Lee
started this conversation in
Show and tell
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
배경
uvipen의 코드를 참고하여 코딩하던 중에, 저는 이런 방식을 택했습니다.
log_policy
에detach()
를 붙일 수밖에 없었는데, 그렇지 않으면 자꾸 아래와 같은 에러가 발생했기 때문입니다.Gradient를 계산해야 하는데, 미처 계산하기 전에 값이 바뀌어버렸다는 뜻인 것 같습니다.
torch.autograd.set_detect_anomaly(True)
를 켜도, 맨 끝에Good luck!
이 달릴 뿐이었죠....그래서 저는 어디서
detach()
를 빼먹은건가 싶어 여기저기 붙여보다가log_policy
에 붙이기에 이르렀습니다.하지만 희찬님께서는 gradient가 흘러야하기 때문에
log_policy
에는detach()
가 없어야 한다고 하셨습니다.그럼 어떡할까요?
Reference
torch.autograd.set_detect_anomaly(True)
에 대해 검색하던 중에, 이런 글을 발견했습니다.https://bo-10000.tistory.com/117
맨 마지막을 보시면 됩니다..
Assignment operator를 줄여쓰지 말고, 풀어썼더니 잘 동작했다는 것이었습니다..
읭?
솔루션
놀랍게도 저한테도 적용되는 말이었습니다.. 어이없네용
*=
를 그냥= .. * ..
로 풀어썼더니log_policy
에detach()
를 붙이지 않고도 오류가 없어졌습니다!이유가 뭘까요?
2017년의 한 답변에 따르면,
x = x + 1
꼴은 inplace 연산이 아니지만,x += 1
꼴은 inplace 연산이라고 합니다. 와우!!이래서 한 언어를 "잘" 알아야 한다고 하나봅니다.
다들 유념합시다!!
결론
Important
Gradient를 계산할 때는 inplace 연산을 하면 안됩니다!
Beta Was this translation helpful? Give feedback.
All reactions