基于Rosetta的隐私保护多方金融联合AI建模场景

近期Rosetta开源框架引发人们广泛关注,“一键”切换隐私计算模式,AI数据秒换隐身衣的神奇操作,也让人们不禁问到:如此简单便捷的操作,Rosetta能真正与实际应用落地相结合吗?

其实Rosetta的目标并不仅仅是为了用于科研性质的探索,而是促进隐私AI技术在工业界真正的实际落地。

今天我们就以Rosetta在实际场景下的解决方案为示例,详细解析如何基于Rosetta框架将隐私AI引入到实际AI任务中来。

Rosetta在金融行业中的应用

在互联网金融业务中,金融风控是极其重要的一环,近年来越来越多的大数据和人工智能技术被应用到了这个领域中。其中在贷前,有一个重要的环节是对用户的信用进行评级,这里主要是需要综合考虑用户的收入数据、以往的经济行为数据等数据。用户相关的数据越多,对该用户的信用风险等级判断就可能越准确,就有助于银行更好地判定风险,这一分析过程在业内一般称为信用评分卡(或A卡),实际中一般先用逻辑回归等机器学习算法得到预测模型,再根据简单映射关系转换到标准评分卡中的分数。

假设现在有两个银行A、B和某知名电商互联网企业C分别拥有大量银行客户以往的信贷数据和用户线上消费行为数据,如果能够将他们的数据联合起来,那么就可以在更大的数据维度上联合使用机器学习模型(这里为了方便,我们以简单实用的Logistic Regression为例)来训练得到更加准确的信用评分卡模型。这对于银行A、银行B的后续客户信用评级都是有好处的,同时也有助于C从数据中获取经济价值(当然实际中的商业合作模式可能是多种多样的,比如A、B也可以再协助C训练一个更好的商品推荐系统)。

但从合规和保护自身商业数据资产的角度看,显然不能够直接地将自己的数据交给对方,而且也不可能找到一个所谓的可信第三方来拿到各方数据进行本地计算。这时就可以使用Rosetta框架以分布式隐私AI的方式快速地解决此问题。

首先,让我们对上述场景问题进行简单的抽象,如图所示,三方各自独立部署自己的Rosetta计算服务节点,彼此之间建立标准安全SSL链接,就可以开始运行同一份训练程序。

基于Rosetta的隐私保护多方金融联合AI建模场景

完整的训练任务代码如下,熟悉TensorFlow的开发者可以很快发现和用原生TensorFlow相应训练代码比起来,区别仅仅在于两三行必要的数据的预处理代码,其他完全一致,所以开发成本极低。

#!/usr/bin/env python3
import latticex.rosetta as rtt
import math
import os
import csv
import tensorflow as tf
import numpy as np

np.random.seed(0)
EPOCHES = 10
BATCH_SIZE = 16
learning_rate = 0.0002
rtt.activate(“SecureNN”)
# load local private data
file_feature = “./train_feature_data.csv”
file_label = “./train_label_data.csv”
cipher_X, cipher_Y = rtt.SecureDataSet(
    label_owner=0, p2_owns_data=True).load_XY(file_feature, file_label, header=None)
DIM_NUM = real_X.shape[1]
BATCHES = math.ceil(len(cipher_X) / BATCH_SIZE)
X = tf.placeholder(tf.float64, [None, DIM_NUM])
Y = tf.placeholder(tf.float64, [None, 1])

# initialize W & b
W = tf.Variable(tf.zeros([DIM_NUM, 1], dtype=tf.float64))
b = tf.Variable(tf.zeros([1], dtype=tf.float64))
# loss
logits = tf.matmul(X, W) + b
loss = tf.nn.sigmoid_cross_entropy_with_logits(labels=Y, logits=logits)
loss = tf.reduce_mean(loss)
# optimizer
train = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
print(“train Op:\n”, train)
# save
saver = tf.train.Saver(var_list=None, max_to_keep=5, name=’v2′)
os.makedirs(“./result/ckpt”, exist_ok=True)
# init
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    # train
    for e in range(EPOCHES):
        for i in range(BATCHES):
            bX = cipher_X[(i * BATCH_SIZE): (i + 1) * BATCH_SIZE]
            bY = cipher_Y[(i * BATCH_SIZE): (i + 1) * BATCH_SIZE]
            sess.run(train, feed_dict={X: bX, Y: bY})
            j = e * BATCHES + i
            if j % 50 == 0 or (j == EPOCHES * BATCHES – 1 and j % 50 != 0):
                xW, xb = sess.run([W, b])
                print(“I,E,B:{:0>4d},{:0>4d},{:0>4d} weight:{} \nbias:{}”.format(
                    j, e, i, xW, xb))
    saver.save(sess, ‘./result/ckpt/model’)
rtt.deactivate()

下面我们简单解读下代码。

首先这个实际场景对应着MPC技术下数据集被“垂直划分”的case,各方所需要做的第一步是对数据进行对齐,即要使同一个客户在A、B处的特征数据和label数据和其在C处的特征数据对应匹配起来。这一步骤可以有多种的实现方案,这里我们假定这一步已经在线下预处理完成(顺便提一下,在8月Rosetta就将集成PSI(Private Set Intersection,隐私AI求交集)等方便高效的API来进一步辅助用户完成这一任务)。

在这个隐私AI任务下,我们设定银行A的角色为P0,银行B的角色为P1,互联网企业C的角色为P2。在执行此python程序前,P0需要将他私有的用户特征训练数据集放到train_feature_data.csv中,将对应该用户是否是信用高风险的分类结果训练数据集放到train_label_data.csv中。P1和P2只需要将各自私有的用户特征训练数据集也放到本地的train_feature_data.csv文件中。然后调用Load_XY 这一API即可完成对数据的多方“加密分享”。

另外,我们还可以通过配置文件设定在使用TF的save接口对得到的结果模型进行输出时,仅将明文结果保存到某一方。比如这里,我们在实际中可以通过配置SAVER_MODE=3来使得训练得到的模型结果仅给银行A和银行B使用,而不暴露给企业C。

然后运行就更加简单,和之前的例子一样,只需要三方各自启动上述的同一脚本,并通过命令行参数设定自身的角色分别是P0、P1、P2即可。

在执行过程中,我们特地打印出一些中间的内容看一下:

基于Rosetta的隐私保护多方金融联合AI建模场景

可以看出原生的TensorFlow Operation已经被我们替换成了具有隐私保护功能的’SecureOp’类型,而在整个训练过程中,中间训练得到的权重与bias参数全都是密文,完全不会有数据、模型泄露的问题出现。

我们选择在一个UCI公开真实数据集上,对在直接明文状态与在Rosetta密文状态下的效果进行实际对比,结果如图所示:


基于Rosetta的隐私保护多方金融联合AI建模场景

由此可见,给AI数据披上 “隐身衣”之后训练得到的模型与AI数据直接训练得到的模型相差无几,完全可以应用在实际落地场景中。

关键词: Rosetta  多方金融  

该内容来自于互联网公开内容,非区块链原创内容,如若转载,请注明出处:https://htzkw.com/archives/28786

联系我们

aliyinhang@gmail.com