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.trainable
和initial_weights.trainable
的区别,但是我们原来在compute_benign_update()
函数的第一行不就把这些设置成相等了吗?我假设 reduce_fn
以某种方式改变了 initial_weights
但我没有看到 reduce 函数中使用的 model.trainable_variables
和 initial_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
的后续计算是计算客户训练过程结束时和开始时模型的可训练变量之间的差异。
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.trainable
和initial_weights.trainable
的区别,但是我们原来在compute_benign_update()
函数的第一行不就把这些设置成相等了吗?我假设 reduce_fn
以某种方式改变了 initial_weights
但我没有看到 reduce 函数中使用的 model.trainable_variables
和 initial_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
的后续计算是计算客户训练过程结束时和开始时模型的可训练变量之间的差异。