네이버 부스트캠프 AI Tech 2기

[08.27 P Stage Day5] - 🔨 Ensemble & Experiment Toolkits

Jay x 2 2021. 8. 28. 19:15
728x90
반응형

Ensemble

여러 실험 하다 보면 여러가지 모델로 여러 결과를 만들게 된다.

그런데, 이런 여러가지 모델을 결합해서 더 좋은 모델을 만들 수 있지 않을까?

→ 그래서 이를 활용하는 '앙상블' 기법이 있다.

의미 : 싱글 모델보다 더 나은 성능을 위해서 서로 다른 여러 학습 모델을 활용하는 것이다.

살펴봐야 할 것들 : Overfitting(High Variance → Boosting), Under Fitting(High Bias → Bagging)

Voting

Model Averaging이 잘 동작하는 이유는 , 서로 다른 모델에서 같은 에러는 테스트에서 만들지 않게 되기 때문에 효과가 좋다.

Hard Voting → 다수결 방식(단점, 다른 모델에서 소수의 의견(?)이 무시될 수 있다는 것)

Soft Voting → 위의 Hard Voting의 단점을 해결하기 위해 확률적으로 처리하는 방법

Cross Validation(CV라고 불림)

훈련 셋과 검증 셋을 분리는 하외, 검증 셋을 학습에 활용할 수 없을 까?

→ Validation Set을 적절히 섞어서 학습에 활용을 한다.

Stratified K-Fold Cross Validation

적절한 Validation과 Train을 비율로 나누고, 그 Validation을 한 덩어리로 생각을 하고 모든 경우로 나눠서 처리하는 방법. (단점, fold 한 개수 → K 가 늘어나면 model이 그만큼 늘어난다.)

(가능한 경우를 모두 고려하며, Split시에 Class 분포도 고려한다.)

TTA(Test Time Augmentation)

: Test 할때, Augmentation을 부여해서, 여러 상황에서 어떤 결과가 있는 지 확인해보는 방법

이 테스트 셋에서의 Validation을 따지고 싶그 때문이다.

하지만 앙상블 기법은 성능과 효율에 Trade-Off가 있다.

Hyperparameter Optimization

이 모델의 시스템 메커니즘에 영향을 주는 중요한 파라미터들을 최적화 시킨다는 것

단점 : 파라미터 하나하나 수정할 때마다, 학습을 진행해야하기 때문에 시간적 효율이 떨어진다.

방법 : Grid Search, Random Search, Basian Optimization

import optuna
def objectiv(tiral):
    ...
    x = trial.suggets_uniform('x', -10, 10)
    return (x - 2) ** 2

study = optuna.create_study()
study.optimize(objective, n_trial = '횟수')

study.best_params

Experiment Toolkits과 Tips

Training Visualization

  1. Tensroboard
from torch.utils.tensorboard import SummaryWriter

logger = SummaryWriter(log_dir=f"result"/{name}")

logger.add_scalar("Train/loss", train_loss, epoch * len(train_loader) + id)
logger.add_scalar("Train/accuracy", train_loss, epoch * len(train_loader) + id)

#어떤 이미지들이 들어가는 가? 도 볼 수 있다.
for idx, batch in enumaerate(train_loader):
    inputs, labels = train_batch

    grid = torchvision.make_grid(inputs)
    logger.add_image('image', grid, 0)
    logger.add_graph(model, inputs)

  1. Weight and Bias(wandb)
    • wandb login 진행
    • 코드가 생성이 되어, 복사한 코드를 붙여서 사용한다.
    • import wandb
      
      wandb.init(config = {"batch_size" : batch_size, "lr" : lr, "epochs" : epoch, "backbone" : name})
      
      wandb.log({
      	"Train loss" : train_loss,
      	"Train acc" : train_acc
      })
      
      wandb.log({
      	"Valid loss" : val_loss,
      	"Valid acc" : val_acc
      })

 

반응형