我正在为数据集和函数f实现L-2灵敏度。根据{{3}},L-2灵敏度定义如下:
this link on Differential Privacy
我正在寻求将其纳入梯度计算中,以差分方式训练ML模型。
在我的上下文中,D
是这样的向量:X = np.random.randn(100, 10)
D'
被定义为D
中仅缺少一行的D
的子集,例如X_ = np.delete(X, 0, 0)
f
是梯度向量(即使定义说f
是实数值函数)。在我的情况下,f(x)
的评估方式类似于f(D)
:
grad_fx = (1/X.shape[0])*(((1/(1+np.exp(-(y * (X @ b.T))))) - 1) * (y * X)).sum(axis=0)
其中:
y = np.random.randn(100, 1)
b = np.random.randn(1, 10)
如果我对定义的理解是正确的,那么我必须为所有可能的f(D) - f(D')
数组评估D'
的2范数,并获取最小值。
这是我的实现(我尝试使用numba.jit
进行加速,因此使用了有限的numpy功能):
def l2_sensitivity(X, y, b):
norms = []
for i in range(X.shape[0]):
# making the neigboring dataset X'
X_ = np.delete(X, i, 0)
y_ = np.delete(X, i, 0)
# calculate l2-norm of f(X)-f(X')
grad_fx =(1/X.shape[0])*(((1/(1+np.exp(-(y * (X @ b.T))))) - 1) * (y * X)).sum(axis=0)
grad_fx_ =(1/X_.shape[0])*(((1/(1+np.exp(-(y_ * (X_ @ b.T))))) - 1) * (y_ * X_)).sum(axis=0)
grad_diff = grad_fx - grad_fx_
norm = np.sqrt((grad_diff**2).sum())
#norm = np.linalg.norm(compute_gradient(b, X, y) - compute_gradient(b,X_,y_))
norms.append(norm)
norms = np.array(norms)
return norms.min()
问题:
函数调用l2_sensitivity(X, y, b)
需要大量时间才能运行。如何加快速度-也许使用numba或JAX?
答案 0 :(得分:0)
我刚刚开始研究此问题,但是我认为您不必每次都进行完整的梯度计算,因为D和D'的总和仅相差第k个观测值(行)。我在此论坛b / c上发布了派生文件,但没有图片代表,请点击此处:https://security.stackexchange.com/a/206453/203228 这是一个示例实现
norms = []
B = np.random.rand(num_features) #choice of B is arbitrary
Y = labels #vector of classification labels of height n
X = observations #data matrix of shape nXnum_features
for i in range(0,len(X)):
A = Y[i]*(np.dot(B.T,X[i]))
S = sigmoid(A) - 1
C = Y[i]*X[i]
norms.append(np.linalg.norm(S*C,ord=2))
sensitivity = max(norms) - min(norms)