Loss와 Optimizer의 관계

안녕하세요!

늘 작성하던 코드에 갑자기 어떻게 동작하는지가 궁금하여 글 남기게 되었습니다!

보통 파이토치로 학습을 하게 되면

  1. optimizer의 grad를 비워주고
  2. forward를 한 다음
  3. loss 구한 다음
    4, 5 loss.backward() → optimizer.step()

을 하게 되는데 이 때 4, 5번에서 loss.backward에서 모델의 Computational Graph와 Parameter 값을 어떻게 알고 backward를 진행할 수 있는것 인가요?
Parameter들 값은 optimizer 인스턴스를 생성할 때만 넣어주지 않나요?

안녕하세요, @JungHwang 님!

먼저 아래 튜토리얼을 참고해보시면 어떠실까요?

제가 이해하기로는, 모델에 어떤 값을 넣고 예측 값( \hat{y} )을 계산할 때, Tensor들 간의 연산을 하게 되고, 이 과정에서 동적으로 연산 그래프(Computational Graph)가 그려지는 것으로 알고 있습니다. 즉, 모델의 최종 연산 결과인 예측값을 기준으로, 연산 그래프를 따라올라가면 각각의 값들이 얼마만큼의 비중으로 기여(?)를 했는지 알 수 있습니다.

위 튜토리얼에 있는 예시를 보시면, \hat{y} = z = x * w + b 를 계산한 뒤에 정답 y 와 예측값 z 의 CrossEntropy로 loss를 구하게 되면, 이 때 아래와 같이 연산 그래프(Computational Graph)가 그려지게 됩니다.

image

이후, 말씀하셨던 4번째 단계의 loss.backward()가 호출될 때, 아래와 같은 과정들이 이뤄진다고 합니다. (아래 튜토리얼의 중간 부분에서 아래 내용을 확인하실 수 있습니다.)

순전파 단계에서, autograd는 다음 두 가지 작업을 동시에 수행합니다:

  • 요청된 연산을 수행하여 결과 텐서를 계산하고,
  • DAG에 연산의 변화도 기능(gradient function) 를 유지(maintain)합니다.

역전파 단계는 DAG 뿌리(root)에서 .backward() 가 호출될 때 시작됩니다. autograd 는 이 때:

  • .grad_fn 으로부터 변화도를 계산하고,
  • 각 텐서의 .grad 속성에 계산 결과를 쌓고(accumulate),
  • 연쇄 법칙을 사용하여, 모든 잎(leaf) 텐서들까지 전파(propagate)합니다.
좋아요 2

아 자세한 답변 감사합니다! 이해가 되었습니다!ㅎ