Tensorflow Federated 如何从服务器更新模型

How does Tensorflow Federated update model from server

Tensorflow 的新手,所以不确定这是否是 Tensorflow Federated 的特定问题。

我正在研究 code 中联邦学习的对抗性攻击。我很好奇从服务器接收到的权重是如何在客户端更新的。

例如,这里是 'benign' 更新的代码:

@tf.function
def compute_benign_update():
  """compute benign update sent back to the server."""
  tf.nest.map_structure(lambda a, b: a.assign(b), model_weights,
                        initial_weights)

  num_examples_sum = benign_dataset.reduce(initial_state=tf.constant(0),
                                           reduce_func=reduce_fn)

  weights_delta_benign = tf.nest.map_structure(lambda a, b: a - b,
                                               model_weights.trainable,
                                               initial_weights.trainable)

  aggregated_outputs = model.report_local_outputs()
  return weights_delta_benign, aggregated_outputs, num_examples_sum

我可以看到从服务器收到的初始权重分配给 model_weights 然后 reduce_fn 用于在本地客户端上训练一批数据。

@tf.function
def reduce_fn(num_examples_sum, batch):
  """Runs `tff.learning.Model.train_on_batch` on local client batch."""
  with tf.GradientTape() as tape:
    output = model.forward_pass(batch)
  gradients = tape.gradient(output.loss, model.trainable_variables)
  optimizer.apply_gradients(zip(gradients, model.trainable_variables))
  return num_examples_sum + tf.shape(output.predictions)[0]

在此函数中进行训练并且(我认为)model.trainable_variables 已更新。对我来说没有意义的部分是 weights_delta_benign 的计算方式:

weights_delta_benign = tf.nest.map_structure(lambda a, b: a - b,
                                             model_weights.trainable,
                                             initial_weights.trainable)

好像是利用了model_weights.trainableinitial_weights.trainable的区别,但是我们原来在compute_benign_update()函数的第一行不就把这些设置成相等了吗?我假设 reduce_fn 以某种方式改变了 initial_weights 但我没有看到 reduce 函数中使用的 model.trainable_variablesinitial_weights.trainable_variables.

之间的联系

谢谢,感谢任何帮助!

在您指向的代码中,initial_weights 只是值的集合(tf.Tensor 对象),而 model_weights 是对 model 的引用变量(tf.Variable 个对象)。我们使用 initial_weights 将初始值分配给模型的变量。

然后,在对 optimizer.apply_gradients(zip(gradients, model.trainable_variables)) 的调用中,您只需修改模型的变量。 (model.trainable_variables,指的是与 model_weights.trainable 相同的对象。我承认,这有点令人困惑。)

因此 weights_delta_benign 的后续计算是计算客户训练过程结束时和开始时模型的可训练变量之间的差异。