grad_uploaded = compute_grad(W, b, x_private, y_label) def attack_reconstruct(W, b, y, grad_true, steps=400, lr=0.01): "““攻击者已知模型参数与截获梯度,反演原始输入””" x_guess = np.random.randn(8) * 0.05 for _ in range(steps): grad_guess = compute_grad(W, b, x_guess, y) # 数值梯度:近似求 d(loss_obj)/dx_i grad_x = np.zeros(8) eps = 1e-6 for i in range(8): xp = x_guess.copy() xp[i] += eps xm = x_guess.copy() xm[i] -= eps grad_x[i] = (np.sum((compute_grad(W, b, xp, y) - grad_true) ** 2) - np.sum((compute_grad(W, b, xm, y) - grad_true) * 2)) / (2 eps) x_guess -= lr * grad_x return x_guess x_recovered = attack_reconstruct(W, b, y_label, grad_uploaded) sim = np.dot(x_recovered, x_private) / ( np.linalg.norm(x_recovered) * np.linalg.norm(x_private) + 1e-8) print(“真实私有数据:”, x_private) print(“攻击者重建:”, np.round(x_recovered, 2)) print(“余弦相似度:%.3f” % sim) print(“提示:相似度越高,说明梯度携带的输入信息被还原得越彻底”) ```
代码用途:用一个 8 维线性模型直观演示“梯度携带输入指纹”这一核心原理:客户端只上传梯度,攻击者却能通过反演恢复原始输入向量。