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