PipelineDP로 비공개 통계 계산

1. 시작하기 전에

합산 통계는 자신과 관련된 개인에 대한 정보를 유출하지 않는다고 생각할 수 있습니다. 그러나 공격자가 집계된 통계에서 개인에 대한 민감한 정보를 습득할 수 있는 다양한 방법이 있습니다.

이 Codelab에서는 개인 정보를 보호하기 위해 PipelineDP에서 개인 정보 차등 보호 집계로 비공개 통계를 생성하는 방법을 알아봅니다. 있습니다. PipelineDP는 Apache SparkApache Beam과 같은 일괄 처리 시스템을 사용하여 대규모 데이터 세트에 개인 정보 차등 보호를 적용할 수 있는 Python 프레임워크입니다. Go에서 개인 정보 차등 보호 통계를 계산하는 방법에 관한 자세한 내용은 Beam의 개인 정보 보호 Codelab을 참고하세요.

비공개는 데이터 내 개인의 개인 정보가 유출되지 않는 방식으로 출력이 생성되었음을 의미합니다. 익명처리의 강력한 개인 정보 보호 개념인 개인 정보 차등 보호를 통해 이러한 결과를 얻을 수 있습니다. 익명처리는 사용자 개인 정보를 보호하기 위해 여러 사용자의 데이터를 집계하는 프로세스입니다. 모든 익명처리 방법에서 집계를 사용하지만 모든 집계 방법이 익명처리를 수행하는 것은 아닙니다. 반면 개인 정보 차등 보호는 정보 유출과 개인 정보 보호에 대해 측정 가능한 보증을 제공합니다.

기본 요건

  • Python에 대한 기본 지식
  • 기본 데이터 집계에 대한 지식
  • Pandas, Spark, Beam 사용 경험

학습할 내용

  • 개인 정보 차등 보호의 기본 사항
  • PipelineDP로 개인 정보 차등 보호 요약 통계를 계산하는 방법
  • 추가 개인 정보 보호 및 유틸리티 매개변수로 결과를 조정하는 방법

필요한 항목

  • 사용 중인 환경에서 Codelab을 실행하려면 컴퓨터에 Python 3.7 이상이 설치되어 있어야 합니다.
  • 자체 환경 없이 Codelab을 따르려면 Colaboratory에 액세스해야 합니다.

2. 개인 정보 차등 보호 이해하기

개인 정보 차등 보호를 더 잘 이해하려면 다음의 간단한 예를 살펴보세요.

온라인 패션 소매업체의 마케팅 부서에서 일하고 있고 판매 가능성이 가장 높은 제품을 파악하려고 합니다.

이 차트는 고객이 이 매장 웹사이트를 방문할 때 티셔츠, 점퍼, 양말, 청바지 등 가장 먼저 본 제품을 보여줍니다. 티셔츠가 가장 인기 있는 상품이고 양말은 가장 인기 없는 상품입니다.

ea813c698889a4c6.png

유용할 것 같지만, 문제가 있습니다. 고객의 구매 여부 또는 두 번째로 조회한 제품과 같은 추가 정보를 고려하려고 하면 데이터에 개인이 공개될 위험이 있습니다.

이 차트에서는 한 고객만 점퍼를 먼저 본 후 실제로 구매했음을 보여줍니다.

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

없음

없음

거짓

0.0

1

청바지

t_shirt

청바지

점퍼

없음

거짓

0.0

2

t_shirt

점퍼

t_shirt

t_shirt

없음

true

105.19

3

t_shirt

t_shirt

청바지

없음

없음

거짓

0.0

4

t_shirt

양말

청바지

청바지

없음

거짓

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)

앞서 배웠듯이 이러한 통계는 데이터 세트에 있는 개인에 관한 정보를 드러낼 수 있습니다. 예를 들어 점퍼를 먼저 본 후에 한 사람만 전환되었습니다. 조회수가 22회인 경우 전환율은 약 0.05입니다. 이제 각 막대 그래프를 비공개 차트로 변환해야 합니다.

  1. pipeline_dp.NaiveBudgetAccountant 클래스로 개인 정보 보호 매개변수를 정의하고 분석에 사용할 epsilondelta 인수를 지정합니다.

이러한 인수를 설정하는 방법은 특정 문제에 따라 다릅니다. 자세한 내용은 '선택사항: 개인 정보 차등 보호 매개변수 조정'을 참고하세요.

이 코드 스니펫에서는 예시 값을 사용합니다.

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. max_contributions_per_partitions 인수를 1 값으로 설정합니다.

이 인수는 이 경우 단일 방문자가 개별 파티션 또는 제품 카테고리에 얼마나 기여할 수 있는지 지정합니다.

  1. privacy_id, partition, value 필드를 찾을 위치를 지정하는 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 값으로 설정할 수 있습니다.

이제 결과에서 모든 파티션 또는 제품의 데이터가 보고되는 것을 볼 수 있습니다.

a4f6302c8efcd5da.png

공개 파티션을 사용하면 더 많은 파티션을 유지할 수 있을 뿐만 아니라 파티션 선택에 개인 정보 보호 예산을 지출하지 않으므로 노이즈가 약 절반 정도 늘어납니다. 따라서 원시 개수와 비공개 개수의 차이는 이전 실행에 비해 약간 적습니다.

공개 파티션을 사용할 때 유념해야 할 중요한 두 가지 사항이 있습니다.

  • 원시 데이터에서 파티션 목록을 가져올 때는 주의해야 합니다. 개인 정보 차등 보호 방식으로 이를 수행하지 않으면 파이프라인에서 더 이상 개인 정보 차등 보호를 보장하지 않습니다. 자세한 내용은 고급: 데이터에서 파티션 파생을 참조하세요.
  • 일부 공개 파티션에 데이터가 없는 경우 개인 정보 차등 보호를 유지하기 위해 해당 파티션에 노이즈를 적용해야 합니다. 예를 들어 데이터 세트나 웹사이트에서 발생하지 않는 바지와 같은 추가 제품을 사용한 경우 여전히 노이즈이며 제품이 없는 경우에도 결과에 일부 제품 방문 내역이 표시될 수 있습니다.

고급: 데이터에서 파티션 파생

동일한 파이프라인에서 동일한 비공개 출력 파티션 목록으로 여러 집계를 실행하는 경우 dp_engine.select_private_partitions() 메서드로 파티션 목록을 한 번 파생하고 각 집계에 파티션을 public_partitions 입력으로 제공할 수 있습니다. 이렇게 하면 개인 정보 보호 관점에서 안전할 뿐만 아니라 전체 파이프라인에 대해 파티션 선택에 개인 정보 보호 예산을 한 번만 사용하므로 노이즈를 줄일 수 있습니다.

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를 사용하면 AggregateParams 인스턴스에서 동일한 매개변수를 공유하는 한 여러 통계를 동시에 계산할 수 있습니다. 이에 관해서는 이후에 알아봅니다. 여러 측정항목을 한 번에 손쉽게 계산할 수 있을 뿐 아니라 개인 정보 보호 측면에서도 더 좋습니다.

NaiveBudgetAccountant 클래스에 제공하는 epsilondelta 매개변수를 기억한다면 이러한 매개변수는 개인 정보 보호 예산이라는 것을 나타냅니다. 이 예산은 데이터에서 유출되는 사용자 개인 정보 보호 수준을 측정합니다.

개인 정보 보호 예산에 관해 기억해야 할 중요한 점은 예산이 추가된다는 것입니다. 한 번에 특정 엡실론 및 델타 delta로 파이프라인을 실행하면 (ion,아래) 예산을 소비하게 됩니다. 두 번째로 실행하면 총 (2 app, 2paste)의 예산이 지출됩니다. 마찬가지로 NaiveBudgetAccountant 메서드로 여러 통계를 계산하고 연속해서 개인 정보 보호 예산인 en,향후 즉, 개인 정보 보호 보증이 약화됩니다.

이를 우회하려면 동일한 데이터로 여러 통계를 계산해야 할 때 사용할 총 예산과 함께 단일 NaiveBudgetAccountant 인스턴스를 사용해야 합니다. 그런 다음 각 집계에 사용할 epsilondelta 값을 지정해야 합니다. 결과적으로 전반적으로 동일한 개인 정보 보호가 보장되지만 특정 집계의 epsilondelta 값이 클수록 정확도가 높아집니다.

실제 동작을 확인하기 위해 count, mean, sum 통계를 계산하면 됩니다.

두 가지 측정항목, 즉 가장 먼저 조회된 제품을 기준으로 발생한 수익을 추정하는 데 사용하는 conversion_value 측정항목과 웹사이트 방문자 수와 평균 전환율을 계산하는 데 사용하는 has_conversion 측정항목을 더해 통계를 계산합니다.

각 측정항목마다 비공개 통계를 계산할 때 기준이 되는 매개변수를 별도로 지정해야 합니다. 개인 정보 보호 예산을 두 측정항목에 분할합니다. has_conversion 측정항목에서 두 가지 통계를 계산하므로 이를 초기 예산의 3분의 2로 할당하고 다른 3분의 1은 conversion_value 측정항목에 할당합니다.

여러 통계를 계산하는 방법은 다음과 같습니다.

  1. 다음 세 가지 통계에서 사용하려는 총 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_valuemax_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 변수를 기반으로 두 측정항목을 계산합니다.
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를 집계로 정의하고 개인 정보 보호 예산의 2/3를 이 계산에 할당하는 것입니다. 두 통계에 동일한 참여 한도를 설정하고 동일한 has_conversion 변수를 기반으로 계산하려고 하므로 동일한 pipeline_dp.AggregateParams 인스턴스에서 이를 결합하고 동시에 계산할 수 있습니다.

  1. budget_accountant.compute_budgets() 메서드 호출:
budget_accountant.compute_budgets()

세 가지 비공개 통계를 모두 원래의 통계와 비교하여 표시할 수 있습니다. 추가된 노이즈에 따라 결과가 실제 범위를 벗어날 수 있습니다. 이 경우에는 추가된 노이즈가 0에 가까운 대칭이기 때문에 점프의 전환율과 총 전환 가치가 음수입니다. 추가 분석 및 처리를 위해 비공개 통계를 수동으로 후처리하지 않는 것이 가장 좋지만, 이러한 플롯을 보고서에 추가하려는 경우 나중에 개인정보 보호를 위반하지 않고 최소값을 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 매개변수와 같은 꽤 많은 매개변수를 확인했습니다. 이는 크게 개인 정보 보호 매개변수유틸리티 매개변수의 두 가지 카테고리로 나눌 수 있습니다.

개인 정보 보호 매개변수

epsilondelta 매개변수는 개인 정보 차등 보호로 제공하는 개인 정보 보호를 수량화합니다. 더 정확하게 말하자면, 잠재적인 공격자가 익명처리된 출력에서 데이터에 관해 얻을 수 있는 정보의 양을 측정한 것입니다. 매개변수 값이 클수록 공격자가 데이터에 대해 더 많은 정보를 얻게 되어 개인 정보가 유출될 위험이 있습니다. 반면 epsilondelta 매개변수의 값이 작을수록 익명처리하기 위해 출력에 더 많은 노이즈를 추가해야 하고 익명처리된 출력에 유지하기 위해 각 파티션에서 필요한 순 사용자 수가 더 많습니다. 이 경우 유용성과 개인 정보 보호 사이에는 장단점이 있습니다.

NaiveBudgetAccountant 인스턴스에서 총 개인 정보 보호 예산을 설정할 때 PipelineDP에서 익명처리된 출력에 대해 원하는 개인 정보 보호 보장을 지정해야 합니다. 단, 개인 정보 보호 보증을 유지하려면 각 집계에 별도의 NaiveBudgetAccountant 인스턴스를 신중하게 사용하거나 파이프라인을 여러 번 실행하여 예산 초과 사용을 방지해야 합니다.

개인 정보 차등 보호 및 개인 정보 보호 매개변수의 의미에 대한 자세한 내용은 개인 정보 차등 보호 읽기 목록을 참고하세요.

유틸리티 매개변수

유틸리티 매개변수는 개인 정보 보호 보장에는 영향을 미치지 않지만 정확성 및 결과적으로 출력의 유용성에 영향을 미칩니다. AggregateParams 인스턴스에 제공되며 추가된 노이즈를 조정하는 데 사용됩니다.

AggregateParams 인스턴스에 제공되고 모든 집계에 적용할 수 있는 유용성 매개변수는 max_partitions_contributed 매개변수입니다. 파티션은 PipelineDP 집계 작업에서 반환하는 데이터의 키에 해당하므로 max_partitions_contributed 매개변수는 사용자가 출력에 기여할 수 있는 고유한 키 값의 수를 제한합니다. 사용자가 max_partitions_contributed 매개변수 값을 초과하는 여러 키에 기여하는 경우 일부 기여는 제외되어 max_partitions_contributed 매개변수의 정확한 값에 기여합니다.

마찬가지로 대부분의 집계에는 max_contributions_per_partition 매개변수가 있습니다. AggregateParams 인스턴스에도 제공되며 각 집계에는 별도의 값이 있을 수 있습니다. 키마다 사용자의 기여를 바인딩합니다.

출력에 추가되는 노이즈는 max_partitions_contributedmax_contributions_per_partition 매개변수에 의해 조정되므로 여기에는 절충이 있습니다. 각 매개변수에 할당된 값이 클수록 데이터가 더 많이 유지되지만 노이즈가 더 많은 결과를 얻게 됩니다.

일부 집계에는 각 사용자의 기여에 대한 경계를 지정하는 min_valuemax_value 매개변수가 필요합니다. 사용자가 min_value 매개변수에 할당된 값보다 낮은 값을 기여하면 값은 매개변수 값까지 증가합니다. 마찬가지로 사용자가 max_value 매개변수 값보다 큰 값을 기여하면 이 값은 매개변수 값으로 줄어듭니다. 원래 값을 더 많이 유지하려면 더 큰 범위를 지정해야 합니다. 노이즈는 경계 크기에 따라 조정되므로 경계가 클수록 더 많은 데이터를 보관할 수 있지만 결국 노이즈가 더 많은 결과가 발생합니다.

마지막으로 noise_kind 매개변수는 PipelineDP에서 두 가지 노이즈 메커니즘인 GAUSSIANLAPLACE 노이즈를 지원합니다. LAPLACE 배포는 낮은 참여 범위로 더 나은 유용성을 제공하므로 PipelineDP에서는 기본적으로 이를 사용합니다. 그러나 GAUSSIAN 분산 노이즈를 사용하려면 AggregateParams 인스턴스에서 지정하면 됩니다.

9. 축하합니다

훌륭합니다. PipelineDP Codelab을 완료하고 개인 정보 차등 보호 및 PipelineDP에 관해 많은 내용을 배웠습니다.

자세히 알아보기