TFF 中的再现性、控制随机性、操作员级随机性
Reproducibility, Controlling Randomness, Operator-level Randomness in TFF
我有一个 TFF 代码,它在不同的运行中训练时采用略微不同的优化路径,尽管已经设置了所有运算符级别的种子,每轮中用于采样客户端的 numpy 种子等。FAQ section on TFF website确实谈到了 TFF 中的随机性和期望,但我发现答案有点令人困惑。是不是随机性的某些方面即使在设置了所有可以控制的操作员级种子之后也不能直接控制?因为无法控制子会话的开始和结束方式?
更具体地说,这些是我的代码已经设置的所有运算符级种子:dataset.shuffle, create_tf_dataset_from_all_clients, keras.initializers
和 np.random.seed
用于每轮客户端采样(使用 numpy)。我已经验证初始模型状态在运行中是相同的,但是一旦训练开始,模型状态就开始在不同的运行中出现分歧。在大多数情况下,差异是 gradual/slow,但并非总是如此。
代码比较复杂,这里就不加了。
还有一个很难控制的 non-determinism 来源 -- float32
数字的总和不可交换。
当您在一轮中模拟多个客户端时,TFF 执行器无法控制模型更新添加在一起的顺序。因此,float32
范围的底部可能存在一些差异。虽然这听起来可以忽略不计,但它可以在多轮中累加起来(我已经见过数百次,但也可能更少),并最终导致不同的 loss/accuracy/model 权重轨迹,因为梯度将开始以略微不同点。
顺便说一句,this tutorial 有更多关于控制 TFF 随机性的最佳实践的信息。
我有一个 TFF 代码,它在不同的运行中训练时采用略微不同的优化路径,尽管已经设置了所有运算符级别的种子,每轮中用于采样客户端的 numpy 种子等。FAQ section on TFF website确实谈到了 TFF 中的随机性和期望,但我发现答案有点令人困惑。是不是随机性的某些方面即使在设置了所有可以控制的操作员级种子之后也不能直接控制?因为无法控制子会话的开始和结束方式?
更具体地说,这些是我的代码已经设置的所有运算符级种子:dataset.shuffle, create_tf_dataset_from_all_clients, keras.initializers
和 np.random.seed
用于每轮客户端采样(使用 numpy)。我已经验证初始模型状态在运行中是相同的,但是一旦训练开始,模型状态就开始在不同的运行中出现分歧。在大多数情况下,差异是 gradual/slow,但并非总是如此。
代码比较复杂,这里就不加了。
还有一个很难控制的 non-determinism 来源 -- float32
数字的总和不可交换。
当您在一轮中模拟多个客户端时,TFF 执行器无法控制模型更新添加在一起的顺序。因此,float32
范围的底部可能存在一些差异。虽然这听起来可以忽略不计,但它可以在多轮中累加起来(我已经见过数百次,但也可能更少),并最终导致不同的 loss/accuracy/model 权重轨迹,因为梯度将开始以略微不同点。
顺便说一句,this tutorial 有更多关于控制 TFF 随机性的最佳实践的信息。