在Tensorflow中手动累加梯度时,我们应该将experimental_aggregate_gradients设置为False还是True?

Shall we set experimental_aggregate_gradients to False or True when manually accumulating gradients in Tensorflow?

我正在尝试使用 Python 3.8.5Tensorflow 2.2.0 中执行手动梯度累积。

我有一段代码,我在列表中收集了一系列渐变(总数 grads_total_number):grads_list 并使用以下代码进行累积:

avg_accum_grads=[]    
for grad_ind in range(grads_total_number):
        avg_accum_grads.append(tf.reduce_mean(grads_list[grad_ind], axis=0))

然后我打算通过我的优化器将这些梯度应用于我的模型:

myopt.apply_gradients(zip(avg_accum_grads, model.trainable_variables),experimental_aggregate_gradients=True)

,其中我的优化器是 Adam,定义为 tf.keras.optimizers.Adam

但是,由于文档 here,我很困惑是否必须将 experimental_aggregate_gradients 设置为 False。没看明白,这里我是手动累加的,如果是真的,会继续累加吗?

非常感谢任何帮助。

如果您使用的是分布式策略。即跨多个 GPU、多台机器或 TPU 进行分布式训练,然后 experimental_aggregate_gradients 参数就出现了。在分布式策略中,梯度是在每个副本上计算的,然后通过对它们求和来跨副本聚合。如果experimental_aggregate_gradients = True,则跨副本聚合将自行处理,如果experimental_aggregate_gradients = False,则必须手动处理。如果您不使用分布式策略,则设置 experimental_aggregate_gradients = TrueFalse 没有任何区别。

如果您查看 tf.distribute.Strategy 的文档,您会发现以下参数,

num_replicas_in_sync - Returns number of replicas over which gradients are aggregated.

总而言之,如果您使用 tf.distribute.Strategy 并且

  1. 如果experimental_aggregate_gradients = True,那么在不同副本中计算的梯度会自动聚合。
  2. 如果 experimental_aggregate_gradients = False,则用户有责任聚合来自不同副本的梯度。

默认情况下 experimental_aggregate_gradients 设置为 True。如果 TrueFalse 没有任何区别,除非使用 tf.distribute.Strategy.