实现L-2灵敏度-可能使用numba或JAX

时间:2019-03-28 10:20:26

标签: python performance numpy machine-learning numba

我正在为数据集和函数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?

1 个答案:

答案 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)