728x90

- Training(학습)단계에 대한 강의 정리입니다.

 

학습 프로세스

Loss - Optimizer - Metric

 

 

Optimizer

Loss는 Loss를 발생시키는 일만 한다. Loss값을 업데이트하는 주체는 Optimizer이다.

 

 

LR Scheduler

고정된 크기만큼의 lr로 계속 학습한다면 올바른 학습을 하기 어렵거나 많은 시간이 소요될 수 있다. 이때 lr을 동적으로 조절하도록 돕는 LR 스케줄러를 사용할 수 있다. 3가지 스케줄러를 소개해보려한다.

 

1. StepLR

가장 다루기 쉬운 스케줄러로, 직접 설정한 특정 step마다 lr이 감소한다.

scheduler = torch.optim.lr_Scheduler.StepLR(optimizer, step_size=2, gamma=0.1)

2. CosineAnnealingLR

코사인 함수 형태처럼 움직여 lr을 급격히 변경하면서 움직인다. 빠른 편이다.

scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=10, eta_min=0)

3. ReduceLROnPlateau

* 참고

가장 많이 쓰이는 스케줄러로 안정적이다.(큰 변화를 꾀하려면 위의 코사인 스케줄러가 괜찮은 선택일 것이다.)

더 이상 성능 향상이 없을 때 lr을 감소시킨다. 성능 향상의 정도를 체크하는 파라미터를 설정해야한다.

 val_loss epoch 5동안 1e-3 이하로 감소하면 learning rate를 절반으로 감소시킨다.

import torch.optim as optim

epochs = 300
optimizer = optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.5, patience=5, threshold=1e-3)
for epoch in range(epochs):
    train(...)
    val_loss = validate(...)
    scheduler.step(val_loss) #scheduler.step에 input으로 metric을 넣어주어야 한다.

 

Metric의 허와 실

데이터 클래스가 매우 불균형한 데이터셋이 있다고 하자. 1000개의 데이터가 있을 때 900개가 1이고, 100개가 0으로 레이블링되어 있다고 하자. 그럼 이 상태에서 모델을 만들 때 모든 데이터를 1로 예측하면 정확도는 90%가 된다. 하지만 0으로 분류되는 데이터는 100개 중 단 하나도 맞추지 못한, 성능이 좋지 않은 모델이다.

 

클래스 별로 데이터가 골고루 분포되어 있다면 Accuracy를 metric으로 사용하면 된다.

그러나 class imbalance 문제가 있는 데이터셋이라면 F1-Score를 metric으로 권장한다. 각 클래스 별로 성능을 잘 낼 수 있는지 확인이 필요하기 때문이다.

728x90