(5강) Model with PyTorch

💡
Pytorch의 특징과, Model의 특징에 대해 알아본다.

Design Model with Pytorch

Model은 일종의 System에 대한 표현을 의미한다. 우리나라 말로 '모형'이라는 의미를 통해 쉽게 이해할 수 있을 것이다.

PyTorch는 다른 딥러닝 프레임워크에 비해 자유도가 높고 유연한 장점이 있다. Pythonic한 특징으로 매우 쉽게 다룰 수 있다. 또한, Low-level의 기계처럼 Model의 동작 내부를 일일이 구성하기 쉽게 되어있다. 나만의 실험이나 커스터마이징을 하기가 매우 용이하다.

nn.Module

우리가 Model을 설계를 할 때이든, 남이 만든 Model을 불러다가 Fine Tuning하든, PyTorch 내부의 Module의 동작을 이해해야 한다. 모델을 구성하는데 nn.Module은 어떤 역할을 할까?

모든 Linear와 Conv Layer는 이 nn.Module을 상속받고 따른다.

모든 Layer를 타고 가다보면, 결국 nn.Module을 상속한다.

위에서 정의한 Model은 modules()라는 메서드를 가진다.

1개의 모델이지만, 안에 다른 modules를 가지고 있다.

각 module은 다른 module과 Parameter를 저장하고 있다. 이러한 연결성이 매우 중요하다. modules를 통해 모델 내의 모든 파라미터까지 부를 수 있기 때문이다.

forward는 chain의 과정을 정의한다. 들어오는 데이터를 각 Layer에 통과시키는 순전파를 정의하는 것이다. model을 calling하는 것도 forward와 동일하게 동작한다.

nn.Module을 모두 상속한다는 의미는, Model 뿐만 아니라 이 안에 있는 모든 구성 요소들이 각각의 __init__forward를 갖고 있다는 의미이다. 내가 정의한 모델의 forward 호출만으로, 모델에 정의된 모든 Module 각각의 forward가 실행된다.

Model 내에 정의된 Layer를 calling 하는 의미가 즉, forward를 실행하는 것이다. 모든 요소가 nn.Module로 구성해서 가능한 일로, OOP의 상속의 유용성을 볼 수 있다.

더 나아가서 nn.Module은 child modules를 갖는다. 이를 통해서, 부모 Module과 chain 된 자식 Module을 호출할 수 있고 계산에 활용할 수 있는 것이다. Backward시에도 Loss에서 발생한 Grad 값을 전달하는데, 이 때 이 전파는 우리가 정의한 Model의 modules를 타고 흐른다. 연결 되어 있기 때문에, 우리는 각각의 Parameter를 찾을 필요없이 한번에 업데이트를 수행할 수 있는 것이다.

Parameters

Modules는 일종의 저장소이다. 연산을 수행할 Tensor Parameter를 갖고 있는 것이다. Parameter는 즉 Weight와 Bias이다. 이는 Tensor의 형태로 구현되어 있다.

Weight와 Bias를 보기 위해서는 state_dictparameters로 볼 수 있다.

state_dict는 OrderdDict이고, parameters는 generator이다.

각 Parameter도 하나의 Class로서 내부에 Member를 갖는다.

이 멤버들을 통해서 Forward의 연산과, 자동미분을 수행할 수 있는 것이다.

Parameter까지 연결이 되어있기 때문에, Model에서 손쉽게 Grad나 Data를 확인할 수 있다. 또한, requires_grad를 통해서 Freeze를 할 수도 있다. 이처럼 Pythonic한 특징 덕분에 형식과 구조만 알면 여러가지 응용과 적용이 가능하다. 예를 들면, state_dict에서 key 값이 다르더라도 구조만 안다면 이 Parameter를 사용할 수 있는 것이다. 이는 단순히 Python Dict로 구현되어 있기 때문이다.


(6강) Pretrained Model

💡
Computer Vision 분야의 Pretrained Model에 대해 알아본다.

ImageNet

Computer Vision 분야의 발전은 ImageNet의 개발과 맥을 같이하고 있다. 획기적인 알고리즘 개발과 검증을 위해 높은 품질의 데이터 셋은 필수적이기 때문이다.

ImageNet의 출현과, CV분야의 발전

Pretrained Model

매 Task마다 모델을 일반화 하기 위해 수 많은 데이터를 학습시켜야 한다면, 이는 매우 비효율적일 것이다. Pretrained Model은 대용량의 좋은 품질의 데이터로 미리 학습시켜 놓은 Model이다. 우리는 이 Model을 Task에 맞게 다듬어서 사용함으로써 효율성을 높일 수 있다. 이는 torchvision과 같은 다양한 Package를 통해서 손쉽게 사용할 수 있다.

Transfer Learning

CNN의 Base Architecture를 살펴보면 다음과 같다.

Model은 CNN Backbone과 Classifier로 구분할 수 있다.

위 구조를 기반으로 우리는 각 Case에 맞게 Pretrained Model을 활용할 수 있다.

Pretrained Model이 학습한 Data와 Task가 유사하다면, CNN Backbone을 Freeze하는 Feature Extracting 방식을 사용할 수 있다.
유사도도 낮고, Data도 적은 경우에는 Pretrained Model이 적합하지 않을 수 있다.


Reference

파이토치 Module 문서

Torchvisions Models

파이토치 성능 향상을 위한 7가지 팁 (번역)

Pytorch Common Mistakes

Pytorch Autograd

Pytorch FAQ

Pytorch Modules


Project

오늘의 목표 및 진척상황

  • Baseline Code 완성! (환경 구성부터 추론까지 Pipeline 완성)
  • 다양한 Option 적용 및 실험을 위한 Code 구성
  • Model이 동일 Class만 예측하도록 학습되던 문제 해결
  • 데이터가 적은 Class 정답 비율 확인

직면했던 문제와 학습한 내용

  1. Model 학습의 문제

    어제 Labeling의 문제를 해결하고 난 후, Stratified K Fold로 학습을 시켰다. 이 때, Train Accuracy가 0.2에 수렴하고 모든 Class를 4로 예측하는 형태가 됐다. 하루 종일 이 문제와 씨름을 했다. 일일이 출력도 확인하고, 분포도 확인하고, transform도 건드려보고, 타입도 변경해보고, 모델도 변경해보고.. 등등.. 결국 Dataset에 일부의 img_paths만 사용하는 것이 문제였다. 오류의 예시는 다음과 같다.

    kf = KFold(5)
    for train_idx, valid_idx in kf.split(img_paths) :
    	trian_dataset = MyDataset(img_paths[train_idx])
    	...

    이와 같이 Dataset을 구성하면 문제가 생기는지에 대한 원인을 규명하지는 못했다. 다만, 이를 회피할 수 있는 방법은 다음과 같은 방법이었다.

    kf = KFold(5)
    train_dataset = MyDataset(img_paths)
    for train_idx, valid_idx in kf.split(img_paths) :
    	train_subset = Subset(train_dataset, train_idx)
    	...

    위와 같이 수행하니, 정상적인 학습이 가능했다.

  1. Baseline Code 완성

    드디어 Data 전처리부터 Ensemble로 추론하는 것 까지의 Pipeline을 구성했다. 이제, 여러 기법들을 적용해가면서 성능을 Check하고 Model을 개선해나가면 된다!

  1. 소량의 Data인 Class 확인

    Data가 적은 Class에 대해서, Test Data의 분포 여부를 확인해보았다. Class 2번과 같은 경우에는 13%에 육박할 정도로 많은 Data가 있음을 확인했다. Class 3, 4, 7, 8번은 Data가 적은데에 비해 약 2.5%의 비율을 갖는다.

추가로 진행 할 사항

  • Fold에서 겪었던 문제 토론으로 공유하기
  • Learning Rate Scheduler 도입
  • Augmentation 도입 (Albumentation 등 확인)
  • Data 증강 등 전처리 여부 고민
  • 성별, 나이별, 마스크별 등 각각의 모델 구성 여부 고민
  • Pseudo Labeling 여부 고민

'네이버 부스트캠프 AI Tech' 카테고리의 다른 글

[P1] Day 45  (0) 2021.04.11
[P1] Day 44  (0) 2021.04.11
[P1] Day 42  (0) 2021.03.31
[P1] Day 41  (0) 2021.03.31
[U] Day 40 - Lightweight V  (0) 2021.03.28

+ Recent posts