TensorFlow被曝存在嚴重bug,搭配Keras可能丟失權重
最近,一位從事 NLP 工程師 Gupta 發現了 TensorFlow 存在的一個嚴重 bug:
每個在自定義層中使用 Keras 函數式 API 的用戶都要注意了!使用用 Keras 的 Functional API 創建的權重,可能會丟失。
這一話題在 Reddit 機器學習板塊上被熱議,引起不少 TensorFlow 用戶共鳴。
具體來說,就是在 API 中使用自定義層,會導致 trainable_variables 中的權重無法更新。而且這些權重也不會放入 non_trainable_variables 中。
也就是說,原本需要訓練的權重現在被凍結了。
讓這位工程師感到不滿的是,他大約一個月前在 GitHub 中把這個 bug 報告給谷歌,結果谷歌官方到現在還沒有修復。
解決辦法
如何檢驗自己的代碼是否會出現類似問題呢?請調用 model.trainable_variables 來檢測自己的模型:
看看你所有的可變權重是否正確,如果權重缺失或者未發生變化,說明你也中招了。
Gupta 還自己用 Transformer 庫創建模型的 bug 在 Colab 筆記本中復現了,有興趣的讀者可以前去觀看。
https://colab.research.google.com/gist/Santosh-Gupta/40c54e5b76e3f522fa78da6a248b6826/missingtrainablevarsinference_var.ipynb
對此問題,Gupta 給出的一種解決方法是:改為使用 Keras 子類創建模型。改用此方法后,所有的權重都將出現在 trainable_variables 中。
為了絕對確保用函數式 API 和子類方法創建的模型完全相同,Gupta 在每個 Colab 筆記本底部使用相同的輸入對它們進行了推理,模型的輸出完全相同。
但是,使用函數式 API 模型進行訓練會將許多權重視為凍結,而且這些權重也沒有出現在 non_trainable_variables 中,因此無法為這些權重解凍。
為了檢查谷歌最近是否修復了該漏洞,Gupta 還安裝了 Nightly 版的 TF 2.3.0-rc1,保持框架處于最新狀態,但如今 bug 依然存在。
網友:還是用 PyTorch 吧
剛剛,Keras 創始人在 推ter 上回復,這不是 Keras 的 bug,并建議程序員使用單元測試。
對于 Gupta 所說的 bug,有網友說,他在 TensorFlow 和 Keras 之間傳遞權重的時候,出現了類似的錯誤,從此轉而使用 PyTorch。
另外還有不少網友也反映,谷歌的框架不太完善,管理方式一團糟,是在讓用戶幫他們測試 TensorFlow 的 bug。
反觀 PyTorch,說明文檔通俗易懂,最近官方還出了免費電子書,難道用 PyTorch 不香嗎?
你現在在使用哪種深度學習框架,你也遇到過類似的嚴重 bug 嗎?
原帖鏈接:
https://www.reddit.com/r/MachineLearning/comments/hrawam/d_theres_a_flawbug_in_tensorflow_thats_preventing/