このリポジトリは、量子化された深層ニューラルネットワークのプライバシー評価のための研究用コードベースです。一般的な学習後量子化(PTQ)および量子化を考慮した学習(QAT)の設定下でターゲット/シャドウモデルを学習し、中間的な攻撃特徴量をディスクに保存し、メンバーシップ推論に関連する一連の攻撃と指標(例:MIA、RMIA、WhiteBoxMIA、WhiteBoxMIA_Partial)を実行することをサポートします。このコードベースはまた、防御されたモデル向けに Opacus ベースの差分プライバシー学習パス(例:提供されているサンプルスクリプトにおける dropout / DP / adversarial の各バリアント)を統合しています。
評価ワークフローは2つの段階に分かれています:(1) 学習(--training target|shadow|both)で save/<attack_method>/... の成果物を生成し、(2) 攻撃のみの評価(--training None)で保存された事後確率/モデルを読み込み、result/<attack_method>/... の下に指標を報告します。
一般的な実験には NVIDIA GPU をサポートするマシンが必要です。PyTorch には CUDA 12.1 のホイールの使用を推奨します(以下のコマンドを参照)。requirements.txt に固定されているバージョンに合わせるため、Python 3.10 を使用してください。
ほとんどの依存関係は次のコマンドでインストールできます:
conda create --name priv-qdnn python=3.10
conda activate priv-qdnn
pip install -r requirements.txt --extra-index-url https://download.pytorch.org/whl/cu121
注記:
--extra-index-url を付けずに pip install -r requirements.txt を実行してください(お使いのプラットフォームで PyPI の CPU ホイールが利用可能な場合)。aimet-torch のインストールが必要です(quantization/PTQ/adaround.py を参照)。お使いのプラットフォームで pip が aimet-torch を解決できない場合は、まず Qualcomm AIMET のインストール手順に従い、その後で残りの依存関係をインストールしてください。データセットはこのリポジトリに含まれていません。4 つがサポートされており、それぞれ必要なセットアップの量が異なります。
どちらも初回使用時に data/ へ取得されるため、手動の手順は不要です。初回の実験実行時にマシンがネットワークにアクセスできることだけ確認してください。
data/load_data.py 内の torchvision.datasets.CIFAR100(..., download=True) によってダウンロードされます。data/cinic10.py 内の fetch_cinic10() によって Edinburgh DataShare ミラーからダウンロードおよび展開されます。大きなアーカイブであるため、初回実行時には時間とディスク容量を見込んでおいてください。この 2 つには自動ダウンローダーがありません。生のアーカイブを取得し、data/<dataset>/raw/ の下に展開してから、ローダーが期待する .npy ファイルに変換してください。
| データセット | 生のアーカイブ |
|---|---|
| Texas100 | https://www.comp.nus.edu.sg/~reza/files/dataset_texas.tgz |
| Location | https://github.com/privacytrustlab/datasets(location セット) |
展開後の想定レイアウト:
data/texas/raw/texas/100/feats
data/texas/raw/texas/100/labels
data/location/raw/bangkok
次に、train/test の分割を構築します:
python data/prepare_tabular.py --dataset both
--dataset は texas、location、または both を受け付けます。--raw_root を使って別の場所を指定し(デフォルトは data/<dataset>/raw)、--test_size / --seed で分割を変更できます(デフォルトは 0.2 と 41)。
これにより、data/tabular_datasets.py が読み込むファイルが書き出されます:
data/<dataset>/{train_feats,train_labels,test_feats,test_labels}.npy
これらの .npy ファイルが存在しない場合、--dataset_name texas または --dataset_name location を使用する実行は、欠落しているパスを示す FileNotFoundError で失敗します。
attack: 攻撃の実装と評価エントリポイント(MIA、RMIA、WhiteBox_MIA など)。training: ターゲット/シャドウのトレーニングループと防御付きトレーニングのバリアント(DP / 敵対的ブランチ、ユーティリティ)。model: トレーニングと攻撃で使用されるモデル定義とラッパー。quantization: PTQ/QAT 量子化パイプラインとヘルパー(AIMET AdaRound 統合を含む)。data: データセットのダウンロードヘルパー、準備スクリプト、PyTorch の Dataset ラッパー。dp: DP トレーニングパスで使用される差分プライバシーユーティリティ。example: エンドツーエンド実験用のシェルスクリプト(MIA データ収集 + 攻撃のみの評価 / 防御)。experiment: 論文の分析の背後にあるメカニズム的研究 — LOOD 形式の記憶スコア(memorization.py)と勾配ノルム量子化テーブル(grad_norm_quantization_table.py、grad_norm_range_normalized_table.py)。plot: 論文用の図と表の生成。出力される PDF と CSV は plot/figures/ に保存されます。main.py: 統合 CLI エントリ(--training でトレーニングモードと攻撃のみのモードを切り替え)。parameter_parser.py: すべてのコマンドライン引数とデフォルト値。extract_last_layer_grad_norm.py: メンバーと非メンバーのサブセットに対する、最終層分類器の勾配のサンプルごとの L2 ノルム。experiment/ のテーブルで再利用されます。以下のパターンは、リポジトリの想定されるワークフローに一致します:MIA でトレーニングして save/MIA/... を生成し、その後 --training None を指定して MIA を実行します。
# Stage 1: train target + shadow and save MIA artifacts
python main.py \
--dataset_name cifar100 \
--net_name resnet18 \
--quantization hawq --a_bit 8 --w_bit 8 \
--attack_method MIA \
--training both \
--num_epochs 50 --trials 3 \
--device cuda:0
# Stage 2: attack-only MIA evaluation (confidence threshold attack only)
python main.py \
--dataset_name cifar100 \
--net_name resnet18 \
--quantization hawq --a_bit 8 --w_bit 8 \
--attack_method MIA \
--compleaknr_attacks confidence \
--training None \
--trials 3 \
--device cuda:0
各攻撃実行について、コンソールには対応する攻撃実装からの進捗が出力されます(例:MIA の試行ごとの指標。攻撃のみの実行は result/MIA/... に保存されます)。
--compleaknr_attacks は攻撃のみの MIA エントリを制御します:
confidence — 信頼度しきい値攻撃のみを実行します。保存済みの事後確率のみを消費するため高速で、モデルファイルは不要です。all(この引数のデフォルト)— 6 つのブラックボックス変種すべてを実行します:信頼度しきい値、エントロピーしきい値、修正エントロピー、2 つの学習ベース攻撃(事後確率に対する LR/RF、および事後確率とラベルに対する LR/RF)、そして SAMIA です。両モードでは要件が異なる点に注意してください。最初の 5 つの変種は保存済みの事後確率のみを読み込みますが、SAMIA はさらに保存済みのターゲットモデルとシャドウモデルを save/MIA/.../target/<trial>/model.pth および save/MIA/.../shadow/0/model.pth から読み込み、摂動入力に対してクエリを実行して出力感度を推定します。これはモデル出力のみを使用する(勾配や内部アクティベーションは使用しない)という意味では依然としてブラックボックスですが、これらのチェックポイントが存在する必要があり、かなり低速です。
--compleaknr_attacks を省略した場合、6 つすべてが実行されます。高速パスのみを希望する場合やモデルチェックポイントが利用できない場合は、上記のように confidence を明示的に指定してください。
以下を使用して、より大規模なスイープを再現することもできます:
bash example/MIA_cifar100_train.sh
bash example/MIA_cinic10_train.sh
bash example/defense/run_adv.sh
bash example/defense/run_dp.sh
bash example/defense/run_dropout.sh
bash example/RMIA.sh
クラスタに合わせて、これらのスクリプト内のデバイス ID (cuda:*) とハイパーパラメータを編集してください。
以下は、攻撃のみのモードで --compleaknr_attacks confidence を使用した、防御済みモデルの最小限の例です。
# Dropout defense (resnet18_drop010): train target, then black-box confidence attack
python main.py --training target --attack_method MIA --dataset cifar100 --net_name resnet18_drop010 --quantization Original --a_bit 32 --w_bit 32 --trials 1 --device cuda:0
python main.py --attack_method MIA --compleaknr_attacks confidence --dataset_name cifar100 --net_name resnet18_drop010 --quantization Original --a_bit 32 --w_bit 32 --training None --trials 1 --device cuda:0
# DP defense (resnet18_dp, eps=5.0): train target, then black-box confidence attack
python main.py --training target --attack_method MIA --dataset cifar100 --net_name resnet18_dp --quantization Original --a_bit 32 --w_bit 32 --num_epochs 20 --batch_size 512 --eps 5.0 --trials 1 --device cuda:0
python main.py --attack_method MIA --compleaknr_attacks confidence --dataset cifar100 --net_name resnet18_dp --quantization Original --a_bit 32 --w_bit 32 --training None --eps 5.0 --trials 1 --device cuda:0
# Adversarial defense (resnet18_adversarial): train target, then black-box confidence attack
python main.py --training target --attack_method MIA --dataset cifar100 --net_name resnet18_adversarial --quantization Original --a_bit 32 --w_bit 32 --num_epochs 50 --trials 1 --device cuda:0
python main.py --attack_method MIA --compleaknr_attacks confidence --dataset cifar100 --net_name resnet18_adversarial --quantization Original --a_bit 32 --w_bit 32 --training None --trials 1 --device cuda:0
量子化手法とビット幅を網羅的にスイープするには、以下を使用します:
example/defense/run_dropout.sh、example/defense/run_dp.sh、example/defense/run_adv.sh。
このリポジトリでは、2つのホワイトボックス攻撃エントリを提供しています:
WhiteBoxMIA: シャドウベースのホワイトボックスMIA(シャドウ特徴量で攻撃モデルを学習し、ターゲット特徴量で評価)。WhiteBoxMIA_Partial: ターゲットのみの分割モード(シャドウモデル不要。ターゲット特徴量を学習/テスト用に分割)。どちらも save/MIA/... から保存済みモデルを読み込むため、ステージ1の完了後に実行してください:
# WhiteBoxMIA (shadow mode)
python main.py \
--dataset_name cifar100 \
--net_name resnet18 \
--quantization hawq --a_bit 8 --w_bit 8 \
--attack_method WhiteBoxMIA \
--training None \
--trials 3 \
--device cuda:0
# WhiteBoxMIA_Partial (target-only split mode)
python main.py \
--dataset_name cifar100 \
--net_name resnet18 \
--quantization hawq --a_bit 8 --w_bit 8 \
--attack_method WhiteBoxMIA_Partial \
--training None \
--trials 3 \
--device cuda:0
結果は result/WhiteBoxMIA/... および result/WhiteBoxMIA_Partial/... に書き込まれます。