본문 바로가기

AI/AI 라이브러리

[Pytorch] Autograd

728x90
반응형

파이토치 한국사용자 모임의 글을 보면서 공부한 내용을 정리한 글입니다.

 

신경망 학습 시 가장 자주 사용되는 알고리즘은 Back Propagation이다. 

이 알고리즘에서, 매개변수(W: 모델의 가중치)는 주어진 매개변수에 대한 손실 함수의 변화도(Gradient)에 따라 조정된다.

 

PyTorch에서는 torch.autograd 라고 불리는 자동 미분 엔진이 내장되어 있다.

  • 이는 모든 계산 그래프에 대한 변화도의 자동 계산을 지원한다.

 

import torch

x = torch.ones(5) # input tensor
y = torch.zeros(3) # expected output

# requires_grad=True 옵션은 역전파를 통해 가중치의 기울기를 계산하기 위해 설정
w = torch.randn(5,3,requires_grad=True) # weight, 가중치
b = torch.randn(3,requires_grad=True) # bias, 편향
z = torch.matmul(x,w)+b # wx + b, 선형 변환을 거친값

# 이진 교차 엔트로피 손실 함수를 계산
# z는 예측값, y는 실제값
loss = torch.nn.functional.binary_cross_entropy_with_logits(z, y)

print("input :",x)
print("output :",y)
print("weight :",w)
print("bias :",b)
print("z(x) :",z)
print("loss :",loss)

 

 

이렇게 만들어진 z와 loss는 각각 속성을 가진다.

  • z.grad_fn : z의 기울기를 계산하는 함수, 기울기를 계산하는데 사용된 연산의 정보를 담고 있음, 이를 통해 z를 생성하는 연산을 식별할 수 있다.
  • loss.grad_fn : 손실 함수 loss의 기울기를 계산하는 함수, z.grad_fn를 통해 loss의 기울기를 계산한다.
  • 두 속성을 통해 기울기 계산에 사용된 연산의 정보를 확인할 수 있다.
# 객체의 주소를 나타내냄
print(f"Gradient function for z = {z.grad_fn}")
print(f"Gradient function for loss = {loss.grad_fn}")

 

 

Gradient 계산

신경망에서 매개변수의 가중치를 최적화하려면 매개변수에 대한 손실함수의 도함수(미분)를 계산해야 한다.

  • 일부 고정값에서 loss / wloss / ∂b가 필요하다.
  • 도함수를 계산하기 위해 loss.backward()를 호출한 다음, w.grad b.grad에서 값을 가져온다.

 

loss.backward() # Back Propagation을 통해 기울기를 계산하는 함수
# loss.backward() 호출 이후에는 w.grad, b.grad에 각각의 파라미터에 대한 기울기 값이 저장됨.
# 단! requres_grad 속성이 True로 설정된 노드들만 구할 수 있음
print(w.grad) # w에 대한 기울기
print(b.grad) # b에 대한 기울기

# 여러번의 backward 호출이 필요하면 backward 호출 시 retrain_graph = True를 전달해야 함.

 

 

Gradient 추적 멈추기

기본적으로 requires_grad=True인 텐서들은 연산 기록을 추적하고 변화도 계산을 지원한다.

 

단순 모델 학습 뒤 입력 데이터를 단순히 적용하기만 하는 경우(순전파 연산)는 추적이나 지원이 필요 없을 수 있다.

 

연산 코드를 torch.no_grad() 블록으로 둘러싸서 연산 추적을 멈출 수 있다.

z = torch.matmul(x, w)+b
print(z.requires_grad)

with torch.no_grad():
    z = torch.matmul(x, w)+b
print(z.requires_grad)

 

 

동일한 결과를 얻는 다른 방법은 테서에 detach() 메소드를 사용하면 된다.

z = torch.matmul(x, w)+b
z_det = z.detach()
print(z_det.requires_grad)

 

 

 

 

5. Autograd.ipynb

Colaboratory notebook

colab.research.google.com

 

728x90
반응형