작성
·
1.1K
0
안녕하세요. 딥러닝호형님 강의 유익하게 잘 보고 있습니다.
optimizer.zero_grad() 관련 질문 드립니다.
1. 각 epoch마다 gradient를 초기화하는게 아니라 각 iteration마다 gradient를 초기화해주는 이유는 무엇인가요? 전체 데이터를 한번 다 돌고 난 뒤에 gradient를 초기화하는 것이 아니라, 각 미니배치마다 gradient를 초기화해서 새롭게 학습해야 하는 것인가요?
2. model.zero_grad()와 optimizer.zero_grad()의 차이는 무엇인가요?
그럼 답변 기다리겠습니다. 감사합니다!
답변 2
1
안녕하세요! Zero 님 :)
너무 좋은 질문 감사합니다!!
1. 일반적으로 모델을 최적화 하는 방법이 SGD기반 입니다. 따라서 데이터 일부를 받아 모델 파라메터를 업데이트 하는 것입니다. 즉, 이 말은 배치마다 업데이트 하겠다는 의미입니다. 왜 이렇게 하는지에 대해서는 이론편에서 언급 드렸는데 epoch이 1이라는 말은 데이터 전체를 한 번 사용했다는 의미이므로 epoch 기준으로 업데이트를 하면 데이터 전체에 대한 연산이 이뤄집니다. 결국 이는 완벽한 GD는 아니지만 GD와 유사하게 메모리 문제나 학습 시간이 길어지는 등의 문제를 야기할 수 있습니다. 게다가 SGD를 기반으로 하는 여러 방법론(ADAM, Momentum 등)들의 성능이 이미 검증 된 만큼 전체 데이터를 이용한 학습을 하지 않습니다.
다만, 학습 메카니즘 측면에서는 epoch for문을 기준으로 최적화하는 방법을 사용하지 않는 것이지 틀린 표현은 아닙니다 :)
2. zero_grad() 앞은 최적화로 정의 된 변수가 들어옵니다. 즉, optimizer = optim.Adam.... 이라고 정의 하시면 optimizer.zero_grad()로 사용하시면 됩니다. 매 학습 시 누적 된 그레디언트를 초기화 해주는 역할을 합니다 :) 혹시 강의 코드에 model.zero_grad()이라는 표현이 있던가요!!?
0
자세한 답변 감사드립니다!
그리고 강의 코드 내에는 model.zero_grad()란 표현이 없었지만 제가 optimizer.zero_grad()에 대해서 좀 더 검색해보다가 model.zero_grad()로 써놓은 코드들도 보게 되어서 두 코드의 차이가 뭔지 궁금해졌습니다! 이 두개를 같은 용도로 보아도 될까요?
네 같은 용도입니다. 앞에 optimizer, model 이런건 사용자가 변수명을 어떻게 썼는냐의 차이입니다 :)