데이터 증강
더 많은 작업
- Data augmentation; 데이터 증강
- 가진 학습 데이터에 뒤집기·자르기·잡음 추가·번역 같은 변형을 가해 새 학습 예시를 만들어, 모델이 더 일반적인 규칙을 배우게 하는 기법
데이터 증강(data augmentation)은 학습 데이터를 직접 더 모으지 않고, 이미 있는 예시를 의미(정답 레이블)가 유지되는 범위에서 변형해 학습 데이터의 양과 다양성을 늘리는 기법이다. 고양이 사진을 좌우로 뒤집어도 고양이이고, 음성을 조금 빠르게 재생해도 같은 문장이다. 모델은 이런 변형에 대해 답이 바뀌지 않아야 한다는 것(불변성)을 배우게 되고, 훈련 데이터의 우연한 특징에 덜 매달리게 되어 과적합이 줄어든다. 드롭아웃, 가중치 감쇠와 함께 대표적인 정규화 수단이며, 자기 지도 학습의 대조 학습에서는 학습 신호 자체를 만드는 장치이기도 하다.
증강은 보통 학습할 때 미니배치를 만들 때마다 무작위로 적용한다(온라인 증강). 같은 이미지라도 에폭마다 다른 모습으로 보이므로 저장 공간이 늘지 않는다. 검증·시험 데이터에는 적용하지 않는 것이 원칙이고, 예외로 추론 때 여러 변형의 예측을 평균하는 테스트 시점 증강(test-time augmentation, TTA)이 있다.
2012년 ImageNet 대회에서 우승한 알렉스넷은 256×256 이미지에서 224×224 조각을 무작위로 잘라 내고 좌우 반전을 더해 학습 데이터를 2048배로 늘렸다(물론 서로 매우 비슷한 예시들이다). 시험할 때는 네 모서리와 가운데 조각 5개와 그 반전 5개, 모두 10개 예측을 평균했다. 또 학습 이미지 전체 RGB 값에 주성분 분석(PCA)을 해서 주성분 방향으로 색을 무작위로 흔드는 증강을 넣어 top-1 오류율을 1% 넘게 줄였다.[1] 이 조합(무작위 자르기 + 좌우 반전 + 색 변형)은 지금도 이미지 분류 학습의 기본 골격이다.
| 분류 | 기법 | 내용 | 레이블 |
|---|---|---|---|
| 기하 변환 | 뒤집기, 무작위 자르기·크기 조정, 회전, 이동, 전단(shear), 원근 변환 | 물체 위치·방향·크기에 대한 불변성 | 그대로(검출·분할은 상자·마스크도 같이 변환) |
| 색·화질 변환 | 밝기·대비·채도·색조 흔들기, 회색조, 흐림, 잡음, JPEG 압축 | 조명·카메라 차이에 대한 불변성 | 그대로 |
| 지우기 | Cutout(2017), Random Erasing(2017) | 직사각형 영역을 0이나 무작위 값으로 지움. 가려진 물체에 강해짐 | 그대로 |
| 섞기 | Mixup(2017), CutMix(2019) | 두 이미지를 섞고 레이블도 같은 비율로 섞음 | 섞임(소프트 레이블) |
| 자동 정책 | AutoAugment(2018), RandAugment(2019), TrivialAugment(2021) | 어떤 변환을 얼마나 셀지 자동으로 정하거나 무작위로 고름 | 그대로 |
Cutout은 입력에서 정사각형 영역을 가려 CIFAR-10·CIFAR-100·SVHN에서 당시 최고 시험 오류율(2.56%, 15.20%, 1.30%)을 냈다.[2] 같은 해의 Random Erasing은 가릴 직사각형을 무작위 값으로 채우며 분류, 객체 검출, 사람 재식별에서 효과를 보였다.[3]
네이버 클로바 AI 연구진이 2019년 제안했다. 한 이미지의 직사각형 영역을 다른 이미지의 같은 위치 조각으로 바꿔 붙이고, 레이블은 붙인 넓이 비율대로 섞는다.[5] 은 붙일 영역이 0인 이진 마스크이고, 는 남은 원래 영역의 넓이 비율이다. Cutout처럼 영역을 지우면 그 픽셀 정보가 버려지지만 CutMix는 다른 이미지로 채우므로 정보 손실이 없다. ImageNet ResNet-50에서 top-1 오류율을 23.68%에서 21.40%로 낮췄고, 이렇게 학습한 모델을 사전 학습 모델로 쓰면 객체 검출과 이미지 캡션에서도 성능이 올랐다.[5]
| 기법 | 탐색 방법 | 정책 모양 | 보고된 결과 |
|---|---|---|---|
| AutoAugment | 순환 신경망 제어기를 강화 학습으로 학습해 작은 대리 과제에서 정책 탐색 | 하위 정책 여러 개(각각 변환 2개와 확률·세기). 이미지마다 하위 정책 하나를 무작위 선택 | ImageNet top-1 83.5%, CIFAR-10 오류율 1.5%[6] |
| RandAugment | 별도 탐색 없음. 두 정수 (변환 개수), (세기)만 격자 탐색 | 변환 14가지 중 개를 균등하게 골라 모두 세기 으로 적용 | 탐색 공간을 약 에서 으로 줄이고, ImageNet(EfficientNet-B7) 85.0%[7] |
| TrivialAugment | 탐색도, 하이퍼파라미터도 없음 | 이미지마다 변환 하나를 고르고 세기도 무작위로 뽑음 | 탐색 비용 0으로 이전 자동 증강과 같거나 나은 정확도[8] |
RandAugment 논문의 중요한 관찰은 가장 좋은 증강 세기가 모델 크기와 학습 데이터 크기에 따라 달라진다는 점이다. 작은 대리 모델에서 찾은 정책을 큰 모델에 그대로 옮기는 AutoAugment식 접근이 최적이 아닐 수 있다는 근거가 되었다.[7]
import torch
from torch.utils.data import DataLoader, default_collate
from torchvision.transforms import v2
NUM_CLASSES = 1000
train_tf = v2.Compose([
v2.RandomResizedCrop(224, antialias=True),
v2.RandomHorizontalFlip(),
v2.RandAugment(num_ops=2, magnitude=9), # N=2, M=9
v2.ToImage(),
v2.ToDtype(torch.float32, scale=True),
v2.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
v2.RandomErasing(p=0.25),
])
val_tf = v2.Compose([
v2.Resize(256), v2.CenterCrop(224), # 검증에는 무작위 증강 없음
v2.ToImage(), v2.ToDtype(torch.float32, scale=True),
v2.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
# CutMix·MixUp은 배치 단위라서 collate 함수에서 적용한다
cutmix_or_mixup = v2.RandomChoice([v2.CutMix(num_classes=NUM_CLASSES),
v2.MixUp(num_classes=NUM_CLASSES)])
def collate_fn(batch):
return cutmix_or_mixup(*default_collate(batch))
loader = DataLoader(train_set, batch_size=256, shuffle=True,
num_workers=8, collate_fn=collate_fn)
# 레이블이 (배치, 클래스 수) 소프트 레이블이 되므로 cross_entropy에 그대로 넣는다
torchvision.transforms.v2의 RandAugment 기본값은 num_ops=2, magnitude=9이고, CutMix·MixUp은 정수 레이블을 원-핫으로 바꾼 뒤 섞는다.[9][10] Mixup을 직접 구현하면 다음과 같다. 손실을 두 레이블에 대해 따로 구해 같은 비율로 섞는 것이 섞인 원-핫 레이블의 교차 엔트로피와 같다.
def mixup(x, y, alpha=0.2):
lam = torch.distributions.Beta(alpha, alpha).sample().item()
idx = torch.randperm(x.size(0), device=x.device)
return lam * x + (1 - lam) * x[idx], y, y[idx], lam
x_mix, y_a, y_b, lam = mixup(x, y)
logits = model(x_mix)
loss = lam * criterion(logits, y_a) + (1 - lam) * criterion(logits, y_b)
글자 하나만 바뀌어도 뜻이 달라질 수 있어 이미지보다 레이블을 지키기 어렵다.
| 기법 | 내용 | 주 용도 |
|---|---|---|
| EDA | 동의어 치환, 무작위 삽입, 무작위 위치 교환, 무작위 삭제 네 가지 연산 | 소규모 텍스트 분류 |
| 역번역(back-translation) | 문장을 다른 언어로 번역했다가 다시 번역해 바꿔 쓰기를 얻음. 기계 번역에서는 목표 언어 단일어 문장을 역방향 모델로 번역해 가짜 병렬 데이터를 만듦 | 기계 번역, 분류 |
| 토큰 마스킹·치환 | 일부 토큰을 [MASK]나 다른 토큰으로 바꿈. 마스크 언어 모델로 문맥에 맞는 대체어 생성 | 분류, 사전 학습 |
| 언어 모델 생성 데이터 | 대형 언어 모델로 바꿔 쓰기나 새 예시·지시문을 생성 | 미세 조정용 데이터 확장 |
EDA 논문은 다섯 개 텍스트 분류 과제에서 평균적으로, EDA를 쓰면 학습 데이터의 50%만으로 전체 데이터를 쓴 일반 학습과 같은 정확도를 냈다고 보고했다. 데이터가 적을수록 효과가 컸다.[11] 센리치(Sennrich) 등의 역번역은 WMT 15 영어·독일어 양방향에서 BLEU를 2.8~3.7 올렸다.[12] 언어 모델이 스스로 만든 지시문으로 지시 데이터를 늘리는 Self-Instruct 같은 방법도 넓게 보면 증강의 한 갈래다.[13]
음성 인식에서는 원 파형에 속도 변화(speed perturbation), 잡음 섞기, 잔향(실내 반향) 합성을 쓰고, 특징값(스펙트로그램)에는 SpecAugment를 쓴다.[14]
SpecAugment는 구글 브레인이 2019년 발표한 방법으로, 로그 멜 스펙트로그램을 이미지처럼 다룬다.
- 시간 왜곡(time warping): 시간 축의 한 점을 좌우로 조금 밀어 스펙트로그램을 늘이거나 줄인다.
- 주파수 마스킹: 연속한 주파수 채널 개()를 가린다.
- 시간 마스킹: 연속한 시간 단계 개()를 가린다.
LibriSpeech용 LD 정책은 , 주파수 마스크 2개, , 시간 마스크 2개다. 이 방법으로 언어 모델 없이 LibriSpeech test-other 단어 오류율 6.8%를 기록했다.[14]
import torch
import torchaudio.transforms as T
spec_augment = torch.nn.Sequential( # LibriSpeech LD 정책에서 시간 왜곡을 뺀 형태
T.FrequencyMasking(freq_mask_param=27),
T.FrequencyMasking(freq_mask_param=27),
T.TimeMasking(time_mask_param=100),
T.TimeMasking(time_mask_param=100),
)
mel = mel_transform(waveform) # (채널, 멜 빈, 프레임)
mel_aug = spec_augment(mel) # 학습 때만 적용
이미지·음성처럼 자연스러운 변환이 없는 표 형식 데이터에서는 잡음 추가 정도가 쓰이고, 클래스 불균형을 다룰 때는 소수 클래스 예시를 합성하는 오버샘플링을 쓴다. SMOTE(2002)는 소수 클래스 예시와 그 최근접 이웃 사이의 선분 위에서 새 예시를 뽑는다. 저자들은 소수 클래스 오버샘플링과 다수 클래스 언더샘플링을 함께 쓰면 언더샘플링만 쓸 때보다 ROC 공간에서 더 좋은 분류 성능을 낸다고 보고했다.[15]
- 레이블이 바뀌는 변환은 쓰지 않는다. 숫자 6과 9가 있는 데이터의 180도 회전, 글자가 든 이미지의 좌우 반전, 좌우 구분이 중요한 의료 영상의 반전, 부정어를 지우는 텍스트 삭제가 그 예다.
- 검증·시험 세트에는 학습용 무작위 증강을 쓰지 않는다. 증강한 복사본이 학습과 검증에 나뉘어 들어가면 정보가 새어 성능이 부풀려진다. 증강 전에 데이터를 나눈다.
- 세기는 모델과 데이터 크기에 맞춘다. 큰 모델은 더 센 증강에서 이득을 보는 경향이 있고, 작은 모델에 센 증강을 쓰면 오히려 과소적합한다.[7]
- 섞기 증강과 다른 기법의 상호작용. Mixup·CutMix는 소프트 레이블을 만들므로 지식 증류나 레이블 스무딩과 함께 쓸 때 목표 분포가 겹친다. 학습 정확도는 섞인 레이블 때문에 낮게 나오는 것이 정상이다.
- 데이터 적재가 병목이 될 수 있다. CPU에서 하는 무거운 증강은 GPU를 놀게 만든다. 작업자 수(
num_workers)를 늘리거나 GPU 증강 라이브러리를 쓴다. - 실제 분포에서 너무 벗어나지 않게. 증강은 실제로 일어날 법한 변형을 흉내 낼 때 효과가 크다. 현실에 없는 변형만 잔뜩 넣으면 학습 분포가 시험 분포와 멀어진다.
- ↑ Alex Krizhevsky, Ilya Sutskever, Geoffrey E. Hinton, 〈ImageNet Classification with Deep Convolutional Neural Networks〉, NeurIPS 2012. proceedings.neurips.cc
- ↑ Terrance DeVries, Graham W. Taylor, 〈Improved Regularization of Convolutional Neural Networks with Cutout〉, 2017. arXiv:1708.04552
- ↑ Zhun Zhong 외, 〈Random Erasing Data Augmentation〉, 2017. arXiv:1708.04896
- ↑ Hongyi Zhang, Moustapha Cisse, Yann N. Dauphin, David Lopez-Paz, 〈mixup: Beyond Empirical Risk Minimization〉, ICLR 2018. arXiv:1710.09412
- ↑ 5.0 5.1 Sangdoo Yun, Dongyoon Han, Seong Joon Oh, Sanghyuk Chun, Junsuk Choe, Youngjoon Yoo, 〈CutMix: Regularization Strategy to Train Strong Classifiers with Localizable Features〉, ICCV 2019. arXiv:1905.04899
- ↑ Ekin D. Cubuk 외, 〈AutoAugment: Learning Augmentation Strategies from Data〉, CVPR 2019. arXiv:1805.09501
- ↑ 7.0 7.1 7.2 Ekin D. Cubuk, Barret Zoph, Jonathon Shlens, Quoc V. Le, 〈RandAugment: Practical automated data augmentation with a reduced search space〉, 2019. arXiv:1909.13719
- ↑ Samuel G. Müller, Frank Hutter, 〈TrivialAugment: Tuning-free Yet State-of-the-Art Data Augmentation〉, ICCV 2021. arXiv:2103.10158
- ↑ PyTorch, 〈torchvision.transforms.v2.RandAugment〉 문서. docs.pytorch.org
- ↑ PyTorch, 〈How to use CutMix and MixUp〉 예제. docs.pytorch.org
- ↑ Jason Wei, Kai Zou, 〈EDA: Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasks〉, EMNLP-IJCNLP 2019. arXiv:1901.11196
- ↑ Rico Sennrich, Barry Haddow, Alexandra Birch, 〈Improving Neural Machine Translation Models with Monolingual Data〉, ACL 2016. arXiv:1511.06709
- ↑ Yizhong Wang 외, 〈Self-Instruct: Aligning Language Models with Self-Generated Instructions〉, ACL 2023. arXiv:2212.10560
- ↑ 14.0 14.1 Daniel S. Park 외, 〈SpecAugment: A Simple Data Augmentation Method for Automatic Speech Recognition〉, Interspeech 2019. arXiv:1904.08779
- ↑ Nitesh V. Chawla, Kevin W. Bowyer, Lawrence O. Hall, W. Philip Kegelmeyer, 〈SMOTE: Synthetic Minority Over-sampling Technique〉, Journal of Artificial Intelligence Research 16, 2002. arXiv:1106.1813
- ↑ Ting Chen, Simon Kornblith, Mohammad Norouzi, Geoffrey Hinton, 〈A Simple Framework for Contrastive Learning of Visual Representations〉, ICML 2020. arXiv:2002.05709
- Connor Shorten, Taghi M. Khoshgoftaar, 〈A survey on Image Data Augmentation for Deep Learning〉, Journal of Big Data 6, 2019. doi:10.1186/s40537-019-0197-0
- torchvision 문서: Transforming and augmenting images