본문 바로가기
C.W.K.
Stream
Lesson 06 of 08 · published

강건성, 편향, 안전성

~18 min · safety, bias, robustness

Level 0호기심
0 XP0/73 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

배포된 모델에서 생길 수 있는 문제

  • 분포 변화: 운영 데이터의 분포가 학습 데이터와 달라져. 그 결과 모델 정확도가 눈에 띄지 않게 떨어질 수 있어.
  • 적대적 입력: 의도적으로 가한 작은 교란이 예측을 크게 바꿀 수 있어. 특히 비전과 오디오 모델에서 문제가 돼.
  • 편향: 모델 성능이 인구통계 집단마다 고르지 않을 수 있으며, 학습 데이터의 편향을 반영하는 경우가 많아.
  • 환각 (LLM): 유창하고 그럴듯해 보이지만 사실과 다른 출력을 만들어.
  • 프롬프트 인젝션 (LLM): 검색된 문맥에 포함된 사용자 제공 지시가 시스템 프롬프트를 무시하게 만들어.
  • 개인정보 유출: 모델이 학습 데이터를 암기했다가 그대로 출력할 수 있어. 드물지만 실제로 보고된 문제야.
주의: 이런 문제를 모니터링하지 않은 채 모델을 배포하면, 성능이 경고 없이 떨어지거나 피해를 일으키는 시스템을 내놓는 셈이야. 모니터링에 드는 비용은 고객이나 규제 기관이 문제를 먼저 발견했을 때 치르는 비용보다 작아.

최소 안전 도구 모음

  • 클래스별 지표: 클래스별 분석 없이 집계 정확도만 제시하는 결과는 절대 받아들이지 마.
  • 슬라이스 평가: 사용자가 실제로 중요하게 여기는 하위 집합을 평가해. 인구통계, 지역, 언어 같은 기준을 사용할 수 있어.
  • 분포 변화 모니터링: 입력 분포와 모델 출력을 시간에 따라 추적하고, 변화가 감지되면 알림을 보내.
  • 신뢰도 보정: 모델이 내놓는 확률은 실제 관측 빈도와 일치해야 해. 보정되지 않은 모델은 자신의 확실성을 거짓으로 말해.
  • 적대적 강건성 점검: 최소한 몇 가지 표준 공격으로 평가해. 비전 모델에는 FGSM과 PGD를, LLM에는 탈옥 데이터셋을 사용할 수 있어.
  • LLM 레드팀 테스트: 사용자가 먼저 시도하기 전에 사람이 의도적으로 모델의 안전 가드레일을 무너뜨려 봐.

철학이 아니라 엔지니어링인 이유

안전성 문제는 고객 불만, 규제 벌금, 소송, 뉴스 보도로 나타나. 측정하고 완화할 수 있는 엔지니어링 위험이지, 막연한 이상이 아니야. 보안 취약점처럼 다뤄. 스캔하고, 알림을 설정하고, 발견되면 수정해.

원칙: 안전성 모니터링 비용은 엔지니어의 시간으로 지불해. 이 과정을 건너뛰면 고객 신뢰, 법적 위험, 온콜 호출로 대가를 치르게 돼. 첫 번째 비용이 훨씬 작고 예측하기도 쉬워.

Code

가장 간단한 공정성 점검: 그룹별 정확도·python
import numpy as np

def per_group_metrics(y_true, y_pred, group):
    groups = np.unique(group)
    out = {}
    for g in groups:
        mask = (group == g)
        acc = (y_pred[mask] == y_true[mask]).mean()
        out[str(g)] = {"n": int(mask.sum()), "acc": float(acc)}
    return out

# Print: spot the group whose accuracy is much lower than the average.
for grp, m in per_group_metrics(y_val, preds, val_group).items():
    print(f"{grp}: n={m['n']}, acc={m['acc']:.4f}")
신뢰도 다이어그램을 활용한 보정 점검·python
import numpy as np
import matplotlib.pyplot as plt

def reliability(y_true, prob, n_bins=10):
    bins = np.linspace(0, 1, n_bins + 1)
    confs, accs, sizes = [], [], []
    for lo, hi in zip(bins[:-1], bins[1:]):
        mask = (prob >= lo) & (prob < hi)
        if mask.sum() == 0: continue
        confs.append(prob[mask].mean())
        accs.append(y_true[mask].mean())
        sizes.append(mask.sum())
    return np.array(confs), np.array(accs), np.array(sizes)

c, a, _ = reliability(y_val, preds_prob)
plt.plot([0, 1], [0, 1], "k--")
plt.scatter(c, a)
plt.xlabel("predicted prob"); plt.ylabel("observed accuracy"); plt.show()

External links

Exercise

모델의 검증 세트에서 클래스별 정확도와 인구통계 집단별 정확도를 계산해. 인구통계 데이터가 없다면 지역, 시간대, 출처처럼 의미 있는 슬라이스를 사용해. 성능이 가장 나쁜 슬라이스를 찾아. 그 격차가 운영 환경에서 허용 가능한지 판단해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.