敵対的攻撃モデルについて
敵対的攻撃(Adversarial Attack)は、機械学習モデルに対する攻撃手法の一つであり、特に画像やテキスト、音声などの入力データに対して広く用いられるものとなる。敵対的攻撃は、わずかな摂動(ノイズや操作)を加えることにより、機械学習モデルの誤認識を引き起こすことを目的としている。このような攻撃は、セキュリティの脆弱性を明らかにし、モデルのロバスト性を評価するのに役立ち、”説明できる機械学習“で述べているモデルの説明可能性にも関連する情報を類推することができる。
敵対的攻撃の種類としては以下のものがある。
1. ノンターゲット攻撃(Non-targeted Attack): ノンターゲット攻撃は、敵対的なサンプルがどのクラスに分類されるかには関心がなく、単にモデルを誤認識させることを目的としている。
2. ターゲット攻撃(Targeted Attack): ターゲット攻撃は、特定の誤ったクラスにデータを分類させることを目的としている。つまり、攻撃者は特定のクラスをターゲットとし、そのクラスに分類されるように敵対的なサンプルを生成する。
3. ホワイトボックス攻撃(White-box Attack): ホワイトボックス攻撃は、攻撃者が攻撃対象のモデルの構造とパラメータに完全にアクセスできる状況で行われる。攻撃者はモデルの情報を利用して、最適な敵対的なサンプルを生成する。
4. ブラックボックス攻撃(Black-box Attack): ブラックボックス攻撃は、攻撃者が攻撃対象のモデルの内部情報にアクセスできない状況で行われる。攻撃者は、モデルの振る舞いを観察して外部からの入力と出力の関係を推測し、それに基づいて敵対的なサンプルを生成する。
敵対的攻撃の手法としては以下の様なものがある。
1. Fast Gradient Sign Method (FGSM): FGSMは、モデルの勾配情報を使用して敵対的なサンプルを生成する手法となる。具体的には、入力データに勾配の符号に比例する小さな値を加えることで摂動を作成する。
2. Projected Gradient Descent (PGD): PGDは、複数のFGSMステップを繰り返して摂動を生成する手法となる。各ステップで生成された摂動が一定の範囲内に収まるようにクリッピングされ、最終的な摂動が生成される。
3. DeepFool: DeepFoolは、モデルの出力を最も効果的に変更するための最小な摂動を見つける手法となる。これは、線形モデルに対しては効率的だが、非線形モデルに対しては適用が難しい場合がある。
4. CW Attack (Carlini-Wagner Attack): CW Attackは、様々な距離尺度(L2、L∞など)を使用して敵対的なサンプルを生成する手法となる。特に、非線形最適化を使用して生成された摂動が小さく、かつ高い攻撃成功率を持つ。
敵対的攻撃に対する対策と防御に関しては以下の様なものがある。
1. 敵対的なトレーニング(Adversarial Training): 敵対的なトレーニングは、モデルに敵対的なサンプルを含めて再トレーニングすることで、これにより、モデルが敵対的なサンプルに対してよりロバストになる。
2. 検知手法(Adversarial Detection): 敵対的なサンプルを検出する手法もある。これは、敵対的な摂動の特徴を利用して、モデルが敵対的なサンプルを識別するようにする方法となる。
3. ロバストなモデルの構築: より堅牢なモデルアーキテクチャを採用することで、敵対的攻撃に対する抵抗力を高めることができる。例えば、アンサンブル学習やドロップアウトなどの手法がある。
一般にニューラルネットワークでは、わずかな摂動による敵対的攻撃に対して脆弱であることが”Deep Neural Networks are Easily Fooled: High Confidence Predictions for Unrecognizable Images“でも報告されている。
GNNにおける敵対的攻撃
グラフニューラル ネットワークも上述のような脆弱性があり、 実際に応用していくうえで頑強なグラフニューラルネットワークを構築する必要がある。グラフに おける敵対的攻撃とそれに対する防御については、 Jinらによるサーベ イ論文”Adversarial Attacks and Defenses on Graphs: A Review, A Tool and Empirical Studies“がある。 この論文では、 グラフに対する敵対的 攻撃を攻撃者の属性に基づいて以下のように分類している。
- 攻撃者の能力:訓練後の攻撃(evasion attack)か訓練中の攻撃(poisoning attack)か。
- 攻撃のタイプ: ノード特徴を修正するか、エッジを追加・削除するか、偽ノードを追加するか。
- 攻撃者の目標:少数のテストノードを誤分類させる(targeted attack)か全体的に精度を低下させる(untargeted attack)か。
- 攻撃者の知識:攻撃者がモデルパラメータや訓練時入力・ラベルをすべて知っている(white-box attack)か、限られた知識 しかない(gray-box attack)か、 まったく知識がない(black-box attack)か。
そのうえで、 代表的な敵対的攻撃アルゴリズムについて、ホワイトボッ クス攻撃(white-box attack)、グレーボックス攻撃(gray-box attack)、ブラックボックス攻撃(black-box attack)に分け、 それぞれをさらに標的型攻撃(targeted attack)と非標的型攻撃(untargeted attack)に分けて紹 介している。
また、それらの攻撃に対する防御として、以下の5つに分類してそれぞれを紹介している。
- 敵対的訓練(adversarial training): 訓練集合に敵対的な例を入れ、 訓練したモデルが将来の敵対的な例を正しく分類できる ようにする。
- 敵対的摂動検出(adversarial perturbation detection): 敵対的 なノード・エッジと、 クリーンなノード・エッジとの間の固有 の違いを探索することでモデルを防御する。
- 頑強性認定(certifiable robustness): グラフニューラルネット ワークの安全性を推論し、 その頑強性を証明しようとする。
- グラフ浄化(graph purification): 訓練後でなく訓練中の攻 撃を防ぐ。 グラフをきれいにしてから学習する前処理(preprocessing)と、 グラフニューラルネットワーク学習時に敵対的なパターンを避けてきれいなグラフ構造を得るグラフ学習(graph learning)の2つのアプローチがある。
- 注意機構(attention mechanism): 敵対的な摂動を除去する代わりに、 敵対的なエッジやノードの重みにペナルティを与える ことで頑強なグラフニューラルネットワークモデルを学習する。
以上を要点すると、GNNにおける敵対的攻撃は、ノード分類、リンク予測、グラフ生成などのタスクに影響を与える可能性があり、敵対的攻撃の手法には、ターゲット攻撃、パス攻撃、ノード削除攻撃、リンク攻撃などがあって、対策としては、敵対的なトレーニング、グラフ構造の正則化、重要度評価、クリーンアップメカニズムなどがあるといえる。
“Adversarial Attacks and Defenses on Graphs: A Review, A Tool and Empirical Studies“ではさらに、 グラフ攻撃・ 防御について著者らが開発したリポジトリで ある 「DeepRobust」 について紹介し、攻撃や防御による実験結果について示している。
GNNにおける敵対的攻撃に関連するアルゴリズムについて
以下にいくつかの代表的なGNNにおける敵対的攻撃アルゴリズムについて述べる。
1. Metattack: Metattackは、ノード分類タスクに対する敵対的攻撃を行う手法となる。この手法は、目標とするターゲットノードを指定して、そのノードの分類結果を誤らせることを目的としている。具体的には、以下の手順で攻撃を行う。
- 隣接ノードの重要度の推定: ターゲットノードに隣接するノードの重要度を推定する。この重要度は、各ノードのラベル予測に対する勾配情報を用いて計算される。
- 重要度に基づく攻撃: 推定された重要度に基づいて、最も重要な隣接ノードから順に攻撃対象として選択する。選択されたノードに対して、一定の摂動を加えることで攻撃を行う。
- 攻撃対象ノードの分類結果の誤差最大化: 攻撃対象のターゲットノードの分類結果を誤らせるために、重要な隣接ノードに摂動を加えながら、目的関数を最大化するように攻撃を進める。
2. PGD Attack: PGD(Projected Gradient Descent)Attackは、GNNにおける敵対的攻撃手法の一つであり、白箱攻撃の一種で、モデルのパラメータを知っている状況下で攻撃を行うものとなる。具体的な手順は以下の様になる。
- 摂動の初期化: ノードの特徴に対する摂動を初期化する。
- PGDの反復: 摂動を更新して攻撃を行う。各反復ステップでは、目的関数を最大化するように摂動を更新し、一定範囲内に収まるようにクリップする。
- 目的関数の最大化: ノードの分類結果を誤らせるために、目的関数を最大化するように攻撃を行う。
3. GCN Attack: GCN(Graph Convolutional Network)Attackは、GCNモデルに対する敵対的攻撃手法となる。GCNモデルはグラフデータに適用されるニューラルネットワークであり、ノード分類などのタスクに使用される。GCN Attackの手法は、MetattackやPGD Attackと同様に、ノードの特徴に対する摂動を加えて攻撃を行うもので。攻撃目標は、特定のノードの分類結果を誤らせることとなる。
4. RL-based Attack: 強化学習(Reinforcement Learning)を使用した敵対的攻撃手法もある。これらの手法は、攻撃者がグラフを操作する際に、状態、行動、報酬を定義し、最適な攻撃手法を学習する。RL-based Attackの手法は、探索的な攻撃や潜在的な攻撃ノードを見つけるために使用されている。
GNNにおける敵対的攻撃の実装例
GNNにおける敵対的攻撃の実装例を示す。以下の例では、PythonとPyTorch Geometricを使用している。
ライブラリのインポート:
import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
from torch_geometric.datasets import Planetoid
from torch_geometric.utils import add_self_loops
import numpy as np
import random
データセットの読み込み: Planetoidデータセットを使用する。Planetoidは、いくつかのグラフデータセット(Cora、Citeseer、PubMed)のリストを提供している。
dataset = 'Cora'
dataset = Planetoid(root='./data/' + dataset, name=dataset)
data = dataset[0]
GNNモデルの定義: 単純なGCN(Graph Convolutional Network)モデルを定義する。
class GCN(torch.nn.Module):
def __init__(self):
super(GCN, self).__init__()
self.conv1 = GCNConv(dataset.num_features, 16)
self.conv2 = GCNConv(16, dataset.num_classes)
def forward(self, data):
x, edge_index = data.x, data.edge_index
x = F.relu(self.conv1(x, edge_index))
x = F.dropout(x, training=self.training)
x = self.conv2(x, edge_index)
return F.log_softmax(x, dim=1)
敵対的攻撃の実装: PGD(Projected Gradient Descent)Attackを使用して、GNNモデルを攻撃する。
def pgd_attack(model, data, target_node, epsilon=0.1, alpha=0.01, num_iters=20):
model.eval()
node_feat, edge_index = data.x.clone().detach(), data.edge_index.clone().detach()
node_feat.requires_grad = True
for _ in range(num_iters):
logits = model(data)
loss = F.nll_loss(logits[data.train_mask], data.y[data.train_mask])
loss.backward()
perturbation = alpha * node_feat.grad.detach().sign()
node_feat.grad.zero_()
perturbed_feat = node_feat + perturbation
diff = perturbed_feat - data.x
diff.clamp_(-epsilon, epsilon)
perturbed_feat = data.x + diff
node_feat = perturbed_feat.clone().detach()
node_feat.requires_grad = True
return perturbed_feat
実行:
# モデルの初期化
model = GCN()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)
# トレーニング
model.train()
for epoch in range(200):
optimizer.zero_grad()
out = model(data)
loss = F.nll_loss(out[data.train_mask], data.y[data.train_mask])
loss.backward()
optimizer.step()
# ターゲットノードの選択
target_node = random.choice(data.train_mask.nonzero().view(-1))
# 敵対的攻撃
perturbed_feat = pgd_attack(model, data, target_node)
# 攻撃結果の評価
model.eval()
output = model(data)
print("Original prediction:", output[target_node].argmax().item())
output = model(data, perturbed_feat)
print("Adversarial prediction:", output[target_node].argmax().item())
この例では、GCNモデルを使用してCoraデータセットのノード分類を行い、PGD Attackを使用して敵対的攻撃を実行している。攻撃対象のノードはランダムに選択され、PGD Attackによって生成された摂動をノード特徴に加え、元のノード特徴との差分をクリップして、敵対的なノード特徴を得る。最後に、元のモデルと敵対的なノード特徴を使用して、元の予測と敵対的な予測を評価している。
参考情報と参考図書
グラフデータの詳細に関しては”グラフデータ処理アルゴリズムと機械学習/人工知能タスクへの応用“を参照のこと。また、ナレッジグラフに特化した詳細に関しては”知識情報処理技術“も参照のこと。さらに、深層学習全般に関しては”深層学習について“も参照のこと。
参考図書としては”グラフニューラルネットワーク ―PyTorchによる実装―“
“Graph Neural Networks: Foundations, Frontiers, and Applications“等がある。
コメント
[…] GNNにおける敵対的攻撃モデルの概要とアルゴリズム及び実装例 […]
[…] GNNにおける敵対的攻撃モデルの概要とアルゴリズム及び実装例 […]