• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    미해결

optimizer.zero_grad() 질문 드립니다.

21.10.30 19:19 작성 조회수 779

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

ZERO님의 프로필

ZERO

질문자

2021.10.30

자세한 답변 감사드립니다! 

그리고 강의 코드 내에는 model.zero_grad()란 표현이 없었지만 제가 optimizer.zero_grad()에 대해서 좀 더 검색해보다가 model.zero_grad()로 써놓은 코드들도 보게 되어서 두 코드의 차이가 뭔지 궁금해졌습니다! 이 두개를 같은 용도로 보아도 될까요?

네 같은 용도입니다. 앞에 optimizer, model 이런건 사용자가 변수명을 어떻게 썼는냐의 차이입니다 :)

ZERO님의 프로필

ZERO

질문자

2021.10.31

아하 그렇군요. 답변 감사드립니다 ㅎㅎ 딥러닝호형님! 

참고로 변수명의 차이가 아닌 model이 실제 모델명인 경우에도 일반적으로 같은 이유가model.parameters를 optimizer에 넣기 때문입니다. 만약 optimizer에 model의 전체 변수를 넣지 않거나 다른 모델 변수가 주어지면 초기화 범위는 달라질 수 있겠네요 :)