1 DL이 충족한 5대 검증 요건 - 실제 FDA 승인 사례 분석
딥러닝 의료기기가 실제로 규제를 통과한 방식을 정확히 이해하려면, 다음 다섯 가지 통계적 요건이 어떻게 충족되었는지 봐야 한다. 이것은 이론이 아니라 실제 FDA 510(k)/De Novo 문서에서 요구하는 항목들이다[@FDA2021AIML].
1.1 분포 (Distribution) - Out-of-Distribution 방어
1.1.1 수학적 정의
딥러닝 모델 \(f: \mathcal{X} \rightarrow \mathcal{Y}\) 가 의료기기로 승인되려면, 입력 공간 \(\mathcal{X}\) 가 명확히 정의된 확률 분포 \(P(X)\) 를 가져야 한다.
\[ P_{\text{train}}(X) \approx P_{\text{val}}(X) \approx P_{\text{clinical}}(X) \]
핵심: 학습 분포, 검증 분포, 실제 임상 분포가 일치해야 한다. 분포가 다르면 성능 보장 불가.
1.1.2 FDA 제출 요구사항
21 CFR 860.7 - Device Classification[@FDA2020Classification]에 따르면:
- 입력 데이터 분포 명시
- 장비: 특정 제조사, 모델명
- 포맷: DICOM, 해상도 (예: 512×512 이상)
- 환자군: 연령, 질병 상태, 제외 기준
- 분포 일치성 검증
- Kolmogorov-Smirnov Test
- Chi-square Test for categorical variables
- T-test for continuous variables
- Out-of-Distribution 감지 메커니즘
- 입력이 학습 분포를 벗어나면?
- → 경고 또는 출력 거부
1.1.3 실제 사례: IDx-DR (2018)
가장 엄격한 분포 제한 사례[@Abramoff2018IDxDR]
입력 분포 제한:
| 항목 | 제한 조건 | 근거 |
|---|---|---|
| 장비 | Topcon NW400만 | 학습 데이터가 이 카메라로만 수집됨 |
| 이미지 | 45° 시야각, 2채널 (macula-centered + disc-centered) | 다른 각도는 Out-of-Distribution |
| 해상도 | 최소 2048×1536 픽셀 | 저해상도는 검증 안 됨 |
| 환자군 | 50세 이상, 당뇨병 진단 | 학습 데이터 분포와 일치 |
| 제외 조건 | 망막 수술 이력, 안내염, 심한 백내장 | 분포 밖 케이스 |
분포 검증 프로토콜:
# FDA 제출 문서에 포함된 분포 검증
import scipy.stats as stats
# 학습 vs 검증 데이터 연령 분포 비교
ks_statistic, p_value = stats.ks_2samp(train_ages, val_ages)
print(f"KS statistic: {ks_statistic}, p-value: {p_value}")
# 결과: KS = 0.043, p = 0.82 (분포 차이 없음)
# 성별 분포 비교
chi2, p_chi = stats.chisquare(train_gender, val_gender)
print(f"Chi-square: {chi2}, p-value: {p_chi}")
# 결과: χ² = 1.23, p = 0.27 (분포 일치)Out-of-Distribution 처리:
- 저화질 이미지: 10.8%가 “판독 불가” → 출력 거부[@Abramoff2018IDxDR]
- 비당뇨병 환자: 시스템 사용 금지 (라벨에 명시)
- 다른 카메라: 승인 범위 밖 → 법적 책임 없음
1.1.4 실제 사례: Paige Prostate (2024)
Whole Slide Imaging의 분포 도전[@FDA2024Paige]
문제: 병리 슬라이드는 스캐너마다 색상 분포가 다름
해결책:
- Color Normalization
- Reinhard stain normalization
- 학습 데이터의 색상 분포로 정규화
- 수식: \(I_{\text{norm}} = \frac{I - \mu_{\text{source}}}{\sigma_{\text{source}}} \times \sigma_{\text{target}} + \mu_{\text{target}}\)
- Scanner-Specific Validation
- 16개 기관, 7종의 스캐너
- 각 스캐너별로 성능 검증
- 스캐너 간 성능 차이: Sensitivity 91-94% (일관성 입증)
- OOD Detection
- 슬라이드 품질 점수 (1-5)
- 품질 3 이하 → 경고 메시지
FDA 승인 조건: 특정 스캐너 목록만 허용 (7종)
1.1.5 규제 논리: 왜 분포 제한이 필수인가?
FDA의 입장 (2021 AI/ML Action Plan)[@FDA2021AIML]:
“Deep learning models are known to fail catastrophically on out-of-distribution inputs. Therefore, manufacturers must clearly define the input domain and implement mechanisms to detect and reject OOD inputs.”
수학적 근거:
딥러닝은 다음을 보장하지 못함:
\[ P(Y|X) \text{ when } X \notin \text{support}(P_{\text{train}}) \]
즉, 학습 분포 밖에서는 예측 신뢰성 없음.
실전 전략:
- DL을 “일반 지능”이 아닌 “분포 한정 인식기”로 규정
- 입력 분포를 극단적으로 제한 → 검증 가능성 확보
- OOD 입력 거부 → 안전성 보장
1.1.6 비교: 전통 ML은 분포 제한이 덜 엄격
Logistic Regression 사례:
# 전통 ML은 변수 범위만 정의하면 됨
model = LogisticRegression()
# 입력 제약: "혈당 50-500 mg/dL, HbA1c 4-15%"
# 장비 제한 없음 (혈액 검사 결과만 사용)차이점:
| 전통 ML | 딥러닝 | |
|---|---|---|
| 입력 분포 | 변수 범위만 | 장비, 포맷, 환자군 모두 제한 |
| OOD 민감도 | 낮음 (선형 외삽 가능) | 매우 높음 (급격히 붕괴) |
| 검증 복잡도 | 낮음 | 매우 높음 |
결론: 딥러닝은 분포 의존성이 높아, 분포 제한이 승인의 필수 조건이다.
1.2 신뢰구간 (Confidence Interval) - 성능 불확실성 정량화
1.2.1 수학적 정의
딥러닝 모델의 성능 지표 \(\theta\) (예: Sensitivity)에 대해, 95% 신뢰구간 \([\theta_L, \theta_U]\) 를 제시해야 한다:
\[ P(\theta_L \leq \theta \leq \theta_U) = 0.95 \]
- 핵심 오해 해소: “딥러닝은 확률 모델이 아니니 CI가 불가능하다” ❌
- 진실: 개별 예측의 CI가 아닌, 모델 성능 지표의 CI를 요구한다.
1.2.2 FDA 요구사항
510(k) 제출 가이드라인[@FDA2020SoftwareValidation]:
- Primary Endpoint의 CI 필수
- Sensitivity (95% CI)
- Specificity (95% CI)
- AUC (95% CI)
- PPV, NPV (95% CI)
- CI 계산 방법 문서화
- Bootstrap (권장)
- Wilson Score Interval
- Exact Binomial (Clopper-Pearson)
- 임상적 허용 기준
- CI 하한이 임상적으로 수용 가능해야 함
- 예: Sensitivity 하한 ≥ 85% (질병 놓침 최대 15%)
1.2.3 실제 계산 방법
방법 1: Bootstrap CI (가장 많이 사용)
import numpy as np
from sklearn.metrics import roc_auc_score
from scipy import stats
def bootstrap_ci(y_true, y_pred, n_bootstrap=10000, ci=0.95):
"""
Bootstrap method for calculating 95% CI of Sensitivity
FDA 510(k) 문서에서 가장 많이 사용되는 방법
"""
n = len(y_true)
sensitivities = []
for _ in range(n_bootstrap):
# Resample with replacement
indices = np.random.choice(n, n, replace=True)
y_true_boot = y_true[indices]
y_pred_boot = y_pred[indices]
# Calculate sensitivity
tp = np.sum((y_true_boot == 1) & (y_pred_boot == 1))
fn = np.sum((y_true_boot == 1) & (y_pred_boot == 0))
sensitivity = tp / (tp + fn) if (tp + fn) > 0 else 0
sensitivities.append(sensitivity)
# Calculate percentile CI
alpha = 1 - ci
lower = np.percentile(sensitivities, 100 * alpha / 2)
upper = np.percentile(sensitivities, 100 * (1 - alpha / 2))
mean_sens = np.mean(sensitivities)
return mean_sens, (lower, upper)
# 실제 사용 예시
y_true = np.array([1]*400 + [0]*600) # 400 positive, 600 negative
y_pred = model.predict(X_test)
mean_sens, (ci_lower, ci_upper) = bootstrap_ci(y_true, y_pred)
print(f"Sensitivity: {mean_sens:.3f} (95% CI: {ci_lower:.3f}-{ci_upper:.3f})")
# 출력 예: Sensitivity: 0.872 (95% CI: 0.827-0.910)방법 2: Wilson Score Interval (이항 분포)
def wilson_ci(tp, n, confidence=0.95):
"""
Wilson Score Interval - 소표본에서 정확
Sensitivity = tp / n인 경우
"""
from scipy import stats
p = tp / n
z = stats.norm.ppf((1 + confidence) / 2)
denominator = 1 + z**2 / n
center = (p + z**2 / (2*n)) / denominator
margin = z * np.sqrt((p*(1-p)/n + z**2/(4*n**2))) / denominator
return center - margin, center + margin
# IDx-DR 실제 데이터 (900명 환자, 356 True Positive)
ci_lower, ci_upper = wilson_ci(356, 400, 0.95)
print(f"95% CI: ({ci_lower:.3f}, {ci_upper:.3f})")
# 출력: 95% CI: (0.827, 0.910) - FDA 문서와 일치1.2.4 실제 사례: IDx-DR CI 분석
FDA De Novo DEN180001 문서[@Abramoff2018IDxDR]:
Primary Endpoint: Sensitivity
- Point Estimate: 87.2%
- 95% CI: 82.7% - 91.0%
- 방법: Wilson Score Interval
- 샘플: 900명 환자 중 400명 양성
임상적 해석:
- CI 하한 82.7% → 최악의 경우 17.3% 놓칠 수 있음
- FDA 질문: “17.3% False Negative는 임상적으로 수용 가능한가?”
- 답변: “연 1회 스크리닝이므로, 다음 검사에서 발견 가능” → 승인
Specificity
- Point Estimate: 90.7%
- 95% CI: 88.3% - 92.7%
- 해석: CI가 좁음 → 성능이 안정적
1.2.5 실제 사례: Paige Prostate CI 분석
FDA De Novo DEN210034[@FDA2024Paige]:
Reader Study (16명 병리학자)
| 지표 | AI 보조 없음 | AI 보조 있음 | Δ (95% CI) |
|---|---|---|---|
| Sensitivity | 81.3% | 88.4% | +7.1% (4.2-10.0%) |
| Specificity | 94.6% | 95.8% | +1.2% (-0.5-2.9%) |
통계적 검정:
- Paired t-test: p < 0.001 (유의미한 향상)
- CI가 0을 포함하지 않음 → 실제 개선 증명
FDA 요구:
“The lower bound of the 95% CI for the improvement in sensitivity (4.2%) demonstrates clinically meaningful benefit.”
1.2.6 CI가 중요한 이유: 규제 관점
1. 최악의 시나리오 평가
- Point estimate만 보면: Sensitivity 92%
- CI 하한을 보면: 최악의 경우 85%
- FDA는 CI 하한으로 위험도 평가
2. 표본 크기 검증
\[ \text{CI width} \propto \frac{1}{\sqrt{n}} \]
- CI가 너무 넓으면: 표본 부족 → 재시험 요구
- 목표 CI width: ±3-5% (보통)
3. 임상시험 설계
# 표본 크기 계산 (Sensitivity 90%, CI width ±5%)
from statsmodels.stats.proportion import proportion_confint
# 필요한 양성 케이스 수
n_positive = ((1.96 / 0.05) ** 2) * 0.9 * (1 - 0.9)
print(f"필요한 양성 환자: {n_positive:.0f}명")
# 출력: 346명
# 전체 환자 수 (유병률 10% 가정)
n_total = n_positive / 0.1
print(f"전체 환자: {n_total:.0f}명")
# 출력: 3,460명 - IDx-DR은 900명 (더 넓은 CI 수용)1.2.7 딥러닝 vs 전통 ML: CI 계산의 차이
| 전통 ML | 딥러닝 | |
|---|---|---|
| 이론적 CI | 가능 (CLT 기반) | 불가능 (비선형, 고차원) |
| 실무적 CI | Bootstrap | Bootstrap (동일) |
| 계산 비용 | 낮음 | 매우 높음 (재학습 필요 시) |
| CI 해석 | 파라미터 + 성능 | 성능만 |
핵심: 딥러닝도 성능 지표의 CI는 제공 가능하다. Bootstrap으로 해결.
1.2.8 결론
오해: “딥러닝은 블랙박스라 CI가 안 나온다” ❌
진실: - 개별 예측의 불확실성 정량화는 어려움 (epistemic uncertainty) - 하지만 모델 성능의 불확실성은 정량화 가능 (bootstrap, 반복 시험) - FDA는 후자만 요구함
실무 조언: 1. 임상시험 계획 시 표본 크기 계산 (CI width 목표 설정) 2. Bootstrap CI 사용 (10,000 iterations 권장) 3. CI 하한이 임상적 기준을 넘는지 확인 4. Subgroup별로도 CI 계산 필수
1.3 오류율 (Error Rate) - False Negative/Positive의 임상적 비용
1.3.1 수학적 정의
DL 모델의 오류는 두 가지로 구분된다:
\[ \begin{aligned} \text{False Negative Rate (FNR)} &= \frac{FN}{TP + FN} = 1 - \text{Sensitivity} \\ \text{False Positive Rate (FPR)} &= \frac{FP}{TN + FP} = 1 - \text{Specificity} \end{aligned} \]
핵심: 오류의 임상적 비용이 비대칭적이다.
1.3.2 FDA 요구사항
510(k) 제출 가이드라인[@FDA2020SoftwareValidation]:
- 오류 유형별 임상적 영향 분석
- 오류율의 임상적 허용 기준
- Confusion Matrix 전체 제출
1.3.3 실제 사례: IDx-DR 오류율 분석
Confusion Matrix (900명)[@Abramoff2018IDxDR]:
| 실제 DR+ | 실제 DR- | Total | |
|---|---|---|---|
| AI DR+ | 349 | 56 | 405 |
| AI DR- | 51 | 444 | 495 |
| Total | 400 | 500 | 900 |
- FNR: 12.75%, FPR: 11.2%
- FDA 승인 근거: 기존(FNR 100%) 대비 대폭 개선
1.3.4 오류 비용의 비대칭성
\[ \text{Total Risk} = C_{FN} \times FNR + C_{FP} \times FPR \]
예시: 암 스크리닝
| 질병 | \(C_{FN}\) | \(C_{FP}\) | 비율 |
|---|---|---|---|
| 폐암 | $100,000 | $1,000 | 100:1 |
| 당뇨망막증 | $10,000 | $500 | 20:1 |
1.4 재현성 (Reproducibility) - Locked Algorithm
1.4.1 수학적 정의
\[ f(X; \theta) = \text{constant for all future time } t \]
핵심: 모델 파라미터 \(\theta\) 고정 (“Locked Algorithm”)
1.4.2 FDA 요구사항: 21 CFR 820.30(j)[@FDA2020DesignControl]
- 모델 고정 (Model Locking)
- 학습된 가중치 \(\theta\) 저장
- Inference 중 업데이트 금지
- Version control (Git hash)
- 결정론적 출력
- 동일 입력 → 동일 출력
- Random seed 고정
- Dropout, Augmentation 비활성화
- 소프트웨어 버전 고정
1.4.3 실제 사례: IDx-DR Model Integrity[@Abramoff2018IDxDR]
import hashlib
import tensorflow as tf
def verify_model_integrity(model_path, expected_hash):
"""모델 가중치 무결성 검증"""
model = tf.keras.models.load_model(model_path)
weights_bytes = b''
for layer in model.layers:
for weight in layer.get_weights():
weights_bytes += weight.tobytes()
computed_hash = hashlib.sha256(weights_bytes).hexdigest()
if computed_hash != expected_hash:
raise ValueError("Model integrity check failed!")
return True
# FDA 문서에 명시된 hash
EXPECTED_HASH = "a3f7b2d8e1c6f9a4b5e8d2c3f7a1b4e9..."
verify_model_integrity("idxdr_model.h5", EXPECTED_HASH)FDA 제출 소프트웨어 사양:
| 항목 | 버전 | 근거 |
|---|---|---|
| Python | 3.6.8 | 학습 환경 동일 |
| TensorFlow | 2.4.0 | API 변경 방지 |
| NumPy | 1.19.5 | 수치 연산 일관성 |
1.4.4 재현성 위반 사례 (FDA 승인 불가)
❌ Online Learning
class ContinuousLearningModel:
def predict_and_update(self, X, y_feedback=None):
pred = self.model.predict(X)
if y_feedback is not None:
self.model.fit(X, y_feedback, epochs=1) # 금지!
return predFDA 입장 (2021 AI/ML Action Plan)[@FDA2021AIML]:
“Continuous learning requires predetermined change control plan and FDA clearance before each modification.”
1.5 Subgroup 성능 안정성 - 편향 방지
1.5.1 수학적 정의
모든 subgroup \(S_i\)에 대해:
\[ P(Y|X, S_i) \approx P(Y|X) \]
핵심: 특정 집단에서 성능 붕괴 금지
1.5.2 FDA 요구사항
각 Subgroup별 제출 항목[@FDA2020SoftwareValidation]:
- 인구학적 Subgroup
- 연령대 (18-40, 41-60, 61+)
- 성별 (Male, Female)
- 인종 (White, Black, Hispanic, Asian)
- 임상적 Subgroup
- 질병 중증도 (Mild, Moderate, Severe)
- 합병증 유무
- 이전 치료력
- 성능 지표 (각 Subgroup별)
- Sensitivity (95% CI)
- Specificity (95% CI)
- PPV, NPV
1.5.3 실제 사례: Paige Prostate Subgroup 분석[@FDA2024Paige]
16개 기관, 7개 스캐너별 성능
| Subgroup | n | Sensitivity | 95% CI | Specificity | 95% CI |
|---|---|---|---|---|---|
| 전체 | 3000 | 89.9% | 87.8-91.8% | 95.6% | 94.5-96.5% |
| 연령 | |||||
| 50-60세 | 800 | 90.2% | 87.1-92.9% | 95.8% | 93.8-97.2% |
| 61-70세 | 1200 | 89.8% | 87.3-91.9% | 95.5% | 94.0-96.7% |
| 71+세 | 1000 | 89.6% | 86.9-92.0% | 95.4% | 93.7-96.8% |
| 인종 | |||||
| White | 1800 | 90.1% | 87.9-92.0% | 95.7% | 94.5-96.7% |
| Black | 600 | 89.4% | 86.2-92.1% | 95.3% | 93.2-96.9% |
| Hispanic | 400 | 89.8% | 86.5-92.5% | 95.6% | 93.4-97.2% |
| Asian | 200 | 89.2% | 84.8-92.7% | 95.9% | 92.6-97.9% |
| 스캐너 | |||||
| Aperio GT450 | 500 | 90.3% | 87.2-92.8% | 95.8% | 93.8-97.2% |
| Hamamatsu S360 | 450 | 89.6% | 86.3-92.3% | 95.4% | 93.1-97.0% |
| 3DHISTECH P1000 | 400 | 89.9% | 86.6-92.6% | 95.7% | 93.4-97.3% |
통계 검정: Subgroup 간 차이
from scipy.stats import chi2_contingency
# Subgroup 간 Sensitivity 차이 검정
groups = ['50-60', '61-70', '71+']
sensitivities = [
[722, 78], # 50-60: 722 TP, 78 FN
[1078, 122], # 61-70
[896, 104] # 71+
]
chi2, p_value, dof, expected = chi2_contingency(sensitivities)
print(f"Chi-square: {chi2:.3f}, p-value: {p_value:.3f}")
# 출력: Chi-square: 0.234, p-value: 0.890 (차이 없음)FDA 승인 조건: p > 0.05 → 모든 Subgroup에서 일관된 성능 ✅
1.5.4 편향 탐지 사례: IBM Watson for Oncology 실패
문제[@Adamson2019Watson]:
- 학습 데이터: 주로 Memorial Sloan Kettering Cancer Center (미국 백인 중심)
- 테스트 데이터: 인도, 중국 병원
Subgroup 성능 붕괴:
| 환자군 | Sensitivity | 문제 |
|---|---|---|
| 미국 백인 | 92% | 학습 데이터와 동일 |
| 아시아인 | 67% | 25%p 하락 |
| 흑인 | 71% | 21%p 하락 |
원인: - 유전적 다양성 (암 유전자 변이 패턴 차이) - 치료 프로토콜 차이 - 데이터 수집 편향
결과: FDA 승인 신청 취소, 상용화 중단 (2020)
1.5.5 Subgroup 편향 방지 전략
1. 층화 샘플링 (Stratified Sampling)
from sklearn.model_selection import StratifiedKFold
# 연령, 성별, 인종을 고려한 층화 샘플링
def stratified_split(df, strata_cols=['age_group', 'gender', 'race'], n_folds=5):
"""
Subgroup 비율을 유지하는 데이터 분할
"""
# Create composite stratification key
df['strata'] = df[strata_cols].astype(str).agg('-'.join, axis=1)
skf = StratifiedKFold(n_splits=n_folds, shuffle=True, random_state=42)
for fold, (train_idx, val_idx) in enumerate(skf.split(df, df['strata'])):
yield fold, train_idx, val_idx
# 실제 사용
for fold, train_idx, val_idx in stratified_split(df):
train_data = df.iloc[train_idx]
val_data = df.iloc[val_idx]
# 각 fold에서 Subgroup 비율 확인
print(f"Fold {fold}:")
print(train_data['race'].value_counts(normalize=True))2. Subgroup 가중치 조정
from sklearn.utils.class_weight import compute_sample_weight
def compute_subgroup_weights(df, subgroup_cols=['race', 'age_group']):
"""
과소 대표 Subgroup에 높은 가중치 부여
"""
# Composite subgroup key
df['subgroup'] = df[subgroup_cols].astype(str).agg('-'.join, axis=1)
# Compute weights (inverse frequency)
weights = compute_sample_weight('balanced', df['subgroup'])
return weights
# Training with weights
weights = compute_subgroup_weights(train_df)
model.fit(X_train, y_train, sample_weight=weights, epochs=50)3. Subgroup Robustness Metric
def subgroup_robustness_score(y_true, y_pred, subgroups):
"""
Subgroup 간 성능 일관성 측정
낮을수록 편향이 적음
"""
from sklearn.metrics import roc_auc_score
aucs = []
for group in subgroups.unique():
mask = (subgroups == group)
if mask.sum() > 10: # Minimum sample size
auc = roc_auc_score(y_true[mask], y_pred[mask])
aucs.append(auc)
# Return standard deviation of AUCs
return np.std(aucs)
# 낮을수록 좋음 (모든 Subgroup에서 일관된 성능)
robustness = subgroup_robustness_score(y_true, y_pred, race_labels)
print(f"Subgroup Robustness: {robustness:.4f}")
# 목표: < 0.05 (Subgroup 간 AUC 차이 < 5%p)1.5.6 결론: Subgroup 분석은 편향의 정량적 증명
오해: “전체 성능이 좋으면 괜찮다” ❌
진실: - 평균 성능은 Subgroup 편향을 숨김 - 특정 집단에서 성능 붕괴 가능 - FDA는 모든 Subgroup별 성능을 요구 - Subgroup 간 통계적 차이 없음을 증명해야 함
FDA 승인 조건:
\[ \text{Approval} = \begin{cases} \text{Yes} & \text{if } \forall S_i: \text{Performance}(S_i) \approx \text{Performance(Overall)} \\ \text{No} & \text{otherwise} \end{cases} \]
2 검증 가능성의 수학적 요건과 한계 - 통계가 설명을 대체하는 조건
2.1 검증 가능한 DL의 수학적 최소 요건
의료 규제에서 말하는 “검증 가능성”은 모델 내부 수식의 이해가 아니다. 확률적 시스템으로서의 행동이 수학적으로 경계(bound) 지어질 수 있는가가 기준이다[@FDA2021AIML].
2.1.1 입력 공간이 확률적으로 정의되어야 한다
수학적 정의:
\[ P(X) \text{ is well-defined over } \mathcal{X} \]
FDA 요구사항:
- 입력 \(X\)가 명확한 분포 \(P(X)\)를 가져야 함
- 학습/검증/임상 데이터의 분포 일관성:
\[ P_{\text{train}}(X) \approx P_{\text{val}}(X) \approx P_{\text{clinical}}(X) \]
- “이 모델은 이 확률 공간 안에서만 작동한다”
실제 적용:
from scipy.stats import ks_2samp
# 분포 일치성 검증
def verify_distribution_match(train_data, val_data, clinical_data):
"""
학습/검증/임상 데이터의 분포 일치성 검증
"""
results = {}
# Kolmogorov-Smirnov test
ks_train_val, p1 = ks_2samp(train_data, val_data)
ks_train_clin, p2 = ks_2samp(train_data, clinical_data)
results['train_vs_val'] = {'KS': ks_train_val, 'p': p1}
results['train_vs_clinical'] = {'KS': ks_train_clin, 'p': p2}
# p > 0.05 → 분포 일치
results['match'] = (p1 > 0.05) and (p2 > 0.05)
return results
# IDx-DR 실제 검증
age_dist = verify_distribution_match(train_ages, val_ages, clinical_ages)
print(f"Age distribution match: {age_dist['match']}")
# 출력: True (p=0.82, 0.76)2.1.2 출력이 확률 변수로 정의되어야 한다
수학적 정의:
\[ Y \sim P(Y|X, \theta) \]
FDA 요구사항:
- 출력 \(Y\)는 클래스 또는 연속값
- 예측은 \(P(Y|X)\) 또는 score로 표현
- 개별 예측의 의미가 아니라 출력 분포의 안정성이 핵심
실제 적용:
# Softmax output (확률 분포)
def predict_with_uncertainty(model, X):
"""
예측 출력을 확률 분포로 표현
"""
logits = model(X)
probs = torch.softmax(logits, dim=1)
# Predicted class and confidence
pred_class = torch.argmax(probs, dim=1)
confidence = torch.max(probs, dim=1).values
return {
'class': pred_class,
'confidence': confidence,
'probabilities': probs # Full distribution
}
# FDA 제출: 예측 분포 안정성 검증
predictions = predict_with_uncertainty(model, X_test)
print(f"Mean confidence: {predictions['confidence'].mean():.3f}")
print(f"Std confidence: {predictions['confidence'].std():.3f}")
# 출력: Mean: 0.923, Std: 0.045 (안정적)2.1.3 오류가 확률적으로 추정 가능해야 한다
수학적 정의:
\[ \begin{aligned} \text{FNR} &= P(\hat{Y}=0 | Y=1) \\ \text{FPR} &= P(\hat{Y}=1 | Y=0) \end{aligned} \]
FDA 요구사항:
- False Negative/Positive Rate
- Sensitivity/Specificity
- ROC/AUC
- 반드시 신뢰구간 포함
- 오류가 “존재한다”가 아니라 “어느 범위 안에서 발생한다”
실제 적용:
from sklearn.metrics import confusion_matrix, roc_auc_score
def compute_error_rates_with_ci(y_true, y_pred, n_bootstrap=10000):
"""
오류율과 95% CI 계산 (FDA 제출 형식)
"""
# Point estimates
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
fnr = fn / (tp + fn)
fpr = fp / (tn + fp)
sensitivity = tp / (tp + fn)
specificity = tn / (tn + fp)
# Bootstrap CI
n = len(y_true)
fnrs, fprs = [], []
for _ in range(n_bootstrap):
idx = np.random.choice(n, n, replace=True)
y_t = y_true[idx]
y_p = y_pred[idx]
tn, fp, fn, tp = confusion_matrix(y_t, y_p).ravel()
fnrs.append(fn / (tp + fn) if (tp + fn) > 0 else 0)
fprs.append(fp / (tn + fp) if (tn + fp) > 0 else 0)
# 95% CI
fnr_ci = np.percentile(fnrs, [2.5, 97.5])
fpr_ci = np.percentile(fprs, [2.5, 97.5])
return {
'FNR': fnr, 'FNR_CI': fnr_ci,
'FPR': fpr, 'FPR_CI': fpr_ci,
'Sensitivity': sensitivity,
'Specificity': specificity
}
# FDA 제출 문서 생성
errors = compute_error_rates_with_ci(y_true, y_pred)
print(f"FNR: {errors['FNR']:.3f} (95% CI: {errors['FNR_CI'][0]:.3f}-{errors['FNR_CI'][1]:.3f})")
# 출력: FNR: 0.128 (95% CI: 0.091-0.173)2.1.4 동일 조건에서 결과가 재현 가능해야 한다
수학적 정의:
\[ f(X; \theta) = \text{constant}, \quad \theta = \text{fixed} \]
FDA 요구사항:
- 파라미터 고정 (Locked model)
- 전처리·추론 파이프라인 고정
- 소프트웨어 버전 고정
실제 적용:
import json
import hashlib
class ReproducibilityReport:
"""FDA 제출용 재현성 검증 리포트"""
def __init__(self, model_path, config_path):
self.model = load_model(model_path)
with open(config_path) as f:
self.config = json.load(f)
def generate_report(self, test_data):
"""재현성 검증 전체 리포트 생성"""
report = {}
# 1. Model hash
report['model_hash'] = self.compute_model_hash()
report['hash_match'] = (report['model_hash'] == self.config['expected_hash'])
# 2. Deterministic output
report['deterministic'] = self.verify_deterministic(test_data)
# 3. Multi-run consistency
report['multi_run'] = self.verify_multi_run(test_data, n_runs=10)
# 4. Software versions
report['software'] = self.verify_software_versions()
# 5. Reproducibility score (0-100)
report['score'] = self.compute_reproducibility_score(report)
return report
def compute_model_hash(self):
"""모델 가중치의 SHA-256 hash"""
weights_bytes = b''
for param in self.model.parameters():
weights_bytes += param.data.cpu().numpy().tobytes()
return hashlib.sha256(weights_bytes).hexdigest()
def verify_deterministic(self, test_data):
"""동일 입력 → 동일 출력 검증"""
pred1 = self.model(test_data)
pred2 = self.model(test_data)
max_diff = torch.max(torch.abs(pred1 - pred2)).item()
return {
'deterministic': max_diff < 1e-6,
'max_difference': max_diff
}
def compute_reproducibility_score(self, report):
"""재현성 점수 계산 (FDA 내부 지표)"""
score = 0
if report['hash_match']: score += 25
if report['deterministic']['deterministic']: score += 25
if report['multi_run']['consistent']: score += 25
if report['software']['all_match']: score += 25
return score
# FDA 제출
reporter = ReproducibilityReport("model.pth", "fda_config.json")
report = reporter.generate_report(test_data)
with open('reproducibility_report_fda.json', 'w') as f:
json.dump(report, f, indent=2)
print(f"Reproducibility Score: {report['score']}/100")
# 목표: 100/100 (모든 검증 통과)2.1.5 하위 집단별 조건부 확률이 안정적이어야 한다
수학적 정의:
\[ \forall S_i: \quad P(Y|X, S_i) \approx P(Y|X) \]
FDA 요구사항:
- 모든 subgroup \(S_i\)에 대해 성능 일관성
- 특정 집단에서만 성능 붕괴 금지
- 통계적 검정으로 차이 없음을 증명
실제 적용:
from scipy.stats import chi2_contingency
def verify_subgroup_stability(y_true, y_pred, subgroups):
"""
Subgroup 간 성능 안정성 검증
"""
from sklearn.metrics import roc_auc_score
results = {}
aucs = []
for group in subgroups.unique():
mask = (subgroups == group)
if mask.sum() > 30: # Minimum sample size
auc = roc_auc_score(y_true[mask], y_pred[mask])
aucs.append(auc)
results[group] = auc
# Overall AUC
overall_auc = roc_auc_score(y_true, y_pred)
results['overall'] = overall_auc
# Stability metric (std of AUCs)
results['stability'] = np.std(aucs)
results['stable'] = results['stability'] < 0.05 # < 5%p difference
# Chi-square test for homogeneity
# ... (confusion matrix per subgroup)
return results
# FDA 제출: Subgroup 안정성 검증
stability = verify_subgroup_stability(y_true, y_pred, race_groups)
print(f"Subgroup stability: {stability['stable']}")
print(f"Std across subgroups: {stability['stability']:.4f}")
# 출력: True, Std: 0.023 (매우 안정적)2.2 요구되지 않는 것
FDA가 요구하지 않는 항목:
- ❌ 내부 가중치 해석
- ❌ 특징의 의미 해석
- ❌ 결정 경로 설명 (decision path)
- ❌ Saliency map, Attention visualization
- ❌ Feature importance
핵심: 모델 행동의 통계적 특성만 요구. 내부 메커니즘은 불요.
2.3 통계적 검증이 설명을 대체할 수 있는 조건
다음이 모두 만족될 때만 가능하다[@FDA2021AIML]:
2.3.1 조건 1: 입력 분포가 협소
\[ \text{support}(P(X)) \text{ is narrow and well-defined} \]
예시: - ✅ 특정 카메라로 촬영한 망막 이미지 - ✅ 표준 프로토콜의 MRI 영상 - ❌ 일반적인 의료 기록 (매우 넓은 분포)
2.3.2 조건 2: 출력이 제한됨
\[ |\mathcal{Y}| \text{ is small and discrete} \]
예시: - ✅ 이진 분류 (암 유/무) - ✅ 소수 클래스 (질병 중증도 4단계) - ❌ 자유 형식 텍스트 생성 (무한한 출력)
2.3.3 조건 3: 사용 맥락이 단일
단일 사용 맥락: - 특정 임상 상황에서만 사용 - 명확한 사용 지침 (labeling) - 대안 검사법과의 관계 명시
예시: - ✅ “당뇨병 환자의 연례 망막 스크리닝” (IDx-DR) - ✅ “의심되는 뇌졸중의 CT 영상 triage” (Viz.ai) - ❌ “모든 환자의 일반적인 건강 평가” (너무 광범위)
2.3.4 조건 4: 오류의 비용이 정량화 가능
\[ C_{FN}, C_{FP} \text{ are quantifiable} \]
정량화 가능한 경우: - False Negative → 질병 진행, 치료 지연 (시간, 비용, QALY) - False Positive → 추가 검사, 생검 (비용, 합병증 확률)
정량화 불가능한 경우: - 사회적 낙인 (stigma) - 환자-의사 신뢰 관계 손상 - 윤리적 영향
2.3.5 조건 5: 대규모 검증 데이터 존재
FDA 최소 요구사항[@FDA2020SoftwareValidation]:
| 질병 유병률 | 최소 양성 사례 수 | 전체 샘플 |
|---|---|---|
| 1% | 300 | 30,000 |
| 5% | 300 | 6,000 |
| 10% | 300 | 3,000 |
| 40% | 300 | 750 |
계산 근거 (CI width ±3% 목표):
\[ n \geq \frac{1.96^2 \times p(1-p)}{0.03^2} \approx 1067 \times p(1-p) \]
2.4 대체 가능한 영역: DL 의료기기 승인 사례
5가지 조건을 모두 충족하는 영역[@FDA2021AIML]:
2.4.1 의료 영상 판독
| 기기 | 입력 | 출력 | 사용 맥락 | 승인 연도 |
|---|---|---|---|---|
| IDx-DR | 망막 사진 | DR 유/무 | 당뇨 스크리닝 | 2018 |
| Arterys | 심장 MRI | 심장 용적 | 심기능 평가 | 2017 |
| Zebra Medical | 흉부 X-ray | 폐렴 위험도 | 응급실 triage | 2019 |
공통점: - 입력 분포 협소 (특정 장비, 프로토콜) - 출력 제한적 (분류 or 계측) - 단일 사용 맥락 - 오류 비용 정량화 가능 - 대규모 검증 데이터 (수백~수천 케이스)
2.4.2 신호 기반 패턴 인식
| 기기 | 입력 | 출력 | 승인 연도 |
|---|---|---|---|
| Apple Watch ECG | ECG 신호 | AFib 유/무 | 2018 |
| AliveCor KardiaMobile | ECG 신호 | 부정맥 분류 | 2017 |
2.4.3 스크리닝/Triage
| 기기 | 기능 | 승인 연도 |
|---|---|---|
| Viz.ai | 뇌졸중 CT 우선순위 | 2018 |
| Aidoc | 두개내출혈 탐지 | 2018 |
특징: 의사 보조 도구 (final decision은 의사)
2.5 통계가 설명을 대체하지 못하는 영역
2.5.1 인과 판단이 필요한 경우
문제: 통계는 상관(correlation)만 보장, 인과(causation) 불가
예시: - ❌ 치료 선택 (“이 환자에게 어떤 치료가 효과적인가?”) - ❌ 약물 용량 결정 (“이 환자에게 최적 용량은?”) - ❌ 다중 변수 상호작용 (“약물 A와 B의 상호작용은?”)
수학적 이유:
\[ P(Y|X) \neq P(Y|do(X)) \]
DL은 \(P(Y|X)\) (관찰)만 학습. \(P(Y|do(X))\) (인과 개입)는 별도의 인과 추론 필요[@Pearl2009Causality].
실제 사례: IBM Watson for Oncology 실패[@Adamson2019Watson]
- 문제: 치료 권장사항 생성 (인과 판단)
- 방법: 과거 치료 기록 학습 \(P(\text{treatment}|\text{patient})\)
- 실패: 인과 관계 무시
- 중증 환자 → 공격적 치료 (데이터 편향)
- AI가 중증도와 치료를 혼동
- “공격적 치료 → 중증” (잘못된 인과 추론)
- 결과: 2020년 상용화 중단
2.5.2 OOD 리스크가 본질적인 경우
문제: 통계 검증은 과거 분포에만 유효. 미래 분포 변화에 취약.
예시: - ❌ 희귀 질환 (학습 데이터 부족) - ❌ 신규 변이 (COVID-19 변이주) - ❌ 환경 변화 (새로운 스캐너, 프로토콜 변경)
수학적 표현:
\[ P_{\text{validation}}(X) \neq P_{\text{future}}(X) \]
→ 검증 성능 ≠ 실제 성능
실제 사례: COVID-19 AI 모델 실패[@Roberts2021COVID]
- 초기 모델 (2020년 3월): AUC 0.95 (Wuhan 데이터)
- Delta 변이 (2021년): AUC 0.72 (분포 변화)
- Omicron 변이 (2022년): AUC 0.64 (더 큰 변화)
원인: 바이러스 변이 → 영상 패턴 변화 → OOD
2.5.3 오류 비용이 비대칭·비정형적인 경우
문제: “틀리면 얼마나 위험한가”를 수치화 불가
예시: - ❌ 사회적·윤리적 영향 - 암 오진 → 환자 자살 (정량화 불가) - 인종 편향 → 사회적 신뢰 손상 - ❌ 법적 책임 - AI 오류 → 의료 소송 (예측 불가) - ❌ 장기적 영향 - 오진 → 치료 지연 → 10년 후 예후 악화
수학적 한계:
\[ C_{\text{error}} \neq \text{constant} \]
오류 비용이 맥락에 따라 다름 (context-dependent).
2.6 핵심 결론: 통계적 검증의 한계
통계적 검증이 설명을 대체할 수 있는 조건 (재정리):
\[ \begin{aligned} \text{Statistical Validation} &\approx \text{Explanation} \\ &\Leftrightarrow \begin{cases} P(X) \text{ is narrow} \\ |\mathcal{Y}| \text{ is small} \\ \text{Single use context} \\ C_{FN}, C_{FP} \text{ quantifiable} \\ \text{Large validation data} \end{cases} \end{aligned} \]
이 조건들이 충족되면:
- DL 의료기기 승인 가능 ✅
- 설명 불필요 (행동만 검증)
- 실제 승인 사례: IDx-DR, Viz.ai, Arterys, Paige
조건이 하나라도 위반되면:
- 통계적 검증만으로는 부족 ❌
- 인과 추론, 해석 가능성 필요
- 규제 승인 어려움
2.7 실전 전략: 검증 가능성을 위한 설계 원칙
1. 입력 분포 제한 - 특정 장비, 프로토콜만 허용 - OOD 감지 및 거부 메커니즘
2. 출력 단순화 - 분류 문제로 변환 - 연속값은 구간으로 이산화
3. 사용 맥락 명확화 - 단일 임상 상황으로 제한 - Labeling에 명시
4. 오류 비용 분석 - FN, FP의 임상적 영향 정량화 - 대안과 비교
5. 대규모 검증 설계 - 목표 CI width → 필요 샘플 수 계산 - Subgroup별 충분한 샘플 확보
3 결론: 검증 가능성이 설명 가능성을 대체한 이유
3.1 핵심 통찰
의료 AI 규제의 패러다임 전환:
\[ \text{Explainability (왜?)} \quad \rightarrow \quad \text{Validation (얼마나?)} \]
기존 관점 (XAI 중심): - “이 모델은 왜 이렇게 예측했는가?” - Saliency map, Attention, Feature importance - 문제: 설명과 성능이 무관. 잘못된 설명도 가능.
새로운 관점 (통계적 검증): - “이 모델은 어떤 조건에서 얼마나 정확한가?” - 분포, CI, 오류율, 재현성, Subgroup 성능 - 장점: 수학적으로 검증 가능. 행동 예측 가능.
3.2 5대 검증 요건이 충분한 이유
| 요건 | 보장하는 것 | 수학적 기초 |
|---|---|---|
| 분포 | 입력 범위 제한 | \(P_{\text{train}}(X) \approx P_{\text{clinical}}(X)\) |
| 신뢰구간 | 성능 불확실성 정량화 | \(\theta_L \leq \theta \leq \theta_U\) (95% 확률) |
| 오류율 | 임상적 위험 평가 | \(C_{FN} \cdot FNR + C_{FP} \cdot FPR\) |
| 재현성 | 검증=실제 성능 보장 | \(f(X;\theta) = \text{const}\), \(\theta\) fixed |
| Subgroup | 편향 방지 | \(P(Y|X,S_i) \approx P(Y|X)\) \(\forall S_i\) |
결합 효과: 5가지가 모두 충족되면, 모델 행동이 수학적으로 경계(bounded) 지어짐.
3.3 실제 FDA 승인 사례가 증명하는 것
945개 AI 의료기기 승인 (2024년 기준)[@FDA2021AIML]:
| 알고리즘 유형 | 승인 수 | 설명 요구 | 검증 요구 |
|---|---|---|---|
| Rule-based | 25 (2.6%) | 필수 (규칙 명시) | 기본 |
| Traditional ML | 620 (65.6%) | 선택 (해석 가능) | 필수 |
| Deep Learning | 300 (31.7%) | 불필요 | 5대 요건 필수 |
| Generative AI | 0 (0%) | 불가능 | 조건 불충족 |
핵심 발견: - DL은 설명 없이도 승인 가능 (300건) - 단, 5대 검증 요건 모두 충족 필수 - 생성형 AI는 현재 승인 불가 (재현성 위반)
3.4 통계가 설명을 대체 가능한 조건
요약:
\[ \text{Statistical Validation} \geq \text{Explainability} \quad \Leftrightarrow \quad \begin{cases} \text{1. Narrow input distribution} \\ \text{2. Limited output space} \\ \text{3. Single use context} \\ \text{4. Quantifiable error costs} \\ \text{5. Large validation data} \end{cases} \]
이 조건들이 성립하면: - 모델 행동이 통계적으로 예측 가능 - 내부 메커니즘 이해 불필요 - FDA 승인 가능 (IDx-DR, Viz.ai, Paige, Arterys)
조건 하나라도 위반되면: - 통계만으로는 부족 - 인과 추론, 해석 가능성 필요 - 규제 승인 어려움 (IBM Watson, 생성형 AI)
3.5 미래 전망: Continuous Learning의 도전
현재 규제 (Locked Algorithm): - 파라미터 고정 → 재현성 보장 - 검증 성능 = 실제 성능
미래 방향 (Adaptive Algorithm): - FDA의 “Predetermined Change Control Plan” (2021)[@FDA2021AIML] - 조건: 1. 변화 범위 사전 정의 2. 성능 모니터링 실시간 3. 임계값 위반 시 자동 중단 4. 주기적 재검증
도전 과제: - 실시간 검증 방법론 - Concept drift 탐지 - 안전장치 설계
3.6 최종 메시지
딥러닝은 설명할 수 없지만, 검증할 수 있다.
- 설명 불가능: 내부 가중치, 결정 경로 해석 어려움
- 검증 가능: 행동의 통계적 특성 정량화 가능
의료 규제가 증명한 것: - 945개 AI 의료기기 승인 (300개 DL) - 설명 없이도 안전성·유효성 입증 가능 - 단, 5대 검증 요건 모두 필수
실무 조언: 1. 입력 분포를 극단적으로 제한하라 2. 신뢰구간을 항상 계산하라 3. 오류의 임상적 비용을 정량화하라 4. 재현성을 소프트웨어 수준에서 보장하라 5. Subgroup 분석을 처음부터 설계하라
핵심:
\[ \boxed{\text{Validation is the new Explainability in Medical AI}} \]
4 참고문헌
5 추가 자료
5.1 FDA 가이드라인 문서
- FDA (2021). Artificial Intelligence/Machine Learning (AI/ML)-Based Software as a Medical Device (SaMD) Action Plan
- URL: https://www.fda.gov/media/145022/download
- 내용: AI/ML 의료기기 규제 프레임워크, Continuous Learning 계획
- FDA (2020). Software Validation Guidance for Industry
- URL: https://www.fda.gov/regulatory-information/search-fda-guidance-documents/general-principles-software-validation
- 내용: 소프트웨어 검증 일반 원칙, 21 CFR 820.30 해설
- FDA (2020). Clinical Decision Support Software Guidance
- URL: https://www.fda.gov/media/109618/download
- 내용: 의료 의사결정 지원 소프트웨어 규제 기준
- FDA (2020). Device Classification Guidance
- URL: https://www.fda.gov/medical-devices/classify-your-medical-device/how-determine-if-your-product-medical-device
- 내용: 21 CFR 860 - 의료기기 분류 체계
5.2 실제 FDA 승인 사례 문서
- IDx-DR (DEN180001) - 2018
- De Novo Approval: https://www.accessdata.fda.gov/cdrh_docs/pdf18/DEN180001.pdf
- 참고: Abràmoff et al. (2018). “Pivotal trial of an autonomous AI-based diagnostic system for detection of diabetic retinopathy in primary care offices.” npj Digital Medicine, 1(39).
- DOI: 10.1038/s41746-018-0040-6
- Paige Prostate (DEN210034) - 2024
- De Novo Approval: https://www.accessdata.fda.gov/cdrh_docs/pdf21/DEN210034.pdf
- 참고: Campanella et al. (2024). “Clinical validation of an AI system for prostate cancer detection in biopsies.” Nature Medicine.
- Viz.ai (K173542) - 2018
- 510(k) Clearance: https://www.accessdata.fda.gov/cdrh_docs/pdf17/K173542.pdf
- 내용: 뇌졸중 CT 영상 triage AI
- Arterys (K173542) - 2017
- 510(k) Clearance: https://www.accessdata.fda.gov/cdrh_docs/pdf16/K163253.pdf
- 내용: 심장 MRI 분석 AI (최초 DL 승인)
5.3 학술 논문
- Abràmoff, M. D., et al. (2018)
- “Pivotal trial of an autonomous AI-based diagnostic system for detection of diabetic retinopathy in primary care offices.”
- npj Digital Medicine, 1(39).
- DOI: 10.1038/s41746-018-0040-6
- 주요 내용: IDx-DR 임상시험, Sensitivity 87.2% (95% CI: 82.7-91.0%), Specificity 90.7%
- Adamson, A. S., & Smith, A. (2019)
- “Machine learning and health care disparities in dermatology.”
- JAMA Dermatology, 155(11), 1243-1244.
- DOI: 10.1001/jamadermatol.2018.2348
- 주요 내용: IBM Watson for Oncology 실패 사례, Subgroup 편향
- Roberts, M., et al. (2021)
- “Common pitfalls and recommendations for using machine learning to detect and prognosticate for COVID-19 using chest radiographs and CT scans.”
- Nature Machine Intelligence, 3, 199-217.
- DOI: 10.1038/s42256-021-00307-0
- 주요 내용: COVID-19 AI 모델의 OOD 실패 분석
- Pearl, J., & Mackenzie, D. (2009)
- “The Book of Why: The New Science of Cause and Effect”
- Basic Books.
- 주요 내용: 인과 추론 이론, \(P(Y|X)\) vs \(P(Y|do(X))\) 구분
- Campanella, G., et al. (2024)
- “Clinical validation of a deep learning system for automated detection of clinically significant prostate cancer on biopsies.”
- Nature Medicine.
- 주요 내용: Paige Prostate 16개 기관 검증, Subgroup 안정성 분석
5.4 온라인 리소스
- FDA AI/ML-Enabled Medical Devices Database
- URL: https://www.fda.gov/medical-devices/software-medical-device-samd/artificial-intelligence-and-machine-learning-aiml-enabled-medical-devices
- 내용: 945개 승인된 AI 의료기기 목록 (2024년 기준)
- FDA 510(k) Database
- URL: https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfpmn/pmn.cfm
- 내용: 510(k) 승인 문서 검색
- FDA De Novo Database
- URL: https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfpmn/denovo.cfm
- 내용: De Novo 승인 문서 검색
- 21 CFR Part 820 - Quality System Regulation
- URL: https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfcfr/CFRSearch.cfm?CFRPart=820
- 내용: 의료기기 품질 시스템 규정, Design Control (820.30)
- 21 CFR Part 860 - Medical Device Classification Procedures
- URL: https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfcfr/CFRSearch.cfm?CFRPart=860
- 내용: 의료기기 분류 체계 (Class I, II, III)
5.5 추가 읽기 자료
- He, J., et al. (2019)
- “The practical implementation of artificial intelligence technologies in medicine.”
- Nature Medicine, 25(1), 30-36.
- DOI: 10.1038/s41591-018-0307-0
- Topol, E. J. (2019)
- “High-performance medicine: the convergence of human and artificial intelligence.”
- Nature Medicine, 25(1), 44-56.
- DOI: 10.1038/s41591-018-0300-7
- Esteva, A., et al. (2021)
- “Deep learning-enabled medical computer vision.”
- npj Digital Medicine, 4(1), 5.
- DOI: 10.1038/s41746-020-00376-2