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 用户的手中,用于本地模拟分散式计算。
TensorFlow Federated enables developers to express and simulate federated learning systems. Pictured here, each phone trains the model locally (A). Their updates are aggregated (B) to form an improved shared model (C).
​ 为了说明 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 的初始版本包括一个本地运行态,该运行态模拟跨一组持有数据的客户端执行的计算,每个客户端计算其本地贡献,集中的协调器聚合所有贡献。 但是,从开发人员的角度来看,联盟计算可以看作是一个普通的函数,它恰好有驻留在不同位置的输入和输出(分别位于单个客户端和协调服务器中)。
An illustration of the get_average_temperature federated computation expression.
联盟平均算法的一个简单变体也可以直接使用 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,他们都做出了重大贡献。
Copy link