実用的差分プライバシーW/Apacheビーム


ユーザーのプライバシーを保護する最も永続的なテクニックの一つは、差動プライバシーを介してです.Aでは、我々はHackerNewsコメントからNGramを抽出して、数えたApacheビームパイプラインを構築する方法を調査しました.今日、私たちは、同じパイプラインを取って、いくつかの差動プライバシー良さでそれをアップグレードしますPrivacy-on-Beam グーグルからdifferential privacy library .

ステップ1 :ユーザーを識別する


逆直観的に、ビームパイプラインに異なるプライバシーを加えることは、各々のユーザーのためにIDを持つ必要があります.ユーザーが誰であるかを知る必要はなく、データセットの安定した識別子へのアクセスが必要です.良い開始の選択肢は、autoincrementingユーザー名のフィールドまたはユーザー名/メールアドレスが含まれます.あなたが選ぶIDは、あなたが保護しようとしているプライバシーに、できるだけ密接にマップしなければなりません.
💁ヒント:安全側でerrにするには、このIDをハッシュしたり、暗号化したりして、誤ってログインしたりデバッグしたりするのを防いでください.
我々がHackernewsコメントを使っているのでauthor フィールドはかなり良い選択です.私たちは、各コメントの作者をつかむためにいくつかの変更から始めます、そして、Ngram抽出を通してそのユーザーを伝播させてください.
// CommentRow models 1 row of HackerNews comments.
type CommentRow struct {
    Author string `bigquery:"author"`
    Text   string `bigquery:"text"`
}

// AuthorNgram represents an ngram and it's author.
type AuthorNgram struct {
    Author string
    Ngram  string
}

const query = `SELECT author, text
FROM ` + "`bigquery-public-data.hacker_news.comments`" + `
WHERE time_ts BETWEEN '2013-01-01' AND '2014-01-01'
AND author IS NOT NULL AND text IS NOT NULL
LIMIT 1000
`

func main() {
 // ...

    authorNgrams := beam.ParDo(s, func(row CommentRow, emit func(AuthorNgram)) {
        for _, gram := range ngram(row.Text, 1, 2, 3) {
            emit(AuthorNgram{Author: row.Author, Ngram: gram})
        }
    }, rows)

 // ...
}

ステップ2:セットアッププライバシー予算


差動プライバシー土地では、Epsilonとデルタは、どんな特定のユーザーについてどれくらい学ぶことができるかについて制御する主な方法です.より大きい数=より少ないプライバシー.パイプラインについては,epsilon=4,delta=0 . 0001のサンプル値を選ぶ.

Why 4 and 10-4? I don't know. Apple uses an ε=4 according to it's Differential Privacy Overview. I'd like to write a post on how to pick these numbers once I learn more.


// Configure differential privacy parameters.
epsilon := float64(4)   // ε = 4
delta := math.Pow10(-4) // Δ = 1e-4.
spec := pbeam.NewPrivacySpec(epsilon, delta)

ステップ3 :プライベートデータを作成する


アパッチビームパイプラインPCollection データの主コンテナとして.ビーム上のプライバシーは新しいコンテナを導入するPrivatePCollection , は、PCollection しかし、方法に沿ってプライバシーを保護する方法を知っている.
ステップ2およびPCollection<AuthorNgrams> ステップ1から、我々はPrivatePCollection このフィールドにユーザーのIDを持っているかどうかを知ることができますAuthor フィールドオブザAuthorNgram 構造体Structフィールドの文字列名を渡すと少し奇妙な感じがします.
pgrams := pbeam.MakePrivateFromStruct(s, authorNgrams, spec, "Author")

ステップ4 :統計を行う


以前のパイプラインでは、NGramを数えるのはstats.Count(s, ngrams) . 今私たちはPrivatePCollection 仕事が少しあります.
最初に、我々はNGramにデータを単純化する必要がありますPrivatePCollection<AuthorNgram>PrivatePCollection<string> . 舞台裏では、PrivatePコレクションは、著者を追跡します.電話をかける必要があるParDo 通常のビームではなく、この変換のためのビームパッケージ上のプライバシーからの機能.これは同じ動作します.
ngrams := pbeam.ParDo(s, func(row AuthorNgram, emit func(string)) {
    emit(row.Ngram)
}, pgrams)
NGramの私たちの個人的なコレクションで、我々は現在彼らを数える準備ができています.ビーム上のプライバシーは、すべての本当の魔法が発生する独自のstat関数を実装します.
呼び出すときpbeam.Count また、カウント動作を制御する2つのプライバシーパラメータを選択する必要があります.
  • どのように多くのパーティション(別名Nグラム)ユーザーが貢献することができます.
  • どのように多くの倍のユーザーが1つのパーティションに貢献することができます(同じNGramを使用します).
  • それを簡単に保つために、ユーザーが最高700の異なるNGRAMに貢献して、各々のNGramに2回貢献することができると言いましょう.実際には、これはユーザーAが5コメントを“素晴らしいアイデア”と言う場合、それらの2つだけカウントされることを意味します.ユーザーBが701のユニークなNGRAMに貢献するのに十分なコメントを書くならば、彼らの1はランダムに落とされます.これらのパラメータは、出力中のノイズ量を減らすデータから外れ値を除去するのに役立ちます.
    counts := pbeam.Count(s, ngrams, pbeam.CountParams{
        MaxPartitionsContributed: 700,
        MaxValue: 2,
    })
    

    フィン


    それで、あなたのアップグレードは完了です!The counts 古いパイプラインの非常に近くに使用できますPCollection<string, int64> あなたがテキストファイルに書くことができます、bigqueryにアップロードする、さらに操作してください、しかし、最初のパイプラインとは異なり、NGramはここで異なっています.誰が彼らに貢献したハッカーニュースコメントを書いたかを決して知りません.
    あなたはend-to-end code on Github , とdiff すべての変更を示す

    ⚠️警告:私の経験を差動プライベートパイプラインを実行する一般的に長くかかり、より多くの計算リソースが必要です.より長い実行時間を期待してください.