PyTorch의 Autograd 시스템은 모델 파라미터 최적화를 위한 자동 미분과 역전파(Backpropagation)를 간단하게 수행할 수 있도록 설계되어 있다. 역전파는 미분의 성질과 연쇄 법칙(Chain Rule)을 기반으로 손실 함수의 최적화를 수행하며, PyTorch는 이를 효율적으로 처리한다.
인공 신경망의 최적화는 손실 함수(Loss Function)의 최소값을 찾는 과정을 통해 모델의 최적 가중치를 도출하는 것이다. 이 과정에서 변화율을 나타내는 미분은 필수적이며, 신경망의 여러 층(layer)을 통과하며 계산된 출력값에 대해 미분의 성질과 연쇄 법칙(Chain Rule)을 적용하여 최적화가 수행된다. PyTorch는 이러한 계산 과정을 자동으로 수행할 수 있도록 연산 그래프(Computation Graph) 기반의 Autograd 시스템을 제공한다.
import torch
x = torch.ones(2, 2, requires_grad=True) # x에 대한 연쇄 법칙을 이용한 미분 가능
y = x + 1
z = 2 * y**2
r = z.mean() # 함수 정의. r : z의 모든 요소의 평균인 스칼라 값
print("Result: ", r)
r.backward() # 역전파. r에 대한 자동 미분 실행. x.grad가 round r / round x가 됨
print(x.grad)
Result: tensor(8., grad_fn=<MeanBackward0>)
tensor([[2., 2.],
[2., 2.]])
require_grad=True는 Autograd 시스템을 활성화 해 해당 텐서를 기준으로 모든 연산을 추적해 gradient를 계산할 수 있게 한다. gradient는 scalar 함수 $f(x)$에 대해 다음과 같이 표현된다.
$$\nabla f = \frac{\partial f}{\partial x}$$
다변수 함수 $f(x_1, x_2, ... , x_n$에 대한 gradient는
$$\nabla f = \begin{bmatrix}
\frac{\partial f}{\partial x_1}, & \frac{\partial f}{\partial x_2}, & \cdots, & \frac{\partial f}{\partial x_n}
\end{bmatrix}$$
x = torch.ones(2, 2, requires_grad=True) # x에 대한 연쇄 법칙을 이용한 미분 가능
x는 크기가 (2, 2)인 tensor로 모든 요소가 1로 초기화된다. 따라서 초기값 x는 다음과 같다.
$$ x = \begin{bmatrix}
1.0 & 1.0 \\
1.0 & 1.0
\end{bmatrix} $$
y = x + 1
y는 x에 1을 더한 tensor이다. 따라서 $y=x+1$이며, y는 다음과 같다.
$$ y = \begin{bmatrix}
x_{11} + 1 & x_{12} + 1 \\
x_{21} + 1 & x_{22} +1
\end{bmatrix}$$
z = 2 * y**2
z는 $z=2y^2$으로 표현된다. 따라서 z는 다음과 같다.
$$z = \begin{bmatrix}
2y_{11}^2 & 2y_{12}^2 \\
2y_{21}^2 & 2y_{22}^2
\end{bmatrix}$$
r = z.mean() # 함수 정의. r : z의 모든 요소의 평균인 스칼라 값
mean() 함수는 평균값을 계산한다. 따라서 r은 z의 모든 요소의 평균값으로 다음과 같이 표현된다.
r.backward() # 역전파. r에 대한 자동 미분 실행.
r에 대한 자동 미분(Autograd)를 실행한다. 연쇄법칙(chain rule)을 사용해 $ \frac{\partial r}{\partial x} $를 계산하고 그 결과가 x.grad에 저장된다. r은 위에서 정리한 바와 같이 x와 y의 합성함수로 정의되므로 다음과 같이 정의할 수 있다.
$$r = \frac{1}{4} \sum_{i,j} 2 \cdot (x_{ij} + 1)^2$$
Chain Rule을 적용하면 $ \frac{\partial r}{\partial x} $은 다음과 같다.
$$\frac{\partial r}{\partial x_{ij}} = \frac{\partial r}{\partial z_{ij}} \cdot \frac{\partial z_{ij}}{\partial y_{ij}} \cdot \frac{\partial y_{ij}}{\partial x_{ij}}$$
이때 $\frac{\partial r}{\partial z_{ij}} = \frac{1}{4} , \frac{\partial z_{ij}}{\partial y_{ij}} = 4 \cdot y_{ij} , \frac{\partial y_{ij}}{\partial x_{ij}} = 1$이므로
$$\frac{\partial r}{\partial x_{ij}} = \frac{1}{4} \cdot 4 \cdot y_{ij} = y_{ij}$$
따라서 $ \frac{\partial r}{\partial x_{ij}} = x_{ij} + 1$이다.
print(x.grad)
x.grad에는 $\frac{\partial r}{\partial x}$가 저장된다. x의 모든 원소 값이 1이므로,
$$\frac{\partial r}{\partial x} = x + 1 = \begin{bmatrix}
2.0 & 2.0 \\
2.0 & 2.0
\end{bmatrix}$$
Result: tensor(8., grad_fn=<MeanBackward0>)
tensor([[2., 2.],
[2., 2.]])
최종적으로, 입력 x에 대해 출력 r의 변화율 $\frac{\partial r}{\partial x}$가 자동 미분 과정을 통해 계산되고, 이 값이 x.grad에 저장된다. 이는 PyTorch의 Autograd 시스템이 연산 그래프와 연쇄 법칙을 활용해 역전파를 효율적으로 수행한 결과이다.
즉, 역전파(Back propagation)은 x와 같은 입력 변수에 대해 최종 출력 r의 변화율(Gradient)를 계산한다.
'PyTorch' 카테고리의 다른 글
[PyTorch] 데이터 로드 및 전처리 기본 (1) | 2025.01.13 |
---|---|
[PyTorch] Linear Regression(선형 회귀) - Autograd (0) | 2025.01.12 |
[PyTorch] Tensor(텐서) (0) | 2025.01.10 |
[PyTorch] Pytorch 설치 (0) | 2025.01.09 |
[PyTorch] CUDA, cuDNN 설치 (0) | 2025.01.09 |