Adversarial Robustness Toolbox(ART)は、AI*1セキュリティのためのPythonライブラリです。
ARTを使用することで、AIに対する攻撃手法(敵対的サンプル攻撃、データ汚染攻撃、モデル抽出、メンバーシップ推論など)とそれらに対する防御手法を検証することができます。攻撃からAIを守るためには、攻撃のメカニズムと適切な防御手法の理解が必要です。そこで本コラムでは、ARTを通してAIの安全を確保する技術を学んでいきます。

第7回は、メンバーシップ推論攻撃の対策の一つである信頼スコアのフィルタリングを実践します。
第6回で見てきたように、メンバーシップ推論攻撃は、入力データに対する分類器の応答(信頼スコア)を基に、攻撃ネットワークでメンバーシップか否かを判定する攻撃でした。そこで、信頼スコアのフィルタリングでは、分類器が応答する信頼スコアをフィルタに通し、生の信頼スコアを応答しないようにすることで、メンバーシップ推論の精度を低下させます。フィルタには様々な種類が存在しており、例えば、最も大きい信頼スコアのみを応答するClass Labelsや、信頼スコアの桁数を丸めるRounded、閾値以上の信頼スコアのみを応答するHigh Confidenceなどがあります。

下図は、分類器が応答する信頼スコアをフィルタリングすることで、信頼スコアに変化を加えている様子を表しています。

  • 分類器が応答する信頼スコアにフィルタ処理を施している様子

このように信頼スコアに変化を加えることで、メンバーシップ推論の精度を低下させる効果が期待できます。
今回は、ARTに実装されているPostprocessorを使用し、信頼スコアのフィルタリングを実践します。

*1..本コラムにおけるAIの定義
本コラムでは、画像分類や音声認識など、通常は人間の知能を必要とする作業を行うことができるコンピュータシステム、とりわけ機械学習を使用して作成されるシステム全般を「AI」と呼称することにします。
注意
本コラムは、AIの安全を確保する技術を理解していただくために書かれています。本コラムの内容を検証する場合は、必ずご自身の管理下にあるシステムにて、ご自身の責任の下で実行してください。許可を得ずに第三者のシステムで実行した場合、法律により罰せられる可能性があります。

本コラムの内容を深く理解するには、メンバーシップ推論の基本知識を有していることが好ましいです
メンバーシップ推論をご存じでない方は、事前にAIセキュリティ超入門:第4回 AIのプライバシー侵害 – メンバーシップ推論 –をご覧ください。

ハンズオン

本コラムは、実践を通じてARTを習得することを重視するため、ハンズオン形式で進めていきます。

ハンズオンは、皆様のお手元の環境、または、筆者らが用意したGoogle Colaboratory*2にて実行いただけます。
Google Colaboratoryを利用してハンズオンを行いたい方は、以下のURLにアクセスしましょう。

Google Colaboratory:ART超入門 – 第7回:信頼スコアのフィルタリング –

*2:Colaboratoryを使用するために
Google Colaboratoryを利用するためにはGoogleアカウントが必要です。
お持ちでない方は、お手数ですが、先にGoogleアカウントの作成をお願いします。

お手元の環境でハンズオンを行いたい方は、以下の解説に沿ってコードを実行してください。

事前準備

ARTのインストール

ARTはPythonの組み込みライブラリではないため、インストールします。

# [1-1]
# ARTのインストール。
pip3 install adversarial-robustness-toolbox

ライブラリのインポート

ARTや分類器の構築に必要なライブラリをインポートします。
本ハンズオンでは、TensorFlowに組み込まれているKerasを使用して画像分類器を構築するため、Kerasのクラスをインポートします。

また、ARTでメンバーシップ推論攻撃を実行するクラスMembershipInferenceBlackBoxや、各種フィルタ(ClassLabelsHighConfidenceなど)をインポートします。

# [1-2]
# 必要なライブラリのインポート
import os
import h5py
import random
import numpy as np
import matplotlib.pyplot as plt

# TensorFlow with Keras.
import tensorflow as tf
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dense, Conv2D
from tensorflow.keras.layers import MaxPooling2D, GlobalAveragePooling2D, Dropout
tf.compat.v1.disable_eager_execution()

# ART
from art.defences.postprocessor import ClassLabels, GaussianNoise, HighConfidence, ReverseSigmoid, Rounded
from art.attacks.inference.membership_inference import MembershipInferenceBlackBox
from art.estimators.classification import KerasClassifier

データセットのロード

標的とする画像分類器の学習データとして、CIFAR10を使用します。

# [1-3]
# CIFAR10のロード。
(X_train, y_train), (X_test, y_test) = tf.keras.datasets.cifar10.load_data()

# CIFAR10のラベル。
classes = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
num_classes = len(classes)

CIFAR10の収録画像を確認します。
ロードしたデータセットから25枚の画像をランダム抽出し、画面上に表示します。

# [1-4]
# データセットの可視化。
show_images = []
for _ in range(5 * 5):
    show_images.append(X_train[random.randint(0, len(X_train))])

for idx, image in enumerate(show_images):
    plt.subplot(5, 5, idx + 1)
    plt.imshow(image)

# 学習データ数、テストデータ数を表示。
print(X_train.shape, y_train.shape)

CIFAR10には'airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck'の10クラスの画像が60,000枚収録されています。
内訳は学習データ:50,000枚、テストデータ:10,000枚収録されており、各画像は32×32ピクセルのRGB形式です。

データセットの前処理

データセットを正規化し、ラベルをOne-hot-vector形式に変換します。

# [1-5]
# 正規化。
X_train = X_train.astype('float32') / 255
X_test = X_test.astype('float32') / 255

# ラベルをOne-hot-vector化。
y_train = tf.keras.utils.to_categorical(y_train, num_classes)
y_test = tf.keras.utils.to_categorical(y_test, num_classes)

データセットの分割

データセットを以下の通り2分割します。

  • Target-In:画像分類器の学習に使用するデータセット。
  • Target-Out:画像分類器の学習に使用しないデータセット。
# [1-6]
# データセットの分割。
X_train_target_in = X_train[:25000]
X_train_target_out = X_train[25000:]
y_train_target_in = y_train[:25000]
y_train_target_out = y_train[25000:]
print('Target-In: ', X_train_target_in.shape, y_train_target_in.shape)
print('Target-Out: ', X_train_target_out.shape, y_train_target_out.shape)

攻撃対象モデルの作成

メンバーシップ推論攻撃の標的とする画像分類器を作成します。

モデルの定義

本ハンズオンでは、以下に示すCNN(Convolutional Neural Network)を定義します。

# [1-7]
# モデルの定義。
inputs = Input(shape=(32, 32, 3))
x = Conv2D(64, (3, 3), padding='SAME', activation='relu')(inputs)
x = Conv2D(64, (3, 3), padding='SAME', activation='relu')(x)
x = Dropout(0.25)(x)
x = MaxPooling2D()(x)

x = Conv2D(128, (3,3), padding='SAME', activation='relu')(x)
x = Conv2D(128, (3,3), padding='SAME', activation='relu')(x)
x = Dropout(0.25)(x)
x = MaxPooling2D()(x)

x = Conv2D(256, (3,3), padding='SAME', activation='relu')(x)
x = Conv2D(256, (3,3), padding='SAME', activation='relu')(x)
x = GlobalAveragePooling2D()(x)

x = Dense(1024, activation='relu')(x)
x = Dropout(0.25)(x)
y = Dense(10, activation='softmax')(x)

model = Model(inputs, y)

# モデルのコンパイル。
model.compile(optimizer=tf.keras.optimizers.Adam(),
              loss='categorical_crossentropy',
              metrics=['accuracy'])
model.summary()

モデルの学習

学習データX_train_target_in, y_train_target_inを使用して画像分類器の学習を行います。

# [1-8]
# 学習の実行。
model.fit(X_train_target_in, y_train_target_in,
          batch_size=512,
          epochs=50,
          validation_split=0.2,
          shuffle=True)

モデルの精度評価

学習データX_train_target_inと学習に使用していないデータX_train_target_outを使用し、作成した画像分類器の推論精度を評価します。

# [1-9]
# モデルの精度評価。
# 学習データ。
predictions = model.predict(X_train_target_in)
accuracy = np.sum(np.argmax(predictions, axis=1) == np.argmax(y_train_target_in, axis=1)) / len(y_train_target_in)
print('Accuracy on train data: {}%'.format(accuracy * 100))

# 学習に使用していないデータ。
predictions = model.predict(X_train_target_out)
accuracy = np.sum(np.argmax(predictions, axis=1) == np.argmax(y_train_target_out, axis=1)) / len(y_train_target_out)
print('Accuracy on non-train data: {}%'.format(accuracy * 100))

学習データの推論精度は約95%程度、学習に使用していないデータの推論精度は約75%程度になったと思います。
この結果から、画像分類器は学習データを過学習していることが分かります。

攻撃ネットワークの作成

ARTを使用し、メンバーシップ推論攻撃を行う攻撃ネットワークを作成します。

Keras Classifierの適用

ARTで攻撃ネットワークを作成するためには、攻撃対象の画像分類器をARTが提供するラッパークラスでラップする必要があります。
https://adversarial-robustness-toolbox.readthedocs.io/en/latest/modules/estimators/classification.html#keras-classifier

ARTにはTensorFlow, PyTorch, Scikit-learnなど、様々なフレームワークで作成したモデルをラップするクラスが用意されていますが、本ハンズオンではKerasを使用して分類器を作成しているため、KerasClassifierを使用します。

  • KerasClassifierの引数
    model:攻撃対象となる画像分類器を指定します。
    clip_values:入力データの特徴量の最小値と最大値を指定します。
    use_logits:分類器の出力形式がロジットの場合はTrue、確率値の場合はFalseを指定します。
# [1-10]
# 入力データの特徴量の最小値・最大値を指定。
# 特徴量は0.0~1.0の範囲に収まるように正規化しているため、最小値は0.0、最大値は1.0とする。
min_pixel_value = 0.0
max_pixel_value = 1.0

# 対策の実践用にオリジナルのモデルを保存。
model_path = os.path.join(os.getcwd(), 'origin_model.h5')
model.save(model_path)

# モデルをART Keras Classifierでラップ。
target_classifier = KerasClassifier(model=model, clip_values=(min_pixel_value, max_pixel_value), use_logits=False)

攻撃ネットワークの定義

ARTに実装されているメンバーシップ推論攻撃を使用し、攻撃ネットワークを作成します。
https://adversarial-robustness-toolbox.readthedocs.io/en/latest/modules/attacks/inference/membership_inference.html#membership-inference-black-box

メンバーシップ推論攻撃のクラスMembershipInferenceBlackBoxの引数として、ラップした画像分類器と攻撃ネットワークのモデルタイプ(ニューラルネットワーク、ランダムフォレストなど)などを指定します。

  • MembershipInferenceBlackBoxの引数
    classifier:攻撃対象の画像分類器をラップしたKerasClassifierを指定します。
    attack_model_type:攻撃ネットワークのモデルタイプを指定します。デフォルトはnn(ニューラルネットワーク)。
    input_type:攻撃ネットワークの学習に使用するデータ。デフォルトはtarget_classifierが応答するprediction(予測結果=信頼スコア)。
# [1-11]
# メンバーシップ推論攻撃インスタンスの作成。
# 本ハンズオンでは、攻撃ネットワークのモデルに"rf"(ランダムフォレスト)を採用。
attack = MembershipInferenceBlackBox(classifier=target_classifier,
                                     attack_model_type='rf',
                                     input_type='prediction')

攻撃ネットワークの学習

attackfitメソッドを使用し、攻撃ネットワークを作成(学習)します。
引数に攻撃対象となる画像分類器target_classifierの「学習に使用したデータセットX_train_target_in」と、「学習に使用していないデータセットX_train_target_out」を与え、各データに対する画像分類器の応答(信頼スコア)の違いを学習します。

  • fitの引数
    xtarget_classifierの学習データセットX_train_target_inを指定。
    yxのラベルy_train_target_inを指定。
    test_xtarget_classifierの学習に使用していないデータセットX_train_target_outを指定。
    test_ytest_xのラベルy_train_target_outを指定。
# [1-12]
# 攻撃ネットワークの学習。
attack.fit(x=X_train_target_in,
           y=y_train_target_in,
           test_x=X_train_target_out,
           test_y=y_train_target_out)

メンバーシップ推論攻撃の実行

attackinferメソッドを使用し、攻撃対象の画像分類器に対してメンバーシップ推論攻撃を実行します。本メソッドは、推論したいデータ(とラベル)を引数に渡すと、戻り値として1(メンバーシップ)、0(非メンバーシップ)を返します。

  • inferの引数
    x:推論したいデータを指定。
    yxのラベルを指定。
# [1-13]
# 学習データに対するメンバーシップ推論。
inferred_target_in = attack.infer(x=X_train_target_in, y=y_train_target_in)
print('Inferred for Target-In: {}%.'.format((sum(inferred_target_in) / len(inferred_target_in))*100))

# 学習に使用していないデータに対するメンバーシップ推論。
inferred_target_out = attack.infer(x=X_train_target_out, y=y_train_target_out)
print('Inferred for Target-Out: {}%.'.format((1-(sum(inferred_target_out) / len(inferred_target_out)))*100))

画像分類器が学習したデータX_train_target_in約99%程度の精度、学習していないデータX_train_target_out約80%程度の精度で正しく推論できていることが分かります。
この結果から、メンバーシップ推論攻撃によって、画像分類器が学習したデータ(=メンバーシップ)を高精度で推論できることが分かりました。

信頼スコアのフィルタリング

ARTに実装されている様々なフィルタリング手法を使用し、分類器が応答する信頼スコアに変化を加えます。

フィルタリングの種類

ARTには様々なフィルタが実装されています。
今回は以下のフィルタを実践し、メンバーシップ推論攻撃の精度の変化を見ていきます。

  • ClassLabels
    信頼スコアの中で最も大きい値を「1」、それ以外を「0」に変換します。
    例)[1.4613468e-05, 2.4702784e-08, 0.99996173] -> [0.0, 0.0, 1.0]
  • High Confidence
    信頼スコアの各要素を閾値で切り取ります。
    例)[1.4613468e-05, 2.4702784e-08, 0.99996173] -> [0.0, 0.0, 0.99996173]
    ※閾値を0.25に設定した場合。
  • Reverse Sigmoid
    信頼スコアの各要素をシグモイド関数で逆変換します。
    例)[1.4613468e-05, 2.4702784e-08, 0.99996173] -> [0.06758278, 0.09415675, 0.2046868]
  • Rounded
    信頼スコアの各要素を任意の桁数で丸めます。
    例)[2.205892e-05, 2.0437296e-06, 0.9999758] -> [2.2e-05, 2e-06, 0.999976]
    ※Roundを6にした場合。

フィルタの作成

ARTに実装されているフィルタ機能を使用し、フィルタを作成します。
https://adversarial-robustness-toolbox.readthedocs.io/en/latest/modules/defences/postprocessor.html

各フィルタはベースクラスPostprocessorを継承しています。
このクラスは引数として、フィルタを適用するタイミング(学習時、推論時)などを指定します。

  • Postprocessorの引数
    apply_fit:フィルタを学習時に適用する場合はTrueを指定。
    apply_predict:フィルタをテスト時に適用する場合はTrueを指定。

その上で、各フィルタ独自の引数を指定して作成します。

# [1-14]
# フィルタの作成。
# ClassLabels。
defence_label = ClassLabels(apply_fit=False, apply_predict=True)

# HighConfidence。
# 引数「cutoff」には、切り取りの閾値を指定。
defence_high = HighConfidence(cutoff=0.1, apply_fit=False, apply_predict=True)

# ReverseSigmoid。
# 引数「beta」には、正方向の最大値を指定。
# 引数「gamma」には、データセットとモデルの収束パラメータを指定。
defence_reverse = ReverseSigmoid(beta=0.8, gamma=0.3, apply_fit=False, apply_predict=True)

# Rounded。
# 引数「decimals」には、丸める桁数を指定。
defence_round = Rounded(decimals=6, apply_fit=False, apply_predict=True)

フィルタを画像分類器に適用する前に、各フィルタの挙動を確認します。

# [1-15]
# 任意のデータを画像分類器に入力し、信頼スコアを取得。
preds = target_classifier.predict(X_train_target_in[:1])

# 信頼スコアをフィルタリングした結果を表示。
print('Method                : argmax : Confidence')
print('-'*100)

# フィルタを適用していない信頼スコア。
print('1. Non-Postprocessing :   {}    : {}'.format(np.argmax([pred for pred in preds[0]]), [pred for pred in preds[0]]))

# ClassLabelsを適用した信頼スコア。
print('2. Class Label Only   :   {}    : {}'.format(np.argmax([pred for pred in defence_label(preds)[0]]), [pred for pred in defence_label(preds)[0]]))

# HighConfidenceを適用した信頼スコア。
print('3. High Confidence    :   {}    : {}'.format(np.argmax([pred for pred in defence_high(preds)[0]]), [pred for pred in defence_high(preds)[0]]))

# ReverseSigmoidを適用した信頼スコア。
print('4. Reverse Sigmoid    :   {}    : {}'.format(np.argmax([pred for pred in defence_reverse(preds)[0]]), [pred for pred in defence_reverse(preds)[0]]))

# Roundedを適用した信頼スコア。
print('5. Rounded            :   {}    : {}'.format(np.argmax([pred for pred in defence_round(preds)[0]]), [pred for pred in defence_round(preds)[0]]))

1. Non-Postprocessingはフィルタを適用していない信頼スコアを参考情報として表示しています。
精度の高い信頼スコアであることが分かります。

以降、各フィルタを適用した信頼スコアを表示しており、フィルタの効果により信頼スコアが変化していることが分かります。

ClassLabelsの効果を確認

画像分類器の信頼スコアにClassLabelsを適用することで、メンバーシップ推論攻撃の精度を落とすことができるのか確認しましょう。
なお、保護したい画像分類器をラップするKerasClassifierの引数postprocessing_defencesに適用したいフィルタを指定することで、画像分類器の信頼スコアにフィルタを掛けることができます。

# [1-16]
# オリジナルのモデルをファイルからロード。
origin_model = tf.keras.models.load_model(model_path)

# モデルをART Keras Classifierでラップ。
# 引数「postprocessing_defences」にフィルタを指定。
robustness_classifier = KerasClassifier(model=origin_model,
                                        clip_values=(min_pixel_value, max_pixel_value),
                                        use_logits=False,
                                        postprocessing_defences=defence_label)

# メンバーシップ推論攻撃インスタンスの作成。
attack = MembershipInferenceBlackBox(classifier=robustness_classifier,
                                     attack_model_type='rf',
                                     input_type='prediction')

# 攻撃ネットワークの学習。
attack.fit(x=X_train_target_in,
           y=y_train_target_in,
           test_x=X_train_target_out,
           test_y=y_train_target_out)

# メンバーシップ推論の実行。
inferred_target_in = attack.infer(x=X_train_target_in, y=y_train_target_in)
print('Inferred for Target-In: {}%.'.format((sum(inferred_target_in) / len(inferred_target_in))*100))
inferred_target_out = attack.infer(x=X_train_target_out, y=y_train_target_out)
print('Inferred for Target-Out: {}%.'.format((1-(sum(inferred_target_out) / len(inferred_target_out)))*100))

[1-13]で示したフィルタ未適用時のメンバーシップ推論攻撃と比較し、大幅に攻撃の精度が落ちていることが分かります。
攻撃の精度は約50%になっているため、殆どメンバーシップ推論が成功していないことを意味します。

HighConfidenceの効果を確認

画像分類器の信頼スコアにHighConfidenceを適用することで、メンバーシップ推論攻撃の精度を落とすことができるのか確認しましょう。

# [1-17]
# オリジナルのモデルをファイルからロード。
origin_model = tf.keras.models.load_model(model_path)

# モデルをART Keras Classifierでラップ。
# 引数「postprocessing_defences」にフィルタを指定。
robustness_classifier = KerasClassifier(model=origin_model,
                                        clip_values=(min_pixel_value, max_pixel_value),
                                        use_logits=False,
                                        postprocessing_defences=defence_high)

# メンバーシップ推論攻撃インスタンスの作成。
attack = MembershipInferenceBlackBox(classifier=robustness_classifier,
                                     attack_model_type='rf',
                                     input_type='prediction')

# 攻撃ネットワークの学習。
attack.fit(x=X_train_target_in,
           y=y_train_target_in,
           test_x=X_train_target_out,
           test_y=y_train_target_out)

# メンバーシップ推論の実行。
inferred_target_in = attack.infer(x=X_train_target_in, y=y_train_target_in)
print('Inferred for Target-In: {}%.'.format((sum(inferred_target_in) / len(inferred_target_in))*100))
inferred_target_out = attack.infer(x=X_train_target_out, y=y_train_target_out)
print('Inferred for Target-Out: {}%.'.format((1-(sum(inferred_target_out) / len(inferred_target_out)))*100))

ClassLabels程ではありませんが、[1-13]と比較して若干攻撃の精度が落ちていることが分かります。
HighConfidenceの効果はcutoffに依存するため、[1-14]にてcutoffを調整することで更に攻撃の精度を落とすことができるかもしれまん。

ReverseSigmoidの効果を確認

画像分類器の信頼スコアにReverseSigmoidを適用することで、メンバーシップ推論攻撃の精度を落とすことができるのか確認しましょう。

# [1-18]
# オリジナルのモデルをファイルからロード。
origin_model = tf.keras.models.load_model(model_path)

# モデルをART Keras Classifierでラップ。
# 引数「postprocessing_defences」にフィルタを指定。
robustness_classifier = KerasClassifier(model=origin_model,
                                        clip_values=(min_pixel_value, max_pixel_value),
                                        use_logits=False,
                                        postprocessing_defences=defence_reverse)

# メンバーシップ推論攻撃インスタンスの作成。
attack = MembershipInferenceBlackBox(classifier=robustness_classifier,
                                     attack_model_type='rf',
                                     input_type='prediction')

# 攻撃ネットワークの学習。
attack.fit(x=X_train_target_in,
           y=y_train_target_in,
           test_x=X_train_target_out,
           test_y=y_train_target_out)

# メンバーシップ推論の実行。
inferred_target_in = attack.infer(x=X_train_target_in, y=y_train_target_in)
print('Inferred for Target-In: {}%.'.format((sum(inferred_target_in) / len(inferred_target_in))*100))
inferred_target_out = attack.infer(x=X_train_target_out, y=y_train_target_out)
print('Inferred for Target-Out: {}%.'.format((1-(sum(inferred_target_out) / len(inferred_target_out)))*100))

[1-13]と比較して殆ど攻撃の精度が落ちていないことが分かります。
ReverseSigmoidの効果はbetagammaに依存するため、[1-14]にてbetagammaを調整することで攻撃の精度を落とすことができるかもしれまん。

Roundedの効果を確認

画像分類器の信頼スコアにRoundedを適用することで、メンバーシップ推論攻撃の精度を落とすことができるのか確認しましょう。

# [1-17]
# オリジナルのモデルをファイルからロード。
origin_model = tf.keras.models.load_model(model_path)

# モデルをART Keras Classifierでラップ。
# 引数「postprocessing_defences」にフィルタを指定。
robustness_classifier = KerasClassifier(model=origin_model,
                                        clip_values=(min_pixel_value, max_pixel_value),
                                        use_logits=False,
                                        postprocessing_defences=defence_round)

# メンバーシップ推論攻撃インスタンスの作成。
attack = MembershipInferenceBlackBox(classifier=robustness_classifier,
                                     attack_model_type='rf',
                                     input_type='prediction')

# 攻撃ネットワークの学習。
attack.fit(x=X_train_target_in,
           y=y_train_target_in,
           test_x=X_train_target_out,
           test_y=y_train_target_out)

# メンバーシップ推論の実行。
inferred_target_in = attack.infer(x=X_train_target_in, y=y_train_target_in)
print('Inferred for Target-In: {}%.'.format((sum(inferred_target_in) / len(inferred_target_in))*100))
inferred_target_out = attack.infer(x=X_train_target_out, y=y_train_target_out)
print('Inferred for Target-Out: {}%.'.format((1-(sum(inferred_target_out) / len(inferred_target_out)))*100))

ClassLabels程ではありませんが、[1-13]と比較して若干攻撃の精度が落ちていることが分かります。
Roundedの効果はdecimalsに依存するため、[1-14]にてdecimalsを調整することで更に攻撃の精度を落とすことができるかもしれまん。

このように、信頼スコアにフィルタを適用することで、メンバーシップ推論攻撃の精度を落とすことができます。対策の効果はフィルタの種類よって異なりますので、画像分類器の開発要件にフィットするフィルタを選定し、適宜引数を調整して効果を最大化する必要があります。

おわりに

本ハンズオンでは「第7回:信頼スコアのフィルタリング - メンバーシップ推論攻撃の対策 -」と題し、攻撃対象の画像分類器が応答する分類結果(信頼スコア)に変化を加えることで、メンバーシップ推論攻撃の精度を低下させる対策を実践しました。
そして、ARTを使用することで、少ないコード量でメンバーシップ推論攻撃の対策を実行できることが分かりました。

ARTを使用することで容易にAIのセキュリティテストを行うことができるため、ご興味を持たれた方がおりましたら、是非触ってみることをお勧めします。

以上