tensor([1.9839], grad_fn=<ViewBackward0>)
tensor(0.0003, grad_fn=<MseLossBackward0>)
tensor([1.9841], grad_fn=<ViewBackward0>)
tensor(0.0003, grad_fn=<MseLossBackward0>)
tensor([1.9843], grad_fn=<ViewBackward0>)
tensor(0.0002, grad_fn=<MseLossBackward0>)
tensor([1.9845], grad_fn=<ViewBackward0>)
tensor(0.0002, grad_fn=<MseLossBackward0>)
tensor([1.9847], grad_fn=<ViewBackward0>)
tensor(0.0002, grad_fn=<MseLossBackward0>)
tensor([1.9849], grad_fn=<ViewBackward0>)
tensor(0.0002, grad_fn=<MseLossBackward0>)
tensor([1.9851], grad_fn=<ViewBackward0>)
tensor(0.0002, grad_fn=<MseLossBackward0>)
tensor([1.9852], grad_fn=<ViewBackward0>)
tensor(0.0002, grad_fn=<MseLossBackward0>)
tensor([1.9854], grad_fn=<ViewBackward0>)
tensor(0.0002, grad_fn=<MseLossBackward0>)
tensor([1.9856], grad_fn=<ViewBackward0>)
tensor(0.0002, grad_fn=<MseLossBackward0>)
위 코드는 torch에서 신경망에 데이터를 넣고 추론한 뒤 그 결과를 손실 함수에 넣어 손실 정도를 구하는 과정이다. 하지만 여기서 중요한 점은 손실을 구하는 것으로 끝나는 것이 아니라, 역전파 메서드인 backward를 통해 뉴런 신경망을 일괄적으로 미분하고, 미분 정도에 따라서 경사 하강을 수행해야 한다.
즉 상기 loss는 손실 함수에 데이터를 순전파하면서 나온 최종 오차 결괏값이며 미분에 직접적으로 사용되는 중요한 수치는 아니다. 하지만 손실 함수에 데이터를 넣고 순전파를 해야지만 역전파에 필요한 파라메터 값도 같이 계산할 수 있는 것이다.
문득 위 코드를 처음보면 어떻게 추론 결과만으로 역전파를 수행할 수 있을지 의문이 드는데, pred 값을 직접 출력해보면 다음과 같다.
lossfunc = MyMSELoss()
어차피 로스 람수에서 미분된 각 기울기 정보는 각 신경망쪽으로 역전파된다. pred 에 기록된 연산 그래프 정보를 바탕으로 역으로 추적하며 미분된다.