적대적 훈련
더 많은 작업
- Adversarial training; 적대적 훈련
- 학습 중에 적대적 예제를 만들어 그 입력에서도 정답을 내도록 모델을 학습시키는 방어 기법
적대적 훈련(adversarial training)은 학습 데이터에 적대적 예제를 섞거나 적대적 예제만으로 학습해 신경망을 회피 공격에 강하게 만드는 방법이다. 데이터 증강의 일종으로 볼 수 있지만, 고정된 변형 대신 지금의 모델을 가장 잘 속이는 입력을 매 단계 새로 만든다는 점이 다르다. NIST AI 100-2 E2025는 회피 공격을 완화하는 가장 유망한 방향 중 하나로 적대적 훈련을 들면서, 정확도가 떨어지는 한계도 함께 적는다.[1]
국내에서는 "적대적 학습"이라고도 쓰지만, 이 말은 생성적 적대 신경망의 학습 방식을 가리키는 경우도 많아 방어 기법은 적대적 훈련으로 구분해 부르는 편이 혼동이 적다.
세게디 등이 2013년에 적대적 예제를 섞어 학습하면 약간의 정규화 효과가 있다고 보고했지만, 당시 공격(L-BFGS)은 너무 느려 대규모로 쓰기 어려웠다. 굿펠로(Goodfellow) 등은 빠른 FGSM으로 매 단계 적대적 예제를 만들고, 깨끗한 손실과 적대적 손실을 섞은 목적 함수를 썼다.[2]
논문은 모든 실험에서 를 썼다. MNIST 맥스아웃 신경망의 FGSM 적대적 예제 오류율이 89.4%에서 17.9%로 떨어졌고, 깨끗한 테스트 오류율도 0.94%에서 0.84%로 좋아져 정규화 효과를 보였다. 다만 적대적 훈련된 모델도 틀릴 때는 평균 81.4% 확신으로 틀렸다.[2] 한 걸음 공격으로 만든 예제로만 학습하면 기울기를 가리는 쪽으로 학습되어 반복 공격에는 약하다는 점이 뒤에 드러났다.
매드리(Madry) 등은 적대적 훈련을 강건 최적화(robust optimization)의 안장점(saddle point) 문제로 정리했다.[3]
는 허용 교란 집합으로, 보통 공 이다. 안쪽 최대화는 주어진 모델을 공격하는 문제이고, 바깥쪽 최소화는 그 최악의 손실을 줄이도록 매개변수를 고치는 학습 문제다. 안쪽 문제는 PGD로 근사하고, 단식킨(Danskin) 정리에 따라 안쪽 최대점에서 구한 기울기로 바깥쪽을 갱신한다.
- 이 정식화는 공격(안쪽 문제를 푸는 알고리즘)과 방어(바깥쪽 문제)를 하나의 틀로 설명한다.
- PGD를 1차 정보만 쓰는 공격자 중 가장 강한 "보편적 1차 공격자"로 보고, PGD로 훈련하면 1차 공격 전반에 강건해진다는 관점을 제시했다.
- 강건한 결정 경계는 깨끗한 데이터만 가르는 경계보다 복잡하므로 모델 용량이 커야 한다는 것을 실험으로 보였다.
| 데이터 | 설정 | 깨끗한 정확도 | 적대적 정확도 |
|---|---|---|---|
| MNIST | , PGD 40걸음(걸음 0.01)으로 훈련 | 98.8% | 89.3%(가장 강한 화이트박스 공격 기준) |
| CIFAR-10 | , PGD 7걸음(걸음 2/255)으로 훈련, 10배 넓힌 ResNet | 87.3% | 45.8%(PGD 20걸음) |
| CIFAR-10 (비교) | 같은 신경망을 일반 학습 | 95.2% | 해당 없음 |
표의 수치는 원 논문 표 1, 표 2와 본문에서 가져왔다.[3] CIFAR-10에서 깨끗한 정확도가 95.2%에서 87.3%로 8%포인트 가까이 떨어진 대신, PGD 공격에서 절반 가까이를 지켰다.
장(Zhang) 등은 적대적 오류를 자연 오류와 경계 오류(boundary error)의 합으로 분해하고, 미분 가능한 상한을 유도해 TRADES라는 손실을 제안했다.[4]
첫째 항은 깨끗한 입력의 교차 엔트로피로 정확도를 지키고, 둘째 항은 깨끗한 입력과 교란된 입력의 출력 분포 차이(쿨백-라이블러 발산)를 벌점으로 주어 결정 경계를 데이터에서 멀리 민다. 논문은 로 쓰며, 값이 클수록 강건성 쪽에 무게를 둔다. 매드리식 훈련과 달리 안쪽 최대화가 레이블을 쓰지 않으므로 레이블 없는 데이터를 둘째 항에 활용할 수 있다.
CIFAR-10(WRN-34-10, )에서 같은 20걸음 화이트박스 공격으로 평가했을 때 매드리식 모델이 47.04%, TRADES()가 56.61%의 강건 정확도를 보였다. 이 방법으로 NeurIPS 2018 적대적 비전 대회에서 약 2,000개 제출물 중 1위를 했다.[4]
안쪽 최대화에 PGD를 걸음 쓰면 미니배치마다 순전파·역전파를 번 하므로 학습 비용이 대략 배가 된다. TRADES 논문은 적대적 훈련이 일반 학습보다 보통 10배 넘게 느리다고 적었다.[4]
| 방법 | 핵심 아이디어 | 비고 |
|---|---|---|
| Free AT(샤파히 등, 2019) | 같은 미니배치를 여러 번 반복하면서 한 번의 역전파로 매개변수 기울기와 입력 기울기를 함께 재사용 | 일반 학습과 비슷한 비용[5] |
| Fast AT(웡 등, 2020) | 무작위 시작점을 더한 FGSM 한 걸음으로 훈련 | CIFAR-10에서 6분 만에 PGD() 강건 정확도 45%, ImageNet은 12시간에 43%(). Free AT는 같은 수준에 각각 10시간, 50시간이 걸렸다[6] |
웡(Wong) 등은 FGSM 훈련이 어느 순간 PGD 강건성이 갑자기 0 가까이 무너지는 현상을 발견하고 "파국적 과적합(catastrophic overfitting)"이라 불렀다. 이전에 FGSM 훈련이 실패한 원인으로 지목되며, 무작위 시작점과 조기 종료로 피할 수 있다.[6]
- 정확도 하락: 위 표처럼 깨끗한 정확도가 떨어진다. 치프라스(Tsipras) 등은 단순한 분포에서도 강건성과 표준 정확도가 상충할 수 있음을 증명했다. 대신 강건한 모델의 특징은 사람의 지각과 더 잘 맞는 경향이 있다고 보고했다.[7]
- 위협 모델에 묶임: 훈련에 쓴 노름과 에 대해서만 강건하다. 매드리 등의 MNIST 모델은 훈련 을 조금만 넘어도 강건성이 급격히 떨어졌다.[3]
- 보장 없음: 경험적 방어이므로 더 강한 공격이 나오면 수치가 내려갈 수 있다. 증명이 필요하면 적대적 예제 문서의 인증된 강건성(랜덤 스무딩 등)을 함께 쓴다.
- 대형 모델: 사전 학습된 대형 언어 모델에 그대로 적용하기는 비용이 크다. LLM에서는 탈옥 프롬프트에 대한 안전성 학습이 비슷한 역할을 한다.
파이토치 2.x 기준 PGD 적대적 훈련 한 에폭과 TRADES 손실이다. pgd 함수는 적대적 예제 문서의 구현과 같다.
import torch
import torch.nn.functional as F
def train_epoch_pgd_at(model, loader, opt, eps=8/255, alpha=2/255, steps=7):
"""매드리식 적대적 훈련: 안쪽 최대화(PGD) 후 바깥쪽 최소화"""
for x, y in loader:
model.eval() # 공격 생성 중에는 BN 통계 고정
x_adv = pgd(model, x, y, eps, alpha, steps)
model.train()
loss = F.cross_entropy(model(x_adv), y)
opt.zero_grad()
loss.backward()
opt.step()
def trades_loss(model, x, y, eps=8/255, alpha=2/255, steps=10, beta=6.0):
"""TRADES: 깨끗한 입력의 교차 엔트로피 + beta * KL(깨끗한 출력 || 적대적 출력)"""
model.eval()
p_clean = F.softmax(model(x), dim=1).detach()
x_adv = x + 0.001 * torch.randn_like(x)
for _ in range(steps): # 안쪽 최대화: 레이블 없이 KL을 키운다
x_adv.requires_grad_(True)
kl = F.kl_div(F.log_softmax(model(x_adv), dim=1), p_clean,
reduction="batchmean")
grad, = torch.autograd.grad(kl, x_adv)
x_adv = x_adv.detach() + alpha * grad.sign()
x_adv = torch.min(torch.max(x_adv, x - eps), x + eps).clamp(0, 1)
model.train()
logits = model(x)
loss_nat = F.cross_entropy(logits, y)
loss_rob = F.kl_div(F.log_softmax(model(x_adv.detach()), dim=1),
F.softmax(logits, dim=1), reduction="batchmean")
return loss_nat + beta * loss_rob
F.kl_div(input, target)는 input에 로그 확률, target에 확률을 받아 KL(target ∥ input)을 계산한다. 평가는 학습에 쓴 PGD보다 강한 공격(걸음 수를 늘린 PGD, 무작위 재시작, AutoAttack)으로 해야 한다.
- ↑ Apostol Vassilev 외, 〈Adversarial Machine Learning: A Taxonomy and Terminology of Attacks and Mitigations〉, NIST AI 100-2 E2025, 2025-03, 2.2절. NIST CSRC
- ↑ 2.0 2.1 Ian J. Goodfellow, Jonathon Shlens, Christian Szegedy, 〈Explaining and Harnessing Adversarial Examples〉, ICLR 2015. arXiv:1412.6572
- ↑ 3.0 3.1 3.2 Aleksander Madry 외, 〈Towards Deep Learning Models Resistant to Adversarial Attacks〉, ICLR 2018. arXiv:1706.06083
- ↑ 4.0 4.1 4.2 Hongyang Zhang 외, 〈Theoretically Principled Trade-off between Robustness and Accuracy〉, ICML 2019. arXiv:1901.08573
- ↑ Ali Shafahi 외, 〈Adversarial Training for Free!〉, NeurIPS 2019. arXiv:1904.12843
- ↑ 6.0 6.1 Eric Wong, Leslie Rice, J. Zico Kolter, 〈Fast is better than free: Revisiting adversarial training〉, ICLR 2020. arXiv:2001.03994
- ↑ Dimitris Tsipras 외, 〈Robustness May Be at Odds with Accuracy〉, ICLR 2019. arXiv:1805.12152