1. 시작하기 전에
집계 통계에서는 통계와 관련된 개인의 정보가 유출되지 않는다고 생각할 수 있습니다. 하지만 공격자는 여러 가지 방법으로 집계 통계에서 개인에 관한 민감한 정보를 습득할 수 있습니다.
이 Codelab에서는 PipelineDP의 개인 정보 차등 보호 집계를 사용하여 비공개 통계를 생성하여 개인의 개인 정보를 보호하는 방법을 알아봅니다. PipelineDP는 Apache Spark 및 Apache Beam과 같은 일괄 처리 시스템을 사용하여 대규모 데이터 세트에 개인 정보 차등 보호를 적용할 수 있는 Python 프레임워크입니다. Go에서 개인 정보 차등 보호 통계를 계산하는 방법을 자세히 알아보려면 Privacy on Beam Codelab을 참고하세요.
비공개는 데이터 속의 비공개 개인 정보를 유출하지 않는 방식으로 출력이 생성된다는 의미입니다. 이러한 결과는 사용자 개인 정보 보호를 위해 여러 사용자의 데이터를 집계하는 과정인 익명처리의 강력한 개인 정보 보호 개념인 개인 정보 차등 보호를 통해 달성할 수 있습니다. 모든 익명처리 방법에서 집계가 사용되지만, 모든 집계 방법에서 익명처리가 이루어지지는 않습니다. 반면 개인 정보 차등 보호는 정보 유출과 개인 정보 보호에 관해 측정 가능한 보증을 제공합니다.
기본 요건
- Python에 대한 기본 지식
- 기본 데이터 집계에 대한 지식
- pandas, Spark, Beam 사용 경험
학습할 내용
- 개인 정보 차등 보호의 기본사항
- PipelineDP로 개인 정보 차등 보호 요약 통계를 계산하는 방법
- 추가 개인 정보 보호 및 유틸리티 매개변수로 검색 결과를 조정하는 방법
필요한 항목
- 자체 환경에서 코드랩을 실행하려면 컴퓨터에 Python 3.7 이상이 설치되어 있어야 합니다.
- 자체 환경 없이 Codelab을 따르려면 Colaboratory에 액세스해야 합니다.
2. 개인 정보 차등 보호 이해하기
개인 정보 차등 보호를 더 잘 이해하려면 다음 간단한 예시를 살펴보세요.
온라인 패션 소매업체의 마케팅 부서에서 일하고 있으며 어떤 제품이 가장 잘 팔릴지 파악하고 싶다고 가정해 보겠습니다.
이 차트는 고객이 매장 웹사이트를 방문했을 때 가장 먼저 살펴본 제품(티셔츠, 점퍼, 양말, 청바지)을 보여줍니다. 티셔츠가 가장 인기 있는 상품이고 양말이 가장 인기가 없는 상품입니다.

이 방법은 유용해 보이지만 몇 가지 문제가 있습니다. 고객이 구매했는지 또는 두 번째로 조회한 제품과 같은 추가 정보를 고려하면 데이터에 개인 정보가 노출될 위험이 있습니다.
이 차트를 보면 점퍼를 먼저 살펴본 후 실제로 구매한 고객은 한 명뿐입니다.

이는 개인 정보 보호 관점에서는 좋지 않습니다. 익명 통계는 개별 기여를 드러내지 않아야 하므로 어떻게 해야 할까요? 막대 그래프에 임의 노이즈를 추가하여 정확성을 떨어뜨려 보겠습니다.
이 막대 그래프는 완전히 정확하지는 않지만 여전히 유용하며 개별 기여도를 드러내지 않습니다.

개인 정보 차등 보호는 적절한 양의 임의 노이즈를 추가하여 개별 기여도를 마스크하는 것입니다.
이 예시는 지나치게 단순화되었습니다. 개인 정보 차등 보호를 올바르게 구현하려면 더 많은 요소가 관련되고 예상치 못한 구현 세부 사항도 발생합니다. 암호화와 마찬가지로 개인 정보 차등 보호를 자체적으로 구현하는 것은 좋은 생각이 아닐 수 있습니다. 대신 PipelineDP를 사용할 수 있습니다.
3. PipelineDP 다운로드 및 설치
이 문서에서 관련 코드와 그래프를 모두 확인할 수 있으므로 이 Codelab을 따르기 위해 PipelineDP를 설치할 필요는 없습니다.
PipelineDP를 사용해 보거나 직접 실행하거나 나중에 사용하려면 다음 단계를 따르세요.
- PipelineDP를 다운로드하고 설치합니다.
pip install pipeline-dp
Apache Beam을 사용하여 예시를 실행하려면 다음 단계를 따르세요.
- Apache Beam을 다운로드하고 설치합니다.
pip install apache_beam
이 Codelab의 코드와 데이터 세트는 PipelineDP/examples/codelab/ 디렉터리에서 확인할 수 있습니다.
4. 처음 조회한 제품별 전환 측정항목 계산
온라인 패션 소매업체에서 일하고 있으며, 처음 조회 시 전환수와 전환 가치가 가장 높은 제품 카테고리를 파악하고 싶다고 가정해 보겠습니다. 이 정보를 마케팅 대행사 및 기타 내부 팀과 공유하고 싶지만 개별 고객에 관한 정보는 유출되지 않도록 하고 싶습니다.
웹사이트에서 조회된 첫 번째 제품당 전환 측정항목을 계산하려면 다음 단계를 따르세요.
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: 방문자가 전환하는 비율입니다.
- 비공개 방식으로 측정항목을 생성합니다.
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입니다. 이제 각 막대 그래프를 비공개로 변환해야 합니다.
pipeline_dp.NaiveBudgetAccountant클래스로 개인 정보 보호 매개변수를 정의한 다음 분석에 사용할epsilon및delta인수를 지정합니다.
이러한 인수를 설정하는 방법은 특정 문제에 따라 다릅니다. 자세한 내용은 선택사항: 개인 정보 차등 보호 매개변수 조정을 참고하세요.
이 코드 스니펫에서는 예시 값을 사용합니다.
budget_accountant = pipeline_dp.NaiveBudgetAccountant(
total_epsilon=1, total_delta=1e-5)
LocalBackend인스턴스를 초기화합니다.
ops = pipeline_dp.LocalBackend()
Beam이나 Spark와 같은 추가 프레임워크 없이 이 프로그램을 로컬에서 실행하므로 LocalBackend 인스턴스를 사용할 수 있습니다.
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)
count측정항목을 계산하고LAPLACE노이즈 분포를 사용하도록 지정합니다.max_partitions_contributed인수를1값으로 설정합니다.
이 인수는 사용자가 기여할 수 있는 방문 수의 한계를 설정합니다. 사용자가 하루에 한 번 웹사이트를 방문할 것으로 예상되며 하루에 여러 번 방문하는지는 중요하지 않습니다.
max_contributions_per_partitions인수를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
- 다음 코드를 추가하여 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)
축하합니다. 첫 번째 개인 정보 차등 보호 통계를 계산했습니다.
이 차트에는 개인 정보 차등 보호 개수와 이전에 계산한 비공개 개수가 나란히 표시됩니다.

코드를 실행할 때 표시되는 막대 그래프는 이 그래프와 다를 수 있지만 괜찮습니다. 개인 정보 차등 보호에 적용된 노이즈 때문에 코드를 실행할 때마다 다른 막대 그래프가 표시되지만 원래 비공개 막대 그래프와 비슷합니다.
개인 정보 보호를 보장하려면 개인 정보 보호를 위해 파이프라인을 여러 번 실행하지 않는 것이 중요합니다. 자세한 내용은 여러 통계 계산을 참고하세요.
5. 공개 파티션 사용
이전 섹션에서 파티션(즉, 웹사이트에서 양말을 처음 본 방문자)에 관한 모든 방문 데이터가 누락되었음을 알아챘을 것입니다.
이는 파티션 선택 또는 임곗값 설정 때문입니다. 출력 파티션의 존재 여부가 사용자 데이터 자체의 영향을 받는 경우 이는 개인 정보 차등 보호를 보장하기 위한 중요한 단계입니다. 이 사례에서는 출력에 파티션이 있는 것만으로 데이터의 개별 사용자 존재가 유출될 수 있습니다. 이러한 행위가 개인 정보 보호를 위반하는 이유에 대해 자세히 알아보려면 이 블로그 게시물을 참고하세요. 이러한 개인 정보 보호 위반을 방지하기 위해 PipelineDP는 사용자 수가 충분히 있는 파티션만 유지합니다.
출력 파티션 목록이 비공개 사용자 데이터의 영향을 받지 않는 경우 이 파티션 선택 단계가 필요하지 않습니다. 고객이 먼저 볼 수 있는 모든 제품 카테고리를 알고 있으므로 이 예의 경우 실제로 그렇습니다.
파티션을 사용하려면 다음 단계를 따르세요.
- 가능한 파티션 목록을 만듭니다.
public_partitions_products = ['jeans', 'jumper', 'socks', 't-shirt']
- 목록을
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 값으로 설정할 수 있습니다.
이제 결과에 모든 파티션 또는 제품의 데이터가 보고됩니다.

공개 파티션을 사용하면 더 많은 파티션을 유지할 수 있고, 파티션 선택 시 개인 정보 예산을 사용하지 않아 원시 개수와 비공개 개수의 차이가 이전 실행과 비교해 거의 없습니다.
공개 파티션을 사용할 때는 다음 두 가지 사항을 염두에 두어야 합니다.
- 원시 데이터에서 파티션 목록을 파생할 때 주의하세요. 이 작업을 개인 정보 차등 보호 방식으로 진행하지 않으면 파이프라인에서 더 이상 개인 정보 차등 보호를 보장하지 않습니다. 자세한 내용은 고급: 데이터에서 파티션 파생을 참고하세요.
- 일부 공개 파티션에 데이터가 없는 경우 개인 정보 차등 보호를 유지하기 위해 그러한 파티션에도 노이즈를 적용해야 합니다. 예를 들어 데이터 세트나 웹사이트에 없는 바지와 같은 추가 제품을 사용한 경우에도 노이즈가 발생하며, 방문이 없는데도 제품에 대한 방문이 표시될 수 있습니다.
고급: 데이터에서 파티션 파생
동일한 파이프라인에서 동일한 비공개 출력 파티션 목록을 사용해 여러 집계를 실행하는 경우, 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 클래스에 제공하는 epsilon 및 delta 매개변수를 기억한다면 이는 일종의 개인 정보 보호 예산입니다. 데이터에서 누출되는 사용자 개인 정보 보호의 양을 측정한 값입니다.
개인 정보 보호 예산에 관해 기억할 중요한 점은 축적된다는 것입니다. 특정 엡실론(ε)과 델타(δ)로 파이프라인을 한 번에 실행하면 (ε,δ) 예산을 쓰는 것입니다. 한 번 더 실행하면 (2ε, 2δ)의 총 예산을 쓰는 것입니다. 마찬가지로 NaiveBudgetAccountant 메서드와 연속적인 개인 정보 보호 예산 ε,δ로 여러 통계를 계산하면 (2ε, 2δ)의 총 예산을 쓰게 됩니다. 이는 개인 정보 보호 보장이 떨어진다는 의미입니다.
이를 방지하려면 동일한 데이터로 여러 통계를 계산해야 할 때 사용할 총 예산에 단일 NaiveBudgetAccountant 인스턴스를 사용해야 합니다. 그런 다음 집계마다 사용할 epsilon 및 delta 값을 지정해야 합니다. 결국 전체적인 개인 정보 보호는 동일하게 보장되지만 특정 집계의 epsilon 및 delta 값이 높을수록 정확성도 높아집니다.
실제 동작을 확인하려면 count, mean, sum 통계를 계산하면 됩니다.
두 가지 측정항목을 기반으로 통계를 계산합니다. 첫 번째는 conversion_value 측정항목으로, 이를 사용하여 먼저 조회된 제품을 기반으로 발생한 수익 금액을 추론합니다. 두 번째는 has_conversion 측정항목으로, 이를 사용하여 웹사이트 방문자 수와 평균 전환율을 계산합니다.
각 측정항목에 대해 비공개 통계 계산을 안내하는 매개변수를 별도로 지정해야 합니다. 두 측정항목에 개인 정보 보호 예산을 분할합니다. has_conversion 측정항목에서 두 가지 통계를 계산하므로 초기 예산의 2/3를 has_conversion 측정항목에 할당하고 나머지 1/3을 conversion_value 측정항목에 할당합니다.
여러 통계를 계산하려면 다음 단계를 따르세요.
- 세 가지 통계에서 사용할 총
epsilon및delta값으로 개인 정보 보호 예산 회계사를 설정합니다.
budget_accountant = pipeline_dp.NaiveBudgetAccountant(
total_epsilon=1, total_delta=0)
DPEngine를 초기화하여 측정항목을 계산합니다.
dp_engine = pipeline_dp.DPEngine(budget_accountant, ops)
- 이 측정항목의 매개변수를 지정합니다.
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)
마지막 인수는 선택적으로 개인 정보 보호 예산의 가중치를 지정합니다. 모두 동일한 가중치를 부여할 수도 있지만 앞에서 설명한 대로 이 인수를 1/3로 설정해야 합니다.
또한 min_value 및 max_value 인수를 설정하여 파티션의 개인 정보 보호 단위에서 제공한 값에 적용되는 하한 및 상한을 지정합니다. 비공개 합계 또는 평균을 계산하려면 이러한 매개변수가 필요합니다. 음수 값은 예상되지 않으므로 0 및 100을 적절한 범위로 가정할 수 있습니다.
- 관련 데이터를 추출한 다음 집계 함수에 전달합니다.
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))
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 인스턴스입니다. 이제 mean와 count를 집계로 정의하고 개인 정보 보호 예산의 2/3를 이 계산에 할당합니다. 통계에 동일한 기여도 범위를 적용하고 동일한 has_conversion 변수를 기반으로 계산해야 하므로 동일한 pipeline_dp.AggregateParams 인스턴스에서 결합하여 동시에 계산할 수 있습니다.
budget_accountant.compute_budgets()메서드 호출:
budget_accountant.compute_budgets()
세 가지 개인 정보 보호 통계를 모두 원래 통계와 비교하여 표시할 수 있습니다. 추가된 노이즈에 따라 결과가 실제로 그럴듯한 범위를 벗어날 수 있습니다. 이 경우 추가된 노이즈가 0을 중심으로 대칭이므로 점퍼의 전환율과 총 전환 가치가 음수로 표시됩니다. 추가 분석 및 처리를 위해서는 비공개 통계를 수동으로 후처리하지 않는 것이 좋지만, 보고서에 이러한 플롯을 추가하려면 개인 정보 보호 보장을 위반하지 않고 나중에 최소값을 0으로 설정하면 됩니다.

7. Beam으로 파이프라인 실행
오늘날 데이터 처리를 위해서는 엄청난 양의 데이터를 다뤄야 하므로 로컬에서 처리할 수 없습니다. 대신 많은 사람들이 Beam 또는 Spark와 같은 대규모 데이터 처리 프레임워크를 사용하고 클라우드에서 파이프라인을 실행합니다.
PipelineDP는 코드를 약간만 변경하여 Beam과 Spark를 지원합니다.
private_beam API를 사용하여 Beam으로 파이프라인을 실행하려면 다음 단계를 따르세요.
runner변수를 초기화한 다음rows의 Beam 표현식에 개인 정보 보호 작업을 적용하는 파이프라인을 만듭니다.
runner = fn_api_runner.FnApiRunner() # local runner
with beam.Pipeline(runner=runner) as pipeline:
beam_data = pipeline | beam.Create(rows)
- 필요한 개인 정보 보호 매개변수로
budget_accountant변수를 만듭니다.
budget_accountant = pipeline_dp.NaiveBudgetAccountant(
total_epsilon=1, total_delta=0)
- 집계가 개인 정보 보호 요건을 준수하도록 보장하는
pcol또는 비공개 컬렉션 변수를 만듭니다.
pcol = beam_data | pbeam.MakePrivate(
budget_accountant=budget_accountant,
privacy_id_extractor=lambda
row: row.user_id)
- 적절한 클래스에서 비공개 집계의 매개변수를 지정합니다.
여기서는 제품 조회수의 합계를 계산하므로 pipeline_dp.aggregate_params.SumParams() 클래스를 사용합니다.
- 집계 매개변수를
pbeam.Sum메서드에 전달하여 통계를 계산합니다.
dp_result = pcol | pbeam.Sum(params)
- 최종 코드는 다음 코드 스니펫과 같습니다.
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 매개변수와 같은 상당수의 매개변수가 언급되어 있습니다. 이러한 매개변수는 대략적으로 개인 정보 보호 매개변수와 유용성 매개변수의 두 가지 카테고리로 나눌 수 있습니다.
개인 정보 보호 매개변수
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에서 GAUSSIAN 및 LAPLACE 노이즈라는 두 가지 노이즈 메커니즘을 지원합니다. LAPLACE 분포는 낮은 기여도 한계로 사용성이 더 낫기 때문에 PipelineDP에서는 기본적으로 LAPLACE 분포를 사용합니다. 하지만 GAUSSIAN 분포 노이즈를 사용하려면 AggregateParams 인스턴스에서 지정하면 됩니다.
9. 축하합니다
아주 좋습니다. PipelineDP Codelab을 완료하고 개인 정보 차등 보호와 PipelineDP에 대해 많은 것을 배웠습니다.