TensorFlow惊现大bug?网友:这是逼着我们用PyTorch啊
誕生五年的 TensorFlow 出現(xiàn)大 bug,使用對應(yīng)訓(xùn)練方式得到的模型甚至論文結(jié)果可能受到波及,然而相關(guān) issue 提交 24 天后依然沒有 TensorFlow 開發(fā)團(tuán)隊(duì)的處理。用戶表示很失望,「怒而轉(zhuǎn)用 PyTorch」。在事情發(fā)酵后,TensorFlow 團(tuán)隊(duì)終于回復(fù)了,表示已經(jīng)在改,但對應(yīng)的功能將在 2.4 版本中才能用。
谷歌團(tuán)隊(duì) 2015 年發(fā)布的 TensorFlow 框架是目前機(jī)器學(xué)習(xí)領(lǐng)域最流行的框架之一。雖然后起之秀 PyTorch 奮起直追,但 TensorFlow 框架的使用者仍然眾多。
TensorFlow 經(jīng)常被吐槽難用、新版本也常常收到差評,但不管怎樣,已經(jīng)誕生五年之久的 TensorFlow 應(yīng)該不會有什么太大的 bug 吧?然而,事實(shí)似乎并非如此。
最近,機(jī)器學(xué)習(xí)工程師 Santosh Gupta 在使用 TensorFlow 時發(fā)現(xiàn)了一個問題:使用 Keras 功能 API 創(chuàng)建的模型自定義層中的權(quán)重?zé)o法進(jìn)行梯度更新。
issue 詳情:https://github.com/tensorflow/tensorflow/issues/40638
這個帖子在 reddit 上引起了熱議,網(wǎng)友紛紛表示:「這是在逼我用 PyTorch!」
到底是什么驚天大 bug?
那么這個令人震驚的 bug 到底是什么呢?
Santosh Gupta 對此的描述是:由于 Tensorflow 的缺陷,阻止了 Keras 功能 API 創(chuàng)建模型的自定義層中權(quán)重的梯度更新,從而使這些權(quán)重基本上保持無法更新狀態(tài)。
而我們都知道,梯度更新對于訓(xùn)練神經(jīng)網(wǎng)絡(luò)來說相當(dāng)重要,它是保證模型正常訓(xùn)練的前提。
對于使用自定義圖層功能性 API 的研究人員來說,他們往往會運(yùn)行下列程序:
for i, var in enumerate(model.trainable_variables): print(model.trainable_variables[i].name)
這個程序會保存你的訓(xùn)練權(quán)重。而 Tensorflow 中出現(xiàn)的這個 bug,導(dǎo)致使用者在功能性 API 中使用自定義圖層時 trainable_variables 缺少權(quán)重。同樣地,這些權(quán)重在 non_trainable_variables 也會消失。
但是,如果這些權(quán)重不在可訓(xùn)練變量中,則必須凍結(jié)這些權(quán)重,因?yàn)橹挥羞@些權(quán)重才會接收梯度更新,如下面的 Keras 模型訓(xùn)練代碼所示:
gradients = tape.gradient(loss, trainable_variables) # Whether to aggregate gradients outside of optimizer. This requires support # of the optimizer and doesn't work with ParameterServerStrategy and # CentralStroageStrategy. aggregate_grads_outside_optimizer = ( optimizer._HAS_AGGREGATE_GRAD and # pylint: disable=protected-access not isinstance(strategy.extended, parameter_server_strategy.ParameterServerStrategyExtended)) if aggregate_grads_outside_optimizer: # We aggregate gradients before unscaling them, in case a subclass of # LossScaleOptimizer all-reduces in fp16. All-reducing in fp16 can only be # done on scaled gradients, not unscaled gradients, for numeric stability. gradients = optimizer._aggregate_gradients(zip(gradients, # pylint: disable=protected-access trainable_variables)) if isinstance(optimizer, lso.LossScaleOptimizer): gradients = optimizer.get_unscaled_gradients(gradients) gradients = optimizer._clip_gradients(gradients) # pylint: disable=protected-access if trainable_variables: if aggregate_grads_outside_optimizer: optimizer.apply_gradients( zip(gradients, trainable_variables), experimental_aggregate_gradients=False) else: optimizer.apply_gradients(zip(gradients, trainable_variables))
通過 Colab gist [1],你可以看到此 bug。
針對上述 bug,也有研究者提出了解決方案。
一種解決方法是改用 Keras 子類創(chuàng)建模型。模型子類化導(dǎo)致所有權(quán)重出現(xiàn)在 trainable_variables 中。為了確保功能性 API 和子類模型完全相同,研究人員在每個筆記本底部使用相同的輸入對它們進(jìn)行推論。模型的輸出完全相同。但是使用功能性 API 模型進(jìn)行訓(xùn)練會將許多權(quán)重視為凍結(jié)。
針對此帖,Keras 之父、谷歌軟件工程師 Francois Chollet 也不淡定了。
他表示,「如果第三方寫的代碼有 bug,且涉及到了 Keras 模型,這并不意味著『Keras 就有 bug』。」
此外,他認(rèn)為:跟蹤自定義圖層中訓(xùn)練參數(shù)的效果非常好,只需要 7 行代碼就可以進(jìn)行測試。
最新動向:引發(fā)熱議后,谷歌回復(fù)
在 Francois Chollet 發(fā)推一小時后,谷歌工程師、TensorFlow 貢獻(xiàn)者 Tomer Kaftan 在 GitHub 上回復(fù)了該 issue:
目前,TensorFlow 的情況是這樣的:如果第一個參數(shù)中的所有輸入來自其他 Keras 層,則當(dāng)前層進(jìn)入「functional api construction」模式。但是,你的第一個位置參數(shù)輸入中包含 None,因此,無法觸發(fā)「functional api construction」模式。
這導(dǎo)致該層與外部功能模型產(chǎn)生內(nèi)聯(lián)(inlined),而不是正確地被納入外部模型。你可以更改層 API,排除掉輸入中的 Nones,這樣就可以解決該問題。
功能 API 的主要 cleanup/refactoring 已經(jīng)大部分完成,以使功能 API 觸發(fā)機(jī)制更加清晰(即使輸入中出現(xiàn)任意符號值),并解決其他的一些 issue。但是,該功能將在 TensorFlow 2.4 版本中出現(xiàn)。
對此,issue 發(fā)起者 Santosh Gupta 表示同意:
網(wǎng)友:震驚,這是逼我用 PyTorch!
在這篇帖子的評論中,有網(wǎng)友復(fù)現(xiàn)了這個 bug,并表示震驚:「這個 bug 到底存在多久了?!這是不是意味著用這種方式訓(xùn)練的每一個模型都失效了,基于這些模型的每一篇研究論文的結(jié)果也會被拖累?!?/p>
此外,該網(wǎng)友對 TensorFlow 開發(fā)者的維護(hù)效率也表示質(zhì)疑:
Git issue 顯示 23 天前就有 TensorFlow 開發(fā)者承認(rèn)了這個 bug 的存在,并將該 issue 指定給另一位開發(fā)者,而被指定者并沒有查看這個 issue。
這就像一家食品公司 23 天就發(fā)現(xiàn)自己的產(chǎn)品中存在大腸桿菌,但是這么多天過去了他們啥都沒干。
我見過很多對 TensorFlow 的抱怨,但是之前從未聽到過這樣的事情。
這件事也引發(fā)了開發(fā)者們對 TensorFlow 甚至谷歌產(chǎn)品的吐槽:
作為谷歌曾經(jīng)的擁躉,現(xiàn)在我對它的所有產(chǎn)品感到厭倦。所有事情都半途而廢,看不到完成的可能性,也看不到對用戶的關(guān)注。
TensorFlow 真是糟糕透了。開發(fā)團(tuán)隊(duì)意識到 PyTorch 正在搶奪他們的用戶,但他們?nèi)院鸵酝粯影胪径鴱U,沒有將資源或 Keras 置于優(yōu)先級較高的位置,因?yàn)樗麄儍?nèi)部并不使用。文檔也很糟糕,是因?yàn)槿魏斡凶宰鹦牡墓こ處煻疾幌霝閷憙?yōu)秀的文檔費(fèi)心嗎?
然而,競爭對手 PyTorch 的文檔可讀性就很強(qiáng),PyTorch 官方甚至還提供了限時免費(fèi)的權(quán)威官方教程書籍。
或許有一天谷歌也會出現(xiàn)一位像薩提亞 · 納德拉那樣的人物,改變谷歌的內(nèi)部文化,更加關(guān)注用戶和產(chǎn)品。而現(xiàn)在,谷歌只是停留在廣告業(yè)務(wù)帶來的收益上吃老底,這使得他們忽略了自己在幾乎其他所有業(yè)務(wù)上的無能。
即便在事情引發(fā)熱議后 TensorFlow 團(tuán)隊(duì)進(jìn)行了回復(fù),但這個 bug 仍有可能對 TensorFlow 造成影響。
下面這句評論或許最能反映廣大開發(fā)者的心態(tài):
「這將破壞用戶對 TensorFlow 的信任,可能有更多的開發(fā)者轉(zhuǎn)用 PyTorch。」
原文鏈接:https://new.qq.com/omn/20200715/20200715A0ION100.html
總結(jié)
以上是生活随笔為你收集整理的TensorFlow惊现大bug?网友:这是逼着我们用PyTorch啊的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 智能驾驶继续突破,国内国外技术进入深水区
- 下一篇: C#学习路线