【译】Federated Learning: Bringing Machine Learning to the edge with Kotlin and Android

采用机器学习模式需要数据。 我们越多越好。 但是,数据并不便宜,更重要的是,数据可能包含敏感的个人信息。

以新法律形式作为GDPR以及提高用户和公民对其数据价值的认识的最新隐私发展正在产生对实施更多隐私的技术的需求

虽然匿名技术可以极大地帮助解决隐私问题,但所有数据都被发送到中央位置以训练机器学习模型的事实始终是担心的动机

该项目证明了如何使用Android应用程序作为边缘设备来设置基本的联合学习环境

代码

如果你想直接跳到代码中,你可以在下面的回复中找到它

Android应用程序

服务器在

组件

该项目分为三个主要部分:

  1. 一个服务器,用Kotlin编写,并使用DL4J 生成基于Cifar-10数据集的模型
  2. 使用此模型分类使用相机拍摄的图像的Android应用程序。 写在Kotlin并且也使用DL4J
  3. Android应用程序能够使用本地数据和服务器来训练模型的联合学习设置能够使用来自边缘的更新来更新共享模型

该模型

该模型基于Cifar-10数据集,这是一个众所周知的数据集,可以对十种不同类别的图像进行分类

Cifar-10中的类有一些例子

为了实现双重目的,模型的体系结构进行了调整:

a)具有不那么差的表现

b)允许它在Android应用程序中加载和训练

所选的体系结构是一个具有一个CNN层和密集层的浅层卷积神经网络。 这被证明足以获得一个体面的表现,使用50个时期和10,000个样本,同时保持模型的大小很小

有密集层的CNN

(关于模型大小的说明:这个PoC的重点在于联合学习,更好的模型可以用更多的层次进行训练,并通过应用不同的技术进行量化或使用结构化或草图更新来减少其尺寸。的PoC!)

用于在服务器端训练模型的代码位于PhotoLabellerServer项目的model模块中

用App做出预测

该应用程序允许用户使用嵌入在应用程序本身中的模型对照片进行基本分类,或者当连接到服务器时,可以使用最新版本的共享模型

图像分类器正在运行

该应用app模块结构为app模块,其中包含Android特定的类和Deeplearning4j相关类的trainer 。 base模块包含交互器和域对象

训练者的实现,负责使用DL4J进行预测和训练,调用预测函数以获得图像的分类

联合学习设置

联合学习通过允许边缘设备参与培训来颠倒机器学习模型的更新。

代替将客户端中的数据发送到集中位置,Federated Learning将模型发送给参与联合的设备。 然后使用本地数据对模型进行重新训练(使用转移学习 )

数据和数据永远不会离开设备,让它成为您的手机,笔记本电脑或物联网小工具

服务器打开一轮“培训”,在此期间客户可以将更新模型发送到服务器。

客户端。 在边缘进行训练

我们的Android应用程序决定何时参与共享模型的培训。 它使用已有的模型或服务器中的模型执行Transfer Learning操作(如果更新)。 然后对模型进行的更新发送到服务器

服务器端。 平均和更新模型

一旦轮次结束,服务器通过执行联合平均来更新共享模型,如以下要点所示

服务器还实现了客户端使用的简单REST API。

请注意,客户端,Android应用程序的实现方式只需要很少的努力即可转移到其他Kotlin平台

笔记

性能

在Android应用程序中使用图像进行任何类型的操作始终要求设备必须执行的计算工作。 使用图像对模型进行训练会多次增加这种努力

这意味着在Android应用程序中完成的转换学习阶段非常短:只有几个样本的几个时代。 这是应用程序在内存不足之前可以做的最多! 参数总数约为450k。 这对于应用程序可用的内存非常重要

但是,其他使用其他类型数据的模型运行平稳。 以前版本的联合学习设置仅使用了一些功能仅有的糖尿病数据集。 这可以用更多的时代来完成(我实际上没有找到限制,因为我在达到OOM之前获得了期望的表现)以及更多的数据点

该应用程序的架构适合您尝试其他模型和数据集。 随意重复使用它进行研究,并告诉我是否可以提供帮助

谢谢阅读!

https://proandroiddev.com/federated-learning-e79e054c33ef

猜你喜欢

转载自blog.csdn.net/omnispace/article/details/80704686