1. 자동 미분
1) 자동 미분(autograd)의 기본 원리
PyTorch의 autograd 모듈은 신경망 학습 중에 발생하는 복잡한 편미분 계산을 자동화합니다. 신경망의 학습 과정에서는 모델의 매개변수(가중치와 편향)에 대한 손실 함수의 기울기(gradient)를 계산해야 합니다. 이 기울기는 각 매개변수에 대해 다른 손실 함수의 편미분으로 구성됩니다.
autograd는 이러한 과정을 자동으로 계산해주며, 사용자가 복잡한 미분 수식을 직접 설계하지 않아도 되도록 돕습니다.
2) 텐서(Tensor) 생성과 자동미분
PyTorch에서는 데이터를 텐서 형태로 다룹니다. 텐서에 .requires_grad 속성을 True로 설정하면, PyTorch는 해당 텐서에 대한 모든 연산을 추적하고, 자동 미분을 위한 계산 그래프를 생성합니다.
3) 파이토치에서 autograd의 특징
- 자동화: 신경망에서는 수많은 매개변수에 대한 복잡한 편미분을 계산해야 하는데, autograd를 사용하면 이 과정이 자동화되어 신경망 학습 과정을 간소화합니다.
- 유연성: 동적 계산 그래프를 지원하기 때문에, 모델의 구조가 실행시점에 결정됩니다. 이는 모델을 더 유연하게 설계할 수 있게 해줍니다.
- 빠른 실험: autograd는 딥러닝 모델의 계산 과정을 대폭 단순화시켜주며, 모델 설계와 실험을 더욱 직관적으로 만들어줍니다.
4) 자동미분을 적용한 텐서 만들기
텐서를 정의할 때, 속성 requires_grad를 True로 설정해 줍니다. 해당 속성의 기본값은 False이기 때문에, 설정해주지 않으면 자동미분을 하지 않습니다.
그리고 텐서가 자동미분을 적용되어 있는지 확인하기 위해서는, 텐서의 requires_grad가 True로 되어있는지 확인하면 됩니다.
5) 역전파 실행
backward() 함수는 PyTorch에서 자동 미분을 실행하는 핵심 함수입니다. 이 함수는 텐서(또는 텐서로 구성된 연산의 결과)에 대해 호출되며, 해당 텐서를 최종 출력값으로 하는 계산 그래프를 역방향으로 추적하면서, 각 변수의 기울기를 자동으로 계산합니다. 계산 그래프는 노드와 연산으로 이루어져, 변수 간의 의존성을 에지로 표현한 그래프로, PyTorch는 이 그래프를 사용하여 각 변수에 대한 미분값을 효율적으로 계산할 수 있습니다.
6) grad 속성
grad 속성은 텐서에 대한 기울기(미분값)를 저장합니다.
requires_grad=True로 설정된 텐서에 대해 backward() 함수가 호출되면, PyTorch는 이 텐서와 연관된 모든 연산을 추적하고, 각 텐서의 grad 속성에 해당 텐서의 기울기를 저장합니다. 즉, x.grad와 y.grad는 각각 x와 y에 대한 함수 f의 미분값을 담게 됩니다. item() 함수는 텐서에서 값을 반환하는 함수입니다.
2. autograd 제어
1) autograd 제어하기
PyTorch에서는 모델을 학습시킬 때 자동으로 기울기(gradient)를 계산합니다. 그러나 때로는 모델의 일부분에서 기울기 계산을 중지하거나 기울기의 흐름을 제어해야 할 필요가 있습니다. 이를 위해 PyTorch는 기울기 계산의 중지 및 흐름 제어를 위한 여러 방법을 제공합니다. 가장 흔히 사용되는 방법은 torch.no_grad(), .detach(), torch.enable_grad()입니다.
2) Gradient 중지 - no_grad
범위 안에서 수행되는 모든 연산에서 기울기 계산을 비활성화합니다. 범위 지정은 with문을 사용합니다.
with torch.no_grad():
이는 주로 모델을 평가할 때 사용됩니다. 모델을 학습 모드에서 평가 모드로 전환할 때 기울기를 추적할 필요가 없기 때문에 메모리 사용량을 줄이고 계산 속도를 향상시키는 데 유용합니다.
3) Gradient 중지 - detach
detach() 메서드는 기존 텐서에서 기울기 계산이 제외된 새 텐서를 생성합니다. 이 방법은 기존 데이터를 유지하되, 기울기 추적을 하지 않을 새로운 텐서를 필요로 할 때 유용합니다.
사용하면 좋은 점
- 메모리 효율성 향상: .detach()를 사용하여 불필요한 그래디언트 계산을 방지함으로써, 메모리 사용량을 줄일 수 있습니다. 이는 특히 큰 모델을 학습시키거나, 메모리 리소스가 제한적인 환경에서 유용합니다.
- 연산 속도 향상: 그래디언트 계산을 제외함으로써, 전체 연산 속도를 향상시킬 수 있습니다. 모델의 일부분을 고정시키기 : 특정 모델의 파라미터를 고정시키고 싶을 때 detach()를 사용할 수 있습니다. 예를 들어, 전이 학습(transfer learning)에서 사전 학습된 모델의 일부를 고정시키고, 나머지 부분만을 학습시킬 때 유용합니다.
- 연산 그래프 보완: 복잡한 모델에서 특정 연산을 그래디언트 추적에서 제외시키기 위해 사용됩니다. 이는 연산 그래프를 더 세밀하게 제어하고자 할 때 필요할 수 있습니다.
4) Gradient 흐름 제어
enable_grad() 또는 no_grad()의 반대로 작동하여, 기울기 계산을 강제로 활성화합니다. 이는 기울기 계산이 글로벌하게 비활성화된 상태에서 특정 연산에 대해 기울기를 계산하고자 할 때 사용됩니다.
'딥러닝 > 딥러닝: PyTorch' 카테고리의 다른 글
PyTorch 6 : 딥러닝 모델 만들기 (torch.nn) (0) | 2025.01.17 |
---|---|
PyTorch 5 : 데이터 로딩과 전처리 (0) | 2025.01.12 |
PyTorch 3 : 선형대수학 (0) | 2025.01.10 |
PyTorch 2 : Tensor (1) | 2025.01.10 |
PyTorch 1 : PyTorch 입문 (0) | 2025.01.10 |