Day_76 01. 작은 모델, 좋은 파라미터 찾기: Data Augmentation & AutoML 결과 분석

작성일

6 분 소요

작은 모델, 좋은 파라미터 찾기: Data Augmentation & AutoML 결과 분석

1. Overview: Image augmentation

1.1 Introduction

Data Augmentation

  • 기존 훈련 데이터에 변화를 가해, 데이터를 추가로 확보하는 방법
  • 데이터가 적거나 Imbalance 된 상황에서도 유용하게 활용 가능
  • 직관적으로는 모델에 데이터의 불변하는 성질을 전달 $\rightarrow$ robust 해짐
    • ex) 강아지 이미지는 “회전해도”, “늘려도”, “일부분만 보여도” 강아지 이미지
  • 데이터의 종류마다 Augmentation 의 종류, 특성은 달라질 것
    • ex) 음성, 정형데이터, 이미지, …
  • 뒤의 내용은 이미지 데이터의 augmentation(image augmentation)에 대해서만 논함

경량화, AutoML 관점의 augmentation?

  • 경량화 관점에서는 직접적으로 연결이 되지는 않으나, 성능 향상을 위해서는 필수적으로 적용되어야하는 기법
  • Augmentation 또한 일종의 파라미터로, AutoML 의 search space 에 포함이 가능한 영역

Object detection 에서의 대표적인 Augmentation 기법들

  • 실제 데이터에서는 보통 이보다 더 큰 효과를 얻음

1.2 Image augmentation list-up

Image classification 에서의 대표적인 Augmentation 기법들

ShearX(Y)

magnitude * random.choice([-1, 1]) 이 값에 의해서 양수면 오른쪽으로 음수면 왼쪽으로 비틀림

한쪽 축방향으로 이미지를 비튼다고 보면

TranslateX(Y)

위에가 X 방향, 아래가 Y 방향

실제이미지가 특정 방향으로 이동된걸 확인할 수 있음

Rotate

rot(각도 파라미터)를 주게되면 각도만큼 이미지를 회전하는 형태

회전한만큼 빈공간에는 색이 채워지게 됨

Contrast

밝은 픽셀과 어두운 픽셀의 차이값을 조절해주는 것

0을 주면 완전히 회색 이미지를 주고 1을주면 원본 이미지를 주고 1보다 크게되면 컬러상으로 좀 더 대비되는 이미지의 효과가 있음

1보다 작은 값이어서 흐릿해짐

Invert

예를들어 256개의 RGB color 를 가지는 8bit 의 이미지라고 봤을때, 255에서 원래 픽셀값을 뺀 것

그래서 색이 뒤집어지는 효과를 볼 수 있음

Equalize

특정 픽셀값들의 빈도수가 굉장히 높음

색 구분이 제대로 되지 않는다라고 볼 수 있음

한곳에 모여있는 분포를 펼쳐준다라고 생각할 수 있음

그렇게 되면 누적분포가 모여있는곳에서 확 올라가는 경향이 있었다가 직선의 형태로 변경됨

색 표현이 좀 더 풍부해졌다라고 볼 수 있음

AutoContrast

contrast 와 동일하지만 여기에 histogram equalize 값을 사용해서 자동으로 밝은 픽셀과 어두운 픽셀의 대비를 좀 더 커지게 만드는 것

별도의 파라미터는 없음, 실제로 cutoff 라는 파라미터가 있지만 사용하진 않음

미미하지만 색표현이 좀 더 진해진 걸 볼 수 있음

Solarize

threshold 를 넘는 값들에 대해서 invert 를 취함

거의 바뀌긴 했는데 안바뀐 부분에 대해서는 그대로고 바뀐 부분에 대해선 색을 invert 하는 특이한 효과를 볼 수 있음

Posterize

일종의 Quantization 혹은 양자화라고 봐도 될 것 같음

원래 있던 bit 보다 더 적은 bit 로 표현하려는 것

강아지 이마쪽을 보면 같은 색으로 바뀌어버림

비슷한 색들의 값을 다 같은 값으로 퉁쳐버림

그러면 더 적은 bit 로 8bit 로 표현된 이미지면 4bit 로 표현

촘촘하게 픽셀값들이 있었는데 넓직넓직하게 바꿔서 비슷한 값들로 맵핑

Color

0의 경우에는 흑백사진이 나오고 1인 경우는 원본이미지가 나오고 1보다 크면 좀 더 쨍한 느낌으로 augmentation 이 적용

Brightness

밝기 조절

Cutout

조금은 특별한데 구멍을 뚫는다고 보면 됨

강아지의 입부분에 구멍을 뚫었지만 사람은 강아지라는 걸 알 수 있음

모델도 알아내야 함

Mix of things

하나만 적용하지 않고 막 여러개를 짬뽕 시킬 수 있음

회전도 시키고 색도 바꾸고 흐릿흐릿하게도 만들고 이것들을 중첩해서 적용할 수 있음

한 장의 이미지를 가지고 다양한 이미지로 만들 수 있음

2. Image Augmentation 논문 리뷰

2.1 Introduction

Image Augmentation: issue

  • Task, Dataset 의 종류에 따라 적절한 Augmentation 의 종류, 조합, 정도(magnitude 가 다를 것)
    • ex1) Capacity 가 작은 모델의 학습에 심한 augmentation 을 적용하면? 오히려 성능이 떨어질 수 있음
    • ex2) 숫자 인식(MNIST) 데이터에 심한 rotation(180도) augmentation 을 적용하면?

2.2 초간단 리뷰: AutoAugment

AutoAugment: AutoML 로 augmentation policy 를 찾자

  • Data 로부터 Data augmentation policy 를 학습
  • 총 5개의 sub policy, 각 sub policy 는 2개의 augmentation type, 각 probability 와 magnitude 를 가짐

  • 좋은 성능을 보이지만, 학습에 매우 큰 자원이 필요
  • 속도를 바르게 만드려는 시도들([8], [9])

1.3 초간단 리뷰: RandAugment

RandAugment[10]: 좋은 절충안

  • 2개의 파라미터(N: 한번에 몇개 적용, M: 공통 magnitude)로 search space 를 극단적으로 줄임
    • (RandAug: 약 $10^2$, AutoAug: 약 $10^{32}$)
  • 이 설정으로, policy 를 찾는 여타 알고리즘과 거의 동등한 성능을 보임

3. Rand Augmentation 적용하기

3.1 코드 설명

PyTorch 의 DataLoader

  • Transform(데이터셋 변환)
  • Dataset class
  • DataLoader class

의 3과정을 거침

Transform 에 RandAugmentation 추가

  • RandAugmentation 이라는 custom transforms 를 추가
  • transform 은 tensor 를 입력으로 받아 tensor 를 출력하는 함수

RandAugmentation 클래스

RandAugmentation 클래스: __call__

  • Augmentation 의 크기(magnitude)를 [0, self.n_level] 로 나눔
  • 고정하거나(Constant Magnitude) random 하게 샘플(Random Magnitude)

RandAugmentation 클래스: _apply_augment

  • self.transforms_info 에 아래와 같이 predefined 된 method 와 low, high 가 정의
  • 선택된 level 크기의 augmentation 을 적용

RandAubment 적용 결과

3.2 Baseline 에 적용

Overview

  • 좌측과 흐름은 동일
  • 약간의 모듈화를 적용

Overview: 호출 순서는 반대!

먼저 외부에서 create_dataloader() 함수를 호출하게 되면 dataloader 를 만들기 위해서는 dataset 이 필요하기 때문에 get_dataset() 을 호출하고 dataset 이 만들어지려면 transform 이 필요하기 때문에 randaugment_train() 을 실행하는 형태로 호출은 반대로되는걸 볼 수 있음

Dataloader 를 만드려면, dataset 이 필요함

Dataset 을 만드려면, transform 이 필요함

Dataloader 를 만드려면, Dataset 이 먼저 필요하고

  1. ./tune.py 또는 ./main.py 에서 create_dataloader 함수 실행

  1. ./src/dataloader.py 속 create_dataloader 함수에서 get_dataset 함수 실행

Dataset 을 만드려면, transform 이 필요함

  • Yaml 에서 적용할 transform 함수의 이름을 지정하고, getattr 를 활용하여 해당 함수를 호출

  1. DATA_PATH: 데이터를 저장할 폴더 이름
  2. DATASET: 사용할 dataset 이름
  3. AUG_TRAIN: train_dataset 에 적용할 augmentation 함수
    • (./src/augmentation/policies.py 속 {}_train 함수 중 선택)
  4. AUG_TEST: test_dataset 에 적용할 augmentation 함수
    • (./src/augmentation/policies.py 속 {}_test 함수 중 선택)
  5. AUG_TRAIN_PARAMS: AUG_TRAIN 함수 속 arguments
    • (AUG_TRAIN 에 randaugment 이 들어갈 때만 설정, 아니면 null)
      1. n_select: 몇 개의 random augmentation 을 적용할 지
      2. level: 얼마나 강하게 augmentation 을 적용할 지(0 <= level <= n_level)
      3. n_level: level / n_level 의 강도로 augmentation 적용
      • level 이 0에 가까울수록 약하게 적용, n_level 에 가까울수록 강하게 적용
  6. AUG_TEST_PARAMS: AUG_TEST 함수 속 arguments
    • (arguments 를 필요로하는 함수가 없으므로 null 로 유지)
  7. BATCH_SIZE: train 에 사용할 batch size
  8. VAL_RATIO: train_dataset 중 validation 에 사용할 데이터 비율

4. AutoML 구동 및 결과 분석

4.1 가상의 시나리오

상황에 맞는 설정 셋업

  • 가용가능한 자원(GPU, CPU) 수 파악
  • 일반 모델을 학습하는데 걸리는 시간
  • … 등등

가상의 시나리오 설정(현업에서는 훨씬 더 구체적)

  • PC 1대 정도 리소스(CPU: 8코어, GPU: v100 1대) 할당해드릴게요,
    cifar10 classification task 에 대해서 파라미터는 적고, 성능 좋은 모델 하나 만들어주세요.
    내일(24시간)까지 부탁드립니다.

상황을 파악해보자

  • Q: Objective 는?
    A: Multi objective 문제(min Param, max Acc)
  • Q: 해당 task 를 한번 수행하는데 걸리는 시간은?
    A: 모델의 크기에 따라 다르지만 약 2~4시간
  • Q: 해당 리소스에서 최대 몇개의 세션까지 구동가능?
    A: 대략 2~3개까지 가능

  • 일반적으로 100~200 회는 되어야 만족스러운 결과를 얻어낼 수 있다는 것을 경험적으로 알고있을때,
    받은 업무를 그대로 처리한다면 약 24회 정도(기한 / 학습시간 * 세션 갯수, 24시간/3시간 * 3개)의 trial 을 처리 가능

시간을 줄여야 한다

  • 학습 시간을 줄이고 싶은데, 데이터 셋을 소규모로 sample 해서 모델을 찾아도 될까?
  • 모델의 성능에 가장 큰 영향을 주는 인자만 Search space 로 넣고 싶은데, 어떤 것들 일까?
  • 등등

결국 해봐야 안다: 작고 강한 cifar10 classification 모델 만들기

  • 짧은 기한임을 고려하여, 데이터셋 축소(Train: 5만장 $\rightarrow$ 1만장(random sample), Test: 1만장); small cifar10
  • Search space: 7개의 블록, 그 밖의 하이퍼파라미터는 전부 고정(모델 보다 중요하지 않다고 판단)
    batchsize: 128, epoch: 200, SGD(+Momentum), Cosine annealing[11], Randaug 적용(N:2, M:15)

4.2 결과 분석 및 논의

AutoML 구동 결과

  • 축소된 데이터셋에 대해서는 약 30분에 한 trial 이 종료됨
  • 전체 89회 trial 이후, 충분히 유의미한 결과를 얻어서 미리 종료함

결과 분석(성능 - 파라미터 그래프)

  • 우측으로 갈수록 높은 성능(Acc), 하단으로 갈수록 적은 파라미터 수
  • 대체적으로 나중에 생성된 모델들(밝은 점들)이 좋은 경계(우측 하단)에 가깝게 분포 됨을 확인

결과 분석(성능 - 파라미터 그래프); baseline

결과 분석(성능 - 파라미터 그래프); 유사 성능, 결과 내 최소 파라미터

결과 분석(성능 - 파라미터 그래프); 최고성능

결과 분석(성능 - 파라미터 그래프); 적당히 좋은

결과 분석(성능 - 파라미터 그래프); 비교군 목록

과연 전체 데이터에서도 유효할까?

적합하고, 적당한 크기의 approximation 을 하더라도, 소기의 목적을 어느정도 달성할 수 있다.

다만, 이는 사용자의 몫

Use cases

  • Q1) MobileNetV2 대비 성능은 비슷하면서 작은 모델을 찾아주세요!
    A1) (Mbv2 대비) 성능: -1.18%, 크기: x0.0095, 속도 x0.45
  • Q2) 가장 성능 높은 모델을 찾아주세요!
    A2) 성능(약 8% 향상(95.6% > 87.37%)), 크기(x0.38(mbv2), x0.20(mbv3)), 속도(x1.00(mbv2), x0.84(mbv3))
  • Q3) 적당히 좋은 모델 찾아주세요!
    A3) 성능(약 4% 향상(92.78% > 87.37%)), 크기(x0.073(mbv2), x0.038(mbv3)), 속도(x0.77(mbv2), x0.65(mbv3))

약간의 discussion & open questions

  • AutoML 로 데이터셋, task 에 특화된 모델을 찾는 것이 가능
  • 현실적인 제약(시간, 리소스 등등)들을 해소하기 위한 엔지니어링은 (아직) 사람의 노하우가 필요
  • (심화) 데이터셋이 계속 추가되고 변화하는 현실 상황에서 이전 결과를 지속적으로 활용하려면 시스템을 어떻게 구성해야 할까? (AutoML 에서의 CI/CD)

Further Reading

댓글남기기