【导读】联邦学习(FL)作为一种无需集中数据就能训练模型的技术,近年来受到了广泛关注。这项技术最初由谷歌应用于消费环境中,用于开发、训练及不断改进安卓的预测输入法——GBoard。
传统上,训练模型需要数据科学家可以直接访问集中式数据集。然而,如果数据集分散且具有敏感性,集中数据并训练模型将变得困难。例如,对于GBoard,集中所有用户的按键数据可能会侵犯用户的隐私权,并可能导致谷歌错误地收集用户的密码、信用卡号码及其他敏感信息。联邦学习通过只共享模型的更新,而非训练数据,大大缓解了这一问题。
尽管如此,联邦学习并非完全解决数据隐私问题,它不能保证在更新过程中不会泄露敏感信息。多次针对联邦学习的攻击表明,可以从客户端的更新中获取隐私信息。为了解决这个问题,可以采用差分隐私和安全聚合来保护更新信息。
安全聚合通过避免聚合器直接读取各个客户端的更新,解决了由于默认信任聚合器带来的问题。然而,这并不能解决最终模型存储和训练数据泄露的问题,而差分隐私特别适用于解决这类问题。尽管在使用类似于TensorFlow隐私的情况下,结合差分隐私和安全聚合是可行的,但本文主要关注安全聚合本身。
TF Encrypted 是一个加密的机器学习框架,它利用了Keras API的易用性,同时通过安全的多方计算和同态加密对加密数据进行训练和预测。TF Encrypted的目标是在不需要密码学、分布式系统或高性能计算专业知识的情况下,实现隐私保护的机器学习。
该项目已经在GitHub上开源:https://github.com/tf-encrypted/tf-encrypted
将TensorFlow与TF Encrypted结合起来,无需担心底层细节,可以快速迭代高层次的实现。TF Encrypted的安全计算以及TensorFlow使用优化计算图的能力,使团队能够专注于联邦学习的具体实现,并采用不同技术进行实验。
计算模型更新时,每个参与部分都需要获得最新的模型,这样才能确保本地生成的更新对模型有效。这意味着每次训练迭代都需要在模型拥有者、数据拥有者及安全聚合器之间同步,而TensorFlow可以通过Keras接口及用于管理设备分配的tf.device接口简化这一过程。
团队可以使用TF Encrypted的安全协议来安全地汇总更新内容。当前实现使用了TF Encrypted和额外的密钥共享方法,需要三方或更多方安全地聚合计算。在安全计算中,同步非常重要,而TensorFlow通过在图形模式下运行,并使用分布引擎按正确顺序执行操作,使同步成为可能。
联邦学习通过安全聚合增加了一个额外的步骤,即将模型更新发送给聚合器,而不是直接返回给模型拥有者。之后,通过安全聚合器,将汇总的更新发送给模型拥有者。
本示例的主要目的是展示在TensorFlow和TF Encrypted中以高度可定制的方式实现联邦学习。与TensorFlow 1.x相比,最近发布的TensorFlow 2.0使这个实验变得更加简单。
假设:TF Encrypted已复制到本地目录中,系统安装了Python 3.5或更高版本,只需从命令行中运行以下命令,即可运行示例的基础版本:
python examples/federated-learning/main.py
使用help标志可以显示用于自定义脚本执行的其他选项。
我们提供了两个基本类——BaseModelOwner和BaseDataOwner,这些类包含了网络通信的方法,并允许对模型更新的计算和聚合进行易于配置的定制。
该示例应用了网络通信的两种方式来实现联邦学习:使用tfe.localcomputation装饰器在本地计算,使输入保持加密状态,然后在函数外部解密。在对模型更新进行前向和反向迭代时使用这种方法,使更新输入(即模型更新)保持加密状态。pinto_owner是一个辅助装饰器,通过tf.device调用函数,确保TensorFlow在正确的设备上运行。在更新聚合和评估模型最终版本时使用。
完整版本请参阅:https://github.com/tf-encrypted/tf-encrypted/tree/494b95844860424c026fe0a31dd99788aaeee0e9/examples/federated-learning
TF Encrypted及联邦学习将不仅仅局限于这个小示例,而是会与现有的联邦学习框架如TensorFlow Federated相结合,允许开发者和机器学习工程师利用TF Encrypted进行安全聚合。此外,还可以结合多种不同的技术,同时选择使用联邦学习。从示例TensorFlow Federated和分布策略中还有很多值得思考的地方,以探索更安全的联邦学习API的用法。