## 简介
联邦学习`Federated Learnin`是是一种在大数据服务中保护隐私的分布式机器学习技术，一种新兴的人工智能基础技术。主要解决数据孤岛和数据隐私保护的问题，通过建立一个数据“联邦”，让参与各方都获益，推动技术整体持续进步。

2016年由谷歌最先提出，2020年4月，微众银行、中国银联、腾讯研究院等多家机构联合发布了《[联邦学习白皮书V2.0](https://aisp-1251170195.cos.ap-hongkong.myqcloud.com/wp-content/uploads/pdf/%E8%81%94%E9%82%A6%E5%AD%A6%E4%B9%A0%E7%99%BD%E7%9A%AE%E4%B9%A6_v2.0.pdf)》，对联邦学习的最新定义是：在进行机器学习的过程中，各参与方可借助其他方数据进行联合建模。各方无需共享数据资源，即数据不出本地的情况下，进行数据联合训练，建立共享的机器学习模型。

![](resource/FL1.png)

## 联邦学习过程
联邦学习中包含两种角色，服务器与客户端，服务器端负责保存、更新全局的机器学习模型，协调、配置各个客户端对模型进行训练，而客户端就是一家家独立的企业，保存自己产生的隐私数据，使用自己的数据对服务器提供的模型进行训练。

假设企业`A`和`B`想联合训练一个机器学习模型，它们的业务系统分别拥有各自用户的相关数据。出于数据隐私保护和安全考虑，`A`和`B`无法直接进行数据交换，可使用联邦学习系统建立模型。

![](resource/FL3.png)

* Part 1：加密样本对齐。由于两家企业的用户群体并非完全重合，系统利用基于加密的用户样本对齐技术，在`A`和`B`不公开各自数据的前提下确认双方的共有用户，并且不暴露不互相重叠的用户，以便联合这些用户的特征进行建模。
  
* Part2：加密模型训练。在确定共有用户群体后，就可以利用这些数据训练机器学习模型。为了保证训练过程中数据的保密性，需要借助第三方协作者`C`进行加密训练。以线性回归模型为例，训练过程可分为以下4步（如图b所示）： 
     - Step1：协作者`C`把公钥分发给`A`和`B`(`A`和`B`交换公钥)，用以对训练过程中需要交换的数据进行加密。
     - Step2：`A`和`B`之间以加密形式交互用于计算梯度的中间结果。
     - Step3：`A`和`B`分别基于加密的梯度值进行计算，并把结果汇总给`C`。`C`通过汇总结果计算总梯度值并将其解密。
     - Step4：`C`将解密后的梯度分别回传给`A`和`B`，`A`和`B`根据梯度更新各自模型的参数。
  
      迭代上述步骤直至损失函数收敛，这样就完成了整个训练过程。在样本对齐及模型训练过程中，`A`和`B`各自的数据均保留在本地，且训练中的数据交互也不会导致数据隐私泄露。

* Part3: 效果激励。联邦学习的一大特点就是它解决了为什么不同机构要加入联邦共同建模的问题，即建立模型以后模型的效果会在实际应用中表现出来，并记录在永久数据记录机制（如区块链）上。提供数据多的机构所获得的模型效果会更好，模型效果取决于数据提供方对自己和他人的贡献。这些模型的效果在联邦机制上会分发给各个机构反馈，并继续激励更多机构加入这一数据联邦。
 
## 安全聚合
从企业模型训练之后返回的梯度可以推断出原始的训练数据，包括图像和文本数据，从而泄露用户的个人信息。因此梯度上报给服务端使用了安全聚合SMPC加密方案，服务器只能看到聚合完成之后的梯度，无法获取每个企业私有的真实梯度值。

### 秘钥交换
![](resource/FL4.png)

### 秘密分享
`Shamir′s Secret Sharing with 2−out−of−3 (t = 2, n = 3)`
假设秘密`s = f(0)`，s被分享给n=3个用户，阈值t=2。

在这种情况下，一个用户想要知道秘密s，必须至少有另一个用户的合作，达到阈值t，才能获取秘密。只有一个用户，是获取不到秘密的。

与代理重加密的秘钥分片原理一样。

### FedAVG 梯度平均
用户u发送更新值y{u}给服务器，y{u}是其真实的模型更新值，服务器进行聚合，再按照聚合规则取平均
![](resource/FL5.png)

### Masking with One-Time Pads 差分加密
用户u和v之间通过DH建立秘密通信通道，他们之间知道一个秘密随机数s{uv}。用户1发送给服务器的更新值y1是真实值x1+0−(s{12}+s{13})
这样服务器收到y1时，并不知道x1是多少。服务器对收到的所有值进行聚合以后，它们正负才会抵消，相当于真实值的聚合。

![](resource/FL6.png)

但是这个方案存在一个问题，如果有一个用户上传的时候掉线，则聚合值没有办法抵消随机数

### SMPC: One-Time Pads with Recovery
当用户2掉线时，在恢复阶段，它的值s12和s23用户1和用户3是知道的，服务器询问用户1和用户3，用户1和用户3进行报告。在恢复阶段结束后，服务器完成聚合。
![](resource/FL8.png)

这个方案同样存在问题，服务器拿到掉线用户2的随机掩码之后可以解密用户2的梯度真实值。

### SMPC: Double-Masking
针对上面存在的问题，采用双掩码的策略，即使用两个随机数，为用户u引入另一个秘密随机数bu

![](resource/FL9.png)

对于用户u，服务器只能选择询问其随机掩码s**，或者第二掩码bu，且诚实的用户v，对于掉线用户u，他会分享s{uv}, 对于在线用户u,他会分享bu

## 可信服务端 vs 区块链
联邦学习技术中，需要一个可信第三方来进行多方计算过程的协调，假如这个可信第三方作弊，或者不配合，都会导致整个系统无法正常运作。因此区块链可以替代掉了联邦学习中的可信第三方，使得整个系统可以在多个企业组成的P2P对等网络中运行，不受任何单一企业状态的影响。

联邦学习中，服务器主要有以下三个功能点：
1. 储存：储存执行计划、模型的参数、配置等数据
2. 计算：对客户端上传的结果进行聚合
3. 通信：与客户端进行通信，将数据分发给客户端，并从客户端接受数据

对于存储，对于配置这种小数据量，可以使用链上存储，对于执行计划和模型参数这类大数据量，可以使用链外存储加链上校验。

对于计算，梯度计算设计阶数较高的矩阵运算，在智能合约中实现可能效率较低，也可采用链下计算，链上校验。

对于和客户端的数据交互，可通过智能合约实现

## 联邦学习智能合约

#### 任务发起方
* 发布任务，等待参与方加入
* 参与方人数达标后，下发配置，启动训练
* 等待一定区块后，结束当前轮次的训练
* 查询训练聚合结果
* 更新参数
* 启动新一轮训练
* ...

#### 任务参与方
* 加入任务
* 监听智能合约事件
  
  - 轮次开始事件：调用智能合约的参与轮次方法，参与这轮训练。
  
  - 配置下发事件：调用智能合约的获取配置方法，获取配
  置、执行计划、模型参数等，调用运行时，运行执行计划。执行计划运行完毕后，根据聚合算法，对运行结果进行处理，之后调用智能的上传结果方法，上传结果。
  
  - 轮次结束：无论是否上传了结果，直接结束当前轮次的执行

## More
联邦学习和区块链、智能合约结合的场景有一定的通用性，即在不可信的环境中，存在可信第三方服务端的场景下，区块链和智能合约都能提供相对优秀的解决方案。而本篇只是这种场景在人工智能领域的一种体现，后续也可能会有更多的领域会有类似的诉求。


## 参考
1. [用区块链和隐私计算实现个性化内容推荐](https://mp.weixin.qq.com/s/z0QkuNtHfn-ZBmY1yyiKoA)
2. [联邦学习之安全聚合SMPC](https://blog.csdn.net/qq_37734256/article/details/104223580)
3. [联邦学习（Federated Learning）](https://blog.csdn.net/cao812755156/article/details/89598410)