此前我们通过基于Rosetta的隐私保护多方金融联合AI建模场景,了解了Rosetta在金融行业中的实际应用。实际上,隐私开源框架Rosetta可应用范围极广,各行各业中需要在隐私保护下联合建模的场景中,都会用到Rosetta。下面我们从人脸识别的应用场景中解析Rosetta的实际应用。
现实中有一类典型的场景是一方有数据,一方有模型参数。都很需要彼此,但因为数据与参数的敏感性,又显得“貌合神离”。
比如,一家专注AI视觉算法的公司A有一套先进的人脸识别模型,并且模型参数在不断的迭代优化中,其服务可以通过RESTful API来访问。而另一家公司B需要基于人脸识别系统构建自己的用户认证系统,但是用户的人脸图像等敏感数据不能泄露。
此时A方和B方如果需要进行合作,由于隐私方面的问题会存在困难,B不能用自己明文的人脸图像作为输入直接调用A的接口,因为很容易将人脸图像数据暴露给了对方,而且很难知道双方会不会用数据和参数去做别的事情。而基于Rosetta提供的隐私AI框架可以轻松解决这个难点。
基于Rosetta只需要本地先调用加密转换的接口,将本地待处理数据集和模型参数都加密后,就可以在后面的复杂模型上运行。B公司完全不会泄露自己这些敏感的人脸图像数据,A公司也不会泄露属于自己公司核心资产的这些模型参数。由于篇幅限制,我们仍以上述LR简单模型来示例,假定A公司角色是P0,B公司角色是P1,而P2只需要是一个临时的无输入、无输出的辅助节点。可以对基于安全多方计算技术的整套业务过程进行加速。
import latticex.rosetta as rtt
import os
import csv
import tensorflow as tf
import numpy as np
from util import read_dataset
# load P0’s private feature data to be predicted.
file_feature = ‘test_feature.csv’
cipher_feature= rtt.SecureDataSet().load_X(file_feature, header=None)
DIM_NUM = cipher_feature.shape[1]
X = tf.placeholder(tf.float64, [None, DIM_NUM])
if rtt.get_party_id() == 0:
model_W = np.loadtxt(‘W.txt’)
model_b = np.loadtxt(‘b.txt’)
else:
model_W = None
model_b = None
# initialize model W & b with P1’s private data
W = rtt.private_input(1, model_W)
b = rtt.private_input(1, model_b)
# predict with model
pred_Y = tf.sigmoid(tf.matmul(X, W) + b)
# for demo, only P0 can get this plain result
plain_Y = rtt.SecureReveal(pred_Y, 1)
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
# predict
Y_cipher, Y_plain = sess.run([pred_Y, plain_Y], feed_dict={X: cipher_feature})
print(“cipher Y:”, Y_cipher)
print(“plain Y:”, Y_plain)
在这里通过Rosetta的隐私数据处理接口,分别指定了各方输入自己的隐私数据,然后就可以和原生TensorFlow一样,执行模型预测的任务了。
我们可以在最后打印一下输出的密文值和明文值看一下效果(注意我们指定了只有P0(即A方)才可以返回明文结果)。
以下为A方的输出:
以下为B方的输出:
可以看出A方按照预期顺利地拿到了预测的结果,而且在整个计算过程中,A方的模型参数不会暴露,B方的明文数据也不会暴露。