Path: blob/master/site/ja/federated/tutorials/random_noise_generation.ipynb
25118 views
Copyright 2021 The TensorFlow Federated Authors.
TFF でのランダムノイズの生成
このチュートリアルでは、TFF でランダムノイズを生成するための推奨されるベストプラクティスについて説明します。ランダムノイズの生成は、差分プライバシーなどの連合学習アルゴリズムにおける多くのプライバシー保護技術の重要なコンポーネントです。
始める前に
まず、関連するコンポーネントがコンパイルされたバックエンドにノートブックが接続されていることを確認しましょう。
以下の「Hello World」の例を実行して、TFF 環境が正しくセットアップされていることを確認してください。動作しない場合は、インストールガイドの手順を参照してください。
クライアントのランダムノイズ
クライアントで必要とされるノイズは、一般に同一のノイズと i.i.d ノイズの 2 つのケースに分類されます。
同一のノイズの場合、推奨されるパターンは、サーバー上でシードを維持し、それをクライアントにブロードキャストし、
tf.random.stateless
関数を使用してノイズを生成することです。i.i.d. ノイズの場合、from_non_deterministic_state でクライアント上で初期化された tf.random.Generator を使用します。TF の推奨事項に沿って tf.random.<distribution> 関数を回避するためです。
クライアントの動作はサーバーとは異なります(後で説明する落とし穴に悩まされることはありません)。これは、各クライアントが独自の計算グラフを作成し、独自のデフォルトシードを初期化するためです。
クライアントの同一のノイズ
クライアントの独立したノイズ
クライアントのモデル初期化子
サーバーのランダムノイズ
推奨されない使用法: tf.random.normal
を直接使用すること
TF でのランダムノイズ生成のチュートリアルによるとランダムノイズ生成用の API tf.random.normal
のような TF1.x は、TF2 では強く推奨されていません。これらの API を tf.function
および tf.random.set_seed
と一緒に使用すると、驚くような動作が発生する可能性があります。たとえば、次のコードは、呼び出しごとに同じ値を生成します。この驚くような動作は TF では期待されており、説明は tf.random.set_seed
のドキュメントに記載されています。
TFF では、少し異なります。ノイズ生成を tf.function
ではなく tff.tf_computation
としてラップすると、非確定的なランダムノイズが生成されます。ただし、このコードスニペットを複数回実行すると、毎回異なる (n1, n2)
のセットが生成されます。TFF のグローバルランダムシードを設定する簡単な方法はありません。
さらに、シードを明示的に設定しなくても、TFF では確定的ノイズを生成できます。次のコードスニペットの関数 return_two_noise
は、2 つの同一のノイズ値を返します。TFF は実行前に事前に計算グラフを作成するため、これは予想される動作です。ただし、これは、ユーザーが TFF での tf.random.normal
の使用に注意を払う必要があることを示しています。
注意して使用する: tf.random.Generator
TF チュートリアルで提案されているように、 tf.random.Generator
を使用できます。
ただし、使用する場合は注意する必要があります
tf.random.Generator
は、tf.Variable
を使用して、RNG アルゴリズムの状態を維持します。TFF では、ジェネレータをtff.tf_computation
内に構築することをお勧めします。また、ジェネレータとその状態をtff.tf_computation
関数間で渡すことは困難です。前述のコードスニペットも、ジェネレータでシードを注意深く設定することに依存しています。代わりに
tf.random.Generator.from_non_deterministic_state()
を使用すると、期待どおりの驚くべき結果(確定的n1 == n2
)が得られる場合があります。
一般に、TFF は関数演算を優先します。次のセクションでは、tf.random.stateless_*
関数の使用法を紹介します。
連合学習の TFF では、スカラーの代わりにネストされた構造を使用することが多く、前述のコードスニペットはネストされた構造に自然に拡張できます。
推奨される使用法: ヘルパーを使用した tf.random.stateless_*
TFF での一般的な推奨事項は、ランダムノイズの生成にtf.random.stateless_*
関数を使用することです。これらの関数は、ランダムノイズを生成するための明示的な入力引数として seed
(形状 [2]
のテンソルまたは 2 つのスカラーテンソルの tuple
)を取ります。まず、シードを疑似状態として維持するためのヘルパークラスを定義します。ヘルパー RandomSeedGenerator
には、state-in-state-out 方式の関数の演算子があります。tf.random.stateless_*
の疑似状態としてカウンターを使用するのは合理的です。これらの関数は、シードを使用する前にシードをスクランブルして、相関シードによって生成されるノイズを統計的に無相関にするためです。
次に、ヘルパークラスと tf.random.stateless_normal
を使用して、TFF でランダムノイズ(のネストされた構造)を生成します。次のコードスニペットは、TFF 反復プロセスによく似ています。連合学習アルゴリズムを TFF 反復プロセスとして表現する例として、simple_fedavg を参照してください。ここでのランダムノイズ生成の疑似シード状態は tf.Tensor
であり、TFF および TF 関数で簡単に利用できます。