예제 #1
0
def check_condition_rdp_gp(args, radius, sample_rate, steps, alpha, delta,
                           sigma, p1, p2):

    if radius == 0:
        return True

    if args.train_mode == 'DP' or args.train_mode == 'Sub-DP-no-amp':
        rdp = PrivacyEngine._get_renyi_divergence(sample_rate=sample_rate,
                                                  noise_multiplier=sigma,
                                                  alphas=[alpha]) * steps
        eps = rdp.cpu().detach().numpy()[0]
    elif args.train_mode == 'Sub-DP':
        _, eps = rdp_amplify(alpha, args.sub_training_size, args.training_size,
                             sample_rate, sigma)
        eps *= steps

    alpha = alpha / radius
    eps = 3**(np.log2(radius)) * eps

    if alpha <= 1:
        return False

    val = np.e**(-eps) * p1**(alpha/(alpha-1)) - \
        (np.e**eps * p2)**((alpha-1)/alpha)
    if val > 0:
        return True
    else:
        return False
예제 #2
0
 def func(alpha):
     rdp = PrivacyEngine._get_renyi_divergence(sample_rate=sample_rate,
                                               noise_multiplier=sigma,
                                               alphas=[alpha])
     eps = rdp.cpu().detach().numpy()[0]
     return eps
예제 #3
0
def rdp_bounds(radius,
               sample_rate,
               steps,
               alpha,
               sigma,
               p1,
               p2,
               softmax,
               agg_res_param=None,
               amplify=False,
               training_size=None,
               sub_training_size=None,
               clip=True):
    sample_rate_gp = 1 - (1 - sample_rate)**radius
    if not amplify:
        rdp = PrivacyEngine._get_renyi_divergence(sample_rate=sample_rate_gp,
                                                  noise_multiplier=sigma,
                                                  alphas=[alpha]) * steps
        eps = rdp.cpu().detach().numpy()[0]
    else:
        _, eps = rdp_amplify(alpha, sub_training_size, training_size,
                             sample_rate_gp, sigma)
        eps *= steps

    if not softmax:
        lower = np.e**(-eps) * p1**(alpha / (alpha - 1))
        upper = (np.e**eps * p2)**((alpha - 1) / alpha)
    else:
        if agg_res_param is not None:
            mgf_diff_list, varis_p1, varis_p2 = agg_res_param[
                'mgf_diff_list'], agg_res_param['varis_p1_p2'][
                    0], agg_res_param['varis_p1_p2'][1]

            def moments(order, mean, varis):
                from sympy import symbols
                t, mu, sigma = symbols('t, mu, sigma')
                return mgf_diff_list[order].evalf(subs={
                    t: 0,
                    mu: mean,
                    sigma: varis
                })

            a1a = (alpha - 1) / alpha
            aa1 = round(alpha / (alpha - 1))
            upper_moments = moments(aa1, p2, varis_p2)
            upper = np.e**(eps * a1a) * upper_moments**a1a
            lower = np.e**(-eps) * p1**aa1

            # def moments_bounds(agg_res, order):
            #     agg_res_pow = np.power(agg_res, order)
            #     return single_ci(agg_res_pow, 1e-5)

            # p1_agg_res = agg_res[:, p1_idx]
            # p2_agg_res = agg_res[:, p2_idx]
            # _, l1, _ = moments_bounds(p1_agg_res, (alpha-1)/alpha)
            # _, _, u2 = moments_bounds(p2_agg_res, alpha/(alpha-1))

            # if l1 == 1 or u2 == 0:
            #     p1_agg_res = np.longdouble(agg_res[:, p1_idx])
            #     p2_agg_res = np.longdouble(agg_res[:, p2_idx])
            #     _, l1, _ = moments_bounds(p1_agg_res, (alpha-1)/alpha)
            #     _, _, u2 = moments_bounds(p2_agg_res, alpha/(alpha-1))

            # lower = np.e**(-eps) * l1**(alpha/(alpha-1))
            # upper = (np.e**eps * u2)**((alpha-1)/alpha)
        else:
            lower = np.e**(-eps) * p1**(alpha / (alpha - 1))
            upper = (np.e**eps * p2)**((alpha - 1) / alpha)

    if clip:
        return min(max(lower, 0), 1), max(min(upper, 1), 0)
    else:
        return lower, upper