我有一個 TFF 代碼,盡管設定了所有操作員級別的種子、用于在每一輪中采樣客戶端的 numpy 種子等,但在不同的運行中進行訓練時,其優化路徑略有不同。TFF 網站上的常見問題解答部分確實談到了隨機性和對 TFF 的期望,但我發現答案有點令人困惑。是不是即使設定了所有可以設定的操作員級別的種子,也無法直接控制隨機性的某些方面?因為無法控制子會話的開始和結束方式?
更具體地說,這些是我的代碼已經設定的所有操作員級別的種子:dataset.shuffle, create_tf_dataset_from_all_clients, keras.initializers以及np.random.seed每輪客戶端采樣(使用 numpy)。我已經驗證了初始模型狀態在運行中是相同的,但是一旦訓練開始,模型狀態就會在不同的運行中開始發散。在大多數情況下,分歧是漸進的/緩慢的,但并非總是如此。
代碼比較復雜,這里就不加了。
uj5u.com熱心網友回復:
還有一個非確定性的來源很難控制——float32數字的總和不是可交換的。
當您在一輪中模擬多個客戶端時,TFF 執行器無法控制模型更新添加在一起的順序。因此,該float32范圍的底部可能存在一些差異。雖然這聽起來可以忽略不計,但它可以加起來多輪(我見過數百輪,但也可能更少),并最終導致不同的損失/準確性/模型權重軌跡,因為梯度將開始計算不同的點。
順便說一句,本教程有更多關于控制 TFF 隨機性的最佳實踐的資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/464829.html
下一篇:ValueError:層“lstm”的輸入0與層不兼容:預期ndim=3,發現ndim=2。收到的完整形狀:(無,1024)
