前沿科技探索家 · 2021年07月28日

AI数据获取难?飞桨PaddleFL开源纵向联邦学习方案,进一步降低企业AI应用门槛

从阿法狗不断击败人类棋手、无人驾驶技术逐步成熟,到人脸识别、商品推荐等应用不断深入人们的生活, 人工智能已经逐渐被当做推动人类社会快速发展的强大引擎。作为引擎的燃料,大量优质数据对人工智能的工业实践起到了至关重要的作用,然而在现实生活中,优质的数据是很难获得的。

如何在不侵犯隐私的前提下,实现数据的流动及共享成为了各大企业和科学家们关注的焦点,联邦学习应运而生。通过联邦学习,多个数据持有方可以在数据不出本地的情况下,完成模型联合训练。

飞桨PaddleFL意在帮助联邦学习的探索者更方便地实现不同的策略及算法,在较短的时间内完成框架搭建、算法实现和业务调研等工作。本次PaddleFL 1.0版本主要开源了MPC安全共享计算方案,支持横向、纵向、迁移等多个联邦学习场景,进一步降低企业联邦学习的门槛,使更多数据获取难的企业可以通过联邦学习受益。

这些新功能背后的逻辑是什么,如何在实践中应用?让我们走进PaddleFL一探究竟!

Paddle FL MPC (简称PFM)中的安全训练和推理任务是基于多方计算协议ABY3实现的。ABY3论文地址:

https://dl.acm.org/doi/10.114...

1.png

在ABY3协议中,参与方可分为:数据拥有方(以下简称:输入方)、计算方和结果方,三者关系如下图所示:

1.jpg

输入方:为训练数据及模型的持有方,负责加密数据和模型,并将其发送到计算方。根据ABY3要求,数据输入方数据量≥2个。
计算方:模型训练的执行方,基于ABY3协议完成训练任务,计算方只能得到加密后的数据及模型,以保证数据隐私,根据ABY3要求,计算方的数量为3个。
结果方:计算结束后,结果方获取到计算结果并恢复出明文数据。
值得注意的是,在这个过程中每个参与方都可以充当多个角色。只要参与方具有计算能力,即可作为计算方参与训练,在这个过程中,数据都以密文形式传输。

1.jpg

这类似狼人杀游戏,游戏中有三个角色,每个角色可以有多个充当(大于等于X)。在打牌过程中,我们会根据牌面信息给予其他参与方提示,保证牌局顺利进行,但是会尽力而为直接不暴露角色信息,直到游戏结束。下一轮游戏中,个人角色可能会变化,但是游戏规则不变。

那么在这个过程中PFM如何保障各角色之间的数据安全呢
PFM的整个训练及推理过程主要由如下三个部分组成:数据准备、训练/推理和结果解析,三者关系如下图所示:

1.jpg

数据对齐:PFM允许输入方在不泄露数据的情况下,基于同样的User ID,找出多个输入方的样本集合,在此过程中保证数据加密。这个功能在纵向联邦学习中非常必要。为啥这么说呢?因为在纵向联邦学习中,不同输入方拥有不同的Feature Space,所以需要找到多个数据集中相同的用户。
例如:三个做商品推荐的公司做联邦学习,一个公司持有歌曲相关的数据;一个持有电影相 关的数据;一个公司持有用户点击相关的数据。在进行联邦学习之前,三家公司需要找出相同 用户的集合,并且保证相同位置(第n条)对应相同的用户。数据对齐后,输入方将数据和模型用Secret Sharing方式加密,并传递给计算方。因为每个计算方只拿到数据的一部分,因此任意一方都无法还原真实数据。

训练/推理: PFM 拥有与飞桨相同的运行模式。在训练前,用户需要定义MPC协议、训练模型以及训练策略。PFM中提供了可以操作加密数据的算子,在运行时算子的实例会被创建并被执行器依次运行。
结果解析:安全训练和推理工作完成后,模型(或预测结果)将由计算方以加密形式输出。结果方收集到加密的结果后,使用PFM中的工具对其进行解密,并将明文结果传递给用户。

在CPU上动手实践联邦学习PFM策略

下面介绍PFM在纵向联邦学习场景中的训练过程。

  1. 安装PaddleFL

    # Pull and run the docker
    docker pull hub.baidubce.com/paddlefl/paddle_fl:latest
    docker run --name <docker_name> --net=host -it -v $PWD:/root <image id> /bin/bash
  2. 获取数据。本示例将UCI波士顿房价预测数据集被拆分成两份。用户一Bob持有前60%样本的所有特征数据(feature),用户二Alice持有后60%样本的标注数据(label)。

    wget --no-check-certificate https://paddlefl.bj.bcebos.com/alice.dat
    wget --no-check-certificate https://paddlefl.bj.bcebos.com/bob.dat
  3. 数据对齐。经过数据对齐后会得到中间20%的全量数据(feature +label)。
def align_and_filter(input_file, data_shape, party_id, endpoints, is_receiver):
    input_array = np.fromfile(input_file, sep=' ')
    input_array = input_array.reshape(input_array.shape[0]//(data_shape+1),
                                             data_shape+1)
    input_set = map(int, set(input_array[:, 0]))
    input_set = map(str, input_set)
    input_set = set(input_set)

    # 用alignment.align接口,在不泄露隐私的情况下,做数据对齐
    result = alignment.align(input_set=input_set,
                                  party_id=party_id,
                                  endpoints=endpoints,
                                  is_receiver=is_receiver)
       # 将筛选出的数据保存到 ‘filtered_data_{}.dat’ 文件中
    filtered_data = []
    for r in result:
        idx = list(np.array(input_array[:,0]).astype(np.int)).index(int(r))
        filtered_data.append(input_array[idx])
    filtered_data = np.array(filtered_data)
    filtered_data.tofile('filtered_data_{}.dat'.format(party_id), sep=' ')
  1. 数据拼接及加密。为计算方生成各自的加密数据,并储存在名为tmp的文件夹中。
# 运用 aby3.make_shares 接口将数据加密并分成三份
from paddle_fl.mpc.data_utils import aby3
def encrypted_housing_features():
        """
        feature reader
        """
        for instance in sample_reader():
            yield aby3.make_shares(instance[0])

    def encrypted_housing_labels():
        """
        label reader
        """
        for instance in sample_reader():
            yield aby3.make_shares(instance[1])
  1. 模型训练。
# 定义模型
role, server, port = sys.argv[1], sys.argv[2], sys.argv[3]
    pfl_mpc.init("aby3", int(role), "localhost", server, int(port))
    role = int(role)
x = pfl_mpc.data(name='x', shape=[BATCH_SIZE, 13], dtype='int64')
y = pfl_mpc.data(name='y', shape=[BATCH_SIZE, 1], dtype='int64')
    y_pre = pfl_mpc.layers.fc(input=x, size=1)
    cost = pfl_mpc.layers.square_error_cost(input=y_pre, label=y)
avg_loss = pfl_mpc.layers.mean(cost)
optimizer = pfl_mpc.optimizer.SGD(learning_rate=0.001)
   # 加载数据
feature_reader = aby3.load_aby3_shares(
"tmp/house_feature", id=role, shape=(13, ))
label_reader = aby3.load_aby3_shares(
"tmp/house_label", id=role, shape=(1, ))
batch_feature = aby3.batch(feature_reader, BATCH_SIZE, drop_last=True)
batch_label = aby3.batch(label_reader, BATCH_SIZE, drop_last=True)
loader = fluid.io.DataLoader.from_generator(
    feed_list=[x, y], capacity=BATCH_SIZE)
batch_sample = paddle.reader.compose(batch_feature, batch_label)
place = fluid.CPUPlace()
loader.set_batch_generator(batch_sample, places=place)
# 开始训练
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())
epoch_num = 20
for epoch_id in range(epoch_num):
        for sample in loader():
            mpc_loss = exe.run(feed=sample, fetch_list=[avg_loss])
  1. 数据恢复为明文。在训练中,各方会将训练时的loss及预测结果保存下来,完成训练后,需要将结果恢复成明文。
from paddle_fl.mpc.data_utils import aby3
def load_decrypt_data(filepath, shape):
    # 加载密文信息
        part_readers = []
        for id in six.moves.range(3):
            part_readers.append(
                aby3.load_aby3_shares(
                    filepath, id=id, shape=shape))
        aby3_share_reader = paddle.reader.compose(part_readers[0],               part_readers[1], part_readers[2])                                   
        epoch_id = 0
        for instance in aby3_share_reader():
        # aby3.reconstruct 接口将数据解密
            p = aby3.reconstruct(np.array(instance))
            print("Epoch %d, Step 0, Loss: %f " % (epoch_id,p[0]))

完整的训练过程请参考:https://aistudio.baidu.com/ai...

使用PFM策略后,联邦学习的数据安全性增强,但是对模型精度是否有影响呢

在数据相同、训练参数(batch_size)一致、硬件环境相同的情况下,我们对比了使用联邦学习PFM策略与飞桨单机训练的模型精度。实验表明:PFM在保护数据安全的同时,并未影响模型训练的精度, PFM训练中的Loss与Paddle训练中的Loss基本一致。

1.jpg

此外,为了提升开发者的使用体验,PaddleFL在易用性上进一步提升。

PaddleFL组网方式与飞桨开源框架一致,降低了开发者额外的学习成本。
PFM的接口命名方式和程序运行机制都与飞桨开源框架保持一致,使得用户可以采用与明文训练相同的编程方式来进行联邦训练。

采用私有化Op的开发方式,减少了Paddle FL安装时的编译时间。
PFM在实现中加入了很多操作加密数据的算子(mpc_fc_op, mpc_sgd_op等)。本次开发采用私有化Op的方式,使PaddleFL成为可以独立编译的代码库,大大减少了安装时的编译时间。

完善使用文档及功能说明。
在文档中增加了更多的实例,补充了相应的使用说明及编程讲解,帮助开发者快速熟悉和使用PaddleFL。在后续的版本中,针对企业应用特点,我们会继续提升PaddleFL能力,如:

纵向联邦学习将支持更多的模型
开源FL手机端模拟器,帮助企业进行业务调研
期待开发者们的使用,在过程中有任何意见或创意想与大家分享,欢迎联系我们。

如在使用过程中有问题,可加入飞桨官方QQ群进行交流:1108045677。

如果您想详细了解更多飞桨的相关内容,请参阅以下文档。

官网地址:https://www.paddlepaddle.org.cn

基于数据并行的联邦学习方案请参考:https://github.com/PaddlePadd...

基于多方安全计算的联邦学习方案请参考:https://github.com/PaddlePadd...

PaddleFL GitHub:https://github.com/PaddlePadd...

飞桨开源框架项目地址:

GitHub: https://github.com/PaddlePadd...

Gitee: https://gitee.com/paddlepaddle/

推荐阅读
关注数
12978
内容数
325
带你捕获最前沿的科技信息,了解最新鲜的科技资讯
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息