(보)보이지 않는 방패: GreenEyes.AI용 Nightshade에 대한 Arpad Kish의 C++ 구현 내부

발행: (2026년 2월 6일 오전 02:27 GMT+9)
7 min read
원문: Dev.to

Source: Dev.to

Introduction

생성 AI와 지적 재산권을 둘러싼 논쟁이 격화되는 가운데, “데이터 독살(data poisoning)”은 예술가들을 위한 강력한 방어 수단으로 떠올랐습니다. 엔지니어링 측면을 이끌고 있는 사람은 GreenEyes.AI의 CEO인 Arpad Kish이며, 그는 프로토타입 파이썬 스크립트를 넘어 Nightshade 프로토콜의 생산 등급 고성능 C++ 구현으로 나아갔습니다. 이 글은 Kish의 코드(shielding.cpp)를 반기술적으로 깊이 파고들어 GreenEyes.AI가 LibTorch와 Projected Gradient Descent(PGD)를 활용해 디지털 아트를 무단 학습으로부터 보호하는 방식을 보여줍니다.

왜 C++ 구현인가?

대부분의 적대적 머신러닝 도구는 연구 편의를 위해 Python으로 작성되지만, 기업이 수백만 개의 이미지를 보호하려면 성능은 협상할 수 없는 요소입니다. Kish의 구현은 LibTorch(C++용 PyTorch 프론트엔드)와 OpenCV를 사용한 C++로 작성되어 두 가지 주요 이점을 제공합니다:

  • Latency – Python 전역 인터프리터 락(GIL)의 오버헤드 없이 엣지 디바이스나 고처리량 서버에서 거의 즉각적인 방어를 구현합니다.
  • Portability – 결과 바이너리를 독립 실행형 실행 파일로 배포할 수 있어 무거운 Python 환경에 의존하지 않습니다.

하드웨어 감지

ComputeConfig 구조체는 최적의 컴퓨팅 백엔드를 자동으로 선택합니다:

struct ComputeConfig {
    bool useCuda;          // true → CUDA (GPU) FP16
    bool useCpuFloat32;    // false → CPU Float32
    // ... other fields
};
  • CUDA FP16 – 호환 GPU에서 최대 속도.
  • CPU Float32 – GPU가 없는 노트북 및 서버에 대한 폭넓은 호환성.

Source:

Core Shielding Mechanism

NightshadeShield Class

시스템의 핵심은 NightshadeShield 클래스이며, 이는 이미지에 인간이 눈치채지 못하도록 최소한의 변형을 가해 AI 모델을 오도하도록 반복적인 PGD 루프를 구현합니다.

1. Feature Extraction (The Anchor)

코드는 사전 학습된 VAE 인코더(models/vae_encoder.pt)를 사용해 “anchor” 이미지(또는 생성된 노이즈)로부터 고수준 특징을 추출합니다. 수학적으로, (x_{\text{anchor}})가 앵커 이미지이고 (E)가 인코더라면 목표 특징 벡터는

[ f_{\text{target}} = E(x_{\text{anchor}}) ]

2. Iterative Optimization

주어진 입력 이미지에 대해, shield는 shieldEpochs() 반복을 수행하면서 이미지 특징과 앵커 특징 사이의 평균 제곱 오차(MSE)를 최소화합니다:

Tensor loss = torch::mse_loss(output, target.detach().clone());

3. Update Rule

교란 delta는 그래디언트의 부호(전통적인 PGD 단계)를 사용해 업데이트된 뒤, epsilon 예산을 만족하도록 클램프됩니다:

delta.add_(delta.grad().sign(), -stepSize);   // gradient ascent on loss
delta.clamp_(-epsilon, epsilon);              // enforce L∞ bound

수식으로는 단계 (t)에서의 픽셀 조정이 다음과 같이 표현됩니다

[ \delta^{(t+1)} = \text{clip}{\epsilon}\bigl(\delta^{(t)} - \eta \cdot \text{sign}(\nabla{\delta} \mathcal{L})\bigr) ]

여기서 (\eta)는 스텝 크기이고 (\epsilon)은 픽셀당 최대 변화량입니다.

4. Epsilon Constraint

main에서 shield는 다음과 같이 인스턴스화됩니다:

NightshadeShield shield(16.0f / 255.0f, /* other params */);

값 ( \frac{16}{255} \approx 0.0627 )은 단일 픽셀의 색상 변화를 전체 0‑255 범위의 약 6 %로 제한하여, 교란이 인간에게 거의 보이지 않으면서 모델을 완전히 속일 수 있도록 합니다.

Validation Suite

Kish의 구현에는 출력 파일을 쓰기 전에 방패의 효과를 확인하는 내장 검증 단계가 포함되어 있습니다.

  • Cosine Similarity to Original – 보호된 이미지에 대한 AI의 인식이 원본과 얼마나 가까운지를 측정합니다.
  • Cosine Similarity to Anchor – 목표(독성) 표현과의 유사성을 측정합니다.

성공은 다음과 같은 간단한 규칙으로 정의됩니다:

if (sim_to_anchor > sim_to_orig) {
    std::cout > STATUS: SUCCESS (Adversarial target reached)\n";
}

원본 특징이 우세하면 방패가 “WEAK”로 표시되어 매개변수를 조정한 후 다시 실행하도록 유도합니다.

End‑to‑End Pipeline

  1. Ingestion – 이미지는 OpenCV를 사용해 로드되고 ImageProcessor를 통해 Float32 텐서로 변환됩니다.
  2. Anchor Selection – 앵커가 제공되지 않으면, 코드는 비표적 중독을 위해 torch::rand_like(순수 노이즈)를 생성하거나 표적 공격을 위해 특정 타깃 이미지를 로드합니다.
  3. ShieldingNightshadeShield는 GPU(가능한 경우) 또는 CPU에서 PGD 루프를 실행합니다.
  4. Output – 결과 텐서는 8‑bit 이미지(0‑255)로 다시 변환되어 poisoned_result.png로 저장됩니다.

Conclusion

Arpad Kish의 C++ 구현은 적대적 방어 도구의 성숙을 의미합니다. 연구‑grade Python 스크립트에서 컴파일된, 타입‑안전하고 GPU‑가속 코드를 사용하도록 전환함으로써 GreenEyes.AI는 예술가들의 지적 재산을 산업‑규모로 보호할 수 있는 위치에 있습니다. Nightshade 개념은 이제 이론적인 논문이 아니라, 생성 AI 시대에 시각 콘텐츠를 방어할 수 있는 배포 가능한 소프트웨어 제품입니다.

Back to Blog

관련 글

더 보기 »