Path: blob/master/site/ja/federated/tutorials/private_heavy_hitters.ipynb
25118 views
Copyright 2022 The TensorFlow Authors.
プライベートヘビーヒッター
注意: この Colab は 最新リリースバージョンの tensorflow_federated
pip パッケージでの動作が確認されていますが、main
では動作しない可能性があります。
このチュートリアルでは、tff.analytics.heavy_hitters.iblt.build_iblt_computation
API を使用して、母集団で最も頻繁な文字列(プライベートヘビーヒッター)を検出するための連合分析計算を構築する方法を実演します。
環境の設定
環境が正しくセットアップされていることを確認するために、以下を実行してください。動作しない場合は、インストールガイドで手順を確認してください。
背景: 連合分析のプライベートヘビーヒッター
次の場合を検討してみてください。各クライアントには文字列のリストがあり、各文字列は開集団からのもので、任意である可能性があります。目標は、最も頻繁な文字列(ヘビーヒッター)とその数を連合設定でプライベートに発見することです。この colab は、次のプライバシープロパティを使用してこの問題の解決策を実演します。
セキュアな集計: サーバーがクライアントの個々の値を学習できないように、集計された文字列数を計算します。詳細については
tff.federated_secure_sum
を参照してください。差分プライバシー(DP: 分析における機密データのプライバシー漏洩を制限および定量化するために広く使用されている方法。ヘビーヒッターの結果にユーザーレベルの中央 DP を適用できます。
セキュアな集計 API tff.federated_secure_sum
は、整数ベクトルの線形の和をサポートします。文字列がサイズ n
の閉集合からのものである場合、各クライアントの文字列をサイズ n
のベクトルにエンコードするのは簡単です。ベクトルのインデックス i
の値を、閉集合の i
番目の文字列のカウントとします。すべてのクライアントのベクトルをセキュアに集計し、母集団全体の文字列の数を取得できます。ただし、文字列が開集合からのものである場合、セキュアな集計を取得するために文字列を適切にエンコードする方法は明らかではありません。この場合、文字列を Invertible Bloom Lookup Tables (IBLT) にエンコードできます。これは、大規模な(またはオープンな)ドメインのアイテムを効率的にエンコードできる確率的なデータ構造です。IBLT スケッチは線形和で表すことができるので、セキュアな集計と互換性があります。
tff.analytics.heavy_hitters.iblt.build_iblt_computation
を使用して、各クライアントのローカル文字列を IBLT 構造にエンコードする TFF 計算を作成します。これらの構造は、暗号化されたセキュアなマルチパーティ計算プロトコルを介して、サーバーがデコードできる集約された IBLT 構造にセキュアな集計として表されます。その後、サーバーは上位のヘビーヒッターを返します。次のセクションでは、この API を使用して TFF 計算を作成し、シェイクスピアデータセットでシミュレーションを実行する方法を示します。
シェイクスピアの連合データを読み込んで事前処理する
シェイクスピアのデータセットには、シェイクスピアの戯曲の登場人物の台詞が含まれています。この例では、文字のサブセット(つまり、クライアント)が選択されています。プリプロセッサは各登場人物の台詞を文字列のリストに変換し、句読点または記号のみの文字列はすべて削除されます。
シミュレーション
シミュレーションを実行してシェイクスピアデータセットで最も頻繁な単語(ヘビーヒッター)を見つけるには、最初に tff.analytics.heavy_hitters.iblt.build_iblt_computation
API と次のパラメータを使用して TFF 計算を作成する必要があります。
capacity
: IBLT スケッチの容量。この数は、1 回の計算で表示される可能性のある一意の文字列のおおよその総数である必要があります。デフォルトは1000
です。この数が小さすぎると、ハッシュ値の衝突によりデコードが失敗する可能性があります。この数が大きすぎると、必要以上のメモリを消費します。string_max_bytes
: IBLT 内の文字列の最大長。デフォルトは10
です。 正の値でなければなりません。string_max_bytes
より長い文字列は切り捨てられます。max_words_per_user
: 各クライアントが提供できる文字列の最大数。None
でない場合は、正の整数である必要があります。デフォルトはNone
です。これは、すべてのクライアントがすべての文字列を提供することを意味します。max_heavy_hitters
: 返すアイテムの最大数。デコードされた結果にこの数を超えるアイテムがある場合、推定カウントの降順で並べ替えられ、上位の max_heavy_hitters アイテムが返されます。 デフォルトはNone
です。これは、結果のすべてのヘビーヒッターを返すことを意味します。secure_sum_bitwidth
: セキュアな集計に使用されるビット幅。デフォルト値はNone
で、これはセキュアな集計を無効にします。None
でない場合は、[1,62]
の範囲内である必要があります。tff.federated_secure_sum
を参照してください。multi_contribution
: 各クライアントが複数のカウントを提供できるか、または一意の単語ごとに 1 つのカウントのみを提供できるか。デフォルトはTrue
です。この引数は、差分プライバシーが必要な場合の効用を改善する可能性がありますbatch_size
: データセットの各バッチ内の要素の数。デフォルトは1
で、入力データセットがtf.data.Dataset.batch(1)
によって処理されることを意味します。正の整数である必要があります。
これで、TFF 計算 iblt_computation
と前処理入力データセットを使用してシミュレーションを実行する準備が整いました。出力 iblt_computation
には 4 つの属性があります。
clients: 計算に参加したクライアントのスカラー数。
heavy_hitters: 集約されたヘビーヒッターのリスト。
heavy_hitters_counts: 集約されたヘビーヒッターの数のリスト。
num_not_decoded: 正常にデコードされなかった文字列のスカラー数。
差分プライバシーを適用したプライベートヘビーヒッター
中央 DP を使用してプライベートヘビーヒッターを取得するためには、開集合ヒストグラムに DP メカニズムが適用されます。集計されたヒストグラムの文字列の数にノイズを追加し、特定のしきい値を超える数の文字列のみを保持します。ノイズとしきい値は(epsilon、delta)- DP バジェットによって異なります。詳細なアルゴリズムと証明については、このドキュメントを参照してください。ノイズの多いカウントは、後処理ステップとして整数に丸められますが、DP の保証は弱化しません。DP が必要な場合は、ヘビーヒッターを多く発見できないことに注意してください。これは、しきい値処理ステップでカウントの少ない文字列が除外されるためです。