파이토치 - (9) Forward와 Backward 개념 정의

이영락·2024년 9월 27일

개발자 기본기

목록 보기
30/53

PyTorch에서 forward와 backward는 신경망 훈련의 두 가지 주요 단계입니다. forward 함수는 모델이 입력 데이터를 기반으로 예측을 생성하는 계산을 정의합니다. 반면, backward 함수는 손실 함수의 기울기를 계산하여 모델의 가중치를 업데이트하는 과정을 처리합니다. 이렇게 하면, 신경망은 학습을 통해 점진적으로 성능을 향상시킬 수 있습니다.

forward

def forward(self, x):
    
    # 1. Layer pass / Feature extraction
    # 네트워크의 여러 레이어(Convolution, RNN, Fully Connected 등)를 통과시키며 특징 추출
    x = self.layer1(x)  # 예: 첫 번째 레이어를 거침
    x = self.layer2(x)  # 예: 두 번째 레이어를 거침
    # 추가적인 레이어 및 기능을 여기에 추가 가능
    
    # 2. Non-linear activation functions (활성화 함수)
    # 활성화 함수를 적용하여 비선형성 추가
    x = self.activation1(x)  # 예: ReLU, Sigmoid 등
    
    # 3. Dropout, BatchNorm, or other regularization layers (정규화 또는 규제 레이어)
    # 과적합 방지나 일반화 성능을 향상시키기 위한 레이어
    x = self.dropout(x)  # 예: 드롭아웃 적용
    
    # 4. Final output layer / Classification or Regression
    # 최종적으로 모델의 출력을 위한 레이어
    x = self.output_layer(x)  # 예: Fully Connected Layer
    
    # 5. Return the output
    # 최종 계산된 출력 값을 반환
    return x

backward

backward 함수는 PyTorch에서 역전파(Backpropagation)를 수행하는 단계입니다. PyTorch는 자동 미분 기능(Autograd)을 제공하므로, 일반적으로 backward 함수는 따로 구현할 필요 없이, 손실 함수(loss)backward() 메서드를 호출하여 기울기(gradient)를 계산합니다. 하지만, 이를 템플릿처럼 설명하면, 어떤 과정에서 backward가 적용되는지 더 명확하게 이해할 수 있습니다.

PyTorch의 backward 과정 템플릿

def backward(self, loss):
    # 1. Zero gradients
    # 역전파 전 매번 기울기를 0으로 초기화
    # (이전 배치의 기울기가 다음 배치에 누적되지 않도록 방지)
    self.optimizer.zero_grad()

    # 2. Compute gradients (역전파를 통해 기울기 계산)
    # 손실 함수에서 역전파를 호출하여 각 파라미터에 대한 기울기를 계산
    loss.backward()

    # 3. Update parameters (기울기 업데이트)
    # 옵티마이저를 이용해 모델의 파라미터를 기울기를 따라 업데이트
    self.optimizer.step()

    # 4. Optionally log or monitor (선택적: 로그나 모니터링)
    # 필요에 따라 손실 값이나 기울기 값을 모니터링하거나 기록
    # 예: print(loss.item())

세부 설명:

  1. Zero gradients (기울기 초기화):

    • 역전파는 기울기를 누적하는 방식이므로, 새로운 배치에 대한 기울기를 계산하기 전에 optimizer.zero_grad()를 호출하여 기존의 기울기를 초기화해야 합니다.
  2. Compute gradients (기울기 계산):

    • 손실 함수의 backward() 메서드를 호출하면, 자동으로 계산 그래프를 따라 역전파가 수행되며, 각 파라미터에 대한 기울기가 계산됩니다.
    • PyTorch의 자동 미분 기능(Autograd)은 모델의 모든 연산을 기록하고, 이 기록된 연산을 통해 역전파가 이루어집니다.
  3. Update parameters (기울기를 따라 파라미터 업데이트):

    • optimizer.step()을 호출하면 계산된 기울기를 바탕으로 모델의 파라미터들이 업데이트됩니다.
    • 옵티마이저는 Adam, SGD, RMSprop 등 다양한 기법을 사용할 수 있습니다.
  4. Optionally log or monitor (선택적: 기록 또는 모니터링):

    • 학습 과정 중에 손실 값이나 각 레이어의 기울기 등을 모니터링할 수 있습니다.
    • 예: loss.item()으로 현재 손실 값을 확인하고 출력할 수 있습니다.

PyTorch에서 backward 함수가 자동으로 작동하는 구조

backward는 보통 다음과 같은 흐름에서 사용됩니다:

# Forward pass: 모델에 입력 데이터를 넣어서 예측값을 얻음
logits = model(inputs)

# 손실 함수 계산 (예: CrossEntropy)
loss = loss_fn(logits, targets)

# Backward pass: 기울기 계산
loss.backward()

# 기울기를 따라 모델의 파라미터 업데이트
optimizer.step()

# 기울기 초기화
optimizer.zero_grad()

기본 흐름 설명:

  1. Forward pass: 모델에 입력 데이터를 주고 예측값을 계산.
  2. 손실 계산: 예측값과 실제 라벨 간의 차이를 손실 함수로 계산.
  3. Backward pass: loss.backward()를 호출하여 기울기 계산.
  4. Optimizer step: 계산된 기울기를 바탕으로 파라미터 업데이트.
  5. Zero gradients: 다음 배치 전에 기울기를 초기화.

Custom Backward (커스텀 역전파)

PyTorch에서 기본적인 자동 역전파를 사용하지만, 특별한 경우에 autograd.Function을 사용하여 커스텀 역전파를 정의할 수도 있습니다. 예를 들어:

import torch
from torch.autograd import Function

class MyReLU(Function):
    @staticmethod
    def forward(ctx, input):
        ctx.save_for_backward(input)
        return input.clamp(min=0)

    @staticmethod
    def backward(ctx, grad_output):
        input, = ctx.saved_tensors
        grad_input = grad_output.clone()
        grad_input[input < 0] = 0
        return grad_input

이 예시에서, forward 함수는 ReLU 함수의 순전파를 정의하고, backward 함수는 ReLU의 기울기 계산을 수행합니다. 이런 방식으로 고유한 역전파 과정을 정의할 수 있습니다.

결론

일반적으로 PyTorch에서 backward는 자동으로 처리되지만, 기울기 초기화와 파라미터 업데이트를 명시적으로 처리하는 것이 학습의 핵심입니다. backward()는 모델이 어떻게 학습되는지를 이해하는 데 필수적인 역할을 합니다.

profile
AI Engineer / 의료인공지능

0개의 댓글