[08.27 P Stage Day5] - 🔨 Ensemble & Experiment Toolkits
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
- 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)
- 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 })