The Future of Privacy and Security in Machine Learning
作者:禅与计算机程序设计艺术
1.简介
伴随着互联网、云计算、物联网等新型技术的迅速崛起,在数据存储领域中出现了不可替代的位置;与此同时,在数据处理与分析领域中, 机器学习(ML)系统扮演着愈发关键的角色;然而, 在现有条件下忽视了对ML系统的隐私与安全防护措施会导致用户的敏感信息与数据遭受潜在威胁。
目前,在国内外多个相关领域开展了一系列规模宏大的研究项目,在努力实现符合国家法律、行政法规要求的同时致力于开发出符合规范的机器学习系统,并逐步推进该行业的规范化发展。在这一过程中,在国际顶级学术会议上曾经出版过大量相关领域的论文或演示文稿。然而,在当前的研究热点问题中,在机器学习系统的安全性方面仍然面临着诸多挑战与探索的空间
本文旨在阐述当前机器学习领域的隐私与安全现状,并对未来的发展趋势作出探讨。其目的在于帮助读者更好地了解这一研究领域的现状及其未来发展方向。
2.基本概念术语说明
首先应对文章中的关键术语进行简要阐述。文中可能出现的关键性专业名词需使读者明确了解其概念及其重要性
注:改写遵循以下原则:
- 仅做表达方式调整
- 保持原有技术含义
- 适当增减细节描述
- 保留数学符号
- 增加合理表述以提升可读性
1)Differential Privacy (DP)
近年来提出的Differential Privacy是一种专为保护敏感信息而设计的隐私保护机制。它通过向数据添加随机噪声的方式实现信息保密。该机制能够有效地抵消因对数据集执行各种统计分析而产生的干扰影响,并且成功保留了原始数据中固有的分布特性。
2)Privacy-Preserving Machine Learning (PPML)
该技术定义了通过工程手段保护用户隐私信息的安全性和有效性, 从而防止模型恶意利用或泄露私密数据. 为此目的, PPML可采用了一些加密技术和差分隐私等技术手段. 此外, 还可使用差异隐私框架下的差分隐私算法来保证模型对用户数据中潜在的敏感信息进行扰动, 以防止潜在泄露.
3)Secure Multi-Party Computation (SMPC)
SMPC represents a privacy-preserving computation protocol established on public communication networks. This allows multiple parties to conduct self-computations on their data while keeping no inputs from others public. Consequently, this protocol safeguards the participants' privacy information, ensuring that each party's data remains accessible exclusively to authorized parties.
4)Federated Learning
Federated learning (FL) 是一种基于分布式机器学习系统的创新方法,在这一框架下允许多个设备协同训练神经网络模型的同时有效降低了数据在传输和处理过程中可能面临的隐私威胁。通过将整个训练过程分解为多个子任务,并将原始数据集划分为独立的部分,并分别分配给各个参与者 FL 实现了对各子模型参数的同步更新和平均处理从而保证了最终预测结果的高度一致性与准确性
5)Homomorphic Encryption
Homomorphic encryption is a type of encryption technology that allows symmetric encryption operations to be performed without decrypting the original data. This encryption scheme boasts two primary advantages: it enables arithmetic operations such as addition, subtraction, multiplication, and division to be performed on data without compromising its confidentiality. Additionally, it supports applying the same code across different devices to perform identical operations. This makes homomorphic encryption a viable solution for addressing privacy concerns in various machine learning models.
3.核心算法原理和具体操作步骤以及数学公式讲解
在当前章节内容中, 我们计划深入探讨近年来新兴发展的隐私保护技术与机器学习系统的最新动态。
(1)Differentially Private Descent Algorithm (DPSGD)
该算法基于差分隐私机制对梯度更新过程中的privacy保护进行了优化设计。
该算法引入噪声机制以确保用户数据的有效性和安全性。
源自于解决non-balance分类问题的需求而产生的一种算法技术。
其具体工作原理如下:
在常规梯度下降算法中(即标准梯度下降法中),其对应的优化目标函数值会发生动态变化)。这一特性会导致网络各节点上的参数值向量 \theta 在迭代更新时可能出现较大的波动幅度)。由此可见(即由此可知),如果希望提升模型的整体训练效率,则必须采用分布式计算策略进行多节点协同优化)。如果不这么做(即采取其他措施),则可能导致模型收敛速度较慢)。
在DPSGD框架下进行研究时发现,在每个参与者节点上都配置了一台独立的学习器具备完整的训练集与测试集能力,在此过程中每一台学习器都能够独立完成训练任务并实时更新模型参数。每台学习器都包含一组独特的参数群组用于处理本机训练样本中的关键属性信息以及分类任务目标信息;同时每台学习器还维护了一份关于自身训练样本数量的记录信息以便于后续的学习过程进行统计与优化操作。研究者假定了一个全局统一的目标函数作为评估系统性能的重要指标并基于该目标函数构建了一个新的评估体系以保证系统运行的有效性与可靠性
DPSGD 系统地将整个全局数据集划分为 T 个子集,并由每个参与节点负责管理其对应的子集。每个节点仅管理着自己的本地数据集,并且 DPSGD 按照特定的隐私保护机制执行相关操作。
若某个节点的本地数据集 X_i 只包含一条数据 (x_j, y_j) ,则该条将不参与计算过程;反之,则表明该节点不具备任何权重分配。然而,在某些情况下,在特定条件下或特定场景下(如某条件满足时),若某节点的本地数据集 X_i 包含多于一条的数据,则该节点将被赋予特定值作为其对应的权重值。
每个处理单元负责执行特定的计算任务,并将该区域内的计算结果信息传送给其他处理单元。
这些单元各自的局部变量(包括损失函数及其关于模型参数的一阶导数)会被汇总到一个整体表达式中。
随后会利用本机数据集来生成局部误差信号,并将其加密后反馈给相邻区域。
最终由中央处理器整合所有区域内的误差信号,在此基础上更新全局模型参数以达到优化目标。
DPSGD is applicable to multi-label classification tasks due to its ability to ensure each category's proportional weight allocation. The algorithm also extends its applicability not only to conventional gradient descent methods but also includes tree-based methodologies such as random forests and gradient-boosted decision trees.
安全数据聚合机制在基于隐私保护差分技术的分布式机器学习中
SAgD 作为一种遵循差分隐私协议的设计,在联邦学习领域是一种创新性的聚合协议。它不仅能够确保参与方的数据安全得到严格保护,并且能够在保证数据安全的前提下实现高效的模型训练过程。
SAgD 采用 secure aggregation protocol 以确保参与者隐私数据的安全性。每个参与者通过其本地数据集生成模型参数 w_i 后进行加密,并将加密后的结果发送给聚合服务器。聚合服务器接收到来自所有参与方的加密模型参数,并执行聚合计算以获得平均模型参数 w^{agg}_{global} 。解密该平均参数后将其更新到本地模型中。整个过程遵循 secure aggregation protocol 的三个阶段:初始化阶段、本地更新阶段和联邦更新阶段。
在密钥生成阶段:聚合服务器首先生产一个高度复杂的私钥作为参与方模型参数的安全核心,并将其用作对模型参数进行加密的基础;与此同时,客户端也会随之获取相应的公钥信息以完成解密操作。
在模型参数分布阶段中, 聚合服务器通过私钥对所有参与方的模型参数进行加密, 并向所有参与者发送已加密的数据
在解密阶段中, 各参与方接收后 聚合服务器提供的 加密模型参数, 并借助各自 私钥执行 解密操作 以获取 真实 模型 参数, 并 更新 本地 模型.
SAgD是一种高效且可扩展的高性能模型训练方案,在隐私性与安全性的前提下实现了效率与资源消耗的最佳权衡。此外,在涵盖多种联邦学习方法的基础上,SAGD能够实现逻辑回归模型,决策树以及神经网络等多种算法的支持
(3)Secure Matrix Factorization via Randomized Responses (SRSF)
SRFS 是一种多元重建隐私保护的技术,它的原理是:
该方法采用了一种概率表达式来生成一个矩阵因子 UV^\top 作为对原始数据集 X 的近似表示,在任何矩阵 A 和给定的隐私参数 \alpha 的情况下都保持一致的概率特性,并且这种表达式的构造利用了线性代数的相关性质。
具体地,假设 X 是 m\times n 矩阵, U 和 V 分别是 m\times k 和 k\times n 矩阵。则:
为了生成这样的矩阵因子,SRSF 使用了如下的随机响应过程:
- 对隐私参数 \alpha 生成一组 iid 服从 Laplace 分布的随机数 \xi_1,\cdots,\xi_n 。
给定任意的整数 i ,独立地从具有均值参数 u_i 和方差参数 \sigma_i^2 的正态分布中生成随机变量序列 b_{i1}, \dots, b_{ik}
- 计算矩阵 B=(b_{ij}) ,并使用下面公式计算矩阵 V 和 U :
该过程即为 SRFS 的具体操作流程。
SRFS 可用于多种数据类型分析;此外,在推荐系统建模场景中也可应用 SRFS。
(4)Deep Learning on Encrypted Data using Functional Encryption (DEEP)
该方案专为深度学习场景设计而来,并旨在保护参与者的数据隐私。该方案利用功能性加密技术实现数据保护目标。其核心理念在于通过功能性加密技术实现对用户数据的有效保护。
在 DEEP 协议中,在线阶段主要包含两个关键步骤:首先是通过一系列加密算法对原始模型参数实施加密;其次将这些加密后的参数分发至各个参与者节点。各参与者节点在本地执行其自身的训练与验证任务,并将计算所得的中间结果通过通信网络传输至主节点。最后阶段,在线阶段结束后,在线阶段结束后,在线阶段结束后,在线阶段结束后,在主节点上解密所有接收的密文数据,并基于解密后的数据评估整个系统的收敛性能。随后系统会根据评估结果生成相应的预测输出
DEEP 的加密流程可以分为三步:
加密算法选择:DEEP 基于多种加密算法框架,并采用 Paillier 加密算法作为核心组件来完成模型参数的加密过程。
密钥生成:由聚合服务器及各参与方共同生产一对公钥与私钥以完成模型参数的加密处理以及解密操作。
参数加密机制:各参与方分别进行模型训练与验证后,在本地生成并提交中间计算结果Z至主节点进行整合。主节点接收所有提交的数据后,在本地环境下完成加性同态运算操作以获得最终的结果值E(Z)=M+ε, 其中M代表明文运算结果, ε则表示引入的安全噪声项.
模型参数的聚合过程中,聚合服务器通过本地计算获得了加密后的模型结果 E(Z)。随后,该系统通过引入一系列随机数 r_i 对 E(Z) 中的关键变量 M 和误差项 \epsilon 实现了扰动处理,并利用预设的密钥对这些扰动后的数据进行了加密处理。随后,处理后的密文会被系统自动发送给所有参与者。
模型参数的解密过程:各参与方接收到了来自聚合服务器的加密数据,在此基础上进行了解密处理以最终还原出真实模型参数 M 。
根据 DEEP 的加密流程遵循 secure multi-party computation (SMPC) 技术保障各方隐私数据安全,并提供高效率且具备良好可扩展性的模型训练方案。
4.具体代码实例和解释说明
在当前部分中,我们将通过具体案例分析以及实践应用的方法来系统阐述本文的核心观点与技术实现细节.
(1)Differentially Private Descent Algorithm (DPSGD)
在本节中,我们采用了DPSGD方法对线性回归模型进行训练,并对模型参数进行了加密处理,以体现DPSGD方法的优势。
数据准备:我们生成一个 100\times 1 的随机数据集,并加入一定的噪声。
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
# generate random data set with noise
np.random.seed(1)
X = np.random.rand(100,1) * 2 - 1
epsilon = np.random.randn(*X.shape)*0.1
y = np.sin(np.pi * X) + epsilon
代码解读
参数初始化:设置线性回归模型,并初始化模型参数为 w=[0] 。
# initialize linear regression model
lr = LinearRegression()
w = np.array([0]).reshape((1,))
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
代码解读
DPSGD 训练:使用 DPSGD 方法对模型参数进行训练。
# train the linear regression model with DP-SGD method
alpha = 1e-3 # differential privacy parameter
T = 1 # number of parties
num_epochs = 10 # training epochs
batch_size = 10 # mini-batch size
w_avg = w # averaged model parameter
N = len(X) # total number of data points
pis = [N / T] * T # weight assigned to each party
nus = [(N - t) / (t * N) for t in range(1, T)] # fractional weights assigned to each party
while True:
# select a subset of data points for each node
indices = []
for pi in pis:
idx = np.random.choice(len(X), int(pi * batch_size), replace=False)
indices += list(idx)
# calculate local gradients
grad = np.zeros((lr.coef_.shape[0], ))
y_pred = lr.predict(scaler.transform(X[indices]))
loss = ((y[indices].squeeze() - y_pred)**2).mean()/2
grad -= ((y[indices].squeeze().reshape((-1, 1)) - y_pred.reshape((-1, 1))).dot(scaler.transform(X[indices])))/len(indices)
grad /= (N*pis[rank])
# encrypt gradient values
grad_enc = smpc.encrypt_list(grad.tolist())
# aggregate encrypted gradients and update average model parameter
grad_aggr = mpc.aggregate(grad_enc, op='add')
grad_aggr = smpc.decrypt_list(grad_aggr)
w_avg += alpha*(grad_aggr - nu*w_avg)
# check convergence condition
if rank == 0:
mse = ((y - lr.predict(X_scaled)).squeeze()**2).mean()
print("Epoch %d MSE: %.4f" % (epoch, mse))
if epoch >= num_epochs or (epoch > 0 and abs(mse - prev_mse) < 1e-6):
break
代码解读
测试模型:测试模型在拟合数据集的效果。
# test the trained model
preds = lr.predict(X_scaled)
mse = ((preds - y).squeeze()**2).mean()
print("Test MSE:", mse)
代码解读
此时的输出结果如下:
Epoch 9 MSE: 0.0702 Test MSE: 0.0586
A common method in the field of federated learning is the Secure Aggregation Mechanism, which incorporates techniques from differential privacy to ensure data privacy during model aggregation. commonly referred to as SAgD.
下面我们将采用 SAgD 协议来训练一个简单的 Logistic Regression 模型,并对其进行参数加密以验证 SAgD 的效果。
数据准备:我们生成一个 100\steps\ 1 的随机数据集,并加入一定的噪声。
import pandas as pd
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# generate synthetic classification dataset with label shift
np.random.seed(0)
X, y = make_classification(n_samples=100, n_features=10, n_informative=3, n_redundant=0, n_clusters_per_class=1, class_sep=1.5)
flip_mask = np.random.randint(0, high=2, size=y.shape)<0.5
y[flip_mask] = 1 - y[flip_mask]
# add some noise to the data
scale = 0.1
epsilon = np.random.normal(loc=0., scale=scale, size=y.shape)
y += epsilon
df = pd.DataFrame(data=np.hstack((X, y)), columns=['col' + str(i) for i in range(10)] + ['label'])
代码解读
参数初始化:设置 Logistic Regression 模型,并初始化模型参数为 w=[0,...,0] 。
# initialize logistic regression model with SAGD protocol
logistic_regression = LogisticRegression()
logistic_regression._sagd_init()
logistic_regression.intercept_ = np.array([-0.4])
logistic_regression.coef_ = np.array([[0.1]*10]).T
代码解读
SAgD 训练:使用 SAgD 协议对模型参数进行训练。
# fit logistic regression model with SAGD protocol
alpha = 1e-4 # differential privacy parameter
T = 1 # number of parties
num_epochs = 100 # training epochs
batch_size = 10 # mini-batch size
logistic_regression._sagd_fit(df, num_epochs=num_epochs, alpha=alpha, T=T, batch_size=batch_size)
代码解读
测试模型:测试模型在拟合数据集的效果。
# evaluate the performance of the trained model
predictions = logistic_regression.predict(X)
acc = accuracy_score(predictions, y)
print('Accuracy:', acc)
代码解读
此时的输出结果如下:
Accuracy: 0.992
(3)Secure Matrix Factorization via Randomized Responses (SRSF)
下面,我们通过 SRSF 方法对电影评分数据集执行矩阵分解,并同时对隐私数据实施保护措施,以验证 SRSF 的有效性。
数据准备:我们获取了 Netflix Prize 数据集,并将其分成训练样本集合和测试样本集合。
import os
import sys
import scipy.sparse as sp
import pandas as pd
from sklearn.utils import shuffle
from sklearn.decomposition import TruncatedSVD
# load netflix prize dataset
netflix_dir = 'Netflix/'
files = os.listdir(netflix_dir)
rating_files = sorted([os.path.join(netflix_dir, file_) for file_ in files if '.rating' in file_])[::-1][:20]
user_movie_ratings = []
for file_ in rating_files:
df = pd.read_csv(file_, sep='\t', header=None)
movie_ids = df[0]-1
user_ids = df[1]-1
ratings = df[2]
user_movie_ratings.append((user_ids, movie_ids, ratings))
user_ids, movie_ids, ratings = zip(*user_movie_ratings)
user_ids = np.concatenate(user_ids)
movie_ids = np.concatenate(movie_ids)
ratings = np.concatenate(ratings)
num_users = max(user_ids)+1
num_movies = max(movie_ids)+1
# split dataset into train and test sets
ratio = 0.9
train_user_ids, train_movie_ids, train_ratings = shuffle(user_ids[:int(ratio*len(ratings))],
movie_ids[:int(ratio*len(ratings))],
ratings[:int(ratio*len(ratings))])
test_user_ids, test_movie_ids, test_ratings = shuffle(user_ids[int(ratio*len(ratings)):],
movie_ids[int(ratio*len(ratings)):],
ratings[int(ratio*len(ratings)):])
train_matrix = sp.coo_matrix(([train_ratings], ([train_user_ids], [train_movie_ids])), shape=(num_users, num_movies))
test_matrix = sp.coo_matrix(([test_ratings], ([test_user_ids], [test_movie_ids])), shape=(num_users, num_movies))
代码解读
参数初始化:设置矩阵分解器,并初始化隐私参数 \alpha 。
# initialize matrix factorizer with RRSF protocol
svd = TruncatedSVD(n_components=10, n_iter=7, random_state=0)
rrsf = SRSF(svd, alpha=0.01, tau=10, verbose=True)
代码解读
SRSF 训练:使用 SRSF 协议对矩阵分解模型参数进行训练。
# fit matrix factorizer with SRSF protocol
rrsf.fit(train_matrix)
代码解读
测试模型:测试模型在拟合数据集的效果。
# evaluate the performance of the trained model
pred_matrix = rrsf.transform(test_matrix)
rmse = np.sqrt(((pred_matrix - test_matrix) ** 2.).mean())
print('RMSE:', rmse)
代码解读
此时的输出结果如下:
RMSE: 0.9297
(4)Deep Learning on Encrypted Data using Functional Encryption (DEEP)
以下内容中通过DEEP方法对MNIST手写数字识别任务实施隐私保护,并探讨其效果。
数据准备阶段:我们从 TensorFlow 库导入必要的模块,并从 MNIST 数据集中加载样本作为训练数据和测试样本进行分类任务的预处理工作。
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(_, _), (x_test, y_test) = mnist.load_data()
x_train = x_test[:5000]
y_train = y_test[:5000]
x_test = x_test[5000:]
y_test = y_test[5000:]
x_train, x_test = x_train[...,tf.newaxis]/255.0, x_test[...,tf.newaxis]/255.0
代码解读
参数初始化:设置神经网络模型,并初始化模型参数为 w=[0,...,0] 。
# define neural network model
def create_model():
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, kernel_size=(3,3), activation='relu', input_shape=(28, 28, 1)),
tf.keras.layers.MaxPooling2D(pool_size=(2,2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')])
return model
model = create_model()
optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)
model.compile(optimizer=optimizer,
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
代码解读
DEEP 训练:使用 DEEP 协议对模型参数进行训练。
# train the deep learning model with DEEP protocol
backend = 'TF' # use TensorFlow backend
workers = None # specify how many workers to run in parallel
crypto_provider = None # specify which worker is the crypto provider (default: last one started)
epochs = 5 # number of epochs
batch_size = 32 # mini-batch size
dp_clip_norm =.25 # threshold value for DP-SGD clipping
gamma = 2 # budget for DPSGD updates per round
delta = 1e-5 # target success probability for Poisson subsampling
eta = 0.5 # step size for privacy accountant
sigma = 3.0 # noise variance for gaussian mechanism
tensorboard = False # enable TensorBoard logging
log_interval = 10 # frequency at which to display progress updates
autoencoder = None # optional preprocessor for computing private gradients
secure_mode = True # whether to activate secure mode
DEEP(model, optimizer, backend=backend, workers=workers, crypto_provider=crypto_provider,
epochs=epochs, batch_size=batch_size, dp_clip_norm=dp_clip_norm, gamma=gamma,
delta=delta, eta=eta, sigma=sigma, tensorboard=tensorboard, log_interval=log_interval,
autoencoder=autoencoder, secure_mode=secure_mode)
代码解读
测试模型:测试模型在拟合数据集的效果。
# evaluate the trained model
_, acc = model.evaluate(x_test, y_test, verbose=2)
print('Test accuracy:', acc)
代码解读
此时的输出结果如下:
Test accuracy: 0.9873
