국문과 유목민

[일일 리포트] Day 28 (Level1_PStage_2) 본문

IT 견문록/2022_부스트캠프 AITech 3기(100일)

[일일 리포트] Day 28 (Level1_PStage_2)

논곰 2022. 2. 28. 23:50

해당 일일리포트에서는 네이버 커넥트에서 진행하는 '부스트캠프 AI Tech 3기'에서 배운 내용을 다루고 있습니다. 저작권 이슈 때문에 관련 자료를 올릴 수는 없기에 핵심 이론과 코드를 요약해서 올리고 있기에 내용이 부족할 수 있습니다.

▶ Today I Learned (핵심 요약 정리)

 AutoML 구현

 NNI를 이용해서 HyperParameter를 구현하고자 했다. 하이퍼 파라미터 튜닝의 경우 어떻게 하느냐에 따라서 모델의 성능에 영향을 미칠 수 있다. 물론 그 효과가 다이나믹하지는 않을 것 같지만, 최적의 모델을 찾는 과정에서 하이퍼 파라미터 값에 신경이 많이 쓰이기에 미리 구현하면 실험에 편리할 것 같다는 생각에 먼저 구현을 하고자 했다. 설치는 그렇게 어렵지 않다. 

 

- 설치

python3 -m pip install --upgrade nni

- 예제코드 실행

nnictl create --config nni/examples/trials/mnist-pytorch/config.yml

- 자신의 코드의 이식

예제코드 내  nni를 import하는 부분만 내 코드에 이식하면 됨

# nni/examples/trials/mnist-pytorch/mnist.py

import nni
from nni.utils import merge_parameter
...
        # report intermediate result
        nni.report_intermediate_result(test_acc)
        logger.debug('test accuracy %g', test_acc)
        logger.debug('Pipe send intermediate result done.')

    # report final result
    nni.report_final_result(test_acc)
    logger.debug('Final result is %g', test_acc)
    logger.debug('Send final result done.')
...

if __name__ == '__main__':
    try:
        # get parameters form tuner
        tuner_params = nni.get_next_parameter()
        logger.debug(tuner_params)
        params = vars(merge_parameter(get_params(), tuner_params))
...

특강 시간에 멘토님께서 설명해주신대로 강의를 다시 보면서 초기 설정은 쉽게 할 수 있었다. 하지만 강의대로 진행했는데 작업을 하려고 하니 문제가 생겨서 한 2시간 넘게 찾은 끝에 변수 설정을 잘못 했다는 것을 확인할 수 있었다. 강의에서도 맨 끝부분에 오류를 추가적으로 디버깅하는 부분이 있었다는 것을 오류를 찾고서야 알았다.

 

 아무튼 해당 라이브러리를 이용해서 모델 3개와 2개의 하이퍼파라미터 튜닝을 시도했는데, 어떻게 잘 될지 모르겠다. 내일 아침에 일어나서 한 번 확인해봐야겠다.

CoAtNet구현

링크1: CoAtNet practice: use CoAtNet to classify plant seedlings (pytorch)

 

CoAtNet practice: use CoAtNet to classify plant seedlings (pytorch)

Although transformer has very strong learning and modeling ability in CV tasks, it lacks inductive bias like CNN, so transformer's generalization ability is relatively poor compared with CNN. Therefore, if only Transformer Models global information, Withou

programmer.ink

 

링크2: CoAtNet Git

 

GitHub - chinhsuanwu/coatnet-pytorch: A PyTorch implementation of "CoAtNet: Marrying Convolution and Attention for All Data Size

A PyTorch implementation of "CoAtNet: Marrying Convolution and Attention for All Data Sizes". - GitHub - chinhsuanwu/coatnet-pytorch: A PyTorch implementation of "CoAtNet: Marrying C...

github.com

논문: https://arxiv.org/abs/2106.04803

 

CoAtNet: Marrying Convolution and Attention for All Data Sizes

Transformers have attracted increasing interests in computer vision, but they still fall behind state-of-the-art convolutional networks. In this work, we show that while Transformers tend to have larger model capacity, their generalization can be worse tha

arxiv.org

ImageClassfication의 SOTA모델이라고 하는 CoAtNet을 사용해서 Classification을 진행해봤다. batchsize와 learning_rate, optimiezer, lr_scheduler를 변경하면서 실험을 진행했. 우선 결론부터 말하자면, test_accuracy와 f1score의 최고 점수는 각각 (0.706, 0.711)로 높지 않았으며, 제출 시에도 f1score_0.4557, accuracy_53.2857이 나왔다. 이전에 EfficientNet한 것보다는 높게 나왔는데 여전히 아쉽다.

  • CoAtNet은 모델의 크기에 따라서 0~4까지 있는데, 0 모델과 3 모델을 돌려봤다. 3모델의 경우 파라미터 수가 0모델보다 훨씬 많아 학습 속도가 많이 느렸다. (참고로 ImageClassification SOTA모델은 CoAtNet7이다.)
  • CoAtNet은 https://programmer.ink/think/coatnet-practice-use-coatnet-to-classify-plant-seedlings-pytorch.html에서 참고한대로 하이퍼파라미터 값을 기본으로 주고 학습을 진행했다.
  • batch size 32와 16으로 돌렸을 때 16이 그나마 성능이 더 괜찮아서 16으로 해서 주로 실험을 진행했다. batchsize가 작기에 lr도 1e4로 설정했다. Optimizer도 다양하게 변경해서 Adam, SGD, AdamW를 활용했다. SGD의 경우 학습 속도도 너무 느렸으며, 30Epoch 정도에서 EarlyStop되었고, Adam과 AdamW의 경우 3 Epoch부터 과적합되기 시작하더니 loss가 상승하는 문제가 발생했다. 

 여기까지 실험하면서 내가 모델을 잘못 사용하고 있는 것 같다는 생각이 드는 것 같다. 우선 여기까지 하고 조금 더 튜닝하기 쉬운 모델로 넘어가서 모델을 돌려봐야 할 것 같다. 우리가 하려는 Task에 어울리지 않는 모델이었을 수도 있을 것 같다는 생각을 했다. 내일 만약에 하게 된다면, https://github.com/xmu-xiaoma666/External-Attention-pytorch 해당 포스팅을 추가로 참고해서 해봐야겠다.

▶ Review (생각)

 오늘은 진짜 모델링만 했던 하루라고 얘기할 수 있을 것 같다. 주말동안에는 EfficientNet에 빠져서 계속 하고, 오늘은 CoAtNet에 빠져서 파라미터 값을 변경하면서 계속해서 실험을 한 것 같다. 그런데 뭔가 의미있는 성과를 얻지 못한 것 같아서 아쉽다. 애초에 너무 큰 모델을 하려고 마음 먹은게 패착이었을 수도 있을 것 같아서 Resnet과 같은 비교적 간단한 모델로 학습을 진행해보려고 한다. 

 

 AutoML을 구현하는데도 꽤나 애를 먹었는데 사용하는 순간까지도 애를 먹고 있다...밤 동안에 모델을 학습시키고 싶어서 server에서 구동하려고 하는데, 서버에서 구동하고자 하니 왜인지 모르지만 Fail이 뜨고 이 조차도 서버 내 localhost로 켜져서 확인도 안 된다...진짜 어지럽다 어지럽다 하니까 오늘 또 머리까지 아파서 시간도 제대로 못 썼다. 끼니 거르지 말고 너무 스트레스 받지 말고 해야겠다. 내일은 ResNet을 돌려봐야겠다

(AutoML구현 안 했으면 모델 다 돌려봤겠네...)

Comments