네이버 부스트캠프 🔗/⭐주간 학습 정리

[네이버 부스트 캠프 AI Tech]Data Augmentation & Efficient Learning

Dobby98 2023. 3. 28. 01:36

본 글은 네이버 부스트 캠프 AI Tech 기간동안

개인적으로 배운 내용들을 주단위로 정리한 글입니다

 

본 글의 내용은 새롭게 알게 된 내용을 중심으로 정리하였고

복습 중요도를 선정해서 정리하였습니다

 

 

✅ Week 4

목차

  1. Data Augmentation
    1. data augmentation?
    2. type of augmentation  
    3. torch vision & albumentations 
  2. Efficient Learning
    1. knowledg distillation
    2. semi-supervised learning
    3. self-training

✅ Intro

딥러닝을 학습하다 보면 항상 마주치는 문제, 고질적인 문제가 있다

 

바로 Data이다 

 

Data가 문제라고 ?😢😢

 

처음 이 소리를 들으면 이해가 되지 않을 것이다

하지만 다르게 생각해보면 금방 이해가 된다

 

Data가 없으면 모델의 학습이 떨어지고, Data가 안좋으면 모델의 성능이 떨어지고, Data를 확보하기 어렵고, Data를 전처리하는데 시간이 많이 든다

 

사실상 딥러닝 모델을 학습시킬 때 가장큰 주적은 데이터이다

이러한 데이터의 과정을 관리하는 것이 가장 중요한 과제 중 하나라고 할 수있다

 

물론 모델의 구조, 모델의 학습 방법 등 다양한 연구 분야가 주류를 이루고 있지만

이러한 방법들의 근원에는 우리가 갖고 있을 수 있는 데이터 수의 한계 때문에 기인되었다

 

실제로 데이터를 더 많이 던져주면 모델의 성능은 무조건 올라간다

이건 불변의 법칙이다

 

그러나 앞에서 말했듯이 데이터의 확보에는 한계가 분명하다

따라서 우리는 이를 해결하기 위해서 다양한 방법을 시도하여야 한다 

그러한 방법 중 대표적인 방법이 Data Augmentation과 Efficient Learning이다

 

이제 이 둘을 자세히 살펴보도록 하자🔥

 


1.  Data Augmentation

🔥 1.1 What is data augmentation

 

data augmentation은 무엇일까?

 

말 그래도 하자면 '데이터 증강'이다 

즉, 우리가 갖고 있는 데이터를 활용해서 새로운 범주의 데이터로 증강하는 방법인 것이다

 

CNN 모델이 발전하기 전부터 이미 사용된 방법이고 CNN의 조상이라고 불리는 Alexnet 논문을 보더라도 Data Augmentation의 내용이 나온다

 

그리고 최근에는 Cutmix - 예전에 리뷰한 글이 있다, Cutout, Mixup 등 다양한 향상된 기법들이 출연하였고

이러한 방법들은 데이터 수의 한계를 어느정도 개선해주는 역할을 해주었다

물론 이미지 데이터 뿐만 아니라 자연어 처리나 다양한 분야에서도 그 데이터에 맞는 증강기법이 존재한다

하지만 나의 트랙은 CV이기 때문에 CV내용에 집중해서 살펴볼것이다

 

 


🔥 1.2 type of augmentation  

 

Transforming and augmenting images — Torchvision 0.15 documentation

Shortcuts

pytorch.org

대표적인 augmentation 기법들을 한번 살펴보자

 

Pytorch 공식  Doc를 참고하면 더 자세한 내용과 예시들이 등장할 것이다

관심있는 분들은 위의 링크를 이용하기를 바란다

 

이미지 데이터에서 augmentation은 쉽게 이해하자면 '이미지 변형'에 가깝다

이러한 변형은 cv2 라이브러리를 활용해서 실행할 수 있다

하지만 cv2를 활용하는 것은 매우 번거로운 일이다 

 

고맙게도 우리의 슨배님들이 torchvsion과 다양한 라이브러리로 쉽게 할 수있게 만들어 주졌다

따라서 이번 글에서는 torchvision을 이용해서 살펴볼 것이다

 

 

그렇다면 이미지 변형하면 가장 쉬운 방법에 무엇이 있을까?

 

  • Resize 

그렇다 바로 Resize이다. 사실 Resize는 이미 수차례 겪어봤다

이미지를 원하는 inputsize에 맞추기 위해서 필수적으로 해야하기 때문이다

224 x 224 이미지를 448 x 448 이미지로 변형하고

또는 원하는 사이즈로 수정할 수 있다

 

이러한 방법은 torchvision.transforms.Resize를 통해서 쉽게 할 수 있다

 

  • Brightness adjustment

이미지의 크기를 변경해 보았다면 다음 살펴볼 방법은 이미지의 밝기를 조절하는 방법이다

다양하게 이미지의 밝기를 변형하면서  새로운 input data를 만들 수 있다

torchvision.transforms.ColorJitter을 이용하면 쉽게할 수 있다 - 자세한 파라미터는 공식문서 참고

 

  • 수직 수평 뒤집기

앞에서 이미지의 밝기를 변형했다면 이번에는 이미지의 좌우 상하를 조절하는 방법이다

쉽게말해서 원본 이미지를 뒤집어서 새로운 공간정보를 가진 데이터로 만드는 것이다

torchvision에서는 random성 까지 추가해서 구현해 주고 있기 때문에 파라미터만 잘 조절한다면 쉽게 적용할 수 있다

torchvision.transforms.RandomHorizontalFlip

torchvision.transforms.RandomVerticalFlip

등의 함수를 이용해서 쉽게 적용할 수 있다

 

  • Affine Transformation

다음으로 살펴볼 것은 Affine 변형이다

뭔가 새로운 단어가 나와서 어려워 보이지만 예시로 살펴보면 간단하다

이런식으로 이지의 공간을 새롭게 구성해서 새로운 데이터를 구성하는 방법이다

 점, 직선, 평면을 보존하는 선형 매핑 방법을 아핀변환이라고 한다

 

torchvision에 torchvision.transforms.RandomAffine을 활용하면 쉽게 구할 수 있다

 

  • Cutmix

cutmix는 앞에서 살펴본 방식과 조금 다르게 직접 구현이 필요하다

개념은 상당히 간단한데

여러 데이터의 부분을 가져와서 합쳐 한장의 사진을 만들고 이 사진의 label 가져온 데이터의 label 만큼 섞어서 구성해준다

이렇게 만들어주면 모델이 학습을 하면서 어느 부분에 더 집중을 해야 이 label의 특징인지를 학습할 수 있기 때문에

모델의 성능이 많이 올라간다

자랑스럽게도 네이버에서 제안한 논문이다

 

비슷한 계열로는 MixUp, Cutout등의 기법이 있고 사실 Cutmix가 이러한 방법의 한계를 극복하기 위해서 나온 방법이기 때문에 cutmix가 더 좋다

그리고 들이는 노력대비 성능이 많이 향상되기 때문에 반드시 시도해볼 만한 방법중 하나이다

 

 

[논문 리뷰] CutMix : Regularization Strategy to Train Strong Classifiers with Localizable Features

CutMix는 Data Augmentation의 방법 중 하나로 자랑스러운 우리 Naver Clova에서 작성한 논문이다. 2019년도에 나온 논문이지만 아직까지 상당한 영향을 미치고 있고 실제로 데이콘, 캐글같은 대회에서 Agume

eumgill98.tistory.com

 

  • RandAugment

위에서 살펴본 방법들은 사용자가 선택하고 적용해보면서 모델의 결과를 비교하여야한다

하지만 실제로 이러한 과정은 매우귀찮다, 증강 기법은 위에서 살펴본 것 뿐만아니라 매우매우 매우 매우 많기 때문이다

 

따라서 이를 랜덤적으로 적용해보고 비교하는 방법이 있다

이를 RandAugment라고한다

 

간단하게 우리가 지정해준 Augmentation 목록 중 랜덤적으로 적용을 해서 모델학습에 적용하는 것이다

 

  • Compose, P

하지만 당신 만약에 랜덤과 운을 믿지 않는 사람이고, 당신의 실력을 믿는 사람이라면 Compose를 활용해서

직접 다양한 Augmentation을 연속적으로 지정해줄 수 있다

간단하게torchvision.transforms.Compose을 활용해서 리스트 안에 다양한 Augmentation을 넣어주기만 하면된다

그리고 여기서 각 augmentation에 p의 하이퍼 파라미터를 적용해서 확률도 지정해 줄 수 있다 - 0.5는 50%확률로 적용된다는 뜻

transforms.Compose([
    transforms.CenterCrop(10),
    transforms.PILToTensor(),
    transforms.ConvertImageDtype(torch.float),
])

🔥 1.3 torchvision < =  albumentations

 

Albumentations Documentation

Albumentations: fast and flexible image augmentations

albumentations.ai

 

앞에서 살펴본 증강들은 대부분 torchvision을 통해서 설명하였다

하지만 여기에 더 좋은 라이브러리가 하나있다 바로 albumentation이다

 

이부분은 수업에 나오지 않은 이야기지만

직접 학습을 하면서 알게된 노하우중 하나로 

albumentations이 torchvsion보다 편하고 좋았다

 

우선 장점은 아래와 같다

 

1) one of를 활용해서 리스트안에 다시 확률을 적용할 수 있다

실제로 이 방법은 p를 지정하지 않아도 3개로 묶었다면 1/3 확률로 지정된다

그래서 관리하기가 더 쉽다

 

2) torchvision과 똑같은 문법, 그리고 더 많은 기능

albumentations은 일단 torchvision과 같은 문법이기 때문에 웬만한 torchvision의 기능이 전부 존재한다

그리고 추가적으로 cutout 등을 구현하지 않고도 사용할 수 있다는 장점이 있고

특히 ,dataloader에 파라미터로 넘겨줄 때도 적용이 가능하다는 호환성의 장점도 있다

 

3) 속도! 속도! 속도!

딥러닝에서 학습 시간은 생명이다 

실제로 줄일 수 있다면 줄이는 것이 최선의 방법이다

하지만 torchvision의 경우 cv2기반이기 때문에 변형을 해줄 때 시간이 많이 소요된다

물론 albumentations도 cv2기반이겠지만 이러한 문제를 최적화하여서 torchvision과 비교했을때

적은 시간이 소요된다 -> pytorch v2는 비교해 보지는 않았다..

 

이러한 장점때문에 많은 사람들이 특히 속도때문에 albumentations을 사용하고있다

한번쯤 사용해보는 것을 적극 추천한다


2. Efficient Learning

🔥2.1 knowledg distillation

 

이번에 살펴볼 방법은 모델들 효율적으로 학습시키는 방법들이다

이중 처음 살펴볼 내용은 knowledge distillation '지식 증류'기법이다

 

사실 지식 증류기법은 2014년 힌튼 교수님의 논문으로 제시되었다 

이 방법이 집중을 한것은 사실 모델 압축이라는 목표였다

 

간단하게 이론을 살펴보면 다음과 같다

마치 우리가 학교에서 공부를 하듯이 

선생 모델이 학생 모델에게 지식을 증류하는 방법이다 

 

엥? 그게 무슨소리일까?

지식 증류에서는 큰 파라미터를 가진 선생모델이 있고 비교적 작은 파라미터의 학생모델을 사용한다

여기서 둘다 같은 input data를 받고 output을 배출한다 그러면 선생 모델을 통과해서 나온 y'값과 학생모델을 통과해서 나온 y'값이 존재할 것이다 하지만 여기서 선생모델과 학생모델의 loss를 구해주는데 여기서 활용되는 loss는 softlabel이다

 

쉽게 말해서 softmax 함수를 통과 하고 나온 확률들을 비교해서 - KL - divergence를 이용, loss를 구하는 것이다 

즉, 최댓값을 뽑아서 라벨을 비교하는 것이 아니다 

따라서 선생모델과 학생모델의 loss는 실제 y값이 필요하지 않다

그냥 ouput의 차이로 학생 모델이 선생모델을 흉내내게 하는 것에 목적이 있기 때문이다

 

그리고 학생모델은 또다른 loss를 하나 더 구하는데 이는 우리가 일반적인 딥러닝 모델을 학습할 때 구하는 loss로

softmax를 지나서 argmax를 통과해서 나온 라벨과 실제 y의 라벨을 비교해서 loss를 구하는 방법이다

 

이렇게 구해진 2개의 loss를 weight sum하여 backward를 통해서 업데이트를 해주면 물론 여기서 업데이트는 학생모델만 진행된다 - 가장 중요한 포인트는 선생모델은 가중지 업데이트가 되지 않다

 

왜 이러한 방법을 사용할까?

이런방법은 사실 큰 파라미터 모델을 활용해서 효율적으로 모델을 학습시키고 

컴퓨팅 자원의 한계를 극복하기위한 모델압축의 개념으로 제안되었다

 

즉, inference를 통해서 큰 모델은 output만 만드니까 시간이 적게소요되고 실제로 학습에 이용되는 학생모델은 작은 모델이니까 학습 시간도 적다

 

최근에는 이러한 방법들을 더욱 발전시켜서 다양한 목적에서 이용된다

 

뒤에서 살펴보겠다

 


🔥2.2 semi - supervised learning

준지도 학습? 번역하자면 이런 뜻을 갖고 있다

 

쉽게 말해서 label이 없는 데이터와 있는 데이터를 모두 학습에 이용한것이다

실제 데이터 셋을 구성하기 위해서 labeling하는 작업은 많은 시간과 돈을 소모한다

따라서 데이터 셋이 가질 수 있는 데이터의 수는 한계가 있다

이를 해결하기 위해서 사용되는 방법이 semi-supervised learning방법으로

 

AutoEncoder등의 비지도 학습의 방법을 활용해서 unlabeled data에 label을 지정해주고 이를 학습에 이용한다

 

이런방법이 효과적일 수 있는 이유는 데이터의 수의 차이에서 기인한다

 

쉽게 말해서 라벨이 없는 데이터가 더 많기 때문에 조금 라벨링이 잘못되더라도 데이터의 수로 밀어 붙이는 것이다

 


 

🔥2.3 self-training

이러한 방법을 매우 효과적으로 적용한 방법이 self-training이다

이 방법은 앞에 지식증류기법과 semi-supervised learning을 함께 적용하였다

 

2020년 SOTA를 받는 모델이다

 

방법은 다음과 같다

 

우선 큰 모델의 선생모델을 선택하고 이 모델이 unlabel된 데이터를 labeling하게 한다

그리고 이렇게 만들어진 대량의 데이터로 작은 모델인 학생모델을 학습시키고 

이렇게 성능이 올라간 학생모델을 다시 선생모델로 바꾸고 점점 학생 모델의 사이즈를 키워가면서

위의 과정을 반복하는 방법이다

 

이를 Noisy Student Training방법이라고 하는데

실제로 pretraining 모델을 활용하다보면 Noisy student라는 설명이 붙어있는 모델들을 볼 수 있을 것이다

실제로 성능이 매우 좋다

 

시간이 된다면 논문리뷰로 해보도록 하겠다


오늘은 모델을 학습하는 다양한 방법들에 대해서 추가적으로 알아보았다

물론 실전에 사용하기에 매우 좋은 방법들이라

반드시 연습하고 적용해보면서 준비해야할 것 같다

 

들이는 노력에 비해 성능이 많이 개선되는 이런 마법같은 기법들은 언제나 환영이니까...