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 / ∂w 와 ∂loss / ∂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
반응형
'AI > AI 라이브러리' 카테고리의 다른 글
[Pytorch] 모델 저장하고 불러오기 (0) | 2023.12.29 |
---|---|
[Pytorch] 모델 매개변수 최적화하기 (0) | 2023.12.28 |
[Pytorch] 신경망 모델 구성하기 (0) | 2023.12.27 |
[Pytorch] 변형(Transform) (0) | 2023.12.27 |
[Pytorch] 데이터셋 (0) | 2023.12.27 |