- Authors

- Name
- Youngju Kim
- @fjvbn20031
目次
- AIガバナンスフレームワーク概要
- EU AI Act: リスク分類体系
- NIST AI RMF & ISO 42001
- 責任あるAI開発の原則
- バイアス検出と緩和手法
- 説明可能AI (XAI)
- AIセーフティ技術
- データプライバシー技術
- AI規制の実務
- クイズ
AIガバナンスフレームワーク概要
AIシステムが社会全体に展開されるにつれ、ガバナンス体制の必要性が急速に高まっています。AIガバナンスとは、AIシステムの開発・展開・運用の全過程においてリスクを管理し、社会的価値と法的要件を満たすための方針・手続き・技術の総体です。
主要なグローバルフレームワーク:
| フレームワーク | 主体 | 主な特徴 |
|---|---|---|
| EU AI Act | 欧州連合 | 法的拘束力あり、リスクベースアプローチ |
| NIST AI RMF | 米国NIST | 任意ガイダンス、リスク管理 |
| ISO 42001 | ISO/IEC | 認証可能なAI経営システム |
| G7 AI原則 | G7各国 | 国際協力、非拘束的原則 |
| UNESCO AI倫理勧告 | UNESCO | 人権中心、世界的適用 |
EU AI Act: リスク分類体系
2024年に発効したEU AI Actは、世界初の包括的AI法令です。リスクベースアプローチを採用し、AIシステムを4段階のリスクレベルに分類します。
リスクレベルの分類
1. 許容不可能なリスク (Unacceptable Risk) — 禁止
- 公共空間でのリアルタイム遠隔生体認証(監視カメラによる顔認識など)
- ソーシャルスコアリングシステム
- 脆弱なグループを操作するための潜在意識技術
- 個人単位の予測型ポリシング
2. 高リスク (High-Risk) — 厳格な義務
- 医療診断支援、医療機器ソフトウェア
- 自動運転および重要インフラ
- 採用・人事評価システム
- 信用スコアリング・保険引受
- 司法・法執行支援ツール
- 教育評価システム
3. 限定的リスク (Limited Risk) — 透明性義務
- チャットボット: AIであることをユーザーに開示する必要あり
- ディープフェイクコンテンツ: 合成コンテンツであることの表示が必要
- 感情認識システム: 使用事実の告知
4. 最小リスク (Minimal Risk) — 自主規制
- スパムフィルター、ゲームAI
- AIベースの在庫管理など
EU AI Act リスク分類器の実装
from dataclasses import dataclass
from enum import Enum
from typing import List
class RiskLevel(Enum):
UNACCEPTABLE = "許容不可 (禁止)"
HIGH = "高リスク (厳格規制)"
LIMITED = "限定的リスク (透明性義務)"
MINIMAL = "最小リスク (自主規制)"
@dataclass
class AISystemProfile:
name: str
uses_biometric: bool
is_real_time: bool
public_space: bool
domain: str # healthcare, hiring, credit, education, judiciary, infrastructure
interacts_with_humans: bool
generates_synthetic_content: bool
def classify_eu_ai_act_risk(system: AISystemProfile) -> tuple[RiskLevel, List[str]]:
"""
EU AI Actリスク分類器。
Returns (RiskLevel, list_of_applicable_obligations)
"""
obligations = []
# ステップ1: 許容不可能なリスクの確認
if (system.uses_biometric and system.is_real_time and system.public_space):
return RiskLevel.UNACCEPTABLE, ["即時使用停止", "法的に禁止された対象"]
# ステップ2: 高リスクドメインの確認
HIGH_RISK_DOMAINS = {
"healthcare", "hiring", "credit",
"education", "judiciary", "critical_infrastructure"
}
if system.domain in HIGH_RISK_DOMAINS:
obligations = [
"適合性評価 (Conformity Assessment) 必須",
"技術文書化義務",
"人間による監視 (Human Oversight) 体制構築",
"透明性およびログ要件",
"バイアステストとデータガバナンス",
"EUデータベースへの登録",
]
return RiskLevel.HIGH, obligations
# ステップ3: 限定的リスク
if system.interacts_with_humans or system.generates_synthetic_content:
obligations = [
"ユーザーへのAIシステムであることの開示",
"合成コンテンツへのウォーターマークまたはラベル表示",
]
return RiskLevel.LIMITED, obligations
# ステップ4: 最小リスク
return RiskLevel.MINIMAL, ["自発的行動規範の推奨"]
# 使用例
credit_scoring_system = AISystemProfile(
name="自動信用スコアリングAI",
uses_biometric=False,
is_real_time=False,
public_space=False,
domain="credit",
interacts_with_humans=False,
generates_synthetic_content=False,
)
risk_level, obligations = classify_eu_ai_act_risk(credit_scoring_system)
print(f"システム: {credit_scoring_system.name}")
print(f"リスクレベル: {risk_level.value}")
print("義務事項:")
for ob in obligations:
print(f" - {ob}")
NIST AI RMF & ISO 42001
NIST AIリスク管理フレームワーク
NIST AI RMF (2023) は4つのコア機能で構成されています。
- GOVERN: AIリスク管理の文化と方針を確立する
- MAP: AIリスクのコンテキストを特定・分類する
- MEASURE: リスクを分析・評価・定量化する
- MANAGE: 優先順位に基づいてリスクに対応する
ISO/IEC 42001: AI経営システム
ISO 42001は、組織が責任を持ってAIを開発・展開するための経営システム規格です。ISO 9001(品質)やISO 27001(セキュリティ)と同様に、第三者認証を取得できます。
主要要件:
- AI方針と目標の確立
- リーダーシップの責任明確化
- リスクと機会の評価
- AI影響評価の実施
- 内部監査と継続的改善
責任あるAI開発の原則
FATEフレームワーク
Fairness (公平性): 類似した状況の人々を類似して扱う。特定のグループに不利益を与えない。
Accountability (説明責任): 意思決定の責任の所在を明確化する。「この決定に誰が責任を負うか?」
Transparency (透明性): AIシステムの動作方法、訓練データ、限界をステークホルダーに開示する。
Explainability (説明可能性): 個別の予測の根拠を人間が理解できる言語で説明する。
G7広島AIプロセス原則 (2023)
- 法の支配と人権の尊重
- 透明性と説明可能性
- 公平性と非差別
- 人間による監視と制御
- プライバシー保護
- サイバーセキュリティ
- 情報共有とインシデント報告
バイアス検出と緩和手法
AIモデルのバイアスは、訓練データの歴史的不平等、特徴量選択の誤り、ラベリングミス、フィードバックループなどから生じます。
主要な公平性指標
人口統計的同等性 (Demographic Parity): 保護グループ間でポジティブ予測率が等しくなければならない。 P(Y_hat=1 | A=0) = P(Y_hat=1 | A=1)
機会の平等 (Equal Opportunity): 実際にポジティブなサンプルに対する真陽性率 (TPR) が保護グループ間で等しくなければならない。 P(Y_hat=1 | Y=1, A=0) = P(Y_hat=1 | Y=1, A=1)
キャリブレーション (Calibration): 予測確率が実際の陽性率と一致していなければならない(グループ別に)。
個人の公平性 (Individual Fairness): 類似した個人は類似して扱われるべきである。
AIF360によるバイアス検出
import numpy as np
import pandas as pd
from aif360.datasets import BinaryLabelDataset
from aif360.metrics import BinaryLabelDatasetMetric, ClassificationMetric
from aif360.algorithms.preprocessing import Reweighing
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
# 1. データ準備 (ローン審査シナリオ)
np.random.seed(42)
n = 1000
data = pd.DataFrame({
'income': np.random.normal(50000, 20000, n).clip(10000, 150000),
'credit_score': np.random.normal(680, 100, n).clip(300, 850),
'age': np.random.randint(20, 70, n),
'gender': np.random.choice([0, 1], n, p=[0.5, 0.5]), # 0=female, 1=male
'loan_approved': np.zeros(n, dtype=int)
})
# 人工的なバイアスの注入: 男性の承認確率が高く設定
prob = 0.3 + 0.2 * data['gender'] + 0.3 * (data['credit_score'] > 700).astype(int)
data['loan_approved'] = (np.random.random(n) < prob).astype(int)
# 2. AIF360データセットの作成
aif_dataset = BinaryLabelDataset(
df=data,
label_names=['loan_approved'],
protected_attribute_names=['gender'],
favorable_label=1,
unfavorable_label=0,
)
# 3. バイアス測定
privileged_groups = [{'gender': 1}] # 男性
unprivileged_groups = [{'gender': 0}] # 女性
dataset_metric = BinaryLabelDatasetMetric(
aif_dataset,
unprivileged_groups=unprivileged_groups,
privileged_groups=privileged_groups,
)
print("=== 元データのバイアス分析 ===")
print(f"Disparate Impact: {dataset_metric.disparate_impact():.4f}")
print(f"Statistical Parity Difference: {dataset_metric.statistical_parity_difference():.4f}")
# Disparate Impact < 0.8 → 80%ルール違反 (バイアスあり)
# 4. Reweighingによる前処理バイアス緩和
rw = Reweighing(
unprivileged_groups=unprivileged_groups,
privileged_groups=privileged_groups,
)
dataset_reweighed = rw.fit_transform(aif_dataset)
metric_reweighed = BinaryLabelDatasetMetric(
dataset_reweighed,
unprivileged_groups=unprivileged_groups,
privileged_groups=privileged_groups,
)
print("\n=== Reweighing後のバイアス分析 ===")
print(f"Disparate Impact: {metric_reweighed.disparate_impact():.4f}")
print(f"Statistical Parity Difference: {metric_reweighed.statistical_parity_difference():.4f}")
Fairlearnによる後処理緩和
from fairlearn.postprocessing import ThresholdOptimizer
from fairlearn.metrics import MetricFrame, selection_rate, demographic_parity_difference
from sklearn.ensemble import GradientBoostingClassifier
# モデルの訓練
X = data[['income', 'credit_score', 'age']].values
y = data['loan_approved'].values
sensitive = data['gender'].values
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
base_model = GradientBoostingClassifier(n_estimators=100, random_state=42)
base_model.fit(X_scaled, y)
# ThresholdOptimizer: グループ別の決定閾値を最適化
postprocess_est = ThresholdOptimizer(
estimator=base_model,
constraints="demographic_parity",
predict_method="predict_proba",
objective="balanced_accuracy_score",
)
postprocess_est.fit(X_scaled, y, sensitive_features=sensitive)
y_pred_fair = postprocess_est.predict(X_scaled, sensitive_features=sensitive)
# 公平性指標の測定
mf = MetricFrame(
metrics={"selection_rate": selection_rate},
y_true=y,
y_pred=y_pred_fair,
sensitive_features=sensitive,
)
print("\n=== Fairlearn後処理結果 ===")
print(f"グループ別選択率:\n{mf.by_group}")
print(f"Demographic Parity Difference: {demographic_parity_difference(y, y_pred_fair, sensitive_features=sensitive):.4f}")
説明可能AI (XAI)
SHAP: SHapley Additive exPlanations
SHAPは協力ゲーム理論のShapley値を活用して、各特徴量が予測値に寄与する程度を計算します。すべての特徴量部分集合(コアリション)において、特定の特徴量を追加した際の限界寄与度の平均を測定します。
import shap
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
# モデルの訓練
X_train, y_train = make_classification(
n_samples=500, n_features=8, n_informative=5, random_state=42
)
feature_names = [
'income', 'credit_score', 'age', 'debt_ratio',
'employment_years', 'num_accounts', 'late_payments', 'loan_amount'
]
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
# SHAP TreeExplainer (ツリーベースモデル専用、高速)
explainer = shap.TreeExplainer(rf_model)
shap_values = explainer.shap_values(X_train)
# 個別予測の説明 (ウォーターフォールプロット)
sample_idx = 0
shap.waterfall_plot(
shap.Explanation(
values=shap_values[1][sample_idx],
base_values=explainer.expected_value[1],
data=X_train[sample_idx],
feature_names=feature_names,
)
)
# グローバル重要度 (サマリープロット)
shap.summary_plot(shap_values[1], X_train, feature_names=feature_names)
# SHAP相互作用効果
shap_interaction = explainer.shap_interaction_values(X_train[:100])
print(f"Income-CreditScore相互作用SHAP: {shap_interaction[0, 0, 1]:.4f}")
LIME: ローカル解釈可能モデル非依存説明
import lime
import lime.lime_tabular
import numpy as np
# LIME説明器の作成
lime_explainer = lime.lime_tabular.LimeTabularExplainer(
training_data=X_train,
feature_names=feature_names,
class_names=['否決', '承認'],
mode='classification',
discretize_continuous=True,
)
# 個別サンプルの説明
explanation = lime_explainer.explain_instance(
data_row=X_train[0],
predict_fn=rf_model.predict_proba,
num_features=6,
num_samples=1000,
)
print("=== LIME説明 (サンプル #0) ===")
for feature, weight in explanation.as_list():
direction = "増加" if weight > 0 else "減少"
print(f" {feature}: {weight:+.4f} (承認確率を{direction})")
explanation.show_in_notebook(show_table=True)
モデルカード生成
import json
from datetime import datetime
def generate_model_card(
model_name: str,
version: str,
intended_use: str,
out_of_scope_uses: list,
training_data: dict,
evaluation_results: dict,
fairness_analysis: dict,
limitations: list,
ethical_considerations: list,
) -> dict:
"""標準モデルカード生成器 (Mitchell et al. 2019に基づく)。"""
model_card = {
"model_details": {
"name": model_name,
"version": version,
"date": datetime.now().strftime("%Y-%m-%d"),
"type": "Binary Classifier",
"paper": "https://arxiv.org/abs/1810.03993",
},
"intended_use": {
"primary_uses": intended_use,
"primary_users": ["信用審査担当者", "金融規制機関"],
"out_of_scope_uses": out_of_scope_uses,
},
"factors": {
"relevant_factors": ["gender", "age_group", "income_bracket"],
"evaluation_factors": ["demographic_parity", "equal_opportunity"],
},
"metrics": {
"performance_measures": evaluation_results,
"decision_thresholds": {"default": 0.5, "high_precision": 0.7},
},
"training_data": training_data,
"fairness_analysis": fairness_analysis,
"limitations": limitations,
"ethical_considerations": ethical_considerations,
"caveats_recommendations": [
"定期的なドリフト監視を推奨",
"四半期ごとのバイアス再評価が必須",
"高リスクな決定には人間のレビューを併用",
],
}
return model_card
card = generate_model_card(
model_name="個人ローン審査モデル v2.1",
version="2.1.0",
intended_use="個人ローン申請の初期審査の自動化",
out_of_scope_uses=["法人向けローン審査", "保険料算定", "雇用判断"],
training_data={"size": 50000, "period": "2020-2024", "source": "社内ローン履歴"},
evaluation_results={"accuracy": 0.84, "AUC": 0.91, "F1": 0.82},
fairness_analysis={
"demographic_parity_diff": 0.03,
"equal_opportunity_diff": 0.02,
"disparate_impact": 0.96,
},
limitations=["2020年以前のデータ未収録", "農村地域の代表性不足"],
ethical_considerations=["最終決定は必ず担当者がレビュー", "否決理由の開示義務"],
)
print(json.dumps(card, ensure_ascii=False, indent=2))
AIセーフティ技術
Constitutional AI (Anthropic)
Constitutional AIは、明示された原則集合(「憲法」)に基づいてモデルが自身の応答を批評・修正するように訓練する手法です。
動作の仕組み:
- モデルが潜在的に有害な応答を生成
- 憲法原則に基づく自己批評 (self-critique) を実行
- 原則に準拠する方向で応答を修正
- 修正された応答でRLHF訓練
RLHF (人間フィードバックによる強化学習)
1. SFT (教師あり微調整): 高品質なデモンストレーションデータでベースモデルを微調整
2. 報酬モデリング: 人間の好みペア (preferred vs rejected) で報酬モデルを訓練
3. RL最適化: PPOアルゴリズムで報酬を最大化 (KLダイバージェンス制約付き)
ジェイルブレイク防御技術
- 入力フィルタリング: 有害パターンを事前に検出してブロック
- プロンプトインジェクション防御: システムプロンプトとユーザー入力を分離
- 出力監視: 生成テキストのリアルタイム安全性チェック
- レッドチーミング: 攻撃者役の専門家チームが脆弱性を体系的に探索
AIウォーターマーキング
テキストウォーターマーキングは、LLM生成テキストに統計的に検出可能なパターンを埋め込みます。
import hashlib
import random
def green_red_watermark(text: str, key: str, gamma: float = 0.25) -> dict:
"""
Kirchenbauer et al. (2023) 方式のグリーン/レッドリストウォーターマーキング。
前のトークンをシードとしてトークンをグリーン/レッドに分類し、
生成時にグリーントークンを優先してウォーターマークを埋め込む。
"""
words = text.split()
green_count = 0
total = len(words)
for i, word in enumerate(words):
prev_token = words[i - 1] if i > 0 else "<s>"
seed = int(hashlib.sha256(f"{key}{prev_token}".encode()).hexdigest(), 16) % (2**32)
random.seed(seed)
is_green = random.random() > (1 - gamma)
if is_green:
green_count += 1
z_score = (green_count - gamma * total) / ((gamma * (1 - gamma) * total) ** 0.5 + 1e-9)
return {
"green_token_ratio": green_count / total,
"z_score": z_score,
"is_watermarked": z_score > 4.0,
}
データプライバシー技術
差分プライバシー (Differential Privacy)
差分プライバシーはデータベースにノイズを加えることで、個別レコードの包含有無を統計的に隠します。イプシロン (epsilon) が小さいほど、より強いプライバシー保護を提供します。
import torch
import torch.nn as nn
from opacus import PrivacyEngine
from torch.utils.data import DataLoader, TensorDataset
# モデル定義
class SimpleNet(nn.Module):
def __init__(self):
super().__init__()
self.fc = nn.Sequential(
nn.Linear(10, 64),
nn.ReLU(),
nn.Linear(64, 2),
)
def forward(self, x):
return self.fc(x)
# 合成データ
X = torch.randn(1000, 10)
y = torch.randint(0, 2, (1000,))
dataset = TensorDataset(X, y)
loader = DataLoader(dataset, batch_size=64, shuffle=True)
model = SimpleNet()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
# Opacus PrivacyEngineの適用
privacy_engine = PrivacyEngine()
model, optimizer, loader = privacy_engine.make_private_with_epsilon(
module=model,
optimizer=optimizer,
data_loader=loader,
target_epsilon=1.0, # epsilon: 小さいほど強いプライバシー
target_delta=1e-5, # delta: epsilon違反の確率
max_grad_norm=1.0, # クリッピング閾値
epochs=10,
)
# 訓練ループ
criterion = nn.CrossEntropyLoss()
for epoch in range(3):
for batch_X, batch_y in loader:
optimizer.zero_grad()
outputs = model(batch_X)
loss = criterion(outputs, batch_y)
loss.backward()
optimizer.step()
epsilon = privacy_engine.get_epsilon(delta=1e-5)
print(f"訓練完了: epsilon = {epsilon:.2f}, delta = 1e-5")
print(f"プライバシー保証: 個別データの寄与は e^{epsilon:.2f} 倍以内に制限")
連合学習 (Federated Learning)
連合学習は生データを中央サーバーに送信せず、各クライアントがローカルで訓練したモデルの重み(勾配)のみを共有します。
import copy
import numpy as np
def federated_averaging(global_model_weights, client_updates, client_data_sizes):
"""
FedAvgアルゴリズム: データサイズに基づく加重平均集約。
"""
total_data = sum(client_data_sizes)
averaged_weights = {}
for key in global_model_weights.keys():
weighted_sum = sum(
client_updates[i][key] * (client_data_sizes[i] / total_data)
for i in range(len(client_updates))
)
averaged_weights[key] = weighted_sum
return averaged_weights
# GDPR AI適用チェックリスト
gdpr_ai_checklist = {
"データ最小化": "モデル訓練に必要な最小限のデータのみ収集",
"目的制限": "訓練データを明示された目的以外に使用禁止",
"データ主体の権利": "自動化決定に対する説明要求権の保障 (Article 22)",
"プロファイリング制限": "自動プロファイリングに基づく重要決定への人間レビュー義務",
"データポータビリティ": "個人が自身のデータをポータブル形式で受け取る権利",
"削除権": "モデルから個人データの影響を除去する権利 (Machine Unlearning)",
}
for right, description in gdpr_ai_checklist.items():
print(f"[GDPR] {right}: {description}")
AI規制の実務
モデル監査プロセス
- 監査範囲の定義: 対象モデル、期間、ユースケースの明確化
- 文書レビュー: 訓練データの出所、モデルカード、システムカードのレビュー
- 技術テスト: バイアス測定、堅牢性テスト、敵対的攻撃シミュレーション
- ステークホルダーインタビュー: 運用チーム、影響を受けるグループの代表者、規制担当者
- 監査報告書作成: 発見事項、リスクレベル、推奨対処策
AI倫理委員会の構成
効果的なAI倫理委員会には以下の役割が含まれるべきです。
| 役割 | 必要な専門性 |
|---|---|
| AI/ML技術専門家 | モデルの動作原理を理解する |
| 法務/コンプライアンス | 規制要件を解釈する |
| 倫理学者/哲学者 | 価値の衝突を調整する |
| ドメイン専門家 | 適用分野のコンテキストを提供する |
| 影響を受けるグループの代表者 | 実際の影響を反映する |
| サイバーセキュリティ専門家 | セキュリティリスクを評価する |
リスク評価テンプレート
from dataclasses import dataclass, field
from typing import List
from enum import IntEnum
class Severity(IntEnum):
LOW = 1
MEDIUM = 2
HIGH = 3
CRITICAL = 4
class Likelihood(IntEnum):
RARE = 1
UNLIKELY = 2
POSSIBLE = 3
LIKELY = 4
@dataclass
class AIRisk:
risk_id: str
description: str
severity: Severity
likelihood: Likelihood
affected_groups: List[str]
mitigation: str
owner: str
residual_risk: str = "TBD"
@property
def risk_score(self) -> int:
return self.severity * self.likelihood
@property
def risk_level(self) -> str:
score = self.risk_score
if score >= 12:
return "CRITICAL"
elif score >= 8:
return "HIGH"
elif score >= 4:
return "MEDIUM"
return "LOW"
# リスク登録簿の例
risks = [
AIRisk(
risk_id="RISK-001",
description="信用モデルの性別バイアスによるローン否決差別",
severity=Severity.HIGH,
likelihood=Likelihood.POSSIBLE,
affected_groups=["女性", "ノンバイナリー"],
mitigation="Reweighing + 四半期ごとのdisparate impact監視",
owner="AI倫理チーム",
),
AIRisk(
risk_id="RISK-002",
description="モデル決定の説明不可によるGDPR Article 22違反",
severity=Severity.CRITICAL,
likelihood=Likelihood.LIKELY,
affected_groups=["全ローン申請者"],
mitigation="SHAPベースの決定説明システムの構築",
owner="コンプライアンスチーム",
),
]
print("=== AIリスク登録簿 ===")
for risk in risks:
print(f"\n[{risk.risk_id}] {risk.description}")
print(f" リスクレベル: {risk.risk_level} (スコア: {risk.risk_score})")
print(f" 緩和策: {risk.mitigation}")
クイズ
Q1. EU AI Actで生体認証システムが高リスク (High-Risk) に分類される条件は?
答え: リアルタイム+公共空間+遠隔生体認証の3条件が同時に満たされると、許容不可能なリスク (Unacceptable Risk) として禁止されます。ただし、行方不明の子供の捜索など法執行機関による特定の例外が適用されます。非リアルタイムまたは事後分析目的の生体認証、あるいは司法・国境管理で使用されるものは高リスク (High-Risk) に分類され、適合性評価などの厳格な規制が適用されます。
解説: EU AI Act 附則IIIは、法執行・司法・国境管理で使用される遠隔生体認証システムを高リスクAIとして明示しています。公共空間でのリアルタイム遠隔生体認証はArticle 5により原則禁止されています。
Q2. Demographic parityとEqual opportunity公平性指標の違いとトレードオフは?
答え: Demographic parityは保護グループ間でポジティブ予測率 (P(Y_hat=1)) が等しくなければならないという基準です。Equal opportunityは実際にポジティブなサンプル (Y=1) のうち、ポジティブと予測される割合 (TPR) が等しくなければならないという基準です。
解説: Chouldechova (2017) の不可能性定理によると、グループ間で基礎率 (base rate) が異なる場合、demographic parity、equal opportunity、predictive parityを同時に満たすことは数学的に不可能です。したがって、使用コンテキストと潜在的な害の性質に基づいて、どの公平性基準を優先するかを明示的に決定する必要があります。
Q3. SHAPが特徴量重要度を計算するゲーム理論的原理は?
答え: SHAPは協力ゲーム理論のShapley値に基づいています。各特徴量を「プレイヤー」、モデルの予測値を「報酬」として、すべての可能な特徴量部分集合 (コアリション) において特定の特徴量を追加した際の限界寄与度の平均を計算します。
解説: Shapley値は、効率性(全特徴量のSHAPの合計 = 予測値 - 期待値)、対称性、加算性、ダミー特性の4つの公理を満たす唯一の配分方法です。LIMEとは異なり、SHAPはグローバルな一貫性を保証します。TreeSHAPはツリーベースモデルでO(TLD^2)の効率的な計算を提供します。
Q4. 差分プライバシーでイプシロン (epsilon) 値が小さいほどプライバシーが強化される理由は?
答え: epsilonは「1つのデータポイントの包含有無が出力分布を最大 e^epsilon 倍変化させる可能性がある」という上限を定義します。epsilonが0に近いほど、データの包含有無に関係なく出力分布がほぼ同一になり、個別情報が推測されなくなります。
解説: epsilon=0は完全なプライバシー(完全にランダムな出力)、epsilonが大きいと実用的だがプライバシー保護が弱くなります。実務では1以下を強いプライバシー、10以下を実用的なプライバシーとみなします。Opacus (PyTorch) やTensorFlow Privacyなどのライブラリが必要なノイズスケールとepsilonを自動計算します。
Q5. モデルカード (Model Card) に含めるべき重要情報項目は?
答え: モデル詳細 (名前・バージョン・種別)、意図された使用と範囲外の使用、評価要素 (保護属性)、性能指標 (精度・AUCなど)、訓練データの説明、公平性分析結果、制限事項と注意事項、倫理的考慮事項。
解説: Mitchell et al. (2019) が提案したモデルカードはAI透明性の標準として定着しています。Google、Hugging Faceなど主要企業がモデルリリース時にモデルカードを公開しています。EU AI Act高リスクAIは附則IVの技術文書化義務において、モデルカードに相当する情報を含める必要があります。