<!--
* @Descripttion:
* @Version: 1.0
* @Author: ZhangHongYu
* @Date: 2021-12-23 18:53:12
* @LastEditors: ZhangHongYu
* @LastEditTime: 2022-04-01 20:27:20
-->
<p align="center">
<img src="paper_pic/logo.png" width="600" height="200">
</p>
<div align="center">
# FedCom: 基于社区检测的多任务聚类联邦学习
[![Open Source Love](https://badges.frapsoft.com/os/v2/open-source.svg?v=103)](https://github.com/orion-orion/FedCom) [![License](https://img.shields.io/github/license/orion-orion/FedCom)](https://github.com/orion-orion/FedCom/blob/master/LICENSE) [![](https://img.shields.io/github/stars/orion-orion/FedCom?style=social)](https://github.com/orion-orion/FedCom)
<br/>
[![](https://img.shields.io/github/directory-file-count/orion-orion/FedCom)](https://github.com/orion-orion/FedCom) [![](https://img.shields.io/github/languages/code-size/orion-orion/FedCom)](https://github.com/orion-orion/FedCom)
</div>
## 1 简介
[FedCom](https://github.com/orion-orion/FedCom)为SWPU2022届本科毕业设计《基于社区检测的多任务聚类联邦学习》。本研究提出了一种多任务聚类联邦学习(clustered federated learning, CFL)的新方法,该方法的特点是**基于社区检测(community detection)来进行聚类簇的动态划分**。本研究的方法规避了聚类簇由人工指定的弊端,从而在算法后期对前期错误划分进行动态修正,缓解了因前期划分失误带来的负面影响。
在三个不同数据集上进行的实验表明,相比本文对比的其它几个联邦学习方法,本文提出的基于动态划分的多任务聚类联邦学习方法在大多数情况下表现更好。在大多数情况下,本文所提出的算法划分更加准确,达到的准确率更高,收敛速度更快。其中于本文的算法具有动态调整聚簇的特性,所以即使在最初的几轮迭代中划分错误,也能在后面的迭代中对错误的聚簇划分进行调整,从而取得更佳的精度表现。
## 2 算法流程描述
### 2.1 算法整体流程
整体算法流程分为构建带权无向图、任务簇动态划分、任务簇参数更新三个部分,如下图所示:
<img src="paper_pic/算法流程图.png" width="800" height="350">
### 2.2 算法分步描述
#### 2.2.1 构建带权无向图
本研究将 $n$ 个客户端节点视为带权无图 $\mathcal{G}=(\mathcal{V},\mathcal{E})$ , 这里 $\mathcal{V}$ 代表各客户端节点, $\mathcal{E}$ 代表各客户端节点之间的交互。定义节点 $k$ 的邻居为满足 $(k, l)\in\mathcal{E}$ 的节点 $l$ 的集合。我们设 $a_{kl}$ 为节点 $l$ 和节点 $k$ 之间的边权。下图展示了 $6$ 节点的所有邻居:
<img src="paper_pic/6节点的所有邻居.png" width="250" height="200">
在实际运行环境下,预先并不知道任务之间的关系,便无法预先为边赋权。本研究认为节点数据分布相似性(边权)可以由模型学习到。可以证明分布相似性和参数间的余弦距离相关<sup>[1]</sup>:
$$
a_{k l}=\frac{\left\langle\Delta \theta_{k}, \Delta \theta_{l}\right\rangle}{\lVert \Delta \theta_{k}\rVert \lVert\Delta \theta_{l} \rVert}
$$
边权的动态调整如下图所示:
<img src="paper_pic/边权的动态调整示意图.png" width="270" height="200">
#### 2.2.2 聚类簇动态划分算法
首先,将图的一个社团划分和一个聚类簇相对应。然后,采用依据边的权重划分社团的社团划分算法<sup>[2]</sup>。该算法在每一轮迭代更新参数后先进行试探性的社团检测。此外,本研究采用模块度$M$对划分质量进行评估,如果划分后的模块度 $M_t$ 相对于上一轮的模块性 $M_{t-1}$ 取得了 $\varepsilon$ 的增幅,即: $M_{t}-M_{t-1}>\varepsilon$ ,则采用当前划分。
<img src="paper_pic/聚类簇动态划分示意图.png" width="600" height="190">
本研究采用的Louvain社区检测算法<sup>[2]</sup>是一个采用贪心策略的多次迭代算法,每一次迭代都由划分和重构两部分组成。其中划分步骤只使用局部调整优化模块性,做为初步的簇划分;重构步骤则会聚合当前划分出的聚簇,形成新图用于下一次迭代。
<img src="paper_pic/louvain算法示意图.png" width="600" height="430">
#### 2.2.3 聚类簇参数更新
以任务簇为单位进行参数更新的共享。也即相同任务簇内的节点对参数更新求加权平均,其权重根据各任务节点的样本数量来分配,如下式所示:
$$
\Delta \theta_{k}=\sum_{t \in C_{k}} \frac{n_{t}}{n_{C_{k}}} \Delta \theta_{t}
$$
如下图所示,簇 $C_1$ 中根据节点 $1、2、3$ 的参数更新进行加权平均,簇 $C_2$ 中根据节点 $4、5$ 的参数更新进行加权平均。
<img src="paper_pic/聚类簇参数平均示意图.png" width="350" height="260">
## 3 实验设计
### 3.1 数据集Non-IID划分
采用联邦学习的benckmark数据集:EMNIST、CIFAR10、FEMNIST等数据集<sup>[3]</sup>对模型进行评估,采用Dirichlet分布对数据集进行Non-IID划分。下图是对EMNIST数据集采用Dirichlet分布示意图:
<img src="paper_pic/数据集non-iid划分示意图.png" width="800" height="200">
### 3.2 采用图像翻转法初始化簇结构
假设有 $10$ 个client, $k$ 个初始化簇结构:
- $k=2$ ,则client $1-5$ 不变,client $6-10$ 的数据进行旋转 $180°$ 。
- $k=3$ ,则client $1-3$ 不变,client $4-6$ 中图片旋转 $120°$ ,client $7-10$ 图片旋转 $240°$ 。
- 其它 $k$ 值的情况以此类推。
下面是对CIFAR10数据集进行翻转示意图:
<img src="paper_pic/对cifar10数据集进行翻转示意图.png" width="800" height="200">
### 3.3 实验结果
#### 3.3.1 EMNIST数据集
在EMNIST数据集上, $10$ 个client, $300$ 轮迭代条件下的实验结果示意图:
| 表头 | 精度( $k=2$ ) | 精度( $k=3$ ) | 精度( $k=4$ ) |
| ---- | ---- |---- |---- |
| Local | $0.759$ | $0.759$ | $0.760$ |
| FedAvg | $0.773$ | $0.795$ | $0.776$ |
| Clustered | $0.803$ | $0.787$ | $0.783$ |
| Ditto | $0.790$ | $0.795$ | $0.776$ |
| Ours | $\pmb{0.806}$ | $\pmb{0.801}$ | $\pmb{0.787}$ |
可见模型评估精度在各个 $k$ 值均领先于对比论文TNNLS20的Clustered算法<sup>[4]</sup>和ICML21的Ditto算法<sup>[5]</sup>(此处Local算法即在所有节点不通信的情况下,用本地数据进行训练的方法)。
在 $k=2$ 的时候,本研究的算法和TNNLS20的算法都进行了正确的划分,本研究的算法首次进行划分更早,划分结果示意图如下:
<img src="paper_pic/emnist-k=2时和对比方法的比较.png" width="800" height="300">
在 $k=3$ 的时候,本研究的算法一次性就进行了正确的划分,TNNLS20的算法经过了多次划分而且划分错误,划分结果示意图如下:
<img src="paper_pic/emnist-k=3时和对比方法的比较.png" width="800" height="300">
#### 3.3.2 CIFAR10数据集
在CIFAR10数据集上, $10$ 个client, $300$ 轮迭代条件下的实验结果示意图:
| 算法 | 精度( $k=2$ ) | 精度( $k=3$ ) | 精度( $k=4$ ) |
| ---- | ---- |---- |---- |
| Local | $0.721$ | $0.787$ | $0.771$ |
| FedAvg | $0.788$ | $0.796$ | $0.792$ |
| Clustered | $0.800$ | $\pmb{0.800}$ | $0.786$ |
| Ditto | $0.796$ | $0.798$ | $0.793$ |
| Ours | $\pmb{0.805}$ | $0.799$ | $\pmb{0.796}$ |
可见模型评估精度在多数 $k$ 值情况均领先于对比论文TNNLS20的Clustered算法和ICML21的Ditto算法。
在 $k=2$ 的时候,本研究的算法那最开始也进行了错误的划分,但后期及时进行了动态的调整,而TNNLS20的算法不能进行动态调整,划分结果示意图如下:
<img src="paper_pic/cifar10-k=2时和对比方法的比较.png" width="800" height="270">
#### 3.3.3 FEMNIST数据集
在FEMNIST数据集上, $80$ 个client, $300$ 轮迭代条件下的实验结果示�
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
基于社区检测的多任务聚类联邦学习.zip (72个子文件)
基于社区检测的多任务聚类联邦学习
train_eval.py 2KB
result_pic
result.png 23KB
exp
cifar10分布.png 56KB
shakespeare_my.png 31KB
cifar10_1.png 65KB
cifar10彩色_1.png 77KB
cifar10彩色_2.png 83KB
cifar10-社区检测法.png 192KB
cifar10彩色-社区检测方法.png 67KB
eminst分布.png 67KB
cifar10-原始划分方法.png 165KB
cifar10_2.png 64KB
fashion分布.png 61KB
fashion2.png 54KB
cifar10彩色-原始划分方法.png 72KB
EMNIST-社区检测方法.png 62KB
fashion.png 61KB
EMNIST-原始划分方法.png 64KB
cluster_log.html 527B
specialized_acc.html 3KB
graph
.gitkeep 0B
main.py 5KB
data
.gitkeep 0B
models.py 3KB
utils
__init__.py 0B
download.py 3KB
split_text.py 9KB
plots.py 12KB
data_utils.py 9KB
custom_ds
__init__.py 141B
shakespeare.py 13KB
subsets.py 688B
femnist.py 19KB
fl_devices.py 4KB
requirements.txt 121B
paper_pic
对cifar10数据集进行翻转示意图.png 215KB
emnist-k=2时和对比方法的比较.png 113KB
cifar10-k=2时和对比方法的比较.png 124KB
logo.png 45KB
算法流程图.png 637KB
边权的动态调整示意图.png 404KB
emnist-k=3时和对比方法的比较.png 111KB
6节点的所有邻居.png 61KB
louvain算法示意图.png 134KB
聚类簇动态划分示意图.png 195KB
数据集non-iid划分示意图.png 77KB
聚类簇参数平均示意图.png 584KB
init_datasets.py 7KB
method
__init__.py 141B
overlap
__init__.py 141B
server.py 2KB
link_community.py 7KB
overlap.py 6KB
ditto
__init__.py 141B
ditto.py 2KB
client.py 1KB
train.py 1KB
clustered
__init__.py 141B
server.py 2KB
clustered.py 4KB
local
__init__.py 141B
local.py 1KB
my
__init__.py 141B
server.py 2KB
my.py 5KB
graph_cluster
__init__.py 141B
community_status.py 3KB
community_louvain.py 19KB
fedavg
__init__.py 141B
fedavg.py 2KB
init_devices.py 5KB
README.md 10KB
共 72 条
- 1
资源评论
小黑码蚁
- 粉丝: 2374
- 资源: 1760
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功