네이버 부스트캠프 학습 정리/4주차

[CV basic] Data Efficient Learning

AI쟁이J 2023. 3. 31. 20:07

Data augmentation

데이터셋은 대부분 편향되어있다.  

훈련 데이터와 실제 데이터 사이에는 항상 차이가 있기 때문에 data augmentation을 통해 실제 세상에 있는 데이터와의 차이를 매꿔야 한다.

데이터 증강을 하는 방법으로는 데이터를 회전시키거나 좌우반전시키는 Flip/Rotate, 색을 변경하는 방법, 임시로 이미지의 크기를 자르는 Crop, Affine 변환, 각기 다른 이미지를 잘라서 붙이는 Cutmix, 노이즈를 주어 흐리게 만드는 blur 등의 여러 기법이 있다. 

PyTorch의 코드에서는 albumentations, transforms등의 함수를 사용해 data augmentation을 간단히 진행할 수 있다.

albumentations_transform = albumentations.Compose([
    albumentations.Resize(150, 150),  
    albumentations.HorizontalFlip(), 
    albumentations.Blur(p=1.0),
    albumentations.pytorch.transforms.ToTensorV2()
])

위 코드는 albumentations를 사용한 변환으로 image = self.albumnetations_transforms(image=image)['image'] 등의 방식으로 dict 타입으로 변형해서 사용해야 오류가 나지 않는다.

 

transform = transforms.Compose([
    transforms.RandomHorizontalFlip(p = 0.5),
    transforms.GaussianBlur(kernel_size = (7,13), sigma = (0.1, 0.2)),
    transforms.Resize(150),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], 
                          std=[0.229, 0.224, 0.225])
])
위 코드는 transforms 함수를 사용한 변환으로 Compose를 사용해 여러 변환을 한번에 묶어서 처리할 수 있다.
 

Leveraging pre-trained information

Fine-tuning model

데이터 셋으로 pre-traine된 모델을 사용해 FC layer를 새로운 layer로 바꾼 후, pre-train된 Conv layer와 초기화 상태의 FC layer가 합쳐진 모델을 사용해 전체 모델을 다시 학습시킨다. torch.Tensor.require_grads를 사용해서 구현 가능.

 

torch.no_grad() : PyTorch의 Autograd Engine을 비활성화해 Gradient 계산을 하지 않도록 하므로 gradient를 계산할 필요가 없는 경우 메모리 사용량을 줄일 수 있음. 

ex) validation의 forward 과정에서 gradient 계산을 사용하지 않으므로 torch.no_grad() = True 지정

 

torch.Tensor.require_grads : True인 경우 PyTorch의 Autograd에 gradient 계산이 필요하다고 알려줌. 핵심은 False인 경우로, False인 경우 모델의 특정 부분을 freeze하고 나머지 부분이 학습할 수 있도록 함.

 

이 기능을 활용해 기존에 pre-trained 된 Neural Network를 불러와 모든 파라미터(pre-trained 된 파라미터)를 freeze 한 후, classification 부분만 새로 학습해 fine-tuning을 할 수 있음.

from torchvision.models import resnet34

model_finetune = resnet34(pretrained = True)

for param in model_finetune.parameters():
	param.requires_grad = False

model_finetune.fc = nn.Linear(512, 10, bias = True)

model_finetune.cuda()

위 코드를 통해 pre-trained된 resnet34 모델에서 fc layer만을 학습시켰다.

 

Teacher-student network

knowledge distillation : 미리 잘 학습된 큰 네트워크를 Teacher network로, 이 모델의 지식을 사용해 작은 네트워크(Student network)에게 전달하는 것.

Teacher model에서 soft labels을 사용해 학습한 결과를 student model에게 전달하고, 이 Student model이 soft predictions 한 결과를 Teacher model에서 학습했던 결과와 합쳐 Teacher model의 Loss function을 만든다. 여기서 distillation loss는 Teacher model과 Student model의 분류결과의 차이이며, 비교를 위해 Hard label이 아닌 Soft label을 사용한다.

 

좌 : Hard label 우 : Soft label

그리고 Student model을 사용해 hard prediction(Hard label에 대한 예측)을 수행해 student loss를 만든다.

위 모델에서 Softmax(T = t) 가 의미하는 것은 Softmax with temperature(T) 를 의미하는데, 큰 값인 T를 softmax를 구할 때 나누어줌으로서 작은 값과 큰 값이 들어올 때의 차이를 줄여준다. Teacher model과 Student model간의 크기 차이 때문에 softmax 과정에서 두 모델의 차이가 커질 수 있기 때문에 이에 대한 정규화와 비슷한 과정이다.

이 모델에서의 Distillation Loss 는 KLdiv를 사용해 구하며 Student model이 Teacher model을 얼마나 잘 모방하는지에 대해 집중하기 때문에 라벨 하나하나에 집중하지 않기 때문에 Soft label을 통해 구한다. 

반면 Student Loss는 Student model을 활용한 '정답'을 맞추는 것에 집중하기 때문에 Hard label을 통해 얼마나 정확하게 맞추는지 판단한다.

Leveraging unlabeled dataset for training

Semi-supervised learning

세상에는 라벨링되지 않은 데이터가 훨씬 많기 때문에 라벨링에 필요한 자원과 시간을 줄이기 위한 방법.

라벨된 이미지로 학습을 한 모델을 사용해 라벨링 되지 않은 데이터에 대한 pseudo-labelling을 진행하고, 이 Pseudo-label 데이터를 활용해 모델을 학습하는 기법을 말한다.

 

Semi-supervised learning with noisy student

라벨링되지 않은 데이터에 대해 Teacher-student 방법론을 사용하는 기법. 

1. labeled data를 통해 Teacher model을 학습한다.

2. Teacher model을 사용해 unlabeled data를 예측해 Psuedo-labelling을 진행한다.

3. student model을 Psuedo-label with noise (e.g RandAugment)를 사용해 학습한다.

4. Psuedo-label을 통해 학습한 student model을 다시 Teacher model로 지정해 1-4의 과정을 2~3회 반복한다. 이 과정에서 Student model이 될 새로운 모델은 전에 있던 student model보다 더 크게 지정한다. 

비교적 최근(2020년)에 나온 논문.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Reference

https://light-tree.tistory.com/196

 

딥러닝 용어 정리, Knowledge distillation 설명과 이해

이 글은 제가 공부한 내용을 정리하는 글입니다. 따라서 잘못된 내용이 있을 수도 있습니다. 잘못된 내용을 발견하신다면 리플로 알려주시길 부탁드립니다. 감사합니다. Knowledge distillation 이란?

light-tree.tistory.com

https://velog.io/@injokim/%EC%99%95%EC%B4%88%EA%B8%89-Semi-supervised-learning-%EC%9E%85%EB%AC%B8

 

Semi-supervised learning 입문

이미지 분류 task에서 딥러닝은 눈부신 발전을 이룩하였습니다. 그러나 이를 위해서는 막대한 양의 데이터가 필요합니다. 이 데이터에는 다량의 라벨도 포함이 되어있습니다. 그러나 라벨링 작

velog.io

 

'네이버 부스트캠프 학습 정리 > 4주차' 카테고리의 다른 글

4주차 회고  (0) 2023.04.02
[CV basic] Object Detection  (0) 2023.04.02
[CV basic] Semantic Segmentation  (0) 2023.04.01
[CV basic] GoogLeNet/ResNet  (0) 2023.03.31
[CV basic] AlexNet/VGGNet  (0) 2023.03.30