Skip to content

Commit

Permalink
Merge pull request #51 from liushiyao1/lsy2
Browse files Browse the repository at this point in the history
横向联邦建模计算流程补充及过程详解
  • Loading branch information
tanmc123 committed Nov 4, 2020
2 parents d2abf35 + 34e6a76 commit 42cd7fa
Showing 1 changed file with 74 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@


## 一、主要补充内容

之前小伙伴的pr中已经对横向联邦的计算过程有了详细解析,横向联邦的guest和host方在本地通过公式w_i=w_i-1 - delta_grad更新模型后,会将权重w一起发送给arbiter方进行聚合,聚合方式为根据样本数量大小进行加权平均,但是在实际操作中发现,本地更新后的权重与发送给arbiter方的权重有差异,以下面guest方第一个权重计算结果为例,本地更新模型后的权重为-0.08857158-0.01579847 = -0.10434004,与传递给arbiter方的权重before aggregate中第一个权重-0.1030457不一致:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201023145855628.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sYWppYW82NDE=,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201023145910421.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sYWppYW82NDE=,size_16,color_FFFFFF,t_70#pic_center)

host方也同理,说明guest方和host方在本地更新完权重发送给arbiter方之前还进行了其他的计算,通过查看源码发现,在federatedml\framework\homo\procedure\aggregator.py 中定义了安全聚合函数,让权重在发送前进行加密:

![在这里插入图片描述](https://img-blog.csdnimg.cn/20201023145958182.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sYWppYW82NDE=,size_16,color_FFFFFF,t_70#pic_center)
加密过程中federatedml\secureprotol\encrypt.py 中定义了加密函数,通过set_exchange_key函数,使得guest和host拥有相同的随机种子,双方在权重传递给arbiter前加入数值大小相同符号相反的噪声,保证双方在arbiter方聚合后噪声可以相互抵消,在不影响最终结果的情况下使得arbiter方和其他攻击者无法获取真实的权重,符合安全聚合的设定,具体过程如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201028141350200.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sYWppYW82NDE=,size_16,color_FFFFFF,t_70#pic_center)
1.guest方和host方先本地生成uuid,通过federatedml\framework\homo\block\diffie_hellman.py的key_exchange交换uuid和私钥,交换后双方分别获得对方的uuid和相同的mpz值。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201028141504641.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sYWppYW82NDE=,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201028141514447.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sYWppYW82NDE=,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201028141520968.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sYWppYW82NDE=,size_16,color_FFFFFF,t_70#pic_center)
2.双方通过federatedml\secureprotol\encrypt.py中的set_exchange_key函数得到相同的随机种子(因为双方keys中的uuid不一致,但mpz的值相同;随机种子保证后续生成的随机数是一致的)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201028141619346.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sYWppYW82NDE=,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201028141638213.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sYWppYW82NDE=,size_16,color_FFFFFF,t_70#pic_center)
3.双方利用encrypt函数进行加密,通过对方uuid与自己本地生成的uuid进行大小比对来决定加法或减法操作;对于guest方,uid赋值为获取到的host方uuid值,通过与自己本地生成的uuid赋值给self.uuid进行大小对比,决定权重的加减,若大于则进行加法操作(此时host方进行加密时会判别为小于而进行减法操作),具体公式为w = w+r * 1 * amplify_factor(r为与w相同shape的0-1随机数组成的列表,amplify_factor默认初始值为1)
对于多方参与者情况计算原理也相同,例如三方参与者A、B、C,三方均会生成uuid,不失一般性的假设A>B>C,那么对于参与者A,由于接收到的B、C的uuid均小于A,所以权重会进行两步减法,即w_a=w_a-r12-r13,对于B,与A的uuid对比时为加,与C为减,即w_b = w_b+r12-r23,对于C则都为加,w_c = w_c+r13+r23,最终聚合时都可刚好抵消。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201028141734739.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sYWppYW82NDE=,size_16,color_FFFFFF,t_70#pic_center)
4.实例验证:通过计算不加噪声情况下聚合后的权重与系统加了噪音运行的结果进行对比,以第一个权重为例,对于guest方,此为最后一次batch计算的delta_grad,因此不加噪音的权重为w_1 = -0.08857158 – 0.01579847=-0.10437005
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020102814181137.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sYWppYW82NDE=,size_16,color_FFFFFF,t_70#pic_center)
对于host方,初始权重为0,三次batch的delta_grad分别为0.05921983、0.0312532231、0.0281247,因此不加噪音的权重w_2 = 0-0.05921983-0.0312532231-0.0281247 =-0.1185977531
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201028141921382.png#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201028141929799.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sYWppYW82NDE=,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201028141937968.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sYWppYW82NDE=,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201028141945427.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sYWppYW82NDE=,size_16,color_FFFFFF,t_70#pic_center)
Arbiter方进行加权平均聚合后结果应为w = (w_1 * 227+w_2 * 228)/455 =(-0.10437005 * 227+-0.1185977531 * 228)/455 = -0.111499536388571 与加噪音后的结果一致(后几位差异为保留小数点的差异)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201028142006465.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sYWppYW82NDE=,size_16,color_FFFFFF,t_70#pic_center)

## 二、横向联邦计算过程详解

因此重新对横向联邦计算过程在进行详细的梳理和解析,由于guest方与host方计算过程一致,下面以guest方为例。
**1、初始化权重**
先初始化一个截距不为0,其余均为0的权重w`:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201023150046318.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sYWppYW82NDE=,size_16,color_FFFFFF,t_70#pic_center)

**2、本地进行权重和参数更新计算**
本次训练将样本分为3个batch,对于每一个batch,先根据迭代次数更新学习率learning_rate=n/sqrt(1+decay*iter),(decay为初始化参数,默认为1,iter为当前迭代次数,n为初始设置的学习率,默认为0.15),代码位于fedaratedml\optim\optimizer.py
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201023150057483.png#pic_center)

根据样本计算梯度new_grad=(grad+α * w_i),在计算delta_grad =learning_rate*new_grad (α为初始设置的参数,默认0.01,目的应该是做移动平均,防止梯度下降过快,截距项梯度不做此变换,直接乘学习率),
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201023150231661.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sYWppYW82NDE=,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020102315024264.png#pic_center)


以第一个权重为例,由于是第0次迭代,因此learning_rate = 0.15/sqrt(1)=0.15,delta_grad=(0.39357968+0.01 * 0)*0.15=0.05903695
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201023150252936.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sYWppYW82NDE=,size_16,color_FFFFFF,t_70#pic_center)

**3、更新权重w并在batch之间进行权重传递和更新**
根据公式w_i= w_i-1 -delta_grad更新本地参数并传递给下一个batch作为初始权重,以第一个权重为例,-0.05903695=0 - 0.05903695,重复2-3步骤直至最后一个batch计算出权重矩阵w(若只有一个batch则无需传递,更新本地权重后直接进入第4步),代码位于federatedml\linear_model\logistic_regression\homo_logsitic_regression\homo_lr_guest.py(本例以逻辑回归为例)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201023150316507.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sYWppYW82NDE=,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201023150322775.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sYWppYW82NDE=,size_16,color_FFFFFF,t_70#pic_center)


**4、最后一个batch进行本地计算加密传递给arbiter**
最后一个batch计算权重后会传递给arbiter方进行聚合计算,按照2-3步骤计算,以第一个权重为例-0.08857158-0.01579847 = -0.10434004,在传递给arbiter方之前会进行两步操作,第一步为w = w * degree(degree为样本数量),第二部为加密操作,通过set _exchange_keys,使得guest和host拥有相同的随机种子,双方在权重传递给arbiter前加入数值大小相同符号相反的噪声,保证双方在arbiter方聚合后噪声可以相互抵消,在不影响最终结果的情况下使得arbiter方和其他攻击者无法获取真实的权重,符合安全聚合的设定,具体公式为w = w+r * 1 * amplify_factor(r为与w相同shape的0-1随机数组成的列表,amplify_factor默认初始值为1)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020102315035269.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sYWppYW82NDE=,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201028142142885.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sYWppYW82NDE=,size_16,color_FFFFFF,t_70#pic_center)


**5、arbiter接收双方权重进行聚合并传回**
arbiter方接收到guest和host的w和degree后(w为权重,degree为样本数量),按照样本数量大小进行加权平均,计算公式为w=(n_1 * w_1+n_2 * w_2)/n,(n_1和n_2分别为双方的样本量,n_1+n_2=n),以第一个权重为例,-0.1114995339206302 = (-0.1030457 * 227+-0.119916286 * 228)/455,权重聚合完成后发回给guest和host方,重复上述迭代直至收敛或者达到最大迭代次数,代码位于federatedml\framework\homo\procedure\aggregator.py
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201023150424598.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sYWppYW82NDE=,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201023150431724.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9sYWppYW82NDE=,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020102315044099.png#pic_center)





0 comments on commit 42cd7fa

Please sign in to comment.