차분 프라이버시
Differential Privacy
개인 데이터 보호하며 통계 분석 가능케 하는 기법. 노이즈 추가.
Differential Privacy
개인 데이터 보호하며 통계 분석 가능케 하는 기법. 노이즈 추가.
차분 프라이버시(Differential Privacy, DP)는 개인 데이터를 보호하면서도 유용한 통계 분석을 가능하게 하는 수학적 프레임워크입니다. 핵심 원리는 쿼리 결과에 계산된 노이즈를 추가하여, 특정 개인이 데이터셋에 포함되어 있는지 여부를 외부에서 추론할 수 없게 만드는 것입니다.
차분 프라이버시는 2006년 Cynthia Dwork 등이 제안한 개념으로, 기존의 익명화 기법들이 재식별 공격에 취약하다는 한계를 수학적으로 해결했습니다. Apple(2016년부터), Google(2017년 RAPPOR), 미국 인구조사국(2020년 Census) 등이 대규모 서비스에 적용하면서 산업 표준으로 자리잡았습니다. 2024-2025년에는 연합 학습(Federated Learning)과 결합한 DP-FL이 AI 프라이버시의 핵심 기술이 되었습니다.
DP의 수학적 정의는 엄격합니다. 알고리즘 M이 (epsilon, delta)-차분 프라이버시를 만족한다는 것은, 한 개인의 데이터가 있고 없는 두 인접 데이터셋에서 M의 출력 분포가 거의 구분 불가능함을 의미합니다. epsilon(프라이버시 예산)이 작을수록 강한 프라이버시를 보장하지만, 유틸리티(데이터 유용성)가 감소하는 트레이드오프가 있습니다. 일반적으로 epsilon < 1이 강한 프라이버시, epsilon > 10은 약한 프라이버시로 간주됩니다.
실무에서 DP는 헬스케어 AI, 금융 사기 탐지, 위치 데이터 분석, LLM 학습 등 민감한 데이터를 다루는 모든 영역에서 중요합니다. Google의 DP-SGD, Apple의 로컬 DP, OpenAI의 학습 데이터 보호 등이 대표적 사례입니다. EU GDPR, 한국 개인정보보호법 등 규제 준수에도 DP가 효과적인 기술적 조치로 인정받고 있습니다.
Opacus 라이브러리를 활용한 DP-SGD 딥러닝 학습:
# 차분 프라이버시 딥러닝 (DP-SGD with Opacus)
import torch
import torch.nn as nn
from torch.utils.data import DataLoader, TensorDataset
from opacus import PrivacyEngine
from opacus.validators import ModuleValidator
import numpy as np
# 1. 모델 정의 (DP 호환 가능한 레이어 사용)
class DPCompatibleModel(nn.Module):
def __init__(self, input_dim, num_classes):
super().__init__()
self.layers = nn.Sequential(
nn.Linear(input_dim, 128),
nn.ReLU(),
nn.Linear(128, 64),
nn.ReLU(),
nn.Linear(64, num_classes)
)
def forward(self, x):
return self.layers(x)
# 2. 데이터 준비 (예: 민감한 의료 데이터)
np.random.seed(42)
X = torch.randn(1000, 20)
y = torch.randint(0, 2, (1000,))
dataset = TensorDataset(X, y)
dataloader = DataLoader(dataset, batch_size=64, shuffle=True)
# 3. 모델 및 옵티마이저 설정
model = DPCompatibleModel(input_dim=20, num_classes=2)
# DP 호환성 검증 및 수정
model = ModuleValidator.fix(model)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
criterion = nn.CrossEntropyLoss()
# 4. Privacy Engine 적용
privacy_engine = PrivacyEngine()
model, optimizer, dataloader = privacy_engine.make_private_with_epsilon(
module=model,
optimizer=optimizer,
data_loader=dataloader,
epochs=10,
target_epsilon=3.0, # 프라이버시 예산 (작을수록 강한 보호)
target_delta=1e-5, # 허용 실패 확률
max_grad_norm=1.0, # 그래디언트 클리핑 임계값
)
print(f"노이즈 승수 (Noise Multiplier): {optimizer.noise_multiplier:.4f}")
print(f"목표 Epsilon: 3.0, Delta: 1e-5")
# 5. DP 학습 실행
def train_with_dp(model, dataloader, optimizer, criterion, epochs=10):
model.train()
for epoch in range(epochs):
total_loss = 0
for X_batch, y_batch in dataloader:
optimizer.zero_grad()
outputs = model(X_batch)
loss = criterion(outputs, y_batch)
loss.backward()
optimizer.step()
total_loss += loss.item()
# 현재까지 사용된 프라이버시 예산 확인
epsilon = privacy_engine.get_epsilon(delta=1e-5)
print(f"Epoch {epoch+1}: Loss={total_loss:.4f}, Epsilon={epsilon:.2f}")
train_with_dp(model, dataloader, optimizer, criterion, epochs=10)
# 6. 최종 프라이버시 보장 수준
final_epsilon = privacy_engine.get_epsilon(delta=1e-5)
print(f"\n최종 프라이버시 보장: ({final_epsilon:.2f}, 1e-5)-차분 프라이버시")
간단한 라플라스 노이즈 기반 DP 쿼리 예제:
# 라플라스 메커니즘을 활용한 차분 프라이버시 쿼리
import numpy as np
def laplace_mechanism(true_value, sensitivity, epsilon):
"""
라플라스 메커니즘으로 차분 프라이버시 적용
- true_value: 실제 쿼리 결과
- sensitivity: 쿼리의 민감도 (한 사람이 바뀔 때 최대 변화량)
- epsilon: 프라이버시 예산
"""
scale = sensitivity / epsilon
noise = np.random.laplace(0, scale)
return true_value + noise
# 예시: 급여 평균 쿼리
salaries = [50000, 55000, 60000, 65000, 70000, 45000, 80000, 75000, 52000, 58000]
# 실제 평균
true_mean = np.mean(salaries)
print(f"실제 평균 급여: ${true_mean:,.0f}")
# 민감도 계산 (한 사람 추가/제거 시 평균 변화 최대치)
# 급여 범위 / n으로 근사
max_salary = 100000
min_salary = 40000
n = len(salaries)
sensitivity = (max_salary - min_salary) / n
print(f"쿼리 민감도: {sensitivity:,.0f}")
# 다양한 epsilon으로 DP 쿼리 수행
print("\n=== Epsilon별 DP 쿼리 결과 ===")
for epsilon in [0.1, 1.0, 5.0, 10.0]:
dp_results = [laplace_mechanism(true_mean, sensitivity, epsilon) for _ in range(5)]
print(f"epsilon={epsilon}: ${np.mean(dp_results):,.0f} (std: {np.std(dp_results):,.0f})")
# 프라이버시 vs 유틸리티 트레이드오프
print("\n=> epsilon이 작을수록 프라이버시 보호가 강하지만, 결과의 정확도가 낮아짐")
프라이버시 예산(epsilon) 설정 권장 기준:
| Epsilon 범위 | 프라이버시 수준 | 적용 사례 | 노이즈 수준 |
|---|---|---|---|
| 0.1 - 0.5 | 매우 강함 | 의료 기록, 유전자 데이터 | 높음 (유틸리티 저하) |
| 0.5 - 1.0 | 강함 | 금융 거래, 위치 정보 | 중상 |
| 1.0 - 3.0 | 중간 | 일반 개인정보, ML 학습 | 중간 |
| 3.0 - 10.0 | 약함 | 익명화된 통계, A/B 테스트 | 낮음 |
| 10.0+ | 매우 약함 | 공개 가능한 통계 | 매우 낮음 |
* Apple: epsilon 1-8, US Census 2020: epsilon ~17.14, Google: epsilon 1-9 사용
epsilon이 너무 크면 프라이버시 보호 효과가 없습니다. 업계 표준(Apple: 1-8)을 참고하여 적절한 epsilon을 선택하고, 프라이버시 예산 소진을 추적하세요.
동일 데이터에 여러 DP 쿼리를 수행하면 프라이버시 예산이 누적됩니다. 각 쿼리의 epsilon을 단순히 사용하면 안 되고, 순차적/병렬적 구성 정리를 적용해야 합니다.
Privacy Budget Accountant(예: Moments Accountant, RDP)를 사용하여 전체 프라이버시 예산을 정확히 추적하세요. 사전에 총 예산을 정하고, 각 분석 작업에 예산을 배분합니다.