Реализация чувствительности L-2 - возможно, с использованием Numba или JAX - PullRequest
0 голосов
/ 28 марта 2019

Я реализую чувствительность L-2 для набора данных и функцию f. Начиная с этой ссылки на дифференциальную конфиденциальность , чувствительность L-2 определяется следующим образом:

enter image description here

Я собираюсь включить это, чтобы сделать мой расчет градиента при обучении модели 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)

Если мое понимание определения верно, я должен оценить 2-норму f(D) - f(D') для всех возможных D' массивов и получить минимум.

Вот моя реализация (я пытался ускорить с 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 голосов
/ 30 марта 2019

Я только начал изучать это, но я не думаю, что вам нужно каждый раз выполнять полный расчет градиента, потому что суммы по D и D 'отличаются только к k-му наблюдению (строка).Я разместил деривацию на этом форуме, потому что у меня нет представителя для изображений, здесь: 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)
...