最新论文笔记(+21):Privacy-Preserving Byzantine-Robust Federated Learning via Blockchain Systems/ TIFS2022
Privacy-Preserving Byzantine-Robust Federated Learning via Blockchain Systems
可译为“利用区块链实现隐私保护的拜占庭鲁棒性联邦学习”
版本控制
这篇是今年八月份被TIFS2022(CCF A)收录的文章,写的利用全同态加密和区块链技术解决联邦学习中隐私问题和可信问题(虽然区块链仅仅只是存储的作用,也稍微提了一下)。精读完这篇文章,整体感觉还不错,毕竟是CCF A类期刊。下面是自己读后感,根据自己的语言来做了一些笔记,也相当于回顾。其中,有理解不到位的地方望指正,建议读者还是看原文。
DC/EP
WiFi
文章目录预览
算法
一、文章背景
1.1 摘要和简要内容
摘要:由于中心化的联邦学习(Federated Learning,FL)框架和不可靠的用户,传统FL容易遭受恶意客户端和服务器的投毒攻击。本文设计了一个通过区块链系统实现隐私保护拜占庭鲁棒性联邦学习(PBFL)方案,来减轻中央服务器和恶意客户端的影响。利用余弦相似度来判断恶意客户端上传的恶意梯度。然后,采用全同态加密来提供安全的聚合。最后,使用区块链系统来促进透明的流程和法规的实施。形式化分析证明了本方案能达到收敛和提供隐私保护。
tumblr
主要内容:
自动回复信息
- 利用全同态加密(CKKS17)提供了一种隐私保护训练机制,减少了计算和通信开销,防止了攻击者窥探客户端的本地数据。
- 通过余弦相似度去除恶意梯度(感觉并没有去除,而是降低了“恶意梯度”的权重),提供了一个可信的全局模型,抵御了投毒攻击。
- 使用区块链来促进透明的流程,服务器链下计算(区块链实现去中心化的存储,不是去中心化训练,故还有服务器),将结果上传到区块链,实现了高效和可靠性。
1.2 联邦学习现存问题
(1)最常用的隐私保护联邦学习使用paillier同态加密算法来加密本地梯度,然而作者通过做实验比较了CKKS和paillier加密和解密向量所花的时间(CKKS: Homomorphic Encryption for Arithmetic of Approximate Numbers)。结果表明,CKKS算法效率更高,更适合处理大尺度向量和多参数网络模型。因此,本文使用CKKS加密局部梯度,以提高计算效率。
Menu 1
(2)隐私保护联邦学习(PPFL)仍受到投毒攻击。如经过训练的模型会对一个特定的类做出错误的预测,或全局模型对大量类做出错误预测。
Python笔记
(3)PPFL容易受到服务器恶意聚合和单点故障威胁。现有的FL方案在提高安全性和高效率的适合,无法抵抗客户端毒化攻击和避免服务器恶意行为,且在实践中扩展性不强。
瘦身
1.3 CKKS全同态加密
本文主要用到的是全同态加密(CKKS)技术,自己也在看这篇文章前,花了三四天读CKKS论文,结合他人对CKKS的介绍才懂了这个全同态加密方法。可以参考全同态CKKS方案解析.
UGUI
注意以下几个点:
MVVM
- 全同态加密满足加同态性质,即两个明文分别加密后相加等于明文先相加再加密的结果(
E
(
m
1
)
+
E
(
m
2
)
=
E
(
m
1
+
m
2
)
E(m_1)+E(m_2)=E(m_1+m_2)
- 全同态加密满足乘同态性质,即两个明文分别加密后相乘等于明文先相乘再加密的结果(
E
(
m
1
)
⋅
E
(
m
2
)
=
E
(
m
1
⋅
m
2
)
E(m_1)·E(m_2)=E(m_1·m_2)
具体流程如下:
音乐网系统
二、主要内容
将原联邦学习中的服务器扩展为两个“诚实且好奇”的服务器,分别为Verifier和Solver,它们不共谋。
抽象方法
由Solver服务器设置一个小而干净的根数据集
D
0
D_0
D0,并基于它维护一个模型
w
0
w_0
w0,根据算出来的梯度
g
i
0
g^0_i
gi0和Clients上传的梯度
g
i
j
g^j_i
gij的余弦相似度,以此来去除恶意的梯度。
visual studio
本篇文章只有一个框架图,具体发送什么并不是很清晰,为了便于自身理解,画了一个流程图如下:
最短路径算法
首先初始化,密钥生成中心为Verifier和Client生成公私钥对,分别为
(
p
k
v
,
s
k
v
)
(pk_v,sk_v)
(pkv,skv),
(
p
k
x
,
s
k
x
)
(pk_x,sk_x)
(pkx,skx)。
gitlab服务器搭建
(1)本地计算
- 1)局部训练:
g
i
j
=
∇
L
(
w
i
j
,
D
j
)
g^j_i=\nabla L(w^j_i,D_j)
i
i
C
j
C_j
D
j
D_j
w
i
j
w^j_i
g
i
j
g^j_i
- 2)归一化:
g
~
i
j
=
g
i
j
∣
∣
g
i
j
∣
∣
\widetilde{g}^j_i =\frac {g^j_i}{\vert \vert g^j_i \vert\vert}
源码
- 3)全同态加密:
[
[
g
~
i
j
]
]
p
k
v
[[\widetilde{g}^j_i ]]_{pk_v}
p
k
v
pk_v
g
~
i
j
\widetilde{g}^j_i
- 4)模型更新:
w
i
←
w
i
−
1
−
α
g
i
j
w_i\leftarrow w_{i-1}-\alpha g^j_i
C
j
C_j
s
k
x
sk_x
(2)归一化判断
很自然,当客户端上传归一化的梯度后,需要Solver判断收到的梯度是否真的进行了归一化处理,防止恶意客户端行为。所以,当Solver收到
[
[
g
~
i
j
]
]
p
k
v
[[\widetilde{g}^j_i ]]_{pk_v}
[[g
ij]]pkv后,计算其内积,再发送给Verifier,即
[
[
r
1
]
]
p
k
v
=
[
[
g
~
i
j
]
]
p
k
v
⊙
[
[
g
~
i
j
]
]
p
k
v
[[r_1]]_{pk_v}=[[\widetilde{g}^j_i ]]_{pk_v}⊙[[\widetilde{g}^j_i ]]_{pk_v}
[[r1]]pkv=[[g
ij]]pkv⊙[[g
ij]]pkv。这里就要用到乘同态性质,两个向量分别加密后相乘等于两个向量先相乘再加密的结果。具体步骤如下:
安全架构
- 假设
[
[
g
~
i
j
]
]
p
k
v
=
[
[
(
p
1
,
p
2
,
⋯
,
p
n
∗
)
]
]
p
k
v
[[\widetilde{g}^j_i ]]_{pk_v}=[[(p_1,p_2,\cdots,p_{n^*})]]_{pk_v}
- 这两个向量相乘为
[
[
g
~
i
j
⋅
g
~
i
j
]
]
p
k
v
=
[
[
(
p
1
2
,
p
2
2
,
⋯
,
p
n
∗
2
)
]
]
p
k
v
[[\widetilde{g}^j_i \cdot \widetilde{g}^j_i]]_{pk_v}=[[(p^2_1,p^2_2,\cdots,p^2_{n^*})]]_{pk_v}
- 利用CKKS旋转操作,旋转一次为
[
[
(
p
2
2
,
p
3
2
,
⋯
,
p
n
∗
2
,
p
1
2
)
]
]
p
k
v
[[(p^2_2,p^2_3,\cdots,p^2_{n^*},p^2_1)]]_{pk_v}
(
n
∗
−
1
)
(n^*-1)
[
[
(
r
1
,
r
2
,
⋯
,
r
n
∗
)
]
]
p
k
v
[[(r_1,r_2,\cdots,r_{n^*})]]_{pk_v}
- 计算
[
[
(
r
1
,
r
2
,
⋯
,
r
n
∗
)
]
]
p
k
v
[[(r_1,r_2,\cdots,r_{n^*})]]_{pk_v}
[
1
,
0
,
⋯
,
0
,
0
]
[1,0,\cdots,0,0]
[
[
r
1
]
]
p
k
v
[[r_1]]_{pk_v}
然后将所有的
[
[
r
1
]
]
p
k
v
[[r_1]]_{pk_v}
[[r1]]pkv发送给Verifier进行验证,Verifier将得到诚实客户端的列表
C
C
C存储到区块链上,并发给Solver。不难看出,如果梯度真实地归一化处理后,两个向量的内积和应该为1,即
r
1
=
1
r_1=1
r1=1,只需判断
[
[
r
1
]
]
p
k
v
=
[
[
1
]
]
p
k
v
?
[[r_1]]_{pk_v}=[[1]]_{pk_v}?
[[r1]]pkv=[[1]]pkv?即可。
智能车大赛
这里仅仅是判断梯度是否归一化处理,恶意客户端也可以诚实的归一化处理吧,只是他的梯度方向偏离较大。
ios拍照旋转
(3)模型聚合
- 1)训练可信数据集
D
0
D_0
[
[
g
~
i
0
]
]
p
k
v
[[\widetilde{g}^0_i]]_{pk_v}
C
C
g
i
0
g^0_i
g
i
0
g^0_i
[
[
c
s
i
j
]
]
p
k
v
=
[
[
g
~
i
0
]
]
p
k
v
⊙
[
[
g
~
i
j
]
]
p
k
v
s
.
t
.
∣
∣
g
~
i
0
∣
∣
=
∣
∣
g
~
i
j
∣
∣
=
1
[[cs_i^j]]_{pk_v} = [[\widetilde{g}^0_i]]_{pk_v}⊙ [[\widetilde{g}^j_i]]_{pk_v}\\ s.t. \quad ||\widetilde{g}^0_i||=||\widetilde{g}^j_i||=1
其中c
s
i
j
cs^j_i
g
i
0
g^0_i
S
i
j
=
R
e
L
U
(
c
s
i
j
)
=
{
c
s
i
j
,
if
c
s
i
j
>
0
0
,
if
c
s
i
j
≤
0
S^j_i=ReLU(cs^j_i)=\begin{cases} cs^j_i, & \text{if $cs^j_i>0$} \\ 0, & \text{if $cs^j_i\leq0$} \end{cases}
其中,S
i
j
S^j_i
[
[
c
s
i
j
]
]
p
k
v
[[cs_i^j]]_{pk_v}
[
[
c
s
i
j
]
]
p
k
v
[[cs_i^j]]_{pk_v}
[
[
0
]
]
p
k
v
[[0]]_{pk_v}
本文采用了亚密上CKKL19全同态加密中密文比较方法。但是这篇文章只给出了在[0,1]范围内同态密码比较的一种数值方法。但是余弦相似度落在[-1,1]范围内,因此无法直接拿来用,需要做一个转换使其满足要求:
二极管
- 先给
[
[
c
s
i
j
]
]
p
k
v
[[cs_i^j]]_{pk_v}
[
[
1
]
]
[[1]]
- 再将结果乘以1/2,使得范围满足要求。(注意0对应于1/2)
因此,转换ReLU函数变成了ReLU’函数:
[
[
S
i
j
]
]
=
R
e
L
U
(
[
[
c
s
i
j
]
]
)
=
{
1
2
(
[
[
c
s
i
j
]
]
+
[
[
1
]
]
)
,
if
1
2
(
[
[
c
s
i
j
]
]
+
[
[
1
]
]
)
>
[
[
1
/
2
]
]
[
[
1
/
2
]
]
,
if
1
2
(
[
[
c
s
i
j
]
]
+
[
[
1
]
]
)
≤
[
[
1
/
2
]
]
[[S^j_i]]=ReLU([[cs^j_i]])=\begin{cases} \frac 12([[cs^j_i]]+[[1]]), & \text{if $\frac12([[cs^j_i]]+[[1]])>[[1/2]]$} \\ [[1/2]], & \text{if $\frac12([[cs^j_i]]+[[1]])\leq[[1/2]]$} \end{cases}
[[Sij]]=ReLU([[csij]])={21([[csij]]+[[1]]),[[1/2]],if 21([[csij]]+[[1]])>[[1/2]]if 21([[csij]]+[[1]])≤[[1/2]]
然后再利用Algorithm 4同态比较方法,得到权重的密文
[
[
S
i
j
]
]
[[S^j_i]]
[[Sij]]。
中断
-
2)Solver获得所有Client的分数
[
[
S
i
j
]
]
[[S^j_i]]
[[Sij]]。但这个分数的密文还只是变换后的分数,则原始分数应该为
[
[
S
i
j
]
]
p
k
v
′
=
2
⋅
[
[
S
i
j
]
]
p
k
v
−
[
[
1
]
]
p
k
v
[[S^j_i]]'_{pk_v}=2·[[S^j_i]]_{pk_v}-[[1]]_{pk_v}
[[Sij]]pkv′=2⋅[[Sij]]pkv−[[1]]pkv
IDE安装
- 计算
[
[
s
u
m
]
]
p
k
v
=
∑
f
=
1
∣
C
∣
[
[
S
i
f
]
]
p
k
v
′
[[sum]]_{pk_v}=\sum^{|C|}_{f=1}[[S^f_i]]'_{pk_v}
- 随机选取
n
∗
n^*
V
~
\widetilde{V}
V
n
∗
V^{n^*}
V
~
⋅
[
[
S
i
f
]
]
p
k
v
′
\widetilde{V}·[[S^f_i]]'_{pk_v}
V
n
∗
⋅
[
[
g
~
i
j
]
]
p
k
v
V^{n^*}·[[\widetilde{g}^j_i]]_{pk_v}
- 计算
-
3)Verifier执行以下加解密操作。
servlet
- 利用
s
k
v
sk_v
s
u
m
sum
V
~
⋅
S
i
j
′
\widetilde{V}·S^{j'}_i
V
n
∗
⋅
g
~
i
j
V^{n^*}·\widetilde{g}^j_i
- 再利用
p
k
x
pk_x
[
[
V
~
⋅
S
i
j
′
]
]
p
k
x
[[\widetilde{V}·S^{j'}_i]]_{pk_x}
[
[
V
n
∗
⋅
g
~
i
j
]
]
p
k
x
[[V^{n^*}·\widetilde{g}^j_i]]_{pk_x}
s
u
m
sum
- 利用
-
4)Solver执行以下聚合操作。
自动化测试框架
- 利用
1
/
V
~
1/\widetilde{V}
[
[
V
~
⋅
S
i
j
′
]
]
p
k
x
[[\widetilde{V}·S^{j'}_i]]_{pk_x}
[
[
S
i
j
′
]
]
p
k
x
[[S^{j'}_i]]_{pk_x}
- 利用
1
/
V
n
∗
1/V^{n^*}
[
[
V
n
∗
⋅
g
~
i
j
]
]
p
k
x
[[V^{n^*}·\widetilde{g}^j_i]]_{pk_x}
[
[
g
~
i
j
]
]
p
k
x
[[\widetilde{g}^j_i]]_{pk_x}
- 根据它们的分数来聚合梯度:
[
[
g
~
i
j
]
]
p
k
x
=
1
s
u
m
∑
j
=
1
∣
C
∣
[
[
S
i
j
′
]
]
p
k
x
⋅
[
[
g
~
i
j
]
]
p
k
x
=
1
s
u
m
∑
j
=
1
∣
C
∣
R
e
L
U
(
[
[
g
~
i
0
]
]
p
k
x
⊙
[
[
g
~
i
j
]
]
p
k
x
)
⋅
[
[
g
~
i
j
]
]
p
k
x
[[\widetilde{g}^j_i]]_{pk_x}=\frac {1}{sum}\sum^{|C|}_{j=1}[[S^{j'}_i]]_{pk_x}·[[\widetilde{g}^j_i]]_{pk_x}\\ =\frac {1}{sum}\sum^{|C|}_{j=1}ReLU([[\widetilde{g}^0_i]]_{pk_x}⊙[[\widetilde{g}^j_i]]_{pk_x})·[[\widetilde{g}^j_i]]_{pk_x}
- 利用
由此看出,在本方案中Verifier和Solver不能得到除求和以外的任何信息,即使获得了求和结果也无法从中得到有价值的信息。除非两个合谋,但前提已经假设不能合谋。此外,Solver和Verifier都需要向智能合约缴纳保证金,并将在任务结束时以客户端的保证金作为奖励。
解压缩
区块链的作用:存储中间参数信息,保证这些信息是可信,无法篡改的。
无线投屏
三、性能评估
数据集:采用MNIST和FashionMNIST,分别选取200个数据作为数据集
D
0
D_0
D0。
实验平台:Ethereum区块链设置,使用Truffle部署在私有区块链上,Tenseal库实现CKKS算法。
低功耗蓝牙连接
- 1)鲁棒性评估
结论:在目标攻击和非目标攻击和不同比例恶意客户端的情况下,对不同类型的投毒攻击仍能达到鲁棒性和准确性的目标。
AndroidStudio打包
- 2)准确性评估
结论:在目标攻击和非目标攻击和不同比例恶意客户端的情况下,几乎能够达到与Baseline一样的准确性,比Krum算法好很多。
js
-
3)区块链上的开销
结论:本方案实现了较低的gas消耗,因为把计算负担留给了线下服务器,只把结果上传到区块链,这大大降低了gas的消耗。 -
4)非平衡数据下的性能
-
考虑现实原因,根数据集可能是不均匀分布的。假设根数据集共有10个类的标签,且下一个类总比前一类多
n
′
n'
n′个,则数据非平衡程度为
u
=
(
a
+
9
∗
n
′
)
/
a
u=(a+9*n')/a
u=(a+9∗n′)/a。
结论:数据集
D
0
D_0
D0中的分布差异不会对结果产生太大影响,结果显示可以忽略数据分布差异对结果的影响。
四、总结与思考
个人觉得这篇文章比较新颖的点有三处:
- 1)要求服务器收集一个小而干净的根数据集,来抵御投毒攻击,以维护模型。
- 2)将传统单服务器分为了两个不共谋的诚实且好奇的服务器,避免了服务器端恶意行为。
- 3)提出了一种全同态加密(CKKS)的隐私保护机制,以减少了计算和通信开销。
疑问:
- 1)在Algorithm1的本地计算中,每个客户端从区块链中下载
[
[
w
i
−
1
]
]
p
k
x
[[w_{i-1}]]_{pk_x}
s
k
x
sk_x
w
i
−
1
w_{i-1}
- 2)最后虽然作者模拟了根数据集的非平衡分布,但是客户端的训练数据集还是均匀分布的,而联邦学习中的数据应该是非独立同分布,要是再增加这个实验就好啦。
- 3)这个小而干净的根数据集是如何选取?这在FL中本身就是一个难题。