본문 바로가기

인공지능

Gradient 추적과 그것을 멈춰야 하는 이유

이 신경망에서 w와 b는 최적화를 해야하는 매개변수이다.

 

Gradient 추적 멈추기

 

기본적으로, requires_grad=True인 모든 텐서들은 연산 기록을 추적하고 gradient 계산을 지원한다.

그러나 모델을 test 할 때와 같이 forward 연산만 필요한 겨우, 이러한 추적이나 지원이 필요 없을 수 있다.

그럴 때에는 연산 코드를 torch.no_grad()을 사용하여 연산 추적을 멈출 수 있다.

 

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

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

 

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

 

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

 

gradient 추적을 멈춰야 하는 이유들은 다음과 같다.

1. 신경망의 일부 매개변수를 고정된 매개변수(frozen parameter)로 표시한다. 이는 전이 학습을 할 때 매우 일반적인 시나리오이다.

2. gradient를 추적하지 않는 연산이 더 효율적이기 때문에, forward 단계만 수행할 때 연산 속도가 향상된다.

 

짚고 넘어가야 할 PyTorch의 특징

 

PyTorch에서 DAG(Directed Acyclic Graph)들은 동적(dynamic)이다.

주목해야 할 점은 그래프가 처음부터 다시 생성된다는 것이다. 매번 .backward()가 호출되면, autograd는 새로운 그래프를 채우기 시작한다.

 

 

 

참고

https://tutorials.pytorch.kr/beginner/basics/autogradqs_tutorial.html?highlight=detach 

 

torch.autograd를 사용한 자동 미분

파이토치(PyTorch) 기본 익히기|| 빠른 시작|| 텐서(Tensor)|| Dataset과 Dataloader|| 변형(Transform)|| 신경망 모델 구성하기|| Autograd|| 최적화(Optimization)|| 모델 저장하고 불러오기 신경망을 학습할 때 가장

tutorials.pytorch.kr