[Boostcamp AI Tech] 4주차 Day 5 학습 기록

bluegun·2021년 8월 27일
0

AI Tech 2기 활동

목록 보기
19/87

모델 제출을 많이 하기도 힘들고 개인 실력과 완성도를 위해 심화된 구현 능력을 기르는 게 맞다고 생각해, 모델을 수정하진 않고 강의에 집중하였다.

학습 내용

Training Inference

  • Loss

  • loss를 어떻게 선택하느냐에 따라 parameter를 update하는 과정도 달라질 것이다.

  • loss function들도 nn.Module을 상속한다 -> forward를 포함한다.

  • 이로 인해, loss fn에 model의 output과 label을 넣으면, 이 또한 Module의 chain에 포함되는 것이다

    • 떄문에 backward를 사용하면 최종 결과로부터 output, input까지 전부 update가 이루어지는 것이다.
  • focal loss, Label smoothing loss

    • focal loss : class imbalace가 있을 떄, class마다 맞춘 확률에 대해 가중치를 준다.
    • Label smoothing loss : class target을 one-hot으로 하지 않고, 다른 class에도 약간의 확률을 줘서(soft하게 표현해서) 일반화 성능을 높임
  • Optimizer : 실제로 weight를 update

  • LR schedule : 학습시에 Learning rate를 동적으로 조절

  • Metric : 학습된 모델을 객관적으로 평가할 수 있는 지표 필요

  • 데이터 상태에 따라 적절한 Metric을 선택해야 한다.

    • class balance가 좋으면 accuracy로 측정해도 되지만, imbalace하면 각 클래스 별로 성능을 잘 내는지 봐야 한다.(F1 score)

Training Process

  • optimizer.zero_grad

    • 이걸 하지 않으면 이전 batch에 있는 grad가 그대로 나온다.
    • 일반적으로 사용하는데, 꼭 써야하는 것은 아니다.
  • loss

    • loss를 마지막으로 chain 생성, 이를 통해 backward()로 chain의 모든 weight의 gradient 계산
  • optimizer.step()

    • loss를 통해 각 weight는 gradient가 계산되어 있고, optimizer는 이를 적용만 시켜주면 된다.
  • Gradient Accumulation

    • step을 매 batch마다 하는 게 아닌, 특정 시점마다 한 번씩 싹 update하면서 batch를 늘린 효과를 볼 수 있음
    • zero.grad()를 매 batch마다 안 할 수도 있게된다.
    • 꼭 이렇게 해야한다는 게 아니라, 이런 식으로 다양한 응용이 가능

Inference process

  • model.eval()

    • self.train(False), Dropout, BN등을 비활성화
  • with torch.no_grad():

    • 내부는 모두 require_grad=False가 된다.
  • Checkpoint

    • torch.save()
    • 원하는 부분에 직접 코드를 짜넣으면 된다.

Ensemble

  • 여러 모델로 만들어진 여러 결과를 버리지 말고 ensemble하자!

  • 현업에서는 많이 쓰진 않는다.(computation time이 배로 늘어난다)

    • 성능이 좋아야하는 domain에선 쓸 수 있다.
  • Model Averaging(Voting)

    • hard voting : 하나씩만 투표해 가장 많이 투표 받은 걸 result로
    • soft voting : label smoothing을 통해 각각의 확률을 전부 더해 높은 걸 result로
  • Cross validation

    • Validation set을 나누되, 매 학습마다 validation set을 다르게 해 모든 set이 학습에 활용될 수 있게 함.
    • K-fold
    • fold 구조 내에도 class가 골고루 들어있어야 한다.
  • Test Time Augmentation(TTA)

    • test 결과가 나왔다고 가정할 때, 만약 test data가 augmentation 되었을 때도 같은 결과를 낼 수 있는가?
    • 다른 noise를 섞더라도 같은 결과가 나와야 확실한 결과라 판단
    • 왜 ensemble? : 여러 augmentation 결과를 ensemble하기 때문.

Hyperparameter optimization

  • Learning rate, Batch size, Loss parameter, Optimizer parameter, k-fold, Dropout, Hidden Layer num...

  • 바꿀 때마다 학습을 새로해야 하므로 시간과 장비가 충분하지 않으면 내키지 않는 방법

  • Baysian optimization이 유명

Visualization tool

  • tensorboard, wandb

피어 세션

  • 각자 대회 진행 상황을 공유하였다.
  • 팀 협업을 위해 어떻게 할 지 의논하였지만, 마땅한 방법은 찾지 못했다. 주말동안 가능하면 py 파일을 받아 학습을 진행하는 하나의 템플릿을 만들어보면 좋을 것 같다.

멘토링

  • 학습에 도움이 되는 정보를 여럿 주셨다.
    • Data augmentation 관련하여, 데이터 수를 늘리거나 transform을 조금 더 늘려보고, 단순 classification 문제에 국한되지 않고 detection model을 통해 마스크를 찾는 게 성능이 더 잘나올 수 있다고 조언 해주셨다.
  • 제출기회가 많지 않으므로, 8:1:1로 train, val, test data를 쪼개, train, val로 학습을 돌리고 제출 전 test data에 넣어봄으로서 성능을 간접적으로 확인할 수 있다고 조언해주셨다. 현재 상황에 도전할 만한 좋은 방법이라고 생각한다.

느낀 점

  • 한 주간 대회를 하면서 직접 코드를 짜면서 전체 구조가 그려지기 시작한 게 만족스럽기도 하고, 막상 뭘 해야 성능이 오를지, 더 떨어지지 않을지, 현재 상황을 판단하기 어렵고 막막해서 놔버리고 싶을 때도 많았다.(실제로 놓음)

  • 멘토분들의 조언으로, 대회 스코어가 높다고 무조건 잘하는 게 아니니 집착하지 말고, 언제나 좋은 퍼포먼스를 낼 수 있도록 실력과 사고력을 갈고 닦는게 좋다고 말씀해주셨다. 대회가 끝날 때까지는 혼자서 합리적인 추론으로 여러 파라미터 및 구조를 결정하고, 원하는 대로 짤 수 있는 능력을 기르도록 노력해야겠다.

  • 아직도 막막하고 굉장히 할 게 많은 것 같지만, 그래도 얻어가는 건 있고 끝까지 따라갈 수 있도록 해야겠다.

0개의 댓글