Python 联邦学习(三)
原文:
annas-archive.org/md5/59885cc35c2ca63f9f092895c4c3c9b9译者:飞龙
第九章:联邦学习应用的关键用例案例研究
联邦学习(FL)迄今为止在各种情境下遇到了各种人工智能应用,并在这些领域通过试错探索了整合。最受欢迎的领域之一是医疗和保健领域,其中保护隐私的人工智能概念自然符合医疗保健人工智能的当前需求和挑战。FL 还应用于金融服务行业、边缘计算设备和物联网(IoT),通过这些应用,FL 在许多应用中显示出显著的益处,这将解决许多重要的社会问题。
在本章中,我们将讨论 FL 在不同领域的一些主要用例。我们希望到本章结束时,您将熟悉 FL 在不同行业中的应用。我们将从探索 FL 在医疗和金融行业中的应用开始,然后过渡到边缘计算和物联网领域。最后,我们将通过讨论 FL 与大数据分布式学习的交汇来结束本章。
本章将涵盖以下主题:
-
将 FL 应用于医疗保健行业
-
将 FL 应用于金融行业
-
FL 与边缘计算相遇
-
向智能互联网迈进
-
将 FL 应用于大数据分布式学习
将 FL 应用于医疗保健行业
在过去几年中,联邦学习(FL)在医疗保健领域的应用引起了相当多的关注。医疗保健的进步可以对我们生活产生巨大的影响。然而,一些挑战使得这些进步可能比其他领域更困难。让我们首先讨论一些存在的常见挑战,以及它们如何阻碍医疗保健领域人工智能的进一步发展。
医疗保健的挑战
其中一个主要挑战是数据可访问性。数据可访问性不是一个仅限于医疗保健的问题。它是整个人工智能行业的一个巨大问题,并且随着时间的推移,它将变得更加困难。它是医疗保健领域人工智能发展的核心问题,我们将在下面简要讨论为什么这是一个问题。我们还将继续回顾这个主要障碍,从许多不同的角度和应用中解决问题和解决方案。这种策略将使您了解问题的许多不同方面、复杂性和驱动因素。
数据可访问性问题有许多组成部分:
-
隐私法规:数据可访问性问题的主要瓶颈集中在为保护个人数据而实施的隐私法规上;这些法规绝对必要,并且应该得到实施。我们不会绕过这些法规,而是将讨论如何与它们并行工作,保持这些宝贵的法规不变,同时利用这些数据可以提供的智能。你可以将其视为两全其美的情景。在第一章的“数据隐私作为瓶颈”部分以及“大数据挑战”和“传统人工智能”中讨论了几个重要的隐私法规。
-
数据不足/需要真实数据:在提供积极社会影响方面,很少有领域像医疗保健那样具有如此大的潜力。然而,医疗保健行业在利用人工智能提供的所有许多好处方面远远落后。其中一个原因是,为了使 AI 和机器学习模型有效地学习,它们需要大量的数据。我们将在本章中进一步讨论对大量数据的需要。这是 AI 的限制因素。在医疗保健中,有许多法规阻止这些模型以任何方式利用数据,这是合理的。
-
来自许多地方的数据类型:正如我们接下来将要讨论的,来自许多不同地方有许多不同的数据类型。数据可以以文本、视频、图像或语音的形式存在,存储在许多不同的地方。除了能够从许多不同的位置访问数据这一主要挑战之外,这些机构还以各种格式存储数据。
正如之前提到的,FL 在医疗保健领域的应用是最早的工作之一。在这个广阔的领域内,FL 有几种方式可以帮助解决问题。让我们看看 FL 在以下一些领域有巨大潜力改变医疗保健系统的例子。这些领域包括医学影像、药物发现和电子健康记录(EHRs)。
让我们先来仔细看看 FL 在医学影像中的应用。
医学影像
在医学影像领域,正如在“基于深度学习和联邦学习的脑肿瘤诊断方法综合分析”中讨论的那样,人们对 FL 充满了乐观情绪,该分析列在本章的“进一步阅读”部分。这些高期望部分是由于需要解决的一些挑战以及 FL 克服这些障碍的能力。其中一项挑战是需要大量的数据。
随着医学影像行业继续发展更好的设备、程序和设施,每天都会产生大量的医学影像数据。这种数据的指数级增长为医疗保健提供者开发更好的机器学习模型和提高医疗保健质量提供了巨大的机会。
另一个对 FL 对医学影像产生积极影响的乐观原因已经证明的成功是机器学习(ML)——更具体地说,是深度学习(DL)。
让我们简要地看看 DL,以更好地理解为什么在处理大量数据时它如此重要。DL 是 AI 范畴下的 ML 的一个子空间。DL 与 ML 的不同之处在于它使用了几层被称为神经网络的层。关于 DL 和神经网络已有几本书被撰写,因此我们不会在本书中详细解释这些内容。对于 DL 和神经网络的更深入覆盖,Packt 的《Advanced Deep Learning with Python》是一本很好的读物。在我们的一般讨论中,我们将提供一个非常基本的解释。
下面的图,图 9*.1*,展示了使用医学影像帮助分类脑肿瘤类型的神经网络的简单示例:
图 9.1 – 使用神经网络的肿瘤分类
在图例的左侧,我们有一个显示具有两种类型肿瘤之一的大脑图像。图像被分解成代表图像像素的数字。这些数字被添加到神经网络中。隐藏层为这些数字使用不同的权重,并通过激活函数产生不同的输出。最后,我们可以看到两个输出层。在这种情况下,有两种可能的输出。一个是肿瘤为 1 型,另一个是肿瘤为 2 型。
单个位置数据有限
如您所见,DL 模型需要大量的数据来训练。通常,单个数据存储库只有少量数据,这限制了任何模型很好地泛化的能力。
解决数据可访问性挑战的可能的解决方案
一种解决方案是利用隐私保护 FL,这样可以在保持敏感数据隐私的同时,利用多个中心可用的所有数据。
FL 使得可以在不共享敏感数据的情况下,在不同数据中心部署训练的大型 ML 模型。
在 FL 中,我们不是将数据移动到训练模型,而是将模型移动到数据,并且只带回从数据中收集到的智能,称为数据智能(IfD),将在本章的IfD 的潜力部分中进一步讨论。
示例用例 – 医院中的 ML
让我们通过一个例子来看看 FL 如何应用于医学影像数据。这个例子实际上是在一个专注于脑肿瘤的国际挑战赛中进行的。这里的目的是使用 MRI 扫描来分割肿瘤。
在这个例子中,我们将使用三家医院。我们将它们标记为医院 A、医院 B 和医院 C。每家医院都有本地存储的匿名私人医学影像数据。每家医院都从一个学习模型开始,您可以在下面的图中看到:
图 9.2 – 医院共享用于联邦学习的机器学习模型
每个医院都在本地运行模型;这创造了所谓的本地模型。重要的是要注意,在这个阶段,每个医院的本地模型都将不同。它们中的每一个都只在其医院的数据上进行了训练。
训练这三个本地模型的智能以模型参数的形式发送到一个集中服务器。服务器收集本地模型并将它们结合起来创建一个全局模型。这个全局模型,是三个本地模型智能的结合,随后被发送回每个医院,并仅在该医院的数据上再次进行本地训练。
再次强调,只有这些模型的智能被发送回服务器进行聚合。这个过程会重复进行,直到模型已经学到了它能学到的所有东西(称为收敛)。
利用联邦学习(FL),您可以在数据位于不同位置的情况下训练出表现如同所有数据都来自单一位置的模型。正如您所看到的,这种隐私保护方法的实施具有颠覆医学领域的力量。
现在我们来看看联邦学习(FL)如何改善药物发现领域。
药物发现
数据已成为我们现代世界的一种新型货币。对于制药公司来说,特别是,利用这些数据提供个性化医疗已成为一个主要焦点。在未来几年,能够利用更多数据的公司将更具竞争力。这将是任何组织未来成功的关键策略之一。
精准医疗
个性化医疗,也称为精准医疗,严重依赖于大量真实世界数据来实现这一点。此外,还需要机器学习算法来处理和分析这些数据,以便提取有意义的见解。正如我们将讨论的,目前获取大量真实数据非常困难,甚至可能是不可能的。
在图 9.3中,我们展示了精准医疗将立即产生影响的一些领域:
图 9.3 – 精准医疗影响许多领域
如您从图 9.3中看到的,精准医疗覆盖了广泛的不同领域和学科,如肿瘤学、健康、诊断、研究和健康监测。
目前,许多在医疗系统中部署的 AI 解决方案由于仅用代表患者群体一小部分的小数据集创建而失败。研究人员和开发者可以使用来自许多来源的数据来验证和改进模型,而无需拥有这些数据。
为了访问这些数据以便进行处理和分析,需要一种新的方法。这就是联邦学习(FL)发挥作用的地方。正如我们在整本书中讨论的,FL 提供所需的智能访问,而不是数据本身。
精准医疗是一种模型,它提出,而不是使用一刀切的方法,应该根据个人定制医疗保健,以在药物有效性和癌症治疗效果等方面取得更好的结果。为此,精准医疗严重依赖于大量真实世界数据。克服获取大量真实世界数据是实现大规模精准医疗的第一个障碍。
让我们看看当前的方法,看看 FL 如何提供所需的答案。
图 9.4 显示了当前常见的机器学习系统实现方法。在这里,数据被传输到中央服务器,所有数据都集中在一起,然后算法在汇总数据上训练。这被称为将数据带到模型的方法:
![图片 B18369_09_04.jpg]
![图片 B18369_09_04.jpg]
图 9.4 – 精准医疗现状
很容易想象以这种方式将许多医院的数据移动到集中地点的巨大成本。以这种方式处理数据也损害了数据安全,并使得合规性难以实现,如果不是不可能的话。
如图 9.5 所示,联邦学习(FL)的方法相当不同。它不是将数据带到模型中,而是将模型移动到数据中。这意味着机器学习模型在本地数据上训练,并且只将智能发送到 FL 服务器进行聚合,从而使各种本地模型能够从全局模型的更新中受益:
![图片 B18369_09_05.jpg]
![图片 B18369_09_05.jpg]
图 9.5 – 联邦学习中的精准医疗
联邦学习方法允许高效地转移模型和数据,同时符合法规要求。
IfD 的潜力
利用 FL 获取真实世界数据具有巨大的潜力,可以改善所有临床研究阶段。访问这类数据使我们能够利用收集到的智能和 IfD,可以显著加速药物发现的过程和步骤。在讨论 FL 的工作原理时,需要记住的一个重要想法是训练数据永远不会离开设备。
图 9.6 描述了通过训练过程从训练数据中提取机器学习模型的过程:
![图片 B18369_09_06.jpg]
![图片 B18369_09_06.jpg]
图 9.6 – IfD 图
如您在图 9.6 中所见,数据在本地用于训练机器学习模型。在 FL 中,模型位于设备本身上,在那里进行训练,并且只发送模型权重进行聚合——因此只有数据中的智能,而不是数据本身。
能够收集来自多个来源的 IfD(集成数据框架),以及包括视频、文本、语音和其他感官数据在内的广泛数据类型,可以帮助提高注册流程,无论是速度还是找到合适的匹配以进行药物和治疗的研究和开发。
这对于罕见疾病和癌症尤为重要。当以这种方式进行识别时,受试者可以被告知试验机会。
联邦访问数据和收集 IfD 可以打开全球大量数据的访问。这允许聚合数据存储库挖掘足够多的符合协议标准的患者。潜在地,这可以使试验的所有参与者都能接受实际药物而不是安慰剂。
最终,没有稳健的 AI,就无法实现大规模的精准医疗,而稳健的 AI 只能通过大量真实世界数据进行训练。使用 FL 可以允许改进结果测量。在未来几年中,联邦方法有可能以新的方式推动新医疗治疗方法发现的进步和创新,这些方式以前是不可能的。
在以下图中,图 9.7,我们展示了 FL 如何收集个体化数据(IfD)的通用视图:
![图 9.7 – FL 收集 IfD 的通用视图
图 9.7 – FL 收集 IfD 的通用视图
正如这里图 9.7所示,所有数据都保持在每个组织内部隔离,并且不会传输到联邦服务器。
让我们继续前进,讨论一个与电子健康记录(EHRs)相关的联邦学习(FL)应用。
EHRs
电子健康记录(EHR)是一组系统性和数字化存储的健康信息。这些记录旨在在适当的时候与医疗保健提供者(HCPs)共享。根据HealthIT.gov的统计数据,截至 2017 年,美国 86%的门诊医生已经采用了 EHRs。
图 9.8展示了从各种来源收集的 EHRs,例如医院和保险公司。在此图中,我们使用术语电子病历(EMRs)和个人健康记录(PHRs):
![图 9.8 – EHRs
图 9.8 – EHRs
这种采用 EHRs 为医疗保健组织之间的有益合作奠定了基础。正如我们在整本书中讨论的那样,能够访问更多真实世界数据使得基于这些数据训练的 AI 模型更加稳健和有效。
虽然已经建立了这个基础,但在多个机构之间共享 EHR 数据方面,传统的机器学习(ML)方法仍然面临许多挑战。这些问题包括隐私问题和法规以及数据标准化。其中一个主要问题是将数据存储在中央数据存储库(CDRs)中,如图 9.9 所示,其中存储了各种形式的地方数据以训练创建 ML 模型。
![图 9.9 – 集中式数据挖掘方法
图 9.9 – 集中式数据挖掘方法
由于数据隔离问题,这种 CDR 方法并不理想,这一问题将在下一节中讨论。
数据隔离问题
使用 CDR(临床数据记录)进行数据存储带来了许多问题。例如,包括数据泄露、严格的法规以及设置和维护的高成本。
数据存储方法对数据本身的质量和可用性的影响同样重要。在单一中心数据上训练的 ML 模型与从多个地点收集的数据相比,通常无法很好地泛化。
FL 允许跨多个组织进行模型训练协作,从而在不违反数据隐私法规的情况下产生卓越的模型性能。
让我们看看一个 FL 应用在 EHRs 中的例子。
电子健康记录中的表示学习
研究人员已经将联邦学习(FL)应用于电子健康记录(EHRs)中的表示学习,如“进一步阅读”列表中提到的两阶段联邦表型与患者表示学习。他们使用 FL 结合自然语言处理(NLP)对患者数据进行表型和表示学习。在第一阶段,基于几家医院的某些医疗记录创建患者数据的表示,而无需共享原始数据本身。所学习到的表示并不局限于任何特定的医疗任务。在第二阶段,使用从学习到的表示中提取的相关特征,以联邦方式训练特定表型工作的 ML 模型。
FL 已被展示为在医疗保健领域 AI 发展的进步中,作为当前方法的有效替代,无论是在药物发现、医学影像还是电子健康记录(EHRs)的分析中。
让我们继续探讨金融行业,这是联邦学习(FL)的另一个有前景的应用案例。
将 FL 应用于金融行业
仅在美国,金融服务公司每年在合规性上就花费数十亿美元以对抗洗钱,然而,当前系统如此无效,以至于不到 1%的洗钱活动被阻止。事实上,据估计,公司花费的金额大约是他们从这种犯罪活动中能够追回金额的 100 倍。只有一小部分交易被反洗钱(AML)系统捕获,而其中更小比例的警报最终按照 1970 年银行保密法(BSA)的要求报告在可疑活动报告(SARs)中。
保守估计,来自银行网络的情报价值远远高于任何一家银行的情报。这是因为你可以看到钱从哪里来,也看到钱流向了哪里。
反洗钱(AML)
当前的 AML 系统需要重大改进,需要克服几个挑战。许多隐私法规被实施以保护个人财务数据。这些法规从机构到机构、从地区到地区各不相同。
一种解决方案是金融机构之间的合作。这种合作将允许这些机构以互利的方式共享从自身数据中收集到的情报。而不是在合作者之间移动数据,机器学习(ML)模型本身将在每个机构本地部署。这将仅允许共享 IfD(集成数据),并使能够利用收集到的情报的每个合作者受益。正如我们讨论的那样,联邦学习(FL)具有这种能力。
在 FL 中,模型本身从一家机构移动到另一家机构。在这个过程中,模型通过从更多数据中学习调整参数,变得更加智能。这与 FL 的这两种替代方案不同:
-
一种选择是将来自合作金融机构的数据收集到一个中央存储库中。然而,由于客户隐私法规,这种方法不可行。
-
另一种方法是根据需要共享某种标识符。然而,由于隐私法律和法规的限制,这并不可能,只能作为调查过程的一部分使用。
要能够使用 FL,我们需要确保数据的隐私和安全保持完整。为此,我们必须确保模型在没有隐私违规的情况下在金融机构中接受训练。最后,我们需要确保所有与模型参数更新相关的通信,发送到联邦服务器的是安全可靠的。
FL 可以提高全球反洗钱(BSA)和反洗钱(AML)制度的有效性、效率和公平性。在下一节中,我们将探讨在反洗钱各学科中实施交易监控时使用 FL。
对现有 AML 方法的解决方案。
在反洗钱各学科中开发 FL 方法包括客户入职这一基本主题,并可能有助于使用非传统信息来验证潜在客户的身份。
需要一种新的方法,可以利用复杂的技术来提高风险检测系统的意识和效率。
这种方法应该能够实现以下功能:
-
使企业和监管机构能够在不共享敏感或受保护数据的情况下相互学习。
-
增强企业准确识别真实风险并减少无根据的风险报告的能力。
-
提高企业在决定是否服务于特定市场时的风险-收益计算。
反洗钱框架在防止任何通过恐怖主义、洗钱、欺诈或人口贩卖等非法目的使用全球金融系统造成伤害的国家利益中发挥着至关重要的作用。
尽管在洗钱风险检测系统上投入了巨大的资金和关注,但系统已经破裂。企业投入大量资源以满足反洗钱(AML)要求,但很少得到关于其风险报告质量的反馈。
两个关键因素驱使企业退出特定市场运营:
-
第一个是钱服务行业内部风险评级活动的成本
-
第二个关键因素是与非法金融活动相关的金融机构的监管风险和声誉影响
因此,全球范围内,代理银行关系下降了 25%。自 2009 年以来,新兴市场中有 25% 的银行报告了代理银行损失。
在 图 9*.10* 中,交易报告被描绘出来,每个机构的危险模式数据库反映了其非法活动的经验:
图 9.10 – 机构报告的疑似非法活动
机构不一定知道其竞争对手正在捕捉到的模式或政府知道哪些标记的交易是可疑的还是真实的。公司很少得到关于他们提交的报告准确性的及时反馈。结果是,公司缺乏改善其风险检测能力最关键的信息:关于确认问题的及时信息。
那么,想象一下在这种场景下更有效、更高效、更公平的交易监控。银行充当类似公用事业的中心。结合强大的计算机和智能算法可以对不同机构的进行数据评估。学习到风险模式的机器学习模型随后会在参与公司之间移动,以捕捉模式并从每个机构的风险中学习。所有这些都可以在不共享敏感或受保护数据的情况下完成。这如图 图 9*.11* 所示:
图 9.11 – 银行生态系统中的数据和情报流动
在 FL 方法中,银行创建了一个分类算法,该算法在每个参与公司的数据上训练。银行开发了一个关键模型和模型参数,这些参数反映了所有参与公司以及政府拥有的数据的见解。银行将关键模型和模型参数分发给参与公司,同时数据留在每个机构。这些分布式模型通过从本地数据中学习并随后将它们发送回银行来采用这些公司的风险模式。
FL 在 AML 领域的演示
TieSet, Inc. 的研究人员在 STADLE 上对 AML 领域应用 FL 进行了实验,使用 PaySim 移动货币模拟器生成的某些合成交易数据 (www.kaggle.com/ealaxi/paysim1)。他们使用了带有逻辑回归的监督学习,其中模型特征包括时间、金额以及原始账户和目标账户的新旧余额。数据集有 636,2620 笔交易(8,213 笔欺诈交易和 635,4407 笔有效交易),这些交易被分成 10 个单独的本地代理。
图 9*.12* 是将联邦学习(FL)应用于反洗钱(AML)的结果,图中展示了每轮训练中的精确度得分和 F1 得分。在图中,粗线代表聚合模型的性能,细线代表仅使用本地数据进行单独训练的个体代理的结果:
![图 9.12 – 将 FL 应用于 AML 的结果(粗线:聚合模型,细线:个体代理单独训练)]
![img/B18369_09_12.jpg]
图 9.12 – 将 FL 应用于 AML 的结果(粗线:聚合模型,细线:个体代理单独训练)
正如图 9**.12所示,聚合模型的表现相当稳定,在精确度和 F1 得分方面始终保持在 90%以上。FL 可以将欺诈交易从总欺诈交易额 1,241,770,000 美元减少到 65,780,000 美元,这意味着只有 5.3%的欺诈交易丢失。
让我们通过查看 FL 为风险检测提供的益处列表来结束本节。
FL 对风险检测系统的益处
将 FL 应用于风险检测系统在金融领域有以下几个好处:
-
FL 可以创建一个更大的风险检测算法数据集进行训练
-
提高非法活动检测的准确性
-
为组织提供了一种协作方式
-
企业可以进入新市场
在您的金融机构内识别洗钱策略的能力受限于您所能访问的数据。数据共享限制使得合作变得困难,甚至不可能。FL 为金融行业带来的解决方案和优势众多。额外的优势包括更好的运营效率和人力资本更好的分配。由于能够从客户数据中提取智能,FL 的应用在金融空间中几乎无限制。
在下一节中,我们将讨论 FL 在几个新兴技术中的应用时,我们将稍微转换一下话题。
FL 与边缘计算相结合
本章的这一部分是不同领域的混合,其中一些是新兴技术。这些领域都非常相互关联,正如我们将要讨论的。许多这些技术相互依赖以克服它们自己的挑战和限制。将这些技术与 FL 结合是一种特别有力的技术组合,这将是未来几年进步和创新的关键。
在接下来的十年里,我们将看到边缘计算能力、物联网(IoT)和 5G 连接性的扩展带来的几个变化。我们将看到数据量和传输速度的指数级增长。我们将继续看到更多隐私法规的实施,以保护私人用户数据,以及自动化和分析领域的爆炸式增长。
在 5G 之上的物联网边缘计算
要实现智能设备的全部潜力,这些设备必须能够连接到一个大大改进的网络,比如 5G。事实上,到 2023 年底,预计全球将有 13 亿 5G 服务用户。与边缘计算一样,5G 网络对于物联网连接至关重要。结合这些技术将有助于为智能设备铺平道路。
图 9*.13* 展示了各种事物,在物联网框架内,边缘计算能力连接到云和数据中心:
![图 9.13 – 边缘计算与互联网
图 9.13 – 边缘计算与互联网
然而,许多这些物联网设备缺乏足够的安全功能。除了像通用数据保护条例(GDPR)这样的法律和法规之外,我们还可以期待实施额外的政策来保护用户数据。本质上,随着时间的推移,对提取 IfD 解决方案的需求将继续增加。
让我们看看 FL 应用于边缘计算的一个示例。
边缘 FL 示例——目标检测
边缘计算是一种使用分布式计算将计算和数据存储尽可能靠近数据源的架构。理想情况下,这应该会降低延迟并节省带宽。以下是如何利用 FL 与不同类型的边缘设备相结合的示例。
技术设置
在这个示例中,使用了三个设备来演示使用边缘设备进行目标检测的 FL。一个是运行在 Nvidia 的 Jetson 上的 EIS200 边缘微服务器,操作系统为 Ubuntu。第二个设备是树莓派,使用 Raspberry Pi OS,第三个设备是一个简单的常规 PC,操作系统也是 Ubuntu。这些机器分别使用独特的数据集训练了一个目标检测模型。
如何做
EIS200 在鱼、肉和番茄的图片上进行了训练,标签为鱼、肉和蔬菜。树莓派在鱼、肉和茄子的图片上进行了训练。显然,在这里,番茄被茄子所取代。然而,标签保持不变——鱼、肉和蔬菜。同样,常规 PC 在鱼、肉和葱的图片上进行了训练,标签仍然是鱼、肉和蔬菜。
如您所预期的那样,每个环境都含有不同蔬菜的偏见数据——比如番茄、茄子、和葱——但所有这些蔬菜都有一个相同的标签,即蔬菜。
它是如何工作的
首先,模型是用 EIS200 的番茄图片进行训练的。正如您所预期的那样,只有番茄被正确地标记为蔬菜,而茄子和葱被错误地标记。
同样,树莓派仅用茄子图片训练的模型正确地识别了茄子。其中两根葱中的一根被标记为蔬菜,但另一根被识别为鱼。正如预期的那样,常规 PC 的模型只识别葱为蔬菜。
三个代理中没有一个能够正确标记所有三种蔬菜,正如我们所预期的。接下来,它们连接到一个名为 STADLE 的 FL 平台,由 TieSet 公司开发:
图 9.14 – 使用 FL 检测番茄、茄子和大葱的演示,其中每个机器上的数据集分布不同
STADLE 聚合器在 AWS 中以实例运行。在这里,每个环境都有一个独特的、只包含一种蔬菜的数据集。与 STADLE 平台连接后,每个代理使用本地数据进行训练。经过几个训练周期后,模型权重从代理发送到聚合器。然后,这些权重被聚合并发送回代理以继续训练。这种聚合周期的重复产生了无偏重的量。
检查结果
FL 模型能够正确检测和标记所有三种蔬菜,如图9**.15所示。这是 FL 在消除偏差方面的一个简单示例:
图 9.15 – 使用三个边缘设备进行演示的结果
如前所述,所有模型训练都是在边缘设备的本地存储中进行的。模型在本地数据上训练,然后只将参数权重发送到联邦服务器进行聚合。联邦服务器平均化模型。如果您还记得前面的章节,这被称为 FedAvg。联邦服务器然后将改进和更新的模型发送回边缘设备。因此,再次强调,只收集 IfD,而不是数据本身。
现在,让我们在下一节中看看汽车领域的另一个边缘示例。
使用 FL 实现自动驾驶
在 AI 行业中,特别是汽车领域,边缘计算与 ML 获得了显著的兴趣。例如,自动驾驶需要低延迟和实时响应才能正确运行。因此,FL 成为分布式数据处理和训练方面汽车领域的最佳解决方案之一。
将计算和存储卸载到边缘物联网设备使得管理自动驾驶应用的云系统变得更小、更便宜。这是从中心云基于 ML 范式转向 FL 范式最强大的好处。
现代汽车已经配备了具有复杂计算能力的边缘设备。高级驾驶辅助系统(ADASs)是自动驾驶汽车的基本功能,计算在车上进行。它们也需要大量的计算能力。
即使预测发生在自动驾驶车辆中,模型也是使用在本地服务器或云中的常规、昂贵的训练系统进行训练和准备的。
如果数据量变得更大,训练过程将变得更加计算密集和缓慢,并且还需要大量的存储空间。
为了避免这些问题,需要使用联邦学习,因为更新的机器学习模型在车辆和服务器之间传递,服务器存储着车辆的驾驶模式和来自车载摄像头的实时图像流。联邦学习再次可以根据用户同意并遵守隐私和区域法规来工作。
图 9*.16* 介绍了用于提高 ADAS 安全驾驶性能的分布式联邦学习,这是 TieSet, Inc. 与其技术合作伙伴进行的真实用例:
![图 9.16 – 使用多个聚合器提高 ADAS 安全驾驶性能的分布式联邦学习
图 9.16 – 使用多个聚合器提高 ADAS 安全驾驶性能的分布式联邦学习
TieSet, Inc. 的 STADLE 系统集成了 ADAS,旨在提供舒适性和个人安全措施,尤其是针对老年人,为汽车产品提供了优化的转向控制辅助。通过先进的计算机视觉和强化学习(RL)技术,他们实现了一种设计,能够提供及时的危险情况意识,并智能地学习最佳的个性化驾驶策略。
虽然个性化是设计的主要焦点,但个人数据的使用带来了实质性的隐私问题。由 STADLE 平台提供的 FL 框架为克服这一障碍提供了现实解决方案。该架构以协作形式呈现,通过人工智能智能交换在边缘用户之间进行分布式机器学习训练,避免了数据传输并确保了数据隐私。此外,聚合模型可以应对超出驾驶员个人经验的多种风险和不可预测的情况。
在使用真实汽车进行概念验证的过程中,他们成功展示了所设计的 RL 模型能够有效地生成针对使用 STADLE 聚合框架的驾驶员的定制化转向策略。
在下一节中,我们将讨论联邦学习如何应用于机器人领域。
将联邦学习应用于机器人技术
在机器人系统和应用中,机器学习已经成为完成必要任务的一个不可或缺和基本的部分。计算机视觉已经发展到使机器人系统在许多任务上表现出色,例如图像分割、目标检测和分类,以及自然语言处理和信号处理任务。机器学习可以处理许多机器人任务,包括感知、路径规划、传感器融合以及在制造环境中抓取检测到的物体。
然而,机器人在机器学习领域也面临着许多挑战。首先是训练时间。即使数据量足够训练机器学习模型来解决上述问题,训练一个真实的机器人系统也需要数周或数月。同样,如果数据不足,它可能会显著限制机器学习模型的表现。通常,数据隐私和可访问性成为收集足够数据来训练机器人机器学习模型的问题。
正因如此,联邦学习框架被认为是机器人领域的一个关键解决方案。TieSet, Inc. 的研究人员开发了一个系统和方法,允许机器人操作器和工具与其他机器人共享其操作技能(包括伸手、抓取放置、握持和抓取)以及各种类型和形状的物体,并使用其他机器人的技能来改进和扩展自己的技能。
该系统涵盖了创建机器人通用操作模型的方法,该模型通过从各种机器人代理中众包技能并保持数据隐私来持续改进。他们提出了一种新的架构,其中多个由人工智能驱动的机器人代理通过提交其模型到一个聚合器来协同训练全局操作模型。这种通信使得每个代理能够通过接收一个最优更新的全局模型来利用其他代理的训练结果。
图 9.17 展示了机器人联邦众包全局操作框架的工作架构:
![图 9.17 – 机器人联邦众包全局操作框架的架构
图 9.17 – 机器人联邦众包全局操作框架的架构
基于前图的架构,在模拟设置中,他们为抓取盒子、球、鸭子和泰迪熊等个别任务准备了五个机器人臂。使用 TieSet, Inc. 的 STADLE 平台,该平台可以进行异步联邦学习,这些臂的机器学习模型被持续聚合。最终,联邦机器人机器学习模型可以以更高的性能(80% 的成功率)抓取所有这些物体,如图 图 9.18 所示:
![图 9.18 – 机械臂可以通过不同任务进行交叉训练以提高精度和效率
图 9.18 – 机械臂可以通过不同任务进行交叉训练以提高精度和效率
基于 STADLE 的联邦学习可以显著减少训练机器人和机器学习用于生产线的时间,使用计算机视觉。联邦性能远优于单独训练机器人,学习时间也比单独训练机器人快得多。
在下一节中,我们将讨论大规模人工智能,即使有大量设备和连接的环境,学习也应该持续进行,物联网应演变为智能互联网。
向智能互联网迈进
在本节中,我们将讨论为什么在物联网和 5G 等可扩展技术的最新发展中,FL 非常重要。与上一节一样,AI 需要在大规模学习中保持学习的领域包括自动驾驶、零售系统、能源管理、机器人和制造,所有这些在边缘侧产生大量数据,其中大部分数据需要完全学习以生成性能良好的机器学习模型。
随着这一趋势的发展,让我们来看看智能互联网的世界,在这个世界里,学习可以在边缘侧发生,以应对动态环境和连接到互联网的众多设备。
介绍 IoFT
物联网涉及智能和连接的系统。它们之所以智能,是因为信息被共享,智能被提取并用于某些目的——例如,设备的预测或控制。它们通常连接到云端,并能够从许多端点收集数据。
图 9.19显示了随着时间的推移,数据越来越多:
![图 9.19 – 当前物联网系统
图 9.19 – 当前物联网系统
如图 9.19所示,在当前的物联网流程中,必须上传和存储大量数据在云端。
模型针对特定目的进行训练,例如预测性维护和文本预测。最后,训练好的模型被发送回边缘设备。
如您所见,当前方法存在几个问题:
-
需要大量的存储空间
-
由于数据量,延迟受到影响
-
由于数据移动导致的隐私问题
为了克服这些问题,FL 扮演着重要的角色。
联邦物联网(IoFT)是一个最初由密歇根大学的研究者提出的想法,其论文《联邦物联网》(IoFT)列在本章的进一步阅读部分。IoFT 是一个扩展框架,将物联网与 FL 的概念相结合。随着边缘侧的计算能力显著提高,AI 芯片正迅速进入市场。即使是智能手机,现在的计算能力也非常强大,小型但功能强大的计算机通常连接到大多数边缘设备。
因此,由于边缘设备的计算能力提高,机器学习模型训练过程被降低到边缘,物联网将数据发送到服务器的功能可以用来将机器学习模型传输到云端。这也是一种非常有效的方法,可以保护边缘设备上的隐私数据,例如手机。
让我们看看图 9.20中展示的 IoFT 的一个例子。
![图 9.20 – IoFT 的一个例子
图 9.20 – IoFT 的一个例子
IoFT 的潜在应用包括分布式制造、交通交叉口控制和能源控制等。
理解 FL 在 Web 3.0 中的作用
FL 可以集成到 Web 3.0 技术中,以加速智能互联网的采用。由机器学习模型表示的智能可能是特定个人或行业的财产。同时,如果它是可以促进全球人们该机器学习模型学习过程的公共资产,那么它也可以被认为是公共资产。无论是私人知识产权还是公共资产,通过利用 Web 3.0 技术,智能可以以去中心化的方式管理和进化。因此,越来越多的人将获得由人们共同训练的智能带来的好处,这将导致我们整个社会在各个领域和各种应用中的真正创新。
将 FL 应用于大数据的分布式学习
在本节中,我们将讨论如何在大数据的背景下将联邦学习(FL)应用于分布式学习。
对于大数据,FL 可能不太涉及与隐私相关的问题,因为用于智能目的的数据已经拥有。因此,它可能更适合大数据的高效学习和显著提高训练时间,以及降低使用大型服务器、计算和存储的成本。
在大数据上进行分布式学习有几种方法,例如构建适用于不同类型服务器的特定端到端机器学习堆栈,如参数服务器,或者在 Hadoop 和 Spark 等大数据平台之上利用某些机器学习方案。还有一些其他平台,如 GraphLab 和 Pregel。您可以使用任何库和方法,例如具有低级机器学习实用工具的随机近端下降法和坐标下降法。
这些框架可以在计算上支持机器学习模型的并行训练,但无法将数据源分配到不同的机器上以分布式方式本地训练,尤其是在训练环境分散在互联网上时。通过 FL,您只需通过同步模型联邦即可简单地聚合不同分布式机器的学习结果,但您确实需要开发一个精心设计的平台来协调分布式学习的持续运行,包括适当的模型存储库和版本控制方法。
大数据上执行分布式学习的示例在图 9.21中描述。
![图 9.21 – 大数据中分布式学习的集成
图 9.21 – 大数据中分布式学习的集成
在*图 9**.21 的例子中,数据源,通常是很大的,被分割成多个数据源,以便分散到不同的机器或实例中进行训练。在联邦学习(FL)框架内,来自分布式环境的训练模型都被汇总。训练和汇总后的模型随后进入机器学习操作(ML Ops)的过程,以进行性能验证和持续监控,以及模型操作(Model Ops)。
在前一个场景之上,可以进一步的做法是结合其他数据源的洞察。在这种情况下,联邦学习(FL)可以优雅地结合其他数据源的洞察,并很好地协调分布式环境中直接创建的其他形式智能的集成。这样,你还可以创建集中式机器学习(ML)和分布式机器学习(ML)的混合模型。
摘要
在本章中,我们讨论了不同行业在人工智能进步方面面临的各种挑战。大多数挑战都与数据可访问性有关。数据隐私法规、缺乏真实数据和数据传输成本都是我们期望联邦学习(FL)继续帮助解决的独特且具有挑战性的问题。
在本章中,你了解了联邦学习(FL)在医疗保健、金融、边缘和物联网(IoT)领域等越来越多地发挥重要作用的用例。联邦学习(FL)提供的隐私遵守对于医疗保健和金融行业尤为重要,同时联邦学习(FL)可以为许多边缘人工智能和物联网场景在可扩展性和学习效率方面增加显著价值。你还学习了如何将联邦学习(FL)应用于大数据的分布式学习,以减少训练时间和成本。
在下一章和最后一章中,我们将通过讨论联邦学习(FL)在未来十年预期将发挥关键作用的非常激动人心的未来趋势和发展来结束本书。
参考文献
本章节中使用了以下参考文献:
-
金融服务公司花费 1809 亿美元用于金融犯罪合规:
www.prnewswire.com/news-releases/financial-services-firms-spend-180-9-billion-on-financial-crime-compliance-according-to-lexisnexis-risk-solutions-global-study-301036194.html
进一步阅读
要了解更多关于本章所涉及的主题,请参阅以下参考文献:
-
*Naeem A., Anees T., Naqvi RA., Loh WK. 对基于深度和联邦学习的脑肿瘤诊断方法的综合分析. J Pers Med. 2022 年 2 月 13 日;12(2):275. doi: 10.3390/jpm12020275 PMID: 35207763; PMCID: PMC8880689.
-
*Ng, Dianwen, 等人. 联邦学习:一个协作努力,以实现为具有小型标记数据集的各个站点提供更好的医学成像模型。定量影像医学与外科 11.2 (2021):852:
www.ncbi.nlm.nih.gov/pmc/articles/PMC7779924/ -
*Rieke, Nicola, 等人. 联邦学习在数字健康领域的未来。NPJ 数字医学 3.1 (2020):1-7:
www.nature.com/articles/s41746-020-00323-1.pdf -
*Dang, Trung Kien, 等人. 联邦学习在电子健康记录中的应用. ACM 智能系统与技术交易(TIST)(2022):
dl.acm.org/doi/pdf/10.1145/3514500 -
*Liu, Dianbo, Dmitriy Dligach, 和 Timothy Miller. 两阶段联邦表型学习和患者表示学习。会议论文。计算语言学协会。会议。2019 年卷。NIH 公共访问,2019:
arxiv.org/pdf/1908.05596 -
*Kontar, Raed, 等人. 联邦事物互联网(IoFT). IEEE Access 9 (2021): 156071-156113:
ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=9611259 -
深度联邦学习在自动驾驶中的应用:
arxiv.org/pdf/2110.05754.pdf -
联邦学习在大数据中的应用:关于机会、应用和未来方向的调查:
arxiv.org/abs/2110.04160
第十章:未来趋势和发展
智慧将推动下一代技术,而不是大数据。正如在第一章“大数据和传统人工智能的挑战”中讨论的那样,大数据系统存在一些问题,世界正逐渐从数据为中心的时代过渡到智能为中心的时代。联邦学习(FL)将在智慧驱动技术中扮演核心角色。因此,现在是欢迎集体智慧世界的时刻。
在本章中,我们将讨论由联邦学习(FL)带来的范式转变所驱动的未来人工智能技术的方向。对于许多人工智能领域,如对隐私敏感的领域和需要可扩展性的机器学习(ML)领域,FL 的好处和潜力已经非常显著,这主要归功于 FL 设计上自然支持的隐私保护和分布式学习方面。你将了解 FL 的不同类型以及该领域的最新发展努力,如分片学习和群集学习技术,这些可以被视为增强 FL 的进化框架。
此外,联邦学习(FL)创造了一个新的概念——智能互联网,在这个互联网中,人和计算机交换的是智慧,而不仅仅是数据本身。区块链技术进一步加速了面向每个人的智能互联网。这种智能互联网可以形成一个新的定义——集体智慧,它推动着从数据为中心的方法向智能为中心或模型为中心的方法的又一创新。
最后,我们将分享一个集体愿景,在这个愿景中,联邦学习(FL)在协同创造由世界各地许多人和机器学习到的智慧中扮演关键角色。
在本章中,我们将涵盖以下主题:
-
观察未来人工智能趋势
-
联邦学习的研究和发展
-
探索集体智慧
观察未来人工智能趋势
如下节所述,大多数行业领导者现在都意识到集中式机器学习的局限性。
集中式机器学习的局限性
当展望人工智能的未来时,首先要知道的一个事实是,许多公司今天都在努力从他们拥有的数据中提取智能和获得洞察。通常,组织和企业收集的数据中超过一半都没有被使用。传统的机器学习和数据科学方法需要在分析和管理机器学习模型之前,将数据组织并整合到数据湖和存储中。你需要复制并移动数据,这会导致从数据中提取的智能价值的实现和交付延迟,同时伴随着一定的运营风险和复杂性。
此外,大多数企业公司生成的大量数据将在传统的集中式数据中心或云之外创建和处理。以集中方式处理数据以生成洞察力变得越来越不切实际且效率低下。
此外,根据一些市场报告,大多数最大的全球组织和公司至少会探索一次联邦学习,以创建更加准确、安全和环保的模型。
话虽如此,许多行业和市场逐渐意识到分布式和联邦学习范式的重要性,因为他们正面临着当前集中式大数据 AI 训练不可避免的问题和限制,如第一章中所述,大数据和传统 AI 的挑战。联邦学习将模型带到训练过程所在的数据处,而不是将数据带到模型处。因此,联邦学习被认为是数据科学和机器学习的未来。
在下一节中,让我们总结一下为什么联邦学习(FL)对那些公司有益,尤其是那些面临上述问题的企业。
重温联邦学习的益处
在本节中,我们将总结本书中介绍过的联邦学习的益处。
模型准确性和泛化能力的提升
联邦学习通过在本地对分散的数据集进行训练,将学习持续地纳入全局模型,实现了协作和分布式学习,从而可以提高机器学习模型的性能。这样,可以产生更准确和泛化的机器学习模型。
进一步的隐私和安全
联邦学习提供了隐私和安全优势,因为它不会因为其设计和安全机制而要求私有和原始数据,正如我们在第二章中讨论的什么是联邦学习和第九章中讨论的联邦学习应用的关键用例案例研究。因此,联邦学习降低了数据滥用、泄露或敏感信息暴露的风险。联邦学习也符合许多隐私法规,如通用数据保护条例(GDPR)、加州消费者隐私法案(CCPA)和健康保险可携带性和问责法案(HIPAA)。
提高速度和效率
联邦学习还以其高计算效率而闻名,这可以加速机器学习模型的部署和测试,以及减少通信和计算延迟。由于联邦学习的去中心化特性,模型交付和更新的延迟最小化,从而使得全局模型能够近乎实时地进行预测。对于时间敏感的机器学习应用来说,智能的实时交付和更新是非常有价值的。
FL 还有助于通过克服系统异质性和不平衡的数据分布来减少带宽和能源消耗,这导致最小化数据存储和传输成本,这些成本也可以显著减少环境影响。
向分布式学习迈进,以实现更高的隐私性和训练效率
目前,AI 是在大型计算服务器上训练的,通常在大数据公司的大型机器上发生。
正如超级计算机时代所看到的,它可以在一台机器或一台机器集群中处理大量数据和任务,技术的进化过程始于一个中心位置,并逐渐过渡到分布式环境。
在 AI 领域,同样的事情即将发生。现在,数据湖概念在组织训练 ML 模型方面非常流行,但 ML 已经需要分布式学习框架。
FL 是一种将训练过程分布到多个节点上的绝佳方式。正如许多研究报告所示,大多数数据并未被充分利用来提取 ML 模型的洞察力。
有些公司和项目正在尝试使用 FL 作为一种强大的分布式学习技术,例如 Devron 提供的平台(devron.ai)、FedML(fedml.ai)和 STADLE(stadle.ai)。这些平台已经解决了集中式 AI 的局限性部分中讨论的问题,并在各种用例中显著提高了 ML 过程,正如重访 FL 的好处部分所述。
根据我们讨论的 AI 趋势,让我们在下一节中看看与 FL 相关的正在进行的研究和发展,这些研究是由前沿公司现在进行的。
FL 的持续研究和开发
我们现在来讨论正在全球学术界和工业界进行的研究和开发项目。让我们从 FL(联邦学习)的不同类型和方法开始,然后继续探讨进一步增强 FL 框架的持续努力。
探索各种 FL 类型和方法
在这本书中,我们探讨了 FL 系统的最基本算法和设计概念。在现实世界中,我们需要深入了解哪些 FL 框架可用,以从这些算法中提取最佳性能。根据数据场景和用例,FL 中有几种方法,如下所示:
-
水平 FL 和垂直 FL
-
集中式 FL 和去中心化 FL
-
跨部门 FL 和跨设备 FL
现在,让我们在以下各节中看看每种 FL 类型。
水平 FL 和垂直 FL
水平联邦学习(Horizontal FL)使用所有分布式设备上具有相同特征空间或模式的数据库集(www.arxiv-vanity.com/papers/1902.04885/)。这实际上意味着数据集共享相同的列,但行不同。大多数现有的联邦学习项目都是基于水平联邦学习。具有水平联邦学习的数据库和训练过程很简单,因为数据集是相同的,只是数据分布和要学习的数据输入不同。水平联邦学习也称为同质或基于样本的联邦学习。
垂直联邦学习(Vertical FL)适用于不同数据集共享相同的样本 ID 空间但特征空间不同的情况。您可以查看这篇论文(arxiv.org/pdf/2202.04… ID 不同。垂直联邦学习的关键思想是通过使用具有不同属性集的分布式数据集来改进机器学习模型。因此,垂直联邦学习可以垂直处理具有相同样本空间中不同属性的分区数据。垂直联邦学习也称为异质或基于特征的联邦学习。
集中式联邦学习和去中心化联邦学习
集中式联邦学习(Centralized FL)是目前最常见的方法,大多数平台都采用这种框架。它使用集中式服务器来收集和聚合不同的机器学习模型,并在所有本地数据源上进行分布式训练。在这本书中,我们专注于集中式联邦学习方法,其中本地训练代理将学习结果传达给集中式联邦学习服务器以创建全局模型。
去中心化联邦学习(Decentralized FL),另一方面,不使用集中式服务器来聚合机器学习模型。它要求在本地数据源上训练的各个机器学习模型之间相互通信,而不需要一个主节点。在这种情况下,模型权重从每个单独的数据集传输到其他数据集以进行进一步训练。如果不受信任的方能够访问智能,则可能容易受到模型中毒的影响,这是从对等框架中衍生出的一个常见问题。
跨领域联邦学习和跨设备联邦学习
跨领域联邦学习(Cross-silo FL)是指机器学习模型在跨越任何功能、组织和监管障碍的数据上训练的情况。在这种情况下,大数据通常存储在更大的存储空间中,并具备如云虚拟机这样的训练计算能力。在跨领域联邦学习的情况下,领域/训练环境的数量相对较小,因此在联邦学习过程中不需要太多代理。
跨设备 FL是模型需要在大规模训练的情况,通常在边缘设备上进行,例如手机、物联网(IoT)设备、Raspberry Pi 类型的设备等。在这种情况下,大量设备连接起来以聚合机器学习模型。在跨设备 FL 的情况下,限制基本上在于这些边缘设备的低计算能力。该框架还需要处理大量断开和无效的设备,以进行一致和持续的 FL 过程。训练过程及其数据量也应受到限制。
这就总结了可以应用于机器学习应用中各种场景的不同类型的 FL。有一些新技术试图增强 FL 框架,使其演变成下一代具有 FL 的人工智能技术。让我们在下一节中探讨几个高级方法。
理解基于 FL 的增强分布式学习框架
正在进行着进一步增强 FL 或分布式学习框架的努力。
分割学习
分割学习是在麻省理工学院媒体实验室开发的,是一种新兴的分布式学习技术,它使机器学习模型能够分割成多个部分,在分布式客户端上训练这些分割的机器学习模型,并在最后进行聚合。分割学习也不必共享数据,因此也被认为是保护隐私的人工智能。
整体框架类似于 FL。然而,不同之处在于神经网络被划分为多个部分,这些部分将在分布式客户端上进行训练。然后,该神经网络部分的训练权重将被传输到服务器和客户端。这些多个部分的权重将在下一次训练会话中持续训练。因此,分布式客户端之间不共享任何原始和私有数据,只有每个部分的权重被发送到下一个客户端。
尤其是 SplitFed(arxiv.org/abs/2004.12088)是另一种结合分割学习和 FL 的高级技术。SplitFed 在 FL 客户端和服务器之间分割深度神经网络架构,以实现比 FL 更高的隐私级别。它比基于 FL 并行学习范式的分割学习提供了更好的效率。
群体学习
群体学习是基于区块链技术的去中心化机器学习解决方案,特别设计用于使企业行业能够利用分布式数据的力量,从而保护数据隐私和安全。
这可以通过各个节点共享从本地数据推导出的机器学习模型的参数来实现。
从分布式客户端共享的参数合并到一个全局模型中。与正常 FL 的不同之处在于,合并过程不是由中央服务器执行的。分布式节点和客户端选择一个临时领导者来执行合并。这就是为什么蜂群学习真正实现了去中心化,同时也提供了更大的容错性和弹性。分布式代理具有网络的集体智能,而不需要将本地数据共享到一个节点。
蜂群学习建立在区块链之上。区块链提供了去中心化控制、可扩展性和容错性等方面,以超越单个企业的限制。同时,区块链引入了一个防篡改的加密货币框架,参与者可以使用该框架来货币化他们的贡献。
BAFFLE
此外,还有一个名为BAFFLE的框架,代表基于区块链的聚合器免费联邦学习(arxiv.org/abs/1909.07… 也是一个无聚合器、由区块链驱动的 FL 框架,本质上具有去中心化特性。BAFFLE 利用区块链框架中的智能合约(SCs)来协调轮次管理,以及 FL 的模型聚合和更新任务。使用 BAFFLE 可以提升计算性能。全局模型也被分解成许多数据块集合,直接由 SC 处理。
现在我们已经了解了 FL 领域的最新研究和发展,在下一节中,让我们看看人工智能、科学和集体智能技术的更具有前瞻性的方面。
前往集体智能之旅
大数据已经成为人工智能运动的一个变革者。虽然边缘和人们生成数据的数量将以指数级增长,但从中提取的智能对社会有益。因此,大数据时代将逐渐将接力棒传递给由 FL(联邦学习)赋能的集体智能时代,在这个时代,人们将共同创造一个由智慧驱动的世界。
让我们从定义一个以智能为中心的时代开始,在这个时代,基于 FL 的集体智能概念得以实现。
以集体智能为中心的时代
集体智能(CI)是指大量单个实体以看似智能的方式共同行动的概念。CI 是一种涌现现象,其中人群处理信息以获得仅靠单个成员无法理解的见解。
最近,麻省理工学院集体智能中心负责人、最初提出“集体智能”一词的人托马斯·马龙,扩展了 CI 的定义:“CI 是能够从包括人和计算机在内的群体中产生的东西。CI 是一个非常普遍的特性,超级智能可以在许多类型的系统中出现,尽管我主要讨论的系统是涉及人和计算机的系统。”(参考:www2.deloitte.com/xe/en/insights/focus/technology-and-the-future-of-work/human-and-machine-collaboration.html)。
我们现在正迎来由 FL(强化学习)赋能的技术中 CI(集体智能)的新视角。
在当前的技术世界中,数据是提取智能的巨大来源。全球分散的数据集可以通过 AI 技术转化为智能集合。正如提到的,当前的趋势是大数据,因此大数据公司不仅领导着技术产业,也领导着整个世界经济。未来正朝着 CI 的方向发展。随着复杂 ML 算法(包括深度学习)的出现,CI 的愿景变得更加清晰,因为 ML 模型所代表的智能可以从人、计算机或任何生成有意义数据的设备中提取智能。
为什么 FL 会推崇 CI 的概念?FL 的本质是收集一组分布式智能,通过书中讨论的聚合机制进行增强。这本身就能实现一个无需直接从人或设备收集数据的数据无平台。
尽管书中讨论了大数据问题,但我们并没有专注于以数据为中心的平台。然而,学习大数据对于真正创建真正有价值并能在世界许多领域创造实际价值的应用系统来说,是非常关键和不可避免的。这就是为什么即使面对隐私法规、安全、数据孤岛等重大挑战,大数据领域仍然是发展最繁荣的行业。
现在是进一步发展和传播 FL 等技术的时机,这些技术可以通过从根本上解决大数据问题来加速 CI 时代的到来。这样,我们就能实现一个由真正的数学基础支持的 CI 驱动的新技术时代。
正如所述,以数据为中心的平台是当前的趋势。因此,许多数据和自动机器学习供应商可以通过组织数据和学习程序来支持并自动化创建基于机器学习的智能的过程。一个以智能为中心或以模型为中心的平台应该是下一波技术浪潮,人们可以在其中共享和增强他们自己生成的智能。借助 FL,我们甚至可以实现众包学习,人们可以共同且持续地提升机器学习模型的质量和性能。因此,FL 是智能中心平台实现智慧驱动世界的关键和必要部分。
智能互联网
物联网演变为万物互联。然而,人们真正需要的信息是什么?仅仅是大数据吗?还是从数据中提取的智能?随着 5G 技术的出现,大量数据可以在互联网上以更高的速度传输,部分解决了许多人工智能应用中的延迟问题。FL 可以交换比原始数据更少的信息,但仍需要在互联网上传输机器学习模型。
虽然许多研究项目正在最小化 FL 中的通信延迟,但在未来,与智能相关的信息将成为另一种经常在网络上交换的实体。到处都会有模型库,例如模型动物园,由 FL 支持的众包学习将更常见,以在互联网上与全球的人们共同创造更好的智能。
这种范式转变不仅限于人工智能领域本身,还包括广泛的信息技术领域。正如我们将在下一节中讨论的,这种智能互联网运动将成为众包学习和 CI 的基础,并有助于在未来的几年内让尽可能多的人获得智能。
FL 的众包学习
FL 执行的智能集合自然使其非常适合向 CI(集体智能)迈进。同样的事情也适用于人们可以集体贡献训练过程以供全球机器学习模型使用的场景。
计算机视觉和自然语言处理等领域的高性能机器学习模型已被某些大数据公司训练,通常花费巨额资金,包括数亿美元。
是否有办法集体训练一个可能对广大公众都有益的机器学习模型?借助 FL(联邦学习)的先进框架,这是可能的。
FL 提供了一种管理来自各种分布式代理的多个训练模型聚合的真正方式。在这种情况下,分布式代理本身可能是全球的每个人,其中每个机器学习模型的用户和训练者都有自己的独特数据集,这些数据集由于数据隐私、孤岛效应等原因而无法被其他人获取。
这种利用 CI 的方式通常被称为众包学习。然而,传统的众包学习是以一种更加有限的方式进行,仅仅基于大规模促进和招募数据标注者。
在 FL 的新范式下,CI 平台上的用户可以访问和下载他们感兴趣的人工智能模型,并在必要时重新训练它们,以在自己的环境中吸收学习。然后,通过用户共享训练好的机器学习模型的框架,FL 的高级聚合框架可以挑选出合适的模型进行联邦学习,使全局模型表现更佳,采用只有用户才能访问的多样化数据。
这样,通过机器学习的智能正变得更加普遍,不仅限于那些拥有大量数据和预算来训练真实机器学习模型的特定公司。换句话说,没有 FL 框架,协作学习是困难的、棘手的,甚至几乎不可能自动化。这种机器学习模型的开放性将推动整个技术世界达到下一个水平,并将使更多应用成为可能,这些应用拥有由爱好者训练的真正强大的智能,旨在使世界变得更好。
摘要
在本书的最后一章中,我们讨论了未来趋势和发展,其中 FL 预计将在未来十年内发挥关键作用。在未来,FL 对于大多数企业和应用提供商来说,将是从“希望拥有”的框架转变为“必须拥有”的技术,因为不可避免的数据隐私法规和技术趋势要求与众多用户一起实现可扩展性。
正如我们所讨论的,未来的技术将由智能互联网的概念所驱动,人们和计算机主要交换他们的智慧,共同创造一个更加智能的社会和世界。最后,由于当前与 CI 相关的协作学习趋势,以数据为中心的技术将逐渐演变为以智能为中心的技术,这使得人们高度重视 FL 相关的技术,这些技术的基石在本书中进行了讨论。
这本书是在人工智能带来的新进步时代曙光下撰写的。在过去几十年里,我们在利用大数据策略方面取得了巨大进步,但我们已经超越了这些方法,必须采用新的做事方式、新技术和新理念来继续前进。只要我们抓住当前的时刻,投资于如 FL 等新技术,我们面前就有光明的未来。
进一步阅读
如果您希望深入了解本章讨论的一些概念,以下是一些参考资料:
- 理解联邦学习的类型,由 OpenMinded 发布:
blog.openmined.org/federated-learning-types
)
- Thapa, Chandra, 等人。SplitFed: 当联邦学习遇到分割学习,AAAI 人工智能会议论文集。第 36 卷。第 8 期。2022 年:
arxiv.org/pdf/2004.12088.pdf
)
- SWARM LEARNING: 将您的分布式数据转化为竞争优势, 技术白皮书:
www.labs.hpe.com/pdf/Swarm_Learning.pdf
)
- Paritosh Ramanan 和 Kiyoshi Nakayama。BAFFLE: 基于区块链的聚合器免费联邦学习,2020 IEEE 国际区块链会议(Blockchain)。IEEE,2020 年:
arxiv.org/pdf/1909.07452.pdf
附录:探索内部库
在第四章,使用 Python 实现联邦学习服务器,和第五章,联邦学习客户端实现,都关于提供的 simple-fl GitHub 仓库中 fl_main/lib/util 目录的实现。
在本附录中,我们将提供内部库和利用类及函数的概述,并附上代码示例以展示其功能。
在本章中,我们将涵盖以下主要内容:
-
FL 系统内部库概述
-
用于实现 FL 系统的枚举类
-
理解通信处理器功能
-
理解数据结构处理器类
-
理解辅助和支持库
-
用于生成通信负载的消息传递器
技术要求
本章中介绍的所有库代码文件都可以在 GitHub 仓库(github.com/tie-set/sim… fl_main/lib/util 目录中找到。
重要提示
您可以使用这些代码文件用于个人或教育目的。请注意,我们不会支持商业部署,并且不对使用代码造成的任何错误、问题或损害负责。
FL 系统内部库概述
图 A.1 展示了位于 fl_main 目录下的 lib/util 文件夹中内部库的 Python 代码组件,这些组件用于 FL 系统的数据库、聚合器和代理:
图 A.1 – 用于数据库、聚合器和代理通信的 Python 软件组件
以下是对 FL 系统中位于 lib/util 文件夹内部库的 Python 文件的简要描述。
states.py
位于 lib/util 文件夹中的 states.py 文件定义了多种枚举类以支持实现 FL 系统。类定义包括 FL 客户端状态、ML 模型类型和消息类型,以及各种消息的信息和值的位置。
communication_handler.py
在lib/util文件夹中的communication_handler.py文件可以提供数据库、FL 服务器和客户端之间的通信功能,主要定义它们之间的send和receive函数。此外,它还提供了启动数据库、聚合器和代理服务器的函数。
data_struc.py
在lib/util文件夹中的data_struc.py文件定义了一个名为LimitedDict的类,以支持 FL 周期的聚合过程。它提供了将具有字典格式的 ML 模型转换为LimitedDict以及相反的函数。
helpers.py
在lib/util文件夹中的helpers.py文件包含了一系列内部辅助函数,例如读取配置文件、生成唯一的哈希 ID、将 ML 模型打包成字典、加载和保存本地 ML 模型、获取机器的 IP 地址以及操作 FL 客户端状态。
messengers.py
在lib/util文件夹中的messengers.py文件用于生成 FL 系统之间作为通信有效载荷的各种消息,以促进书中讨论的简单 FL 系统通信协议的实现。
既然我们已经讨论了 FL 系统内部库的概述,那么接下来让我们更详细地讨论各个代码文件。
用于实现 FL 系统的枚举类
枚举类用于辅助实现 FL 系统。它们定义在fl_main目录的lib/util文件夹中的states.py文件中。让我们看看定义枚举类时导入了哪些库。
导入库以定义枚举类
在这个states.py代码示例中,该文件导入了来自enum的通用库,如Enum和IntEnum:
from enum import Enum, IntEnum
接下来,我们将解释定义 FL 系统三个组成部分前缀的类。
定义 FL 系统组件的 IDPrefix
以下是一系列定义 FL 系统组件的类。IDPrefix是用于指示代码中引用的 FL 组件的前缀,例如agent、aggregator或database:
class IDPrefix:
agent = 'agent'
aggregator = 'aggregator'
db = 'database'
接下来,我们将提供客户端状态的类列表。
客户端状态类
以下是与 FL 客户端状态相关的枚举类列表,包括等待全局模型的状态(waiting_gm)、机器学习训练的状态(training)、发送本地机器学习模型的状态(sending)和接收全局模型的状态(gm_ready)。在代理规范中定义的客户端状态如下:
# CLIENT STATE
class ClientState(IntEnum):
waiting_gm = 0
training = 1
sending = 2
gm_ready = 3
定义 ML 模型和消息类型的类列表
以下是一系列定义与 FL 系统实现相关的 ML 模型和消息类型的类。
ModelType 类
机器学习模型的类型,包括local模型和cluster模型(global模型),定义如下:
class ModelType(Enum):
local = 0
cluster = 1
DBMsgType 类
消息类型在聚合器和数据库之间的通信协议中定义,如下所示:
class DBMsgType(Enum):
push = 0
AgentMsgType 类
消息类型在从代理发送到聚合器的通信协议中定义,如下所示:
class AgentMsgType(Enum):
participate = 0
update = 1
polling = 2
AggMsgType 类
消息类型在从聚合器发送到代理的通信协议中定义,如下所示:
class AggMsgType(Enum):
welcome = 0
update = 1
ack = 2
定义消息位置的州类列表
以下是与 FL 系统之间通信相关的消息位置定义的类列表。
ParticipateMSGLocation 类
从代理到聚合器的参与消息的索引指示器如下:
class ParticipateMSGLocation(IntEnum):
msg_type = 0
agent_id = 1
model_id = 2
lmodels = 3
init_flag = 4
sim_flag = 5
exch_socket = 6
gene_time = 7
meta_data = 8
agent_ip = 9
agent_name = 10
round = 11
ParticipateConfirmationMSGLocation 类
从聚合器返回的参与确认消息的索引指示器如下:
class ParticipateConfirmationMSGLocation(IntEnum):
msg_type = 0
aggregator_id = 1
model_id = 2
global_models = 3
round = 4
agent_id = 5
exch_socket = 6
recv_socket = 7
DBPushMsgLocation 类
从聚合器到数据库的push消息的索引指示器如下:
class DBPushMsgLocation(IntEnum):
msg_type = 0
component_id = 1
round = 2
model_type = 3
models = 4
model_id = 5
gene_time = 6
meta_data = 7
req_id_list = 8
GMDistributionMsgLocation 类
从聚合器到代理的全局模型分布消息的索引指示器如下:
class GMDistributionMsgLocation(IntEnum):
msg_type = 0
aggregator_id = 1
model_id = 2
round = 3
global_models = 4
ModelUpMSGLocation 类
从代理到聚合器上传本地机器学习模型的索引指示器如下:
class ModelUpMSGLocation(IntEnum):
msg_type = 0
agent_id = 1
model_id = 2
lmodels = 3
gene_time = 4
meta_data = 5
PollingMSGLocation 类
从代理到聚合器的polling消息的索引指示器如下:
class PollingMSGLocation(IntEnum):
msg_type = 0
round = 1
agent_id = 2
我们已定义了在整个 FL 系统代码中使用的枚举类。在下一节中,我们将讨论通信处理器的功能。
理解通信处理器功能
通信处理器的功能实现在communication_handler.py文件中,该文件位于fl_main目录下的lib/util文件夹中。
为通信处理器导入库
在此communication_handler.py代码示例中,处理器导入了一般库,如websockets、asyncio、pickle和logging:
import websockets, asyncio, pickle, logging
接下来,我们将提供通信处理器功能的列表。
通信处理器的功能
以下是与通信处理器相关的函数列表。尽管为了简化,此处未在通信处理器代码中实现安全套接字层(SSL)或传输层安全性(TLS)框架,但建议始终支持它们以保护 FL 组件之间的通信安全。
init_db_server 函数
init_db_server函数用于在 FL 服务器端启动数据库服务器。它接受一个函数、数据库 IP 地址和套接字信息作为输入,并根据 WebSocket 框架启动服务器功能。您也可以使用其他通信协议,如 HTTP。以下是启动数据库服务器的示例代码:
def init_db_server(func, ip, socket):
start_server = websockets.serve( \
func, ip, socket, max_size=None, max_queue=None)
loop = asyncio.get_event_loop()
loop.run_until_complete(start_server)
loop.run_forever()
init_fl_server 函数
init_fl_server 函数用于在聚合器端启动 FL 服务器。它接受三个函数作为参数,用于代理注册、从代理接收消息和模型合成例程,以及聚合器的 IP 地址和注册接收套接字信息(用于接收来自代理的消息),以基于 WebSocket 框架启动服务器功能。以下是启动 FL 服务器的示例代码:
def init_fl_server(register, receive_msg_from_agent, \
model_synthesis_routine, aggr_ip, \
reg_socket, recv_socket):
loop = asyncio.get_event_loop()
start_server = websockets.serve(register, aggr_ip, \
reg_socket, max_size=None, max_queue=None)
start_receiver = websockets.serve( \
receive_msg_from_agent, aggr_ip, recv_socket, \
max_size=None, max_queue=None)
loop.run_until_complete(asyncio.gather( \
start_server, start_receiver, \
model_synthesis_routine))
loop.run_forever()
init_client_server 函数
init_client_server 函数用于启动 FL 客户端服务器功能。它接受一个函数、代理的 IP 地址以及用于接收来自聚合器的消息的套接字信息作为输入,并根据 WebSocket 框架启动功能。以下是启动 FL 客户端服务器功能的示例代码:
def init_client_server(func, ip, socket):
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
client_server = websockets.serve(func, ip, socket, \
max_size=None, max_queue=None)
loop.run_until_complete(asyncio.gather(client_server))
loop.run_forever()
发送函数
send 函数用于将消息发送到由 IP 地址和套接字信息指定的目的地,这些信息作为参数一起传递,同时传递要发送的消息。如果目的地节点有响应,则返回从目的地节点发送回源节点的响应消息:
async def send(msg, ip, socket):
resp = None
try:
wsaddr = f'ws://{ip}:{socket}'
async with websockets.connect( \
wsaddr, max_size=None, max_queue=None, \
ping_interval=None) as websocket:
await websocket.send(pickle.dumps(msg))
try:
rmsg = await websocket.recv()
resp = pickle.loads(rmsg)
except:
pass
return resp
except:
return resp
send_websocket 函数
send_websocket 函数用于将消息返回给由 WebSocket 信息指定的消息源,该信息作为参数一起传递,同时传递要发送的消息:
async def send_websocket(msg, websocket):
while not websocket:
await asyncio.sleep(0.001)
await websocket.send(pickle.dumps(msg))
接收函数
receive 函数用于接收一个作为参数的 WebSocket 消息,并返回一个序列化的消息:
async def receive(websocket):
return pickle.loads(await websocket.recv())
接下来,我们将讨论处理 ML 模型的数据结构类。
理解数据结构处理程序类
数据结构处理程序在 data_struc.py 文件中实现,该文件位于 fl_main 目录的 lib/util 文件夹中。数据结构类具有 LimitedDict 类,用于以一致的方式处理 ML 模型的聚合。
导入数据结构处理程序的库
在这个 data_struc.py 代码示例中,处理程序导入了通用库,如 numpy 和 Dict:
from typing import Dict
import numpy as np
接下来,让我们继续了解 LimitedDict 类及其与数据结构处理程序相关的函数。
LimitedDict 类
以下是对 LimitedDict 类及其与数据结构处理程序相关的函数的定义。
LimitedDict 类及其函数
LimitedDict 类的函数用于将字典格式转换为具有键和值的类。LimitedDict 与 ML 模型中的缓冲区一起使用,以存储聚合器状态管理器的内存空间中的本地和集群模型:
class LimitedDict(dict):
def __init__(self, keys):
self._keys = keys
self.clear()
def __setitem__(self, key, value):
if key not in self._keys:
raise KeyError
dict.__setitem__(self, key, value)
def clear(self):
for key in self._keys:
self[key] = list()
convert_LDict_to_Dict 函数
convert_LDict_to_Dict 函数用于将之前定义的 LimitedDict 实例转换为正常字典格式:
def convert_LDict_to_Dict(ld: LimitedDict)
-> Dict[str,np.array]:
d = dict()
for key, val in ld.items():
d[key] = val[0]
return d
在下一节中,我们将讨论辅助和支持库。
理解辅助和支持库
辅助和支持函数在 helpers.py 文件中实现,该文件位于 fl_main 目录的 lib/util 文件夹中。
导入辅助库的库
在这个 helpers.py 代码示例中,文件导入了通用库,如 json 和 time:
import json, time, pickle, pathlib, socket, asyncio
from getmac import get_mac_address as gma
from typing import Dict, List, Any
from hashlib import sha256
from fl_main.lib.util.states import IDPrefix, ClientState
接下来,让我们继续到辅助库的函数列表。
辅助库的函数
以下是与辅助库相关的函数列表。
set_config_file 函数
set_config_file 函数接受配置文件的类型作为参数,例如 db、aggregator 或 agent,并返回配置文件的路径字符串:
def set_config_file(config_type: str) -> str:
# set the config file name
module_path = pathlib.Path.cwd()
config_file = \
f'{module_path}/setups/config_{config_type}.json'
return config_file
read_config 函数
read_config 函数读取 JSON 配置文件以设置数据库、聚合器或代理。它接受配置路径作为参数,并以字典格式返回配置信息:
def read_config(config_path: str) -> Dict[str, Any]:
with open(config_path) as jf:
config = json.load(jf)
return config
generate_id 函数
generate_id 函数基于 MAC 地址和实例化时间,使用哈希函数 (sha256) 生成一个系统范围内的唯一 ID,并将哈希值作为 ID:
def generate_id() -> str:
macaddr = gma()
in_time = time.time()
raw = f'{macaddr}{in_time}'
hash_id = sha256(raw.encode('utf-8'))
return hash_id.hexdigest()
generate_model_id 函数
generate_model_id 函数基于以下内容为一系列模型生成系统范围内的唯一 ID:
-
组件 ID:创建模型的 FL 系统实体的 ID
-
生成时间:模型的创建时间
ID 是通过哈希函数(sha256)生成的。它接受以下参数:
-
component_type:带有前缀的字符串值,指示IDPrefix的组件类型 -
component_id:创建模型的实体的 ID 字符串值 -
gene_time:模型创建时间的浮点值
此函数将哈希值作为模型 ID 返回:
def generate_model_id(component_type: str, \
component_id: str, gene_time: float) -> str:
raw = f'{component_type}{component_id}{gene_time}'
hash_id = sha256(raw.encode('utf-8'))
return hash_id.hexdigest()
create_data_dict_from_models 函数
create_data_dict_from_models 函数通过以下参数创建 ML 模型的数据字典:
-
model_id:模型 ID 的字符串值 -
models:关于 ML 模型的np.array -
component_id:FL 系统的 ID,例如聚合器 ID 和代理 ID
它返回包含 ML 模型的数据字典:
def create_data_dict_from_models( \
model_id, models, component_id):
data_dict = dict()
data_dict['models'] = models
data_dict['model_id'] = model_id
data_dict['my_id'] = component_id
data_dict['gene_time'] = time.time()
return data_dict
create_meta_data_dict 函数
create_meta_data_dict 函数通过将性能指标 (perf_val) 和样本数量 (num_samples) 作为参数,创建包含 ML 模型元数据的元数据字典,并返回 meta_data_dict,其中包含性能值和样本数量:
def create_meta_data_dict(perf_val, num_samples):
meta_data_dict = dict()
meta_data_dict["accuracy"] = perf_val
meta_data_dict["num_samples"] = num_samples
return meta_data_dict
compatible_data_dict_read 函数
compatible_data_dict_read 函数接受 data_dict,其中包含与 ML 模型相关的信息,如果字典中存在相应的键,则提取值,并返回组件 ID、ML 模型的生成时间、ML 模型本身和模型 ID:
def compatible_data_dict_read(data_dict: Dict[str, Any])
-> List[Any]:
if 'my_id' in data_dict.keys():
id = data_dict['my_id']
else:
id = generate_id()
if 'gene_time' in data_dict.keys():
gene_time = data_dict['gene_time']
else:
gene_time = time.time()
if 'models' in data_dict.keys():
models = data_dict['models']
else:
models = data_dict
if 'model_id' in data_dict.keys():
model_id = data_dict['model_id']
else:
model_id = generate_model_id( \
IDPrefix.agent, id, gene_time)
return id, gene_time, models, model_id
save_model_file 函数
save_model_file 函数用于将一组模型保存到本地文件。它接受以下参数:
-
data_dict:包含模型 ID 和 ML 模型的字典,格式为Dict[str,np.array]。 -
path:ML 模型存储目录的路径字符串值 -
name:模型文件名的字符串值。 -
performance_dict:一个包含性能数据的字典,格式为Dict[str,float]。每个条目都包含模型 ID 和其性能信息:
def save_model_file(
data_dict: Dict[str, Any], path: str, name: str,
performance_dict: Dict[str, float] = dict()):
data_dict['performance'] = performance_dict
fname = f'{path}/{name}'
with open(fname, 'wb') as f:
pickle.dump(data_dict, f)
The load_model_file 函数
load_model_file 函数读取一个本地模型文件,需要以下参数:
-
path:存储机器学习模型的目录的字符串值 -
name:模型文件名的字符串值
它以 Dict 格式返回未反序列化的机器学习模型和性能数据:
def load_model_file(path: str, name: str) \
-> (Dict[str, Any], Dict[str, float]):
fname = f'{path}/{name}'
with open(fname, 'rb') as f:
data_dict = pickle.load(f)
performance_dict = data_dict.pop('performance')
# data_dict only includes models
return data_dict, performance_dict
The read_state 函数
read_state 函数读取一个本地状态文件,需要以下参数:
-
path:客户端状态文件目录的字符串值 -
name:模型文件名的字符串值
此函数返回一个客户端状态,ClientState(例如,training 或 sending),文件中指示的状态,以整数格式。如果客户端状态文件在访问时正在写入,它将在 0.01 秒后再次尝试读取文件:
def read_state(path: str, name: str) -> ClientState:
fname = f'{path}/{name}'
with open(fname, 'r') as f:
st = f.read()
if st == '':
time.sleep(0.01)
return read_state(path, name)
return int(st)
The write_state 函数
write_state 函数用于在代理的状态文件上更改客户端状态。它需要以下参数:
-
path:客户端状态文件目录的字符串值 -
name:模型文件名的字符串值 -
state:ClientState的值(例如,training 或 sending),用于设置新的客户端状态:
def write_state(path: str, name: str, state: ClientState):
fname = f'{path}/{name}'
with open(fname, 'w') as f:
f.write(str(int(state)))
The get_ip 函数
The get_ip 函数获取机器的 IP 地址并返回 IP 地址的值:
def get_ip() -> str:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
# doesn't even have to be reachable
s.connect(('1.1.1.1', 1))
ip = s.getsockname()[0]
except:
ip = '127.0.0.1'
finally:
s.close()
return ip
The init_loop 函数
The init_loop 函数用于启动一个连续循环函数。它需要一个用于运行循环函数的函数:
def init_loop(func):
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(asyncio.gather(func))
loop.run_forever()
在下一节中,让我们看看创建通信有效载荷的消息传递函数。
用于生成通信有效载荷的消息传递器
消息传递函数定义在 messengers.py 文件中,该文件位于 fl_main 目录的 lib/util 文件夹中。
为消息传递导入库
在这个 messengers.py 代码示例中,文件导入了通用库,如 time 和 numpy。它还导入了 ModelType、DBMsgType、AgentMsgType 和 AggMsgType,这些在本书的 实现联邦学习系统的枚举类 部分中定义:
import time
import numpy as np
from typing import Dict, List, Any
from fl_main.lib.util.states import \
ModelType, DBMsgType, AgentMsgType, AggMsgType
接下来,让我们继续查看 messengers 库的函数列表。
消息传递函数的功能
以下是与 messengers 库相关的函数列表。
The generate_db_push_message 函数
generate_db_push_message 函数生成并返回一个消息,用于将包含机器学习模型的推送消息推送到数据库。它通过以下参数将它们打包为有效载荷消息(以 List 格式,消息类型定义为 push),在聚合器和数据库之间:
-
component_id:组件 ID 的字符串值,例如聚合器 ID -
round:FL 轮次信息,以整数格式 -
model_type:机器学习模型类型,例如cluster或local模型 -
models:格式为Dict[str, np.array]的机器学习模型 -
model_id: 机器学习模型唯一 ID 的字符串值 -
gene_time: 机器学习模型生成时间的浮点值 -
performance_dict: 以Dict[str, float]格式的性能数据
以下代码提供了生成前面数据库推送消息的功能:
def generate_db_push_message(
component_id: str, round: int, model_type: ModelType,
models: Dict[str,np.array], model_id: str,
gene_time: float, performance_dict: Dict[str,float])
-> List[Any]:
msg = list()
msg.append(DBMsgType.push) # 0
msg.append(component_id) # 1
msg.append(round) # 2
msg.append(model_type) # 3
msg.append(models) # 4
msg.append(model_id) # 5
msg.append(gene_time) # 6
msg.append(performance_dict) # 7
return msg
The generate_lmodel_update_message function
generate_lmodel_update_message 函数生成并返回一个消息,用于向聚合器发送包含在代理中创建的本地模型的消息。它通过以下参数将它们打包为有效载荷消息(以 List 格式,消息类型定义为 update),在代理和聚合器之间传递:
-
agent_id: 代理 ID 的字符串值 -
model_id: 机器学习模型唯一 ID 的字符串值 -
local_models: 以Dict[str, np.array]格式的本地机器学习模型 -
performance_dict: 以Dict[str, float]格式的性能数据
以下代码展示了生成前面本地模型更新消息的功能:
def generate_lmodel_update_message(
agent_id: str, model_id: str,
local_models: Dict[str,np.array],
performance_dict: Dict[str,float]) -> List[Any]:
msg = list()
msg.append(AgentMsgType.update) # 0
msg.append(agent_id) # 1
msg.append(model_id) # 2
msg.append(local_models) # 3
msg.append(time.time()) # 4
msg.append(performance_dict) # 5
return msg
generate_cluster_model_dist_message 函数
generate_cluster_model_dist_message 函数生成并返回一个 List 格式的消息,用于发送包含由聚合器创建的全局模型的消息到连接的代理。它通过以下参数将它们打包为有效载荷消息(以 List 格式,消息类型定义为 update),在聚合器和代理之间传递:
-
aggregator_id: 聚合器 ID 的字符串值 -
model_id: 机器学习模型唯一 ID 的字符串值 -
round: 以整数格式表示的联邦学习轮次信息 -
models: 以Dict[str, np.array]格式的机器学习模型
以下代码展示了生成前面聚类模型分布消息的功能:
def generate_cluster_model_dist_message(
aggregator_id: str, model_id: str, round: int,
models: Dict[str,np.array]) -> List[Any]:
msg = list()
msg.append(AggMsgType.update) # 0
msg.append(aggregator_id) # 1
msg.append(model_id) # 2
msg.append(round) # 3
msg.append(models) # 4
return msg
generate_agent_participation_message 函数
generate_agent_participation_message 函数生成并返回一个消息,用于发送包含由代理创建的初始模型参与请求消息到连接的聚合器。它通过以下参数将它们打包为有效载荷消息(以 List 格式,消息类型定义为 participate),在代理和聚合器之间传递:
-
agent_name: 代理名称的字符串值 -
agent_id: 代理 ID 的字符串值 -
model_id: 机器学习模型唯一 ID 的字符串值 -
models: 以Dict[str, np.array]格式的机器学习模型 -
init_weights_flag: 一个布尔值,用于指示权重是否已初始化 -
simulation_flag: 一个布尔值,用于指示运行是否为模拟 -
exch_socket: 用于从聚合器向该代理发送消息的字符串值套接字信息 -
gene_time: 机器学习模型生成时间的浮点值 -
meta_dict: 以Dict[str, float]格式的性能数据 -
agent_ip: 代理自身的 IP 地址
以下代码展示了生成前面代理参与消息的功能:
def generate_agent_participation_message(
agent_name: str, agent_id: str, model_id: str,
models: Dict[str,np.array], init_weights_flag: bool,
simulation_flag: bool, exch_socket: str,
gene_time: float, meta_dict: Dict[str,float],
agent_ip: str) -> List[Any]:
msg = list()
msg.append(AgentMsgType.participate) # 0
msg.append(agent_id) # 1
msg.append(model_id) # 2
msg.append(models) # 3
msg.append(init_weights_flag) # 4
msg.append(simulation_flag) # 5
msg.append(exch_socket) # 6
msg.append(gene_time) # 7
msg.append(meta_dict) # 8
msg.append(agent_ip) # 9
msg.append(agent_name) # 9
return msg
generate_agent_participation_confirm_message 函数
generate_agent_participation_confirm_message 函数生成并返回一个消息,用于发送包含全局模型的参与确认消息回代理。它接受以下参数,将它们打包成一个有效载荷消息(以List格式,消息类型定义为welcome),在聚合器和代理之间:
-
aggregator_id: 聚合器 ID 的字符串值 -
model_id: 机器学习模型唯一 ID 的字符串值 -
models: 以Dict[str, np.array]格式的机器学习模型 -
round: 以整数格式表示的联邦学习轮次信息 -
agent_id: 代理 ID 的字符串值 -
exch_socket: 从聚合器到达代理的端口号 -
recv_socket: 接收来自代理的消息的端口号
以下代码展示了生成前面代理参与确认消息的功能:
def generate_agent_participation_confirm_message(
aggregator_id: str, model_id: str,
models: Dict[str,np.array], round: int,
agent_id: str, exch_socket: str, recv_socket: str)
-> List[Any]:
msg = list()
msg.append(AggMsgType.welcome) # 0
msg.append(aggregator_id) # 1
msg.append(model_id) # 2
msg.append(models) # 3
msg.append(round) # 4
msg.append(agent_id) # 5
msg.append(exch_socket) # 6
msg.append(recv_socket) # 7
return msg
generate_polling_message 函数
generate_polling_message 函数生成并返回一个消息,用于发送包含轮询信号的polling消息到聚合器。它接受以下参数,将它们打包成一个有效载荷消息(以List格式,消息类型定义为polling),在代理和聚合器之间:
-
round: 以整数格式表示的联邦学习轮次信息 -
agent_id: 代理 ID 的字符串值
以下代码展示了生成前面轮询消息的功能:
def generate_polling_message(round: int, agent_id: str):
msg = list()
msg.append(AgentMsgType.polling) # 0
msg.append(round) # 1
msg.append(agent_id) # 2
return msg
generate_ack_message 函数
generate_ack_message 函数生成并返回一个消息,用于发送包含确认信号的ack消息回代理。创建有效载荷消息(以List格式,消息类型定义为ack)不需要参数,在聚合器和代理之间:
def generate_ack_message():
msg = list()
msg.append(AggMsgType.ack) # 0
return msg
摘要
在本章中,我们详细解释了内部库,以便您可以在不进一步调查基本功能(如通信和数据结构转换框架)的情况下实现整个联邦学习系统。
内部库主要涵盖以下五个方面:枚举类,定义系统状态,例如联邦学习客户端状态;通信处理器,支持发送和接收功能;数据结构,在聚合时处理机器学习模型;辅助和支持函数,处理基本操作,如保存数据和生成随机 ID;以及messenger 函数,用于生成在数据库、聚合器和代理之间发送的各种有效载荷。
使用这些函数,您会发现联邦学习系统的实现既简单又顺畅,但这些库仅支持实现联邦学习系统的一些基本功能;因此,您需要进一步扩展联邦学习系统,以创建一个更真实的平台,可以用于现实生活中的用例和技术。