Stats & AI tech blog - '일단 시도함'

[Python] PyTorch에서 신경망 모델 파라미터 정의 (손실함수/옵티마이저/학습률 스케줄러) 본문

Programming/Python

[Python] PyTorch에서 신경망 모델 파라미터 정의 (손실함수/옵티마이저/학습률 스케줄러)

justdoit ok? 2024. 4. 5. 13:28

2024.04.05 - [Programming/Python] - [Python] PyTorch에서 신경망 모델 정의

 

[Python] PyTorch에서 신경망 모델 정의

PyTorch에서 신경망 모델 정의 오늘은 파이토치(PyTorch)에서 모델을 정의하는 방법에 대해 알아볼거에요. 모델 정의에 필요한 개념인 계층(Layer), 모듈(Module), 모델(Model)에 대해 먼저 알아볼게요. 계

meowstudylog.tistory.com

 

이전 포스팅에서 파이토치(PyTorch)를 활용해서 신경망 모델을 정의하는 방법에 대해 알아보았다.

이번 포스팅에서는 신경망 모델 파라미터인 손실함수(Loss function), 옵티마이저(Optimizer), 학습률 스케줄러(Learning rate scheduler), 지표(Metrics) 을 정의하는 방법 대해 알아보도록 하겠다.

 

 

1. 손실 함수 (Loss function)

 

모델을 학습한다는 것은 예측값과 실제값의 차이인 오차를 최소화하는 과정을 말한다.

여기서 오차를 어떻게 정의할 것인지 오차에 대한 함수를 손실 함수(Loss function) 또는 비용 함수(Cost function)라고 부르는데, 모델의 특성에 따라 다양한 손실함수를 정의할 수 있다.

 

  • MSE (Mean Squared Error) :  주로 연속형 데이터나 회귀 모델에 사용되고, outlier에 민감.
  • MAE (Mean Absoluted Error) : 주로 연속형 데이터나 회귀 모델에 사용되고, outlier에 덜 민감.
  • CrossEntropy Loss : 분류 문제에 주로 사용되고, 클래스 불균형 문제에서 유용.
# MSE Loss
mse_loss = nn.MSELoss()
loss = mse_loss(y_pred, y_true)

# MAE Loss
mae_loss = nn.L1Loss()
loss = mae_loss(y_pred, y_true)

# Cross-Entropy Loss
# 예제 데이터는 클래스 레이블
cross_entropy_loss = nn.CrossEntropyLoss()
loss = cross_entropy_loss(y_pred, y_true)

 

 

2. 옵티마이저 (Optimizer)

손실 함수를 최소화하기 위해 매개 변수를 업데이트하는 알고리즘이다.

 

  • SGD (Stochastic Gradient Descent) : 간단한 문제나 작은 데이터셋에서 자주 사용.
  • Momentum : SGD보다 빠른 수렴이 필요한 경우 사용되며, 특히 손실 함수가 복잡한 경우에 유용.
  • Adagrad : 텍스트 데이터나 추천 시스템 같이 희소 데이터나 드문 특성을 가진 데이터에 적합.
  • RMSprop : Adagrad의 단점을 보완하여 대부분의 딥러닝 문제에 적합.
  • Adam (Adaptive Moment Estimation) : 대부분의 상황에서 잘 동작하며, 큰 데이터셋과 복잡한 신경망에 적합.
# SGD
optimizer_sgd = optim.SGD(model.parameters(), lr=0.01)

# SGD with Momentum
optimizer_momentum = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

# Adagrad
optimizer_adagrad = optim.Adagrad(model.parameters(), lr=0.01)

# RMSprop
optimizer_rmsprop = optim.RMSprop(model.parameters(), lr=0.01, alpha=0.99)

# Adam
optimizer_adam = optim.Adam(model.parameters(), lr=0.001)

 

 

옵티마이저의 특징과 장단점에 대해서는 차원의 저주 문제의 해결 방법 포스팅에서도 다루었으니 참고.

2024.04.02 - [Data Science/Deep Learning] - [ML/DL] DNN, Deep Neural Network (심층신경망) (2) - 차원의 저주 (Curse of dimensionality)

 

[ML/DL] DNN, Deep Neural Network (심층신경망) (2) - 차원의 저주 (Curse of dimensionality)

DNN, Deep Neural Network (심층신경망) (2) - 차원의 저주 (Curse of dimensionality)   2024.04.02 - [Deep Learning] - [DL] DNN, Deep Neural Network (심층신경망) (1) - 기울기 소실 (Vanishing gradient) [DL] DNN, Deep Neural Ne

meowstudylog.tistory.com

 

 

 

3. 학습률 스케줄러 (Learning rate Scheduler)

학습률 스케줄러는 학습 과정 중에 학습률(learning rate)를 동적으로 조정해서 옵티마이저의 성능을 개선하는데 사용된다.

학습률은 모델의 학습 속도와 수렴 속도에 큰 영향을 미치기 때문에 적절한 조정이 필요하다.

 

  • StepLR : 일정한 에폭마다 학습률을 감소.
  • MultiStepLR : 특정 에폭마다 학습률을 감소.
  • ExponentialLR : 매 에폭마다 학습률을 지수적으로 감소.
  • CosineAnnealingLR : 코사인 함수 형태로 학습률을 감소.
# StepLR
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1)

# MultiStepLR
scheduler = optim.lr_scheduler.MultiStepLR(optimizer, milestones=[30, 80], gamma=0.1)

# ExponentialLR
scheduler = optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.9)

# CosineAnnealingLR
scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=50)

 

 

 

4. 성능 지표 (Metrics)

 

모델의 성능을 평가하기 위해 사용되는 다양한 지표로, 데이터와 모델의 특성에 따라 적절한 메트릭을 사용해야 한다.

 

  • Accuracy (정확도) : 분류 문제에서 주로 사용되며 불균형 자료에서는 부적절.
  • Precision (정밀도) : False Positive를 줄이는 데 유리
  • Recall (재현율) : False Negative를 줄이는 데 유리
  • F1-score : 정밀도와 재현율의 균형으로 불균형 자료에 적절.
  • ROC-AUC : 이진 분류 문제에서 모델의 구별 능력 평가
# Accuracy
def accuracy(preds, labels):
    _, preds_max = torch.max(preds, 1)
    correct = (preds_max == labels).sum().item()
    return correct / len(labels)

# F1-score
def f1(preds, labels):
    _, preds_max = torch.max(preds, 1)
    return f1_score(labels.cpu(), preds_max.cpu(), average='weighted')

# ROC-AUC
def calculate_roc_auc(preds, labels):
    softmax_preds = torch.nn.functional.softmax(preds, dim=1)
    positive_probs = softmax_preds[:, 1]
    roc_auc = roc_auc_score(labels.cpu(), positive_probs.cpu())
    return roc_auc