본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
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]

두 학습 예시 (xi,yi), (xj,yj)를 선형으로 섞는다. y는 원-핫 벡터다. x~=λxi+(1−λ)xj,y~=λyi+(1−λ)yj,λ∼Beta⁡(α,α) 모델이 학습 예시 사이에서 선형에 가깝게 행동하도록 유도한다. 2017년 MIT와 페이스북 연구진은 ImageNet, CIFAR, 음성 명령 데이터 등에서 일반화 성능이 오르고, 잘못된 레이블을 외우는 경향이 줄고, 적대적 예제에 강해지며, GAN 학습도 안정된다고 보고했다.[4] α가 작으면 λ가 0이나 1 근처에 몰려 약하게 섞인다.

네이버 클로바 AI 연구진이 2019년 제안했다. 한 이미지의 직사각형 영역을 다른 이미지의 같은 위치 조각으로 바꿔 붙이고, 레이블은 붙인 넓이 비율대로 섞는다.[5] x~=M⊙xi+(𝟏−M)⊙xj,y~=λyi+(1−λ)yj M∈{0,1}W×H은 붙일 영역이 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 별도 탐색 없음. 두 정수 N(변환 개수), M(세기)만 격자 탐색 변환 14가지 중 N개를 균등하게 골라 모두 세기 M으로 적용 탐색 공간을 약 1032에서 102으로 줄이고, ImageNet(EfficientNet-B7) 85.0%[7]
TrivialAugment 탐색도, 하이퍼파라미터도 없음 이미지마다 변환 하나를 고르고 세기도 무작위로 뽑음 탐색 비용 0으로 이전 자동 증강과 같거나 나은 정확도[8]

RandAugment 논문의 중요한 관찰은 가장 좋은 증강 세기가 모델 크기와 학습 데이터 크기에 따라 달라진다는 점이다. 작은 대리 모델에서 찾은 정책을 큰 모델에 그대로 옮기는 AutoAugment식 접근이 최적이 아닐 수 있다는 근거가 되었다.[7]

PyTorch(torchvision) 예시

편집 원본 편집
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): 시간 축의 한 점을 좌우로 조금 밀어 스펙트로그램을 늘이거나 줄인다.
  • 주파수 마스킹: 연속한 주파수 채널 f개(f∼U[0,F])를 가린다.
  • 시간 마스킹: 연속한 시간 단계 t개(t∼U[0,T])를 가린다.

LibriSpeech용 LD 정책은 F=27, 주파수 마스크 2개, T=100, 시간 마스크 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]

자기 지도 학습에서의 증강

편집 원본 편집

대조 학습은 같은 이미지에 서로 다른 증강을 가한 두 장은 가깝게, 다른 이미지는 멀게 표현하도록 학습한다. 무엇을 같은 것으로 볼지를 증강이 정하므로 증강 설계가 곧 과제 설계다. SimCLR 논문은 증강 조합(무작위 자르기와 색 왜곡의 조합 등)이 효과적인 예측 과제를 정하는 데 결정적인 역할을 한다고 보고했다.[16] 자세한 내용은 자기 지도 학습 문서 참고.

쓸 때 주의할 점

편집 원본 편집
  • 레이블이 바뀌는 변환은 쓰지 않는다. 숫자 6과 9가 있는 데이터의 180도 회전, 글자가 든 이미지의 좌우 반전, 좌우 구분이 중요한 의료 영상의 반전, 부정어를 지우는 텍스트 삭제가 그 예다.
  • 검증·시험 세트에는 학습용 무작위 증강을 쓰지 않는다. 증강한 복사본이 학습과 검증에 나뉘어 들어가면 정보가 새어 성능이 부풀려진다. 증강 전에 데이터를 나눈다.
  • 세기는 모델과 데이터 크기에 맞춘다. 큰 모델은 더 센 증강에서 이득을 보는 경향이 있고, 작은 모델에 센 증강을 쓰면 오히려 과소적합한다.[7]
  • 섞기 증강과 다른 기법의 상호작용. Mixup·CutMix는 소프트 레이블을 만들므로 지식 증류나 레이블 스무딩과 함께 쓸 때 목표 분포가 겹친다. 학습 정확도는 섞인 레이블 때문에 낮게 나오는 것이 정상이다.
  • 데이터 적재가 병목이 될 수 있다. CPU에서 하는 무거운 증강은 GPU를 놀게 만든다. 작업자 수(num_workers)를 늘리거나 GPU 증강 라이브러리를 쓴다.
  • 실제 분포에서 너무 벗어나지 않게. 증강은 실제로 일어날 법한 변형을 흉내 낼 때 효과가 크다. 현실에 없는 변형만 잔뜩 넣으면 학습 분포가 시험 분포와 멀어진다.
  1. ↑ Alex Krizhevsky, Ilya Sutskever, Geoffrey E. Hinton, 〈ImageNet Classification with Deep Convolutional Neural Networks〉, NeurIPS 2012. proceedings.neurips.cc
  2. ↑ Terrance DeVries, Graham W. Taylor, 〈Improved Regularization of Convolutional Neural Networks with Cutout〉, 2017. arXiv:1708.04552
  3. ↑ Zhun Zhong 외, 〈Random Erasing Data Augmentation〉, 2017. arXiv:1708.04896
  4. ↑ Hongyi Zhang, Moustapha Cisse, Yann N. Dauphin, David Lopez-Paz, 〈mixup: Beyond Empirical Risk Minimization〉, ICLR 2018. arXiv:1710.09412
  5. ↑ 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
  6. ↑ Ekin D. Cubuk 외, 〈AutoAugment: Learning Augmentation Strategies from Data〉, CVPR 2019. arXiv:1805.09501
  7. ↑ 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
  8. ↑ Samuel G. Müller, Frank Hutter, 〈TrivialAugment: Tuning-free Yet State-of-the-Art Data Augmentation〉, ICCV 2021. arXiv:2103.10158
  9. ↑ PyTorch, 〈torchvision.transforms.v2.RandAugment〉 문서. docs.pytorch.org
  10. ↑ PyTorch, 〈How to use CutMix and MixUp〉 예제. docs.pytorch.org
  11. ↑ Jason Wei, Kai Zou, 〈EDA: Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasks〉, EMNLP-IJCNLP 2019. arXiv:1901.11196
  12. ↑ Rico Sennrich, Barry Haddow, Alexandra Birch, 〈Improving Neural Machine Translation Models with Monolingual Data〉, ACL 2016. arXiv:1511.06709
  13. ↑ Yizhong Wang 외, 〈Self-Instruct: Aligning Language Models with Self-Generated Instructions〉, ACL 2023. arXiv:2212.10560
  14. ↑ 14.0 14.1 Daniel S. Park 외, 〈SpecAugment: A Simple Data Augmentation Method for Automatic Speech Recognition〉, Interspeech 2019. arXiv:1904.08779
  15. ↑ 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
  16. ↑ Ting Chen, Simon Kornblith, Mohammad Norouzi, Geoffrey Hinton, 〈A Simple Framework for Contrastive Learning of Visual Representations〉, ICML 2020. arXiv:2002.05709