생각하는 아져씨

파이토치 기초 공부하기 - 역전파(Backprop)를 알아보자 본문

Machine & Deep Learning/Pytorch

파이토치 기초 공부하기 - 역전파(Backprop)를 알아보자

azeomi 2023. 3. 23. 23:06

역전파란?

인공 신경망을 최적화 하는 과정에서 미분은 필수적인 요소인데 파이토치는 최적화 과정인 역전파(backpropagation)를 쉽게 할 수 있도록 자동 미분 계산을 제공한다.

 

자동 미분 준비하기

자동 미분을 하기 위해서는 텐서를 기준으로 모든 연산들을 추적할 수 있어야 한다.

그것이 바로 requires_grad = True 옵션이다.

 

requires_grad = True

  • 해당 텐서를 기준으로 모든 연산들을 추적할 수 있게 하는 옵션이다. (x 기준으로 미분을 할 수 있도록 만들어주는 장치)
x = torch.ones(2,2, requires_grad=True)
print(x)

>>
tensor([[1., 1.],
        [1., 1.]], requires_grad=True)

예를 들어 다음의 계산이 있다.

모든 식이 합성 함수의 형태로 x에 대해서 표현이 가능하다는 점!

# y는 x에 대한 식, z는 y에 대한 식, res는 z에 대한 식이다. 따라서 이는 합성함수의 개념으로써 x에 대해서 표현 및 미분이 가능하다.
y = x+1
z = 2*y**2
res = z.mean()
print("y: ", y)
print("z: ", z)
print("Result: ", res)
# grad_fn=..은 추적이 잘 되고 있다는 의미다. -> 현재 x와 연관된 연산을 계속 추적하고 있는 것.

>>
y:  tensor([[2., 2.],
        [2., 2.]], grad_fn=<AddBackward0>)
z:  tensor([[8., 8.],
        [8., 8.]], grad_fn=<MulBackward0>)
Result:  tensor(8., grad_fn=<MeanBackward0>)

 

 

역전파 수행

  • backward 함수로 간단하게 역전파를 계산할 수 있다.

 

backward()

  • required_grad = True 로 선언된 변수를 기준으로 역전파를 진행한다.
res.backward() # res를 기준으로 역전파를 진행하겠다는 의미다. requires_grad=True로 선언된 변수 기준으로 역전파 진행

# 역으로 식을 써내려 가보자.
# res = (z_1 + .. +z_4)/4
# z_i = 2 y_i **2
# z_i = 2(x_i+1)**2
# d(res)/dx_i = x_i + 1

 

grad

  • backward()가 선언된 변수를 기준으로 미분을 한다.
  • 즉 $d(res)/dx$를 계산한다.
print(x)
print(x.grad) 
# x.grad는 backward()가 선언 된 변수를 기준으로 미분을 한다. 즉 d(res)/dx를 계산한다. -> x를 기준으로 미분값을 구하는 것.
# #d(res)/dx_i = x_i + 1
>>
tensor([[1., 1.],
        [1., 1.]], requires_grad=True)
tensor([[2., 2.],
        [2., 2.]])

 

 

참조

https://tutorials.pytorch.kr/beginner/blitz/neural_networks_tutorial.html#backprop