Introducing Tensorflow Federated

作者: Alex Ingerman(产品经理)和 Krzys Ostrowski(研究科学家)译: Junyangz

注: Federated Learning 译作 联合学习 或 联盟(邦)学习,因Google中国翻译为联盟学习所以本文均译为联盟学习。

原文: https://medium.com/tensorflow/introducing-tensorflow-federated-a4147aa20041

​ 据统计,全世界约有30亿部智能手机70亿部连接设备。 这些电话和设备不断产生新的数据。 传统的分析和机器学习需要在处理数据之前集中收集数据,以获得insights,ML模型以及最终产品的改进。 如果数据敏感或集中化代价昂贵,则这种集中式方法可能会出现问题。 如果我们能够在生成数据的设备上运行数据分析和机器学习,并且仍然能够将所学的内容汇总在一起,那不是更好吗?

​ Tensorflow Federated (TFF)是一个开源框架,用于对分散式数据进行机器学习和其他计算的实验。 它实现了一种称为Federated Learning(FL)的方法,允许许多参与的客户端训练共享的机器学习模型,同时保持它们的数据位于本地。 我们根据我们在谷歌开发Federated Learning技术的经验设计了 TFF,它为移动键盘预测和on-device search的机器学习模型提供了动力。 有了 TFF,我们很高兴能够将一个灵活、开放的框架放到所有 TensorFlow 用户的手中,用于本地模拟分散式计算。

​ 为了说明 FL 和 TFF 的用法,让我们从最著名的图像数据集之一: MNIST 开始。 创建 MNIST 的原始 NIST 数据集包含81万个手写数字的图像,这些数字来自3600名志愿者,我们的任务是建立一个机器学习模型来识别这些数字。 传统的做法是将机器学习算法应用于整个数据集。 但是,如果我们不能把所有的数据结合起来呢? 例如,因为志愿者不同意将他们的原始数据上传到中央服务器?

​ 使用 TFF,我们可以编写我们选择的机器学习模型结构,然后跨所有数据拥有者提供的数据进行训练,同时保持各方的数据分散在各自本地。 我们将在下面介绍如何使用 TFF 的联盟学习(FL) API,使用由 Leaf 项目处理的 NIST 数据集的其中一个版本分隔每个志愿者所写的数字。

# Load simulation data.
source, _ = tff.simulation.datasets.emnist.load_data()
def client_data(n):
  dataset = source.create_tf_dataset_for_client(source.client_ids[n])
  return mnist.keras_dataset_from_emnist(dataset).repeat(10).batch(20)

# Wrap a Keras model for use with TFF.
def model_fn():
  return tff.learning.from_compiled_keras_model(
      mnist.create_simple_keras_model(), sample_batch)

# Simulate a few rounds of training with the selected client devices.
trainer = tff.learning.build_federated_averaging_process(model_fn)
state = trainer.initialize()
for _ in range(5):
  state, metrics = trainer.next(state, train_data)
  print (metrics.loss)

​ 您可以在联盟 MNIST 分类教程中看到其余部分。

​ 除了 FL API 之外,TFF 还提供了一组较低级别的原语,我们称之为联盟核心(Federated Core,FC) API。 这个 API 支持在分散的数据集上进行广义的计算。 使用联盟学习训练机器学习模型是联盟计算的一个例子; 在分散数据上对其进行评估是另一个例子。

​ 让我们用一个简单的例子来看一下 FC API。 假设我们有一系列的传感器来获取温度数据,并且想要计算这些传感器的平均温度,而不需要将它们的数据上传到中心位置。 使用 FC API,我们可以表示一个新的数据类型,指定它的底层数据(tf.float32)以及数据存在的位置(分散在客户端的设备上)。

READINGS_TYPE = tff.FederatedType(tf.float32, tff.CLIENTS)

然后在这个类型上指定一个联盟平均函数。

@tff.federated_computation(READINGS_TYPE)
def get_average_temperature(sensor_readings):
  return tff.federated_average(sensor_readings)

​ 定义了联盟计算之后,TFF 以一种可以在分散式设置中运行的形式表示它。 TFF 的初始版本包括一个本地运行态,该运行态模拟跨一组持有数据的客户端执行的计算,每个客户端计算其本地贡献,集中的协调器聚合所有贡献。 但是,从开发人员的角度来看,联盟计算可以看作是一个普通的函数,它恰好有驻留在不同位置的输入和输出(分别位于单个客户端和协调服务器中)。

联盟平均算法的一个简单变体也可以直接使用 TFF 的声明模型:

@tff.federated_computation(
  tff.FederatedType(DATASET_TYPE, tff.CLIENTS),
  tff.FederatedType(MODEL_TYPE, tff.SERVER, all_equal=True),
  tff.FederatedType(tf.float32, tff.SERVER, all_equal=True))
def federated_train(client_data, server_model, learning_rate):
  return tff.federated_average(
      tff.federated_map(local_train, [
          client_data,
          tff.federated_broadcast(server_model),
          tff.federated_broadcast(learning_rate)]))

​ 通过TensorFlow Federated,我们朝着让更多的用户可以使用这项技术的方向迈出了一步,并且邀请社区在一个开放、灵活的平台上参与开发联盟学习及相应研究。 您可以在浏览器中尝试 TFF,只需点击几下,通过遍历教程。 有很多方法可以参与进来: 你可以在你的模型上体验现有的 FL 算法,为 TFF 仓库贡献新的联盟数据集和模型,添加新的 FL 算法的实现,或者用新的特性扩展现有的 FL 算法。

​ 随着时间的推移,我们希望 TFF 运行时能够适用于主要的设备平台,并集成其他有助于保护敏感用户数据的技术,包括用于联盟学习(与 TensorFlow 隐私集成)和安全聚合差分隐私。 我们期待着与社区一起开发 TFF,并使每个开发人员都能使用联合技术。

​ 准备好开始了吗? 请访问 https://www.tensorflow.org/federated/ 并尝试 TFF!

鸣谢

​ 创建 TensorFlow Federated 是一项团队工作。 特别感谢 Brendan McMahan、 Keith Rush、 Michael Reneer 和 Zachary Garrett,他们都做出了重大贡献。

Last updated