Clustered Federated Learning 论文源码阅读笔记

本文分析了《Clustered Federated Learning》论文源码。介绍EMNIST数据集处理与NoIID分布验证,通过旋转图像制造差异,实现客户端数据的有效分组,展示了模型初始化、权重更新及服务器端的计算过程。

本篇文章的阅读论文是《Clustered Federated Learning: Model-Agnostic Distributed Multitask Optimization Under Privacy Constraints》,主要是对论文的作者提供的源码简单的分析一下,留个记录方便之后查看,免得之后重新翻源码。源码地址如下:GitHub源码地址

(源码里是用jupyter,我直接转换成py然后在pycharm里看了,这样看函数方便一些)

1、首先是压缩包解压后的文件,其中包括五个模块,入口在最上面的模块,其中data是我自行修改的,源码中数据集下载的root是“.”,我修改成./data这样更美观一点。

工程结构图

2、 clustered_federated_learning.py

INPUT 1

示例中使用的是经典的EMNIST的byclass数据集,使用只用到了20000 idcs,前10000用作训练,后面用作测试,并且假设的client一共设计有10个,开始时用split_noiid函数打散数据集并且分成十份,所用的函数定义在data_utils中,其实简单来说就是用 np.random.dirichlet 函数使得数据集趋向于noiid分布在十份客户端中。

INPUT1 部分代码

INPUT 2 

第二部分利用绘图将之前打散的数据绘图出来,证明其中的数据分布满足NoIID,因为没有开jupyter就不截图了,大家懂这个意思就行。

INPUT 3 

接着作者做了一件事,将前五个client的数据全部旋转180度,经典的人为制造差异,使得后续的计算中将前五个client和后五个client成功分组,然后证明能够更好的效果。

INPUT 3 旋转一部分clinet的图像

 

 INPUT 4 

作者初始化client和server,这部分函数先不说,后续会根据函数代码给大家展示。

初始化时带上了model,这部分很简单,定义在model模块,大家自己看看就行。

 

INPUT 5

接下来是重点部分,首先作者定义运行80轮,接着定义了eps_1 和 eps_2两个值,至于两个值作用,论文里说的很清楚了,不多赘述,后面也会用到。

参数初始化 for开头循环80轮

 开始先做一个判断,第一轮时会初始化client,就是将server端的weight复制到client储存里,相当于初始化同步操作

 接着随机选择client进行计算,但是因为本来client就很少,不可能再减少了,所以ftac=1.0,这个就是比例,比例为100%,相当于全选

 接着需要每一个client计算weight更新,更新完之后要记得reset,也就是计算完后全部恢复上一次的server端给的weight,因为后续真正的更新需要由server去给。

 更新和reset的函数如下,subtract函数是将计算后的weight和weight-old相减计算差值

 全部算完就轮到server出场了,server计算会返回一个矩阵,矩阵里就是每个clinet两两之间的余弦值了

 矩阵计算,中间省略了一个函数的跳转,source里储存的是每一个client的dw值

 接着分割的步骤来了,这里就可以看出eps的作用了,对照论文一目了然,其中作者为了准确度,分割至少需要在20轮之后,较为稳定再去做分割

 其中cluster的算法作者直接使用的是AgglomerativeClustering函数,作者现在也在学习各种分类算法,k-means、层次之类的

 后面的部分就没什么好说的了,最后附一张图吧。

 

 

在数据库分区和大数据处理中,"clustered by" 是一个关键概念,通常用于描述数据如何在物理存储层面上进行组织。当一个表被 **clustered by** 某个列时,意味着数据将根据该列的值进行物理排序和分布[^1]。 ### 数据库中的聚类(Clustered) 在关系型数据库中,如 SQL Server 或 PostgreSQL,"clustered" 通常指 **聚簇索引(Clustered Index)**。聚簇索引决定了数据行在磁盘上的物理顺序。每个表只能有一个聚簇索引,因为数据行只能按照一种方式进行物理排序。例如: ```sql CREATE TABLE Employees ( EmployeeID INT PRIMARY KEY CLUSTERED, Name NVARCHAR(100), DepartmentID INT ); ``` 在这个例子中,`EmployeeID` 被定义为聚簇索引,这意味着数据将按照 `EmployeeID` 的顺序存储在磁盘上[^3]。 ### 大数据处理中的聚类(Clustered By) 在大数据处理框架中,如 Apache Hive 或 Spark SQL,"clustered by" 通常用于 **分桶(Bucketing)** 或 **哈希分区(Hash Partitioning)**。通过指定 `CLUSTERED BY` 子句,可以将数据按照某个列的哈希值分布在多个文件或节点中,从而提高查询性能和连接效率。例如,在 Hive 中: ```sql CREATE TABLE sales ( order_id INT, customer_id INT, amount DECIMAL(10,2) ) CLUSTERED BY (customer_id) INTO 4 BUCKETS; ``` 此语句表示数据将根据 `customer_id` 的哈希值分成 4 个桶,使得相同 `customer_id` 的数据会落在同一个桶中,便于后续的聚合或连接操作。 ### 总结 - 在数据库中,"clustered by" 通常与 **聚簇索引** 相关,决定数据的物理存储顺序。 - 在大数据处理中,"clustered by" 通常用于 **分桶或哈希分区**,以优化分布式查询性能。 这两种机制虽然应用场景不同,但核心目标一致:即通过合理的物理数据布局来提升查询效率和数据管理能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值