这是我的学习笔记,若有不足和错误之处,欢迎交流和指正,谢谢!
联系方式:lrcgnn@163.com
文章目录
推荐阅读:
[1] Label Inference Attacks Against Vertical Federated Learning
[2] Privacy Leakage of Real-World Vertical Federated Learning
[3] Vertical Federated Learning: Challenges, Methodologies and Experiments
[4] SecureBoost: A Lossless Federated Learning Framework
[5] SplitNN-driven Vertical Partitioning
[6] Xgboost完全详细解读(原理+代码)
如果对VFL想要有更多的了解,可以看一下我在GitHub整理的VFL研究,欢迎star:https://github.com/avdvg/VFL-Survey
关于同态加密在联邦学习中的应用可以阅读前期博客:
【联邦学习邂逅密码学系列】基于同态加密算法python代码实现
1. Introduction
作为一种保护隐私的分布式训练技术,联邦学习近几年成为学术界研究的热点话题,很多研究关于联邦学习的效率、安全性、隐私性展开讨论。最近在企业中联邦学习的应用也逐渐开展,常见的技术是基于FATE的联邦学习。
按照参与方数据分布的差异,联邦学习通常可以分为横向联邦学习(HFL)、纵向联邦学习(VFL)以及联邦迁移学习。关于联邦学习概念的例子可以在很多博客都可以看到,这里不细说。相较于横向联邦学习,纵向联邦学习在实际企业中应用更加广泛,它通常适用于不用部门之间数据垂直分布的场景。然而,对于纵向联邦学习的研究和整理较少。这篇博客学习交流纵向联邦学习。
基于模型来分,纵向联邦学习通常有逻辑回归VFL,XGBoost VFL,SplitNN。下面分别进行介绍。
2. Preliminaries
2.1 VFL加密方法
VFL中通常应用加法同态加密(additively homomorphic encryption),例如Paillier技术加密模型的中间输出结果。加法同态加密技术属于部分加密技术,即只支持一种运算函数:加法。在加法同态加密中,参与方使用相同的公钥(public key)加密需要传输的数据,为了获取明文内容,使用者需要利用私钥(secret key)对密文进行解密。
通常使用
[
[
u
]
]
\left[\left[u\right]\right]
[[u]]表示对数字
u
u
u加密后的结果,加法同态加密支持密文下的加法运算。
[
[
u
+
v
]
]
=
[
[
u
]
]
+
[
[
v
]
]
\left[\left[u + v\right]\right] = \left[\left[u\right]\right] + \left[\left[v\right]\right]
[[u+v]]=[[u]]+[[v]]
同时,加法同态加密还有下列性质:
[
[
u
⋅
v
]
]
=
u
⋅
[
[
v
]
]
\left[\left[u \cdot v\right]\right] = u \cdot \left[\left[v\right]\right]
[[u⋅v]]=u⋅[[v]]
其中
u
u
u未被加密。
上述性质可以被扩展到向量和矩阵的乘法:
V
T
⋅
[
[
U
]
]
=
[
[
V
T
⋅
U
]
]
V^T \cdot \left[\left[U\right]\right] = \left[\left[V^T \cdot U\right]\right]
VT⋅[[U]]=[[VT⋅U]]
2.2 VFL平台
3. VFL逻辑回归
给定
n
n
n个训练样本
x
i
x_i
xi,每个样本具有
d
d
d个特征,每个样本的标签为
y
i
y_i
yi,线性回归的过程就是学习一个函数的过程:
f
(
x
i
)
=
y
i
f(x_i) = y_i
f(xi)=yi。由于
f
f
f是线性的,因此学习的过程可以表示为系数矩阵
θ
\theta
θ和
x
x
x之间的内积,可以表达为:
f
(
x
i
)
=
∑
j
=
0
d
θ
j
x
i
j
=
θ
x
i
f(x_i) = \sum_{j=0}^d \theta^j x_i^j = \theta x_i
f(xi)=j=0∑dθjxij=θxi
为了学习系数矩阵,需要最小化下列的损失函数:
L
(
θ
)
=
1
n
∑
i
=
1
n
1
2
(
θ
x
i
−
y
i
)
2
L(\theta)= \frac{1}{n} \sum_{i=1} ^n \frac{1}{2} (\theta x_i -y_i)^2
L(θ)=n1i=1∑n21(θxi−yi)2
在VFL场景中(2方),每个参与方具有部分的特征
[
x
i
A
∣
x
i
B
]
[x_i^A|x_i^B]
[xiA∣xiB],同时系数
θ
\theta
θ被拆分成
[
θ
A
∣
θ
B
]
[\theta^A|\theta^B]
[θA∣θB],上述损失函数可以近似转化为:
L
(
θ
)
=
1
n
(
1
4
θ
A
X
A
+
1
4
θ
B
X
B
−
1
2
Y
)
⋅
[
X
A
∣
X
B
]
L(\theta) = \frac{1}{n}(\frac{1}{4}\theta^A X^A + \frac{1}{4}\theta^BX^B-\frac{1}{2}Y) \cdot[X^A|X^B]
L(θ)=n1(41θAXA+41θBXB−21Y)⋅[XA∣XB]
上述推导过程:
待补充。
上面的式子表示是在未加密中的损失函数计算方式,在VFL中通常采用同态加密对中间表示进行加密,加密后的损失函数可以表示为:
[
[
L
(
θ
)
]
]
=
1
n
(
1
4
[
[
θ
A
X
A
]
]
+
[
[
1
4
θ
B
X
B
]
]
−
[
[
1
2
Y
]
]
)
⋅
[
X
A
∣
X
B
]
[[L(\theta)]] = \frac{1}{n}(\frac{1}{4}[[\theta^A X^A]] + [[\frac{1}{4}\theta^BX^B]]-[[\frac{1}{2}Y]]) \cdot[X^A|X^B]
[[L(θ)]]=n1(41[[θAXA]]+[[41θBXB]]−[[21Y]])⋅[XA∣XB]
LRVFL的流程可以表示为:
步骤一:参与方A和参与方B初始化系数矩阵,协作方发布公钥。
步骤二:参与方A计算
[
[
u
]
]
[[u]]
[[u]]并发送给参与方B,参与方B计算
[
[
v
]
]
[[v]]
[[v]]并发送给参与方A,同时计算
[
[
v
]
]
X
B
[[v]]X^B
[[v]]XB发送给协作方C。
步骤三:参与方A计算
[
[
v
]
]
X
A
[[v]]X^A
[[v]]XA发送给协作方C。
步骤四:协作方使用私钥解密参与方A、B上传的数据,计算梯度信息
g
A
g^A
gA以及
g
B
g^B
gB并发送给参与方。
4. VFL XGBoost
4.1 XGBoost
4.1.1 概念
XGBoost是基于提升树的。
对
f
(
x
+
Δ
)
f(x+\Delta)
f(x+Δ)在点
x
x
x的泰勒二阶展开式:
f
(
x
+
Δ
x
)
≃
f
(
x
)
+
f
′
(
x
)
Δ
x
+
1
2
f
′
′
Δ
x
2
f(x+ \Delta x)\simeq f(x) +f^{'}(x)\Delta x + \frac{1}{2} f^{''}\Delta x^2
f(x+Δx)≃f(x)+f′(x)Δx+21f′′Δx2
4.1.2 目标函数
给定
n
n
n个训练样本
x
i
x_i
xi,每个样本具有
d
d
d个特征,XGBoost学习一个包含
k
k
k个回归树的函数:
f
(
x
i
)
=
∑
t
=
1
k
f
t
(
x
i
)
f(x_i) = \sum_{t=1} ^kf_t(x_i)
f(xi)=∑t=1kft(xi)。为了学习
k
k
k个回归树,XGBoost添加树
f
t
f_t
ft在第t次迭代的损失函数为:
L
(
t
)
=
∑
i
=
1
n
[
l
(
y
i
,
y
(
t
−
1
)
)
+
g
i
f
t
(
x
i
)
+
1
2
h
i
f
t
2
(
x
i
)
]
+
Ω
(
f
t
)
L^{(t)} = \sum_{i=1}^n[l(y_i, y^{(t-1)}) + g_if_t(x_i) +\frac{1}{2}h_if_t^2(x_i)]+\Omega(f_t)
L(t)=i=1∑n[l(yi,y(t−1))+gift(xi)+21hift2(xi)]+Ω(ft)
其中
f
i
f_i
fi和
h
i
h_i
hi分别对一个损失函数的一阶和二阶项,
Ω
\Omega
Ω表示树的复杂度正则项,
l
(
y
i
,
y
(
t
−
1
)
l(y_i, y^{(t-1)}
l(yi,y(t−1)为常数项。
Ω
(
f
)
=
γ
T
+
1
2
λ
∑
j
=
1
T
w
j
2
\Omega (f) = \gamma T+\frac{1}{2}\lambda \sum_{j=1}^T w_j^2
Ω(f)=γT+21λj=1∑Twj2
其中
T
T
T表示叶子节点的数量,
w
j
w_j
wj表示每个叶子节点
j
j
j权重组成的向量。
注:损失函数推导过程就是将泰勒二阶展开式中的 x x x替换为 y ( t − 1 ) y^{(t-1)} y(t−1),将 Δ x \Delta x Δx替换为第 t t t棵树的模型 f t ( x i ) f_t(x_i) ft(xi)。
将正则化代入公式中,可以获得损失函数:
L
(
t
)
=
∑
i
=
1
n
[
g
i
f
t
(
x
i
)
+
1
2
h
i
f
t
2
(
x
i
)
]
+
γ
T
+
1
2
λ
∑
j
=
1
T
w
j
2
L^{(t)} = \sum_{i=1}^n [ g_if_t(x_i) +\frac{1}{2}h_if_t^2(x_i)] + \gamma T+\frac{1}{2}\lambda \sum_{j=1}^T w_j^2
L(t)=i=1∑n[gift(xi)+21hift2(xi)]+γT+21λj=1∑Twj2
上述损失函数可以进一步表示为:
L
(
t
)
=
∑
j
=
1
T
[
(
∑
i
∈
I
j
g
i
)
w
j
+
1
2
(
∑
i
∈
I
j
h
i
+
λ
)
w
j
2
+
γ
T
]
L^{(t)} = \sum_{j=1}^T [ (\sum_{i\in I_j}g_i) w_j +\frac{1}{2}(\sum_{i\in I_j}h_i + \lambda)w_j^2 +\gamma T]
L(t)=j=1∑T[(i∈Ij∑gi)wj+21(i∈Ij∑hi+λ)wj2+γT]
其中,
I
j
=
{
i
∣
q
(
x
i
)
=
j
}
I_j=\{ i|q(x_i)=j\}
Ij={i∣q(xi)=j}为叶子节点
j
j
j的样本集。
对上式求导,导数为0,叶子节点
j
j
j的权重可以表示为:
w
j
=
−
G
i
H
i
+
λ
w_j = -\frac{G_i}{H_i+\lambda}
wj=−Hi+λGi
将叶子节点的权重代入损失函数,可以得到最终近似的损失函数:
L
t
(
q
)
=
−
1
2
∑
j
=
1
T
(
∑
i
∈
I
j
g
i
)
2
∑
i
∈
I
j
h
i
+
λ
+
γ
T
L^{t}(q) = -\frac{1}{2}\sum_{j=1}^T\frac{(\sum_{i\in I_j} g_i)^2}{\sum_{i\in I_j} h_i +\lambda} + \gamma T
Lt(q)=−21j=1∑T∑i∈Ijhi+λ(∑i∈Ijgi)2+γT
其中
q
q
q为树结构,上面的式子可以评估树结构的质量。
4.1.3 贪心法推树结构
在实践中,通常使用贪婪的方法推测树的结构
q
q
q,即从单一的叶子开始,迭代的向树上添加分支。假设
I
L
I_L
IL和
I
R
I_R
IR为分裂后的左右子树节点集合。
L
s
p
l
i
t
=
1
2
[
(
∑
i
∈
I
L
g
i
)
2
∑
i
∈
I
L
h
i
+
λ
+
(
∑
i
∈
I
R
g
i
)
2
∑
i
∈
I
R
h
i
+
λ
+
(
∑
i
∈
I
g
i
)
2
∑
i
∈
I
h
i
+
λ
]
−
γ
L_{split} = \frac{1}{2}[\frac{(\sum_{i\in I_L} g_i)^2}{\sum_{i\in I_L} h_i +\lambda} + \frac{(\sum_{i\in I_R} g_i)^2}{\sum_{i\in I_R} h_i +\lambda} + \frac{(\sum_{i\in I} g_i)^2}{\sum_{i\in I} h_i +\lambda} ]-\gamma
Lsplit=21[∑i∈ILhi+λ(∑i∈ILgi)2+∑i∈IRhi+λ(∑i∈IRgi)2+∑i∈Ihi+λ(∑i∈Igi)2]−γ
4.2 SecureBoost
不依赖协作方,具有标签信息的参与方被称为主动方(activate participant),没有标签信息的参与方称为被动方(passive participant)。VFL中参与方计算 L s p l i t L_{split} Lsplit来寻找最佳的分裂点。
步骤一:主动方根据所有的训练样本计算一阶导数 g i g_i gi和二阶导数 h i h_i hi,加密导数并发送密文 [ [ g i ] ] [[g_i]] [[gi]]以及 [ [ h i ] ] [[h_i]] [[hi]]到被动方。
步骤二:被动方接收到加密的梯度信息减少损失,首先将特征映射为数据仓,然而基于bins聚合加密的梯度。
步骤三:主动方收到损失之后进行解密,然后找到优化的分裂点。
5. SplitNN
基于拆分学习的VFL比较好理解,每个参与方都具有部分神经网络,通常称为本地模型(bottom model);服务器方具有部分神经网络,通常称为顶部模型(top model)。参与方通过本地模型提取嵌入(embedding)上传给服务器,服务器聚合这些嵌入获得新的矩阵,将该矩阵在顶部模型执行前向传播并计算损失函数。最后利用反向传播计算模型的梯度并更新模型参数。
注:本地模型作为特征提取器,可以根据不同的数据进行调整,例如针对图像数据通常选用卷积神经网络(CNN)作为本地模型,针对网络数据通常选用图卷积神经网络(GCN)作为本地模型。
5.1 Pipeline

5.2 Aggregation
Embedding直接求和:

Embedding concat拼接方式:
