差分プライバシー(Differential Privacy, DP)の概念が提案されてから時間も経ち、実装も複数展開されているのですが、国内だと研究やPoCフェーズでの成果報告がほとんどでプロダクションサービスで利用されている実例はまだまだ少ない現状にあるようです。現時点での状況も含めて技術調査をします。
差分プライバシー(Differential Privacy, DP)とは
概念と理論については日本語情報も豊富なのでそちらの専門サイトの説明を見るのが良いと思います。詳細はLayerXさんやAcompanyさんの技術記事が明るいですし、海外だとOpenMinedの記事が多いです。OpenMinedはプライバシー保護技術の取り組みを推進しているオープンソースコミュニティになります。
以下サイトでも説明がありますが、差分プライバシーとはプライバシーの水準を統計的に表現した尺度です。目的としては「出力データから入力データを推定されることを防ぐ」為の仕組みになります。ユーザーから預かったデータを対象にした場合はそのユーザーのプライバシーを守ることに繋がるわけです。
- 差分プライバシーとは – AppleやGoogleも活用する最先端のプライバシー保護技術
- 【技術】差分プライバシーとはどんな技術なのか – プライバシーテック研究所
- Differential Privacy – OpenMined Blog
差分プライバシーは、当時Microsoft Researchに在籍していたDworkら(2006)によって考案された、プライバシー保護度合いの汎用的・数学的な定義です。データに対するクエリの出力に適切なノイズを付与することによって、統計的な有用性を維持したまま、数学的に証明可能なプライバシー保証を提供します。
加えるノイズの強さと出力データの精度にはトレードオフがあるので調整が難しいとのことですが(ε-差分プライバシーにおけるεの大きさ)、差分プライバシー技術を機械学習分野に適用するのは自然な発想ですから、昨今のAIブームと併せて再注目されている分野となっているようです。
実装
今回は差分プライバシーの実装について調査します。ライブラリやフレームワークはいろいろ出ているのですが、実装にバグや脆弱性があるとプライバシー保護の目的を達成できない懸念があり、商用だとなおさら使いにくいのでしばらく様子見していたのですが、ある程度時間が経って安定してきていそうなのでそろそろ使ってみようかと思い立ちました。
実装の調査はOpenMinedが詳しいのでそちらを参考にしました。
オープンソース実装はいろいろあるのですが、ある程度知名度があるプロダクトに絞ると以下に7つになるようです(僕はOpacusしか知らなかったのですが;;)。
Google’s Differential Privacy Libraries | 差分プライバシーのコア実装だけでなく、データ収集や前処理用の各種ライブラリ(C++、Java、Go)も提供されており、Apache Beamのデータ処理パイプラインに組み込むことができる(Privacy on Beam)。 |
Opacus · Train PyTorch models with Differential Privacy | PyTorchのオプティマイザに差分プライバシー実装を組み込む高速なライブラリ。学習データの機密性を保護しつつ、モデルの精度への影響を最小限に抑えることができる。 |
SecretFlow | プライバシー保護を備えたデータ解析や機械学習用の包括的なフレームワーク。MPC、HE等の秘密計算にも対応しており、TEEなどの暗号化デバイスを抽象化する。 |
IBM’s Differential Privacy Library | 差分プライバシーに関する実験、調査、アプリケーション開発のための汎用ライブラリ。ほとんどのタスクが1行のコードで実行できるなどのシンプルさが特徴。 |
Tensorflow Privacy | 機械学習や深層学習モデルにおけるプライバシーを確保するために開発されたPythonライブラリ。プライバシー強化の為に調整された様々なオプティマイザを提供しており、学習プロセスにプライバシーを組み込むことを容易にする。 |
OpenDP | 差分プライバシーの原理に従った統計手法群を提供するRust製ライブラリ(Pythonからも使える)。プライベートデータを分析するための信頼性の高いオープンソースソフトウェアを開発するOpenDPコミュニティによるプロダクト |
Openmined/PyDP | PyDPはOpenMinedによって作成されたGoogleのDifferential Privacy LibrariesのPythonラッパーライブラリ。Pythonベースの機械学習モデルのプライバシーと精度のレベルをコントロールすることができる。 |
これらの実装はcommonly usedらしいですが、プロダクションへの普及の観点では日本と海外とではかなり差が付いているということなのでしょう。Pythonから使えるライブラリ・フレームワークが多いですが、GoogleのDifferential Privacy LibrariesのようにC++/Java/Go言語用に提供されているプロダクトもありますし、それ以外のインタフェースとしてはZetaSQLやPINQ(Privacy Integrated Queries)のようなSQLベースなクライアントもあるので、機械学習分野に限らず様々な使い方が想定されているようです。いずれもOSSプロダクトですが、その中でもOpenDPはコミュニティ主導で開発されているので個人的には期待しています。以前、MicrosoftがSmartNoiseという差分プライバシーライブラリを公開していましたが、現在はOpenDPプロジェクトに統合されているようです。
サンプル
上で挙げた全てのフレームワークを試すのは大変なので適当に選んでサンプル実装を試します。機械学習特化用途ならOpacusやTensorflow Privacyが良さそうなのですが、今回はコミュニティ主導で開発されているMITライセンスのOpenDPを使ってみたいと思います。
OpenDP
A Programming Framework for OpenDP
OpenDP – github.com
ロゴのテキストがカーニングされてないしフォントもアレな感じでもやもやしますけど性能には関係無いので気にせず進めます。
* 環境
Ubuntu 22.04 (x86_64)
Python 3.10.7
OpenDP 0.6.2
インストール方法は簡単です。前述の通りOpenDPはRust製ですが、Pythonからでも使えるようになっているのでpip経由でインストールできます。ただし2023/4現在、Python 3.11系には公式対応していないようなので注意します。
1 2 3 |
$ pip install opendp ## poetry環境の場合 $ poetry add opendp |
The Laplace Mechanism (ラプラスメカニズム)
まず前提知識として、ノイズ付与の方法はいくつか種類があるのですが、その中でもラプラスメカニズムが広く知られていてよく使われるようです。ラプラス分布に従いデータにノイズを付与します。
PythonならNumPyやSciPyにラプラス分布を作るモジュールがあるのでそれを使えば簡単に描けます。
1 2 3 4 5 6 7 8 9 10 11 12 |
import numpy as np from scipy.stats import laplace import matplotlib.pyplot as plt scale = 30 output_domain = np.arange(sum(v) - scale, sum(u) + scale, 1) def rv_M(x: np.ndarray): """returns a random variable, M(x)""" return laplace(loc=sum(x), scale=scale) plt.plot(output_domain, rv_M(u).pdf(output_domain), label="$p_{M(u)}(x)$") |
OpenDPを使う場合はもちろん上記のように直接ラプラス分布を作るようなコードは必要なく以下のように抽象化されます。
1 2 3 4 5 6 7 8 |
from opendp.measurements import make_base_laplace from opendp.mod import enable_features enable_features("contrib") ## おまじない: 以降の機能を使う際はcontribモジュールを有効化 # call the constructor to produce the measurement `base_lap` base_laplace = make_base_laplace(scale=5.) ## b=5.0, μ=0として分布生成 aggregate = 0. ## float print("noisy aggregate:", base_laplace(aggregate)) |
1 |
noisy aggregate: 4.963613002837211 |
make_base_laplace
関数によりopendp.mod.Measurement
オブジェクトが返されます。これは関数オブジェクトとして振る舞うので直接実行することができます。ここで指定しているscale
パラメータははラプラス分布の尺度母数bです。上記の出力結果は一例であり、毎回同じ結果になるわけでは無く確率的な振る舞いを持ちます。
ここで、差分プライバシーにおけるΔf(Δ:sensitivity)の定義を載せておきます。Dはデータセット(データベースとも呼ばれる)、D’はDと任意の1つのレコードのみが異なるあらゆるデータセットを指しています。
次にε(epsilon)の値を確認する場合は以下のように、opendp.mod.Measurement
オブジェクトにmap
メソッドが定義されているのでそれを使います。OpenDPの文脈ではプprivacy mapと呼んでいます。
1 2 |
sensitivity = 10. ## float print("epsilon:", base_laplace.map(d_in=sensitivity)) |
1 |
epsilon: 2.0 |
これはsensitivity: 10.0, scale: 5.0としたときの ε(epsilon) は2.0になることを示しています。これは適用するアルゴリズム(機械学習ならモデル)の出力値にsensitivityに応じたノイズを加えるだけという単純なメカニズムになっています。つまりε-差分プライバシーはεの値が小さいほどプライバシー強度が高く、強いノイズがデータに付与されることになります。
OpenDPは他にもいろんな機能が備わっていますが今回は触りの部分だけにしておきます。OpenDPが普及するかどうかは競合が多いのでまだわかりませんが、もし広く使われるようになったらこれを内部的に取り込んだフレームワークなども出てくるかもしれませんね。
今回は差分プライバシーのライブラリ・フレームワークを調査しつつ、OpenDPの触りの部分だけ紹介しましたが、次はより実践的な機械学習系の検証をしてみたいと考えています。
おわりに
令和に入ってから個人情報保護法の改正もあって、データプライバシーに関する企業側のリテラシーはだいぶ上がっている印象があるので、今後は技術面でもデータのプライバシー保証が前提になったシステム開発が増えてくる気がします。
企業内でどんな情報がプライバシー侵害に該当するかという問答を繰り返すよりも、数学的に定義された指標に従って客観的に判断できた方が統一したルールも作りやすいし、結果的にユーザーの安心にも繋がるので、精度面での課題は多くてもテクノロジー主導でどんどん推進されるべきだと思います。
また、意外と誤解しやすいのが、このような技術はプライバシー保護のための技術であってシステムのセキュリティ自体を高めるためのものではないので、そもそもデータ自体に不正アクセスさせないような対策は当然していかなければなりませんね。
今後はプライバシー保護が規約と許諾ではなく技術によって約束されたプロダクト開発が求められると見越して技術調査・検証を続けていきたいと思います。