TensorFlow Federated:フェデレーションデータセットの非IIDネスを調整する方法は?

Nov 23 2020

TensorFlow Federated(TFF)でいくつかのアルゴリズムをテストしています。この点で、データの不均一性の異なる「レベル」、つまり非IID性を使用して、同じフェデレーションデータセットでそれらをテストおよび比較したいと思います。

したがって、特定のフェデレーションデータセットの非IIDネスの「レベル」を、自動または半自動の方法で、たとえばTFFAPIまたは従来のTFAPIを使用して制御および調整する方法があるかどうかを知りたいと思います。 (多分データセットユーティリティ内)。

より実用的には、たとえば、TFFが提供するEMNISTフェデレーションデータセットには3383のクライアントがあり、それぞれに手書き文字があります。ただし、これらのローカルデータセットは、ローカルの例の数と表されるクラスの点で非常にバランスが取れているようです(すべてのクラスは、多かれ少なかれ、ローカルで表されます)。フェデレーションデータセット(たとえば、TFFのEMNISTデータセットから開始)が必要な場合は、次のようになります。

  • 病理学的に非IID。たとえば、N個のクラスのうち1つのクラスのみを保持するクライアントがあります(常に分類タスクを参照します)。これはtff.simulation.datasets.build_single_label_dataset ここでのドキュメントの目的ですか。もしそうなら、TFFによってすでに提供されているものなどのフェデレーションデータセットからそれをどのように使用する必要がありますか?;
  • ローカルの例の量に関して不均衡です(たとえば、1つのクライアントには10​​の例があり、別のクライアントには10​​0の例があります)。
  • 両方の可能性;

これらの特性を備えたフェデレーションデータセットを準備するには、TFFフレームワーク内でどのように進める必要がありますか?

私はすべてのことを手作業で行うべきですか?または、このプロセスを自動化するためのアドバイスがありますか?

追加の質問:この論文「連合視覚分類のための非同一データ分布の影響の測定」では、Hsu et al。によって、ディリクレ分布を利用して非同一クライアントの母集団を合成し、集中度パラメーターを使用します。クライアント間の同一性を制御します。これは、さまざまなレベルの異質性を持つデータセットを作成するための調整が面倒な方法のようです。TFFフレームワーク内、またはEMNISTなどの単純なデータセットを考慮したTensorFlow(Python)でこの戦略(または同様の戦略)を実装する方法に関するアドバイスも非常に役立ちます。

大いに感謝する。

回答

2 ZacharyGarrett Nov 25 2020 at 07:46

Federated Learningシミュレーションの場合、Pythonでクライアントデータセットを実験ドライバーでセットアップして、目的の分布を実現することは非常に合理的です。一部の高レベルでは、TFFはモデリングデータの場所(型システムの「配置」)と計算ロジックを処理します。シミュレーションデータセットの再混合/生成は、ライブラリのコアではありませんが、見つけたように役立つライブラリがあります。を操作しtf.data.Dataset、クライアントデータセットをTFF計算に「プッシュ」することで、Pythonでこれを直接行うのは簡単なようです。

非IIDにラベルを付ける

はい、tff.simulation.datasets.build_single_label_datasetこの目的を目的としています。

を取り、tf.data.Dataset基本的に(データセットが同様の構造を生成すると仮定して)のdesired_label値と一致しないすべての例を除外します。label_keydict

EMNISTの場合、(ユーザーに関係なく)すべてのデータセットのデータセットを作成するには、次の方法で実現できます。

train_data, _ = tff.simulation.datasets.emnist.load_data()
ones = tff.simulation.datasets.build_single_label_dataset(
  train_data.create_tf_dataset_from_all_clients(),
  label_key='label', desired_label=1)
print(ones.element_spec)
>>> OrderedDict([('label', TensorSpec(shape=(), dtype=tf.int32, name=None)), ('pixels', TensorSpec(shape=(28, 28), dtype=tf.float32, name=None))])
print(next(iter(ones))['label'])
>>> tf.Tensor(1, shape=(), dtype=int32)

データの不均衡

組み合わせを使用tf.data.Dataset.repeatしてtf.data.Dataset.takeデータの不均衡を作成するために使用することができます。

train_data, _ = tff.simulation.datasets.emnist.load_data()
datasets = [train_data.create_tf_dataset_for_client(id) for id in train_data.client_ids[:2]]
print([tf.data.experimental.cardinality(ds).numpy() for ds in datasets])
>>> [93, 109]
datasets[0] = datasets[0].repeat(5)
datasets[1] = datasets[1].take(5)
print([tf.data.experimental.cardinality(ds).numpy() for ds in datasets])
>>> [465, 5]