PipelineDP を使用して非公開統計情報を計算する

1. 始める前に

集計統計では、関係する個人に関する情報が漏洩していないと思われるかもしれません。しかし、集計した統計情報から個人の機密情報を知る手口は数多くあります。

この Codelab では、PipelineDP の差分プライベート集計を使用してプライベート統計情報を生成し、個人のデータを保護する方法を学びます。プライバシーを保護する。PipelineDP は、Apache SparkApache Beam などのバッチ処理システムを使用して大規模なデータセットに差分プライバシーを適用できる Python フレームワークです。Go で差分プライベート統計を計算する方法の詳細については、Beam におけるプライバシーの Codelab をご覧ください。

非公開とは、データ内の個人に関する個人情報が漏洩しない方法で出力が生成されることを意味します。この結果は、差分プライバシーによって実現できます。これは、匿名化の強力なプライバシー概念で、ユーザーのプライバシーを保護するために複数のユーザー間でデータを集約するプロセスです。すべての匿名化メソッドで集計を使用しますが、すべての集計メソッドで匿名化が行われるわけではありません。一方、差分プライバシーは、情報の漏洩とプライバシーについて測定可能な保証を提供します。

前提条件

  • Python の基本知識があること
  • 基本的なデータ集計に精通していること
  • pandas、Spark、Beam の使用経験

学習内容

  • 差分プライバシーの基本
  • PipelineDP を使用して差分プライベート サマリー統計を計算する方法
  • プライバシーとユーティリティのパラメータを追加して結果を調整する方法

必要なもの

  • この Codelab を実際の環境で実行する場合は、Python 3.7 以降がパソコンにインストールされている必要があります。
  • 独自の環境なしで Codelab を行う場合は、Colaboratory へのアクセス権が必要です。

2. 差分プライバシーについて

差分プライバシーについて理解を深めるために、次の簡単な例をご覧ください。

あなたはオンライン ファッション小売業者のマーケティング部門で働いており、売れそうな商品を把握したいと考えています。

このグラフは、ユーザーがショップのウェブサイトにアクセスした際に最初に見た商品(T シャツ、ジャンパー、ソックス、ジーンズ)を示しています。T シャツが最も人気があり、ソックスが最も人気がない。

ea813c698889a4c6.png

これは便利そうに見えますが、落とし穴があります。ユーザーが購入したかどうかや 2 番目に閲覧した商品など、追加情報を考慮しようとすると、データの中の個人が漏洩するリスクがあります。

このグラフは、最初にジャンパーを見てから実際に購入した顧客は 1 人のみであることを示しています。

b7c6f7f891778366.png

プライバシーの観点から、これはあまり好ましくありません。匿名化した統計情報からは個々の貢献度が明らかにならないので、どうすればよいでしょうか。棒グラフにランダムなノイズを追加して、棒グラフの精度を少し下げます。

この棒グラフは完全に正確というわけではありませんが、有益で、個々の貢献度が明らかになることはありません。

b55e8d7f99f6d574.gif

差分プライバシーとは、適切な量のランダムノイズを追加して、個々の寄与をマスクすることです。

この例は単純化されすぎています。差分プライバシーを適切に実装するには、より複雑で、予期しない実装の微妙な違いも多数あります。暗号と同様に、差分プライバシーを独自に実装することはおすすめできません。代わりに PipelineDP を使用できます。

3. PipelineDP をダウンロードしてインストールする

関連するすべてのコードとグラフはこのドキュメントに記載されているため、この Codelab に沿って PipelineDP をインストールする必要はありません。

PipelineDP を試すには、自分で実行するか、後で使用します。

  • PipelineDP をダウンロードしてインストールします。
pip install pipeline-dp

Apache Beam を使用してサンプルを実行する場合:

  • Apache Beam をダウンロードしてインストールします。
pip install apache_beam

この Codelab のコードとデータセットは、PipelineDP/examples/codelab/ ディレクトリにあります。

4. 最初に表示された商品あたりのコンバージョン指標を計算する

あなたはオンラインのファッション小売店で働いており、最初に表示されたときに最も多くのコンバージョンを獲得している商品カテゴリを把握したいとします。あなたはこの情報をマーケティング代理店や他の社内チームと共有したいと考えていますが、個々の顧客に関する情報は漏洩しないようにする必要があります。

ウェブサイトで最初に表示された商品あたりのコンバージョン指標を計算するには:

  1. PipelineDP/examples/codelab/ ディレクトリにあるウェブサイトへのアクセスの疑似データセットを確認します。

このスクリーンショットはデータセットの例です。ユーザーの ID、ユーザーが閲覧した商品、ユーザーがコンバージョンに至ったかどうか、コンバージョンがあった場合はそのコンバージョン値が含まれます。

user_id

product_view_0

product_view_1

product_view_2

product_view_3

product_view_4

has_conversion

conversion_value

0

ジーンズ

t_shirt

t_shirt

なし

なし

false

0.0

1

ジーンズ

t_shirt

ジーンズ

ジャンパー

なし

false

0.0

2

t_shirt

ジャンパー

t_shirt

t_shirt

なし

true

105.19

3

t_shirt

t_shirt

ジーンズ

なし

なし

false

0.0

4

t_shirt

靴下

ジーンズ

ジーンズ

なし

false

0.0

以下の指標に興味があります。

  • view_counts: ウェブサイトを訪れたユーザーに各商品が最初に表示された回数。
  • total_conversion_value: ユーザーがコンバージョンを達成したときに使用した費用の合計額。
  • conversion_rate: ユーザーのコンバージョン率。
  1. 非公開ではない方法で指標を生成します。
conversion_metrics = df.groupby(['product_view_0'
                               ])[['conversion_value', 'has_conversion']].agg({
                                   'conversion_value': [len, np.sum],
                                   'has_conversion': np.mean
                               })
conversion_metrics = conversion_metrics.rename(
   columns={
       'len': 'view_counts',
       'sum': 'total_conversion_value',
       'mean': 'conversion_rate'
   }).droplevel(
       0, axis=1)

すでに学習したように、これらの統計情報からデータセット内の個人に関する情報が明らかになります。たとえば、最初にジャンパーを見てからコンバージョンに至ったのは 1 人だけです。視聴回数が 22 回の場合、コンバージョン率は約 0.05 です。次に、各棒グラフを非公開の棒グラフに変換する必要があります。

  1. pipeline_dp.NaiveBudgetAccountant クラスでプライバシー パラメータを定義してから、分析に使用する epsilon 引数と delta 引数を指定します。

これらの引数の設定方法は、問題によって異なります。詳細については、「省略可: 差分プライバシー パラメータを調整する」をご覧ください。

このコード スニペットではサンプルの値が使用されています。

budget_accountant = pipeline_dp.NaiveBudgetAccountant(
     total_epsilon=1, total_delta=1e-5)
  1. LocalBackend インスタンスを初期化します。
ops = pipeline_dp.LocalBackend()

このプログラムは、Beam や Spark などの追加のフレームワークなしでローカルで実行するため、LocalBackend インスタンスを使用できます。

  1. DPEngine インスタンスを初期化します。
dp_engine = pipeline_dp.DPEngine(budget_accountant, ops)

PipelineDP では、pipeline_dp.AggregateParams クラスを使用してさらにパラメータを指定できます。これは非公開統計情報の生成に影響します。

params = pipeline_dp.AggregateParams(
     noise_kind=pipeline_dp.NoiseKind.LAPLACE,
     metrics=[pipeline_dp.Metrics.COUNT],
     max_partitions_contributed=1,
     max_contributions_per_partition=1)
  1. count 指標を計算し、LAPLACE ノイズ分布を使用することを指定します。
  2. max_partitions_contributed 引数を 1 値に設定します。

この引数は、1 人のユーザーが貢献できる訪問回数を制限します。ユーザーが 1 日に 1 回ウェブサイトにアクセスすることを想定し、1 日に複数回アクセスしてもかまわないとします。

  1. max_contributions_per_partitions 引数を 1 値に設定します。

この引数では、1 人のユーザーが個々のパーティションまたは商品カテゴリに対して貢献できる数を指定します。

  1. privacy_idpartitionvalue フィールドの場所を指定する data_extractor インスタンスを作成します。

コードは次のコード スニペットのようになります。

def run_pipeline(data, ops):
 budget_accountant = pipeline_dp.NaiveBudgetAccountant(
     total_epsilon=1, total_delta=1e-5)

 dp_engine = pipeline_dp.DPEngine(budget_accountant, ops)

 params = pipeline_dp.AggregateParams(
     noise_kind=pipeline_dp.NoiseKind.LAPLACE,
     metrics=[pipeline_dp.Metrics.COUNT],
     max_partitions_contributed=1, # A single user can only contribute to one partition.
     max_contributions_per_partition=1, # For a single partition, only one contribution per user is used.
     )

 data_extractors = pipeline_dp.DataExtractors(
     privacy_id_extractor=lambda row: row.user_id,
     partition_extractor=lambda row: row.product_view_0
     value_extractor=lambda row: row.has_conversion)

 dp_result = dp_engine.aggregate(data, params, data_extractors)

 budget_accountant.compute_budgets()

 return dp_result
  1. 次のコードを追加して、Pandas DataFrame を行のリストに変換し、そこから差分プライベート統計を直接計算します。
rows = [index_row[1] for index_row in df.iterrows()]
dp_result_local = run_pipeline(rows, ops) # Returns generator
list(dp_result_local)

これで、最初の差分プライベート統計を計算しました。

このグラフには、差分プライベートの数と、前に計算した非プライベートの数の隣に、差分プライベートの数が表示されます。

a5a25a00858219ab.png

コードの実行時に表示される棒グラフは、これとは異なる場合がありますが、問題ありません。差分プライバシーのノイズにより、コードを実行するたびに異なる棒グラフが表示されますが、非公開ではない元の棒グラフと似ていることがわかります。

プライバシー保証では、プライバシー保証のためにパイプラインを複数回実行しないことが非常に重要です。詳細については、「複数の統計情報を計算する」をご覧ください。

5. パブリック パーティションを使用する

前のセクションでは、あるパーティションの訪問データ(ウェブサイトで最初に靴下を見たユーザー)がすべて失われたことにお気づきかもしれません。

これは、出力パーティションの存在がユーザーデータ自体に依存する場合に差分プライバシーを保証するための重要なステップである、パーティションの選択またはしきい値の設定によるものです。この場合、出力にパーティションが存在するだけで、データ内に個々のユーザーの存在が漏えいする可能性があります。これがプライバシーを侵害する理由について詳しくは、こちらのブログ投稿をご覧ください。このプライバシー侵害を防ぐため、PipelineDP は十分な数のユーザーが格納されたパーティションのみを保持します。

出力パーティションのリストがプライベート ユーザーデータに依存しない場合、このパーティション選択手順は必要ありません。この例が示すとおり、ユーザーが最初に目にする可能性のある商品カテゴリがすべてわかっているからです。

パーティションを使用するには:

  1. 使用可能なパーティションのリストを作成します。
public_partitions_products = ['jeans', 'jumper', 'socks', 't-shirt']
  1. リストを run_pipeline() 関数に渡します。この関数は、pipeline_dp.AggregateParams クラスへの追加入力として設定します。
run_pipeline(
    rows, ops, total_delta=0, public_partitions=public_partitions_products)
  # Returns generator
params = pipeline_dp.AggregateParams(
     noise_kind=pipeline_dp.NoiseKind.LAPLACE,
     metrics=[pipeline_dp.Metrics.COUNT],
     max_partitions_contributed=1,
     max_contributions_per_partition=1,
     public_partitions=public_partitions_products)

パブリック パーティションと LAPLACE ノイズを使用する場合は、total_delta 引数を 0 値に設定できます。

すべてのパーティション(つまり product)のデータが報告されるはずです。

a4f6302c8efcd5da.png

パブリック パーティションでは、より多くのパーティションを保持できるだけでなく、パーティションの選択にプライバシー バジェットを使用しないため、約半分のノイズが追加されます。そのため、未加工カウントとプライベート カウントの差は以前の実行と比較してわずかに小さくなります。

パブリック パーティションを使用する場合は、次の 2 つの点に注意してください。

  • 元データからパーティションのリストを取得する場合は注意が必要です。これを差分プライベート方式で行わないと、パイプラインで差分プライバシーの保証が提供されなくなります。詳細については、「上級者向け: データからパーティションを導き出す」をご覧ください。
  • 一部のパブリック パーティションにデータがない場合は、それらのパーティションにノイズを適用して差分プライバシーを維持する必要があります。たとえば、データセットやウェブサイトにない「ズボン」などの別の商品を使用しても、これはノイズであり、結果にはそうした商品がないにもかかわらず、一部の商品への訪問が表示される場合があります。

高度: データからパーティションを導出する

同じパイプラインで、非公開出力パーティションの同じリストを使用して複数の集計を実行する場合、dp_engine.select_private_partitions() メソッドを使用してパーティションのリストを 1 回取得し、パーティションを各集計に public_partitions 入力として指定できます。これはプライバシーの観点から安全であるだけでなく、パイプライン全体でパーティションの選択にプライバシー バジェットを 1 回だけ使用するため、ノイズの追加も少なくて済みます。

def get_private_product_views(data, ops):
 """Obtains the list of product_views in a private manner.

   This does not calculate any private metrics; it merely obtains the list of
   product_views but does so while making sure the result is differentially private.
   """

 # Set the total privacy budget.
 budget_accountant = pipeline_dp.NaiveBudgetAccountant(
     total_epsilon=1, total_delta=1e-5)

 # Create a DPEngine instance.
 dp_engine = pipeline_dp.DPEngine(budget_accountant, ops)

 # Specify how to extract privacy_id, partition_key, and value from a   
 # single element.
 data_extractors = pipeline_dp.DataExtractors(
     partition_extractor=lambda row: row.product_view_0,
     privacy_id_extractor=lambda row: row.user_id)

 # Run aggregation.
 dp_result = dp_engine.select_partitions(
     data, pipeline_dp.SelectPrivatePartitionsParams(
       max_partitions_contributed=1),
     data_extractors=data_extractors)

 budget_accountant.compute_budgets()
 return dp_result

6. 複数の統計情報を計算する

PipelineDP の仕組みを理解したところで、次はより高度なユースケースで PipelineDP を使用する方法を見ていきます。最初に述べたように、3 つの統計情報が必要です。PipelineDP では、AggregateParams インスタンスで同じパラメータを共有している限り、複数の統計情報を同時に計算できます。これについては後で説明します。複数の指標を一度に計算しやすくなるだけでなく、プライバシーの面でも優れています。

NaiveBudgetAccountant クラスに渡す epsilon パラメータと delta パラメータは、プライバシー バジェットと呼ばれるものを表します。プライバシー バジェットとは、データから漏洩するユーザーのプライバシーの度合いを表す尺度です。

プライバシー バジェットは足し算型であるということを覚えておいてください。特定のイプシロン epsilon と delta dev を持つパイプラインを 1 回実行した場合、予算 (epsilon) を消費することになります。2 回目を実行すると、合計予算は (2ep, 2Σ) になります。同様に、NaiveBudgetAccountant メソッドを使用して複数の統計値を計算し、プライバシー バジェットとして連続して ep,d のプライバシー バジェットを計算すると、合計バジェットは (2ep, 2 デル) になります。つまり、プライバシーの保証が低下します。

これを回避するには、同じデータに対して複数の統計情報を計算する必要がある場合に使用する合計予算とともに NaiveBudgetAccountant インスタンスを 1 つ使用する必要があります。次に、各集計に使用する epsilon 値と delta 値を指定する必要があります。結局のところ、全体的なプライバシー保証は同じですが、特定の集計の epsilon 値と delta 値が高いほど、精度が高くなります。

実際の動作を確認するには、countmeansum の統計情報を計算します。

2 種類の指標(最初に表示された商品から得られる収益額を推測する指標)と has_conversion 指標(ウェブサイトの訪問者数と平均コンバージョン率を算出する指標)を合わせて計算します。conversion_value

指標ごとに、非公開統計情報の計算の指針となるパラメータを個別に指定する必要があります。プライバシー バジェットを 2 つの指標に分割します。has_conversion 指標から 2 つの統計情報を計算するため、最初の予算の 3 分の 2 を指標に割り当て、残りの 3 分の 1 を conversion_value 指標に割り当てます。

複数の統計情報を計算するには:

  1. プライバシー予算会計士に、3 つの統計情報で使用する合計 epsilondelta の値を設定します。
budget_accountant = pipeline_dp.NaiveBudgetAccountant(
     total_epsilon=1, total_delta=0)
  1. DPEngine を初期化して指標を計算します。
 dp_engine = pipeline_dp.DPEngine(budget_accountant, ops)
  1. この指標のパラメータを指定します。
params_conversion_value_metrics = pipeline_dp.AggregateParams(
     noise_kind=pipeline_dp.NoiseKind.LAPLACE,
     metrics=[pipeline_dp.Metrics.SUM],
     max_partitions_contributed=1,
     max_contributions_per_partition=1,
     min_value=0,
     max_value=100,
     public_partitions=public_partitions,
     budget_weight=1/3)

最後の引数には、必要に応じてプライバシー バジェットの重みを指定します。すべてに同じ重みを設定することもできますが、ここでは前述のようにこの引数を 3 分の 1 に設定します。

また、min_value 引数と max_value 引数を設定して、パーティション内のプライバシー ユニットごとに提供される値に適用される下限と上限を指定します。これらのパラメータは、非公開の合計または平均を計算する場合は必須です。負の値は想定されないため、0100 を妥当な境界と見なすことができます。

  1. 関連するデータを抽出し、集計関数に渡します。
data_extractors_conversion_value_metrics = pipeline_dp.DataExtractors(
     privacy_id_extractor=lambda row: row.user_id,
     partition_extractor=lambda row: row.product_view_0,
     value_extractor=lambda row: row.conversion_value)

 dp_result_conversion_value_metrics = (
     dp_engine.aggregate(data, params_conversion_value_metrics,
         data_extractors_conversion_value_metrics))
  1. 同じ手順で、has_conversion 変数に基づいて 2 つの指標を計算します。
params_conversion_rate_metrics = pipeline_dp.AggregateParams(
     noise_kind=pipeline_dp.NoiseKind.LAPLACE,
     metrics=[pipeline_dp.Metrics.COUNT, pipeline_dp.Metrics.MEAN],
     max_partitions_contributed=1,
     max_contributions_per_partition=1,
     min_value=0,
     max_value=1,
     public_partitions=public_partitions,
     budget_weight=2/3)

 data_extractors_conversion_rate_metrics = pipeline_dp.DataExtractors(
     privacy_id_extractor=lambda row: row.user_id,
     partition_extractor=lambda row: row.product_view_0,
     value_extractor=lambda row: row.has_conversion)

 dp_result_conversion_rate_metrics = (
     dp_engine.aggregate(data, params_conversion_rate_metrics,
         data_extractors_conversion_rate_metrics))

唯一の違いは pipeline_dp.AggregateParams インスタンスです。ここでは、meancount を集計として定義し、この計算にプライバシー バジェットの 3 分の 2 を割り当てます。両方の統計情報に同じ貢献度の限界を設定し、同じ has_conversion 変数を基に計算したいため、同じ pipeline_dp.AggregateParams インスタンスでそれらを組み合わせて同時に計算できます。

  1. budget_accountant.compute_budgets() メソッドを呼び出します。
budget_accountant.compute_budgets()

3 つの非公開統計情報すべてを元の統計情報と比較してプロットできます。追加したノイズによっては、結果が妥当な尺度から外れることがあります。この例では、追加されたノイズがゼロを中心にして対称であるため、ジャンパーのコンバージョン率と合計コンバージョン値はマイナスになります。詳細な分析や処理では、非公開の統計情報を手動で後処理しないことをおすすめします。ただし、これらのグラフをレポートに追加する場合は、プライバシーの保証を損なうことなく、後から最小値を 0 に設定できます。

cb1fc563f817eaf.png

7. Beam を使用してパイプラインを実行する

最近のデータ処理では、大量のデータを扱う必要があるため、ローカルで処理できません。多くの人は、Beam や Spark などの大規模なデータ処理用のフレームワークを使用して、パイプラインをクラウドで実行します。

PipelineDP は、コードを少し変更するだけで Beam と Spark をサポートします。

private_beam API を使用して Beam でパイプラインを実行するには:

  1. runner 変数を初期化し、プライバシー オペレーションを rows の Beam 表現に適用するパイプラインを作成します。
runner = fn_api_runner.FnApiRunner()  # local runner

with beam.Pipeline(runner=runner) as pipeline:
   beam_data = pipeline | beam.Create(rows)
  1. 必要なプライバシー パラメータを含む budget_accountant 変数を作成します。
budget_accountant = pipeline_dp.NaiveBudgetAccountant(
               total_epsilon=1, total_delta=0)
  1. pcol(非公開コレクション)変数を作成します。これにより、すべての集計がプライバシー要件に準拠していることが保証されます。
pcol = beam_data | pbeam.MakePrivate(
                                 budget_accountant=budget_accountant,
                                 privacy_id_extractor=lambda 
                                                    row: row.user_id)
  1. 非公開集計のパラメータを適切なクラスで指定します。

ここでは、商品の閲覧数の合計を計算するため、pipeline_dp.aggregate_params.SumParams() クラスを使用しています。

  1. 集計パラメータを pbeam.Sum メソッドに渡して、統計を計算します。
dp_result = pcol | pbeam.Sum(params)
  1. 最終的に、コードは次のコード スニペットのようになります。
import pipeline_dp.private_beam as pbeam
runner = fn_api_runner.FnApiRunner()  # local runner

with beam.Pipeline(runner=runner) as pipeline:
   beam_data = pipeline | beam.Create(rows)
   budget_accountant = pipeline_dp.NaiveBudgetAccountant(
               total_epsilon=1, total_delta=0)

   # Create private collection.
   pcol = beam_data | pbeam.MakePrivate(
                              budget_accountant=budget_accountant,
                              privacy_id_extractor=lambda row:  
                                                         row.user_id)
   # Specify parameters.
   params = pipeline_dp.aggregate_params.SumParams(
     noise_kind=pipeline_dp.NoiseKind.LAPLACE,
     max_partitions_contributed=1,
     max_contributions_per_partition=1,
     min_value=0,
     max_value=100,
     public_partitions=public_partitions_product_views,
     partition_extractor=lambda row: row.product_view_0,
     value_extractor=lambda row:row.conversion_value)
   dp_result = pcol | pbeam.Sum(params)

   budget_accountant.compute_budgets()
   dp_result | beam.Map(print)

8. 省略可: プライバシーとユーティリティのパラメータを調整する

この Codelab では、epsilon パラメータ、delta パラメータ、max_partitions_contributed パラメータなど、多くのパラメータを確認しました。これらは、プライバシー パラメータとユーティリティ パラメータの 2 つのカテゴリに分類できます。

プライバシー パラメータ

epsilon パラメータと delta パラメータは、差分プライバシーによって提供するプライバシーを定量化します。より正確には、匿名化された出力から潜在的な攻撃者がデータに関してどれだけの情報を得ることができるかを示す尺度です。パラメータの値が高いほど、攻撃者が取得するデータに関する情報が多くなり、プライバシー リスクとなります。一方、epsilon パラメータと delta パラメータの値が小さいほど、匿名にするために出力に追加する必要があるノイズが多くなり、匿名化された出力に保持するために必要な各パーティションのユニーク ユーザーの数が増えます。この場合、実用性とプライバシーはトレードオフの関係にあります。

PipelineDP では、NaiveBudgetAccountant インスタンスで合計プライバシー バジェットを設定するときに、匿名化された出力の必要なプライバシー保証を指定する必要があります。ただし、プライバシー保証を維持するには、予算の過剰な使用を避けるために、集計ごとに個別の NaiveBudgetAccountant インスタンスを慎重に使用するか、パイプラインを複数回実行する必要があります。

差分プライバシーとプライバシー パラメータの意味について詳しくは、差分プライバシーに関するリーディング リストをご覧ください。

ユーティリティ パラメータ

ユーティリティ パラメータはプライバシーの保証には影響しませんが、出力の精度、ひいては出力の有用性には影響します。これらは AggregateParams インスタンスで指定され、追加されたノイズのスケーリングに使用されます。

AggregateParams インスタンスで提供され、すべての集計に適用されるユーティリティ パラメータは max_partitions_contributed パラメータです。パーティションは、PipelineDP 集計オペレーションによって返されるデータのキーに対応しているため、max_partitions_contributed パラメータは、ユーザーが出力に貢献できる個別のキー値の数を制限します。ユーザーが寄与したキーの数が max_partitions_contributed パラメータの値を超える場合は、max_partitions_contributed パラメータの値に寄与するよう、寄与の一部が破棄されます。

同様に、ほとんどの集計には max_contributions_per_partition パラメータがあります。これらの値は AggregateParams インスタンスでも指定され、各集計値に個別の値が存在する可能性があります。鍵ごとにユーザーの貢献度をバインドします。

出力に追加されるノイズは、max_partitions_contributed パラメータと max_contributions_per_partition パラメータでスケーリングされるため、トレードオフが発生します。各パラメータに割り当てられた値が大きいほど、保持できるデータが増えますが、結果はノイズが多くなります。

一部の集計では、各ユーザーの貢献度の範囲を指定する min_value パラメータと max_value パラメータが必要です。ユーザーが入力した値が min_value パラメータに割り当てられた値よりも低い場合、値はパラメータの値まで引き上げられます。同様に、ユーザーが入力した値が max_value パラメータの値より大きい場合、値はパラメータの値まで減少します。より多くの元の値を維持するには、より大きな境界を指定する必要があります。ノイズは境界のサイズによってスケーリングされるため、境界が大きいほど保持できるデータが増えますが、結果のノイズが多くなります。

最後に、noise_kind パラメータは PipelineDP で GAUSSIANLAPLACE の 2 種類のノイズ メカニズムをサポートしています。LAPLACE 分布は、寄与範囲が低いほど有用性に優れています。そのため、PipelineDP はデフォルトでこの分布を使用します。ただし、GAUSSIAN 分布ノイズを使用する場合は、AggregateParams インスタンスで指定できます。

9. 完了

パフォーマンスは良好です。PipelineDP Codelab を修了し、差分プライバシーと PipelineDP について多くのことを学びました。

その他の情報