連合学習ポイズニング攻防ラボ — 壊そうとしても壊れない
あなたが攻撃者になって連合学習モデルを毒してみる体験デモ。サーバーと同じ品質ゲートがブラウザ内で再現され、汚染された更新がどう無害化されるかを目の前で確認できます。
このラボの遊び方(3ステップ)
グローバルモデルと検証セットをブラウザに読み込みます(本番には一切影響しません)。
「正直/ラベル汚染/ランダム汚染」のどれかで、あなたの更新をモデルに送ります。
「ゲートあり」と「ゲート無しなら」の精度を比べ、汚染が無害化される様子を確認します。
ボタンを押すと何が起きる? — 1ラウンドの流れ
🧑💻 あなた(クライアント)
「正直/ラベル汚染/ランダム」のどれかを選ぶ
📚 ローカル学習
選んだラベルで、ブラウザ内のモデルを4エポック学習する
📦 重み差分 Δ を計算・送信
学習前後の差を取り、大きすぎる値はクリップ(±5)してサーバーへ送る
🛡️ サーバーの品質ゲート
送られた更新を下の4ステップで検査する(このデモはブラウザ内で同じ処理を再現)
① 縮小
Δを移動量の異なる4候補に縮める(0.15 / 0.075 / 0.04 / 0.02)
② 採点
各候補を検証セットで評価し、精度を測る
③ 最良を選ぶ
最も精度が高い候補を「採用候補」にする
④ ラチェット
開始精度を下回るなら棄却。精度を下げさせない
⚖️ 採用 or 棄却
精度が上がる/維持なら採用、下がるなら棄却。グローバル精度は決して下がらない
ポイント: 攻撃者が送れるのは「重み差分」だけ。サーバーは中身の善悪を当てにいかず、「採用すると精度が下がるか」だけで機械的に弾きます。
3つのボタンの違い(早見表)
| ボタン | 何をする | ゲート無しなら | ゲートありの結果 |
|---|---|---|---|
| 😊 正直な貢献 | 正しいラベルで学習 | 精度↑(貢献になる) | ✅ 採用 |
| 😈 ラベル汚染 | ラベルを +5 ずらして学習 | 精度が大きく低下 | 🛡️ 棄却 |
| 🎲 ランダム汚染 | でたらめなラベルで学習 | 精度が崩壊 | 🛡️ 棄却 |
「ゲート無しなら」は、もし無防備に更新をそのまま反映していた場合の精度です。攻撃を選んでも、ゲートありでは精度が下がらないことを確認してください。
結果の読み方
- 現在のグローバル精度:今のモデルの賢さ。攻撃を何度押しても下がらないのが見どころ。
- 攻撃の無害化率:攻撃のうち何件をゲートが弾いたか(例: 5/5 件ブロック)。
- ゲートあり(緑):実際に採用された結果。「開始% → 採用後%」。下がる更新は不採用。
- ゲート無しなら:同じ更新を無防備に反映した場合の精度。攻撃だと赤字で大きく低下=ゲートが救った差。
用語ミニ辞典
| 連合学習(FL) | データを共有せず、各端末の学習結果(重み差分)だけ持ち寄ってAIを育てる方式。 |
|---|---|
| ポイズニング攻撃 | わざと汚れた更新を送り、みんなのモデルを壊そうとする行為。 |
| 品質ゲート | 送られた更新を採点し、悪いものを採用しないための検査。 |
| シフトラダー | 更新の移動量を大→小と段階的に試す仕組み。安全な小ささを探す。 |
| 単調非減少ラチェット | 精度が下がる更新は採用しない歯止め。歯車が逆回転しないイメージ。 |
| L2ノルム | 更新の「大きさ」。大きすぎる更新は上限で抑える。 |
| 検証セット | 更新の良し悪しを採点する、答え合わせ用のデータ。 |
具体的な悪意のある攻撃と、本ラボのゲートで防げるか
連合学習への攻撃は、大きく「データを汚す(データポイズニング)」と「送る更新(重み)を直接いじる(モデルポイズニング)」に分かれます。 このデモが再現する😈ラベル反転・🎲ランダム汚染は氷山の一角です。代表的な攻撃を、防御可否とともに整理します。
| 攻撃 | 手口 | 具体例 | 本ラボのゲート | 追加で必要な対策 |
|---|---|---|---|---|
| ラベル反転 Label Flipping | 学習データのラベルをわざと付け替える | 「7」を「2」と教え込む。本ラボの 😈 | ○ 防げる | 検証精度が下がるため棄却(品質ゲート) |
| ランダム/ビザンチン Byzantine | でたらめ・任意の壊れた更新を送る | 乱数ラベルで学習。本ラボの 🎲 | ○ 防げる | 精度低下で棄却。実運用は中央値・Krum等のロバスト集約を併用 |
| スケーリング(モデル置換) Model Replacement | 悪意の更新を増幅し、集約結果を支配する | 自分の重みで全体を上書きしバックドアを注入 | △〜○ 抑制 | 移動量(L2)上限+ラチェットで単独支配を抑制。巧妙化にはロバスト集約が必要 |
| バックドア Backdoor | 全体精度は保ったまま、特定トリガーにだけ誤反応を仕込む | 特定の模様が写った時だけ別ラベルへ | ✗ 単独では不可 | 検証精度ベースの防御では原理的に困難。要: ロバスト集約・差分プライバシー・異常検知(下記『正直な限界』) |
| シビル Sybil | 多数の偽クライアントで結託し汚染を増幅 | 同一の汚染更新を大量に投票 | △ 一部 | 評判クールダウンで一部対処。FoolsGold等の更新類似度検知が有効 |
| フリーライダー Free-rider | 実データ無しで偽の更新を送り恩恵だけ得る | 乱数や複製を提出して貢献を偽装 | △ 一部 | 精度は下げないが不公平。寄与度・類似度で検知 |
出典: Bagdasaryan et al. “How To Backdoor Federated Learning”(バックドア・モデル置換) / Fang et al. USENIX Security 2020(ビザンチン耐性への局所攻撃) / Fung et al. “Mitigating Sybils …”(FoolsGold) / FL Security & Privacy サーベイ(2025)
なぜ「悪意があっても壊れない」のか
不特定多数が参加する連合学習では、わざと壊そうとする参加者(ポイズニング攻撃)への対策が必須です。 重要なのは「単一の更新から悪意を完璧に見分ける」ことではなく、悪意があっても結果としてモデルが悪くならない仕組みにすることです。
🚪 品質ゲート(単調非減少ラチェット)
移動量の異なる候補を検証セットで全評価し最良を採用。精度を下げる更新は棄却。グローバル精度は決して下がらない。
✂️ 移動量の上限制御
どんなに大きな差分でも、1回にグローバル重みが動ける距離(L2ノルム)に上限。単一更新がモデルを支配できない。
🔒 検証セットの秘匿
本番では採点表(検証セット)をサーバー内に隠す。採点表を知られなければ『採点だけ通る悪意』を作れない。
🛡️ 評判クールダウン
明白な汚染を繰り返すIPに一定時間のクールダウン。正常な貢献は罰しない。
正直な限界: 全体精度を保ったまま特定パターンにだけ誤反応を仕込む「バックドア攻撃」は、検証精度ベースの防御だけでは原理的に完全には防げません。 実運用では差分プライバシーやロバスト集約(中央値・Krum等)を併用します。本ラボは「ゲートにより悪意を無効化できる」という防御の要点を体感する目的です。
連合学習を体験・理解する
攻撃側を体験したら、今度は正直な参加者として「みんなで育てるAI」に貢献してみてください。 仕組みの全体像はガイド記事で解説しています。
関連ガイド
関連デモ
このデモを「実機」で使うには?
実測データで最適な機種を選び、つまずいたら原因→対処をたどれます。
業務への導入を検討中の方へ:このデモのような、入力に近い端末で処理する仕組みの設計・開発相談はLink Fieldへ無料で送れます。
🤝 導入の相談をする