Tensorflow2.0 使用DP查询跟踪联合学习过程中的隐私保证

Tensorflow2.0 使用DP查询跟踪联合学习过程中的隐私保证,tensorflow2.0,tensorflow-federated,Tensorflow2.0,Tensorflow Federated,我对TFF有点陌生,我检查了github,并遵循EMNIST示例,使用DP-FedAvg算法训练了一个差异私有的联邦模型。这主要是通过将dp查询附加到aggregation\u进程然后训练联邦模型来完成的 我有一个问题: 1。鉴于将dp查询附加到聚合过程将导致参与者级别的中央dp,我如何在培训期间跟踪隐私保证(eps、delta? 下面是一个代码片段,其中设置了一个有100名参与者的差异私有联合模型,这就是为什么预期的总权重和预期的每轮客户数都设置为100的原因 def model_fn():

我对TFF有点陌生,我检查了github,并遵循EMNIST示例,使用
DP-FedAvg
算法训练了一个差异私有的联邦模型。这主要是通过将
dp查询
附加到
aggregation\u进程
然后训练联邦模型来完成的

我有一个问题:

1。鉴于将
dp查询
附加到聚合过程将导致参与者级别的中央dp,我如何在培训期间跟踪隐私保证(eps、delta?

下面是一个代码片段,其中设置了一个有100名参与者的差异私有联合模型,这就是为什么
预期的总权重
预期的每轮客户数
都设置为100的原因

def model_fn():
    keras_model = create_keras_model()
    return tff.learning.from_keras_model(
        keras_model=keras_model,
        loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
        input_spec=preprocessed_first_client_dataset.element_spec,
        metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])


dp_query = tff.utils.build_dp_query(
    clip=1.0,
    noise_multiplier=0.3,
    expected_total_weight=100,
    adaptive_clip_learning_rate=0,
    target_unclipped_quantile=0.5,
    clipped_count_budget_allocation=0.1,
    expected_clients_per_round=100
)


weights_type = tff.learning.framework.weights_type_from_model(model_fn)

aggregation_process = tff.utils.build_dp_aggregate_process(weights_type.trainable, dp_query)

iterative_process = tff.learning.build_federated_averaging_process(
    model_fn=model_fn,
    client_optimizer_fn=lambda: tf.keras.optimizers.SGD(0.1),
    server_optimizer_fn=lambda: tf.keras.optimizers.SGD(learning_rate=1.0),
    aggregation_process=aggregation_process
)
我在TF Privacy中遇到了几种计算epsilon和delta的方法,但它们似乎是为了跟踪传统的
DP-SGD
算法的隐私保证,并期望接收诸如
步骤
n
批量大小


事先非常感谢

有几种方法可以执行此计算。我们将在下面讨论两个选项

重新设计DPSGD分析工具 这些工具接受以DP-SGD设置命名的参数是正确的;但是,它们的参数可以以相当简单的方式重新映射到联邦设置

假设我们有来自的符号
apply\u dp\u sgd\u analysis
。我们可以编写一个简单的函数,基本上修改联邦设置的
compute\u dp\u sgd\u privacy
主体:


def compute_fl_隐私(轮数、噪声乘数、用户数、每轮用户数):
#这实际上假设了泊松子采样,这可能不太可能*
#在您的设置中是正确的,但无论哪种方式,近似值都应该很接近。
q=每轮用户数/num#u用户数#q-采样率。
#这些命令是从compute\u dp\u sgd\u privacy的主体内联的
订单=([1.25,1.5,1.75,2,2.25,2.5,3,3.5,4,4.5]+
列表(范围(5,64))+[128,256,512])
#根据默认情况下TFF代码是否使用自适应剪裁,
#您可能需要重新缩放噪波系数参数。
返回应用\u dp\u sgd\u分析(
q、 西格玛=噪音乘数,步长=轮数,订单=订单,增量=用户数**(-1))
使用TFP PrivacyLedger
如果您使用的是相对较新的(我建议在上面使用的DP过程中使用),您可以传递一个已经构造好的
DPQuery
,它可以用。这个分类账可以直接传递到一个函数中,比如,它应该跟踪每个查询调用所花费的隐私。

非常感谢您的回答,非常感谢,我正在尝试使用
DifferentialsPrivateFactory
应用
dp查询
,但我仍然坚持使用
值类型
,不确定放在那里的正确类型是什么,代码示例在下一个注释中,感谢您的建议,
factory=dp\u factory.DifferentilyPrivateFactory(dp\u查询)
value\u type=computation\u types.TensorType(dtype=tf.float32)
aggregation\u process=factory.create(value\u type)
迭代过程=tff.learning.build联合平均过程(model\u fn=model\u fn,client\u optimizer\u fn=lambda:tf.keras.optimizers.SGD(LR),server\u optimizer\u fn=lambda:tf.keras.optimizers.SGD(S\u LR),聚合过程=聚合过程)
model\u fn中的keras模型如下:
tf.keras.Sequential([layers.reforme((28,28,1),input_shape=(784,)),layers.Conv2D(16,8,strips=2,padding='same',activation='relu',input_shape=(28,28,1)),layers.MaxPool2D(32,4,strips=2,padding='valid='relu'),layers.MaxPool2D(2,1),layers.Dropout(0.2),layers.flatte(),layers.densite(单位=32,activation='relu'),tayers.densite(单位=10,activation='softmax'))
注:随着刚刚发布的tff中包含了关于
tff.aggregators
的新工作,构建学习任务DP聚合器的一种简单方法是使用is,而从
tensorflow privacy
包装任意
DPQuery
以用于tff的通用方法是通过is。