본 글은 네이버 부스트 캠프 AI Tech 기간동안
개인적으로 배운 내용들을 주단위로 정리한 글입니다
본 글의 내용은 새롭게 알게 된 내용을 중심으로 정리하였고
복습 중요도를 선정해서 정리하였습니다
✅ Week 4
목차
- Data Augmentation
- data augmentation?
- type of augmentation
- torch vision & albumentations
- Efficient Learning
- knowledg distillation
- semi-supervised learning
- 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
대표적인 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가 더 좋다
그리고 들이는 노력대비 성능이 많이 향상되기 때문에 반드시 시도해볼 만한 방법중 하나이다
- 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
앞에서 살펴본 증강들은 대부분 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라는 설명이 붙어있는 모델들을 볼 수 있을 것이다
실제로 성능이 매우 좋다
시간이 된다면 논문리뷰로 해보도록 하겠다
오늘은 모델을 학습하는 다양한 방법들에 대해서 추가적으로 알아보았다
물론 실전에 사용하기에 매우 좋은 방법들이라
반드시 연습하고 적용해보면서 준비해야할 것 같다
들이는 노력에 비해 성능이 많이 개선되는 이런 마법같은 기법들은 언제나 환영이니까...
'네이버 부스트캠프 🔗 > ⭐주간 학습 정리' 카테고리의 다른 글
[네이버 부스트 캠프 AI Tech] Semantic segmentation의 흐름 (0) | 2023.03.30 |
---|---|
[네이버 부스트 캠프 AI Tech] Wandb 사용설명서 (0) | 2023.03.29 |
[부스트 캠프]Week 3 회고 및 Week 4 목표 정리 (0) | 2023.03.27 |
[네이버 부스트 캠프 AI Tech] VAE 직접 구현하기 by Pytorch (0) | 2023.03.24 |
[네이버 부스트 캠프 AI Tech] Multi-GPU에 간단한 고찰 (0) | 2023.03.24 |