内容简介:谷歌团队 2015 年发布的TensorFlow框架是目前机器学习领域最流行的框架之一。虽然后起之秀 PyTorch 奋起直追,但TensorFlow框架的使用者仍然众多。TensorFlow经常被吐槽难用、新版本也常常收到差评,但不管怎样,已经诞生五年之久的TensorFlow应该不会有什么太大的 bug 吧?然而,事实似乎并非如此。最近,机器学习工程师 Santosh Gupta 在使用TensorFlow时发现了一个问题:
谷歌团队 2015 年发布的TensorFlow框架是目前机器学习领域最流行的框架之一。虽然后起之秀 PyTorch 奋起直追,但TensorFlow框架的使用者仍然众多。
TensorFlow经常被吐槽难用、新版本也常常收到差评,但不管怎样,已经诞生五年之久的TensorFlow应该不会有什么太大的 bug 吧?然而,事实似乎并非如此。
最近,机器学习工程师 Santosh Gupta 在使用TensorFlow时发现了一个问题: 使用 Keras 功能 API 创建的模型自定义层中的权重无法进行梯度更新。
issue 详情:https://github.com/tensorflow/tensorflow/issues/40638
这个帖子在 reddit 上引起了热议,网友纷纷表示:「这是在逼我用 PyTorch!」
到底是什么惊天大 bug?
那么这个令人震惊的 bug 到底是什么呢?
Santosh Gupta 对此的描述是:由于 Tensorflow 的缺陷,阻止了 Keras 功能 API 创建模型的自定义层中权重的梯度更新,从而使这些权重基本上保持无法更新状态。
而我们都知道,梯度更新对于训练神经网络来说相当重要,它是保证模型正常训练的前提。
对于使用自定义图层功能性 API 的研究人员来说,他们往往会运行下列程序:
for i, var in enumerate(model.trainable_variables): print(model.trainable_variables[i].name)
这个程序会保存你的训练权重。而 Tensorflow 中出现的这个 bug,导致使用者在功能性 API 中使用自定义图层时 trainable_variables 缺少权重。同样地,这些权重在 non_trainable_variables 也会消失。
但是,如果这些权重不在可训练变量中,则必须冻结这些权重,因为只有这些权重才会接收梯度更新,如下面的 Keras 模型训练代码所示:
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 子类创建模型。模型子类化导致所有权重出现在 trainable_variables 中。为了确保功能性 API 和子类模型完全相同,研究人员在每个笔记本底部使用相同的输入对它们进行推论。模型的输出完全相同。但是使用功能性 API 模型进行训练会将许多权重视为冻结。
针对此帖,Keras 之父、谷歌软件工程师 Francois Chollet 也不淡定了。
他表示,「 如果第三方写的代码有 bug,且涉及到了 Keras 模型,这并不意味着『Keras 就有 bug』。 」
此外,他认为:跟踪自定义图层中训练参数的效果非常好,只需要 7 行代码就可以进行测试。
最新动向:引发热议后,谷歌回复
在 Francois Chollet 发推一小时后,谷歌工程师、TensorFlow贡献者 Tomer Kaftan 在 GitHub 上回复了该 issue:
目前,TensorFlow的情况是这样的:如果第一个参数中的所有输入来自其他 Keras 层,则当前层进入「functional api construction」模式。但是,你的第一个位置参数输入中包含 None,因此,无法触发「functional api construction」模式。
这导致该层与外部功能模型产生内联(inlined),而不是正确地被纳入外部模型。你可以更改层 API,排除掉输入中的 Nones,这样就可以解决该问题。
功能 API 的主要 cleanup/refactoring 已经大部分完成,以使功能 API 触发机制更加清晰(即使输入中出现任意符号值),并解决其他的一些 issue。但是,该功能将 在TensorFlow2.4 版本中出现。
对此,issue 发起者 Santosh Gupta 表示同意:
网友:震惊,这是逼我用 PyTorch!
在这篇帖子的评论中,有网友复现了这个 bug,并表示震惊:「 这个 bug 到底存在多久了?!这是不是意味着用这种方式训练的每一个模型都失效了,基于这些模型的每一篇研究论文的结果也会被拖累。 」
此外,该网友对TensorFlow开发者的维护效率也表示质疑:
Git issue 显示 23 天前就有TensorFlow开发者承认了这个 bug 的存在,并将该 issue 指定给另一位开发者,而被指定者并没有查看这个 issue。
这就像一家食品公司 23 天就发现自己的产品中存在大肠杆菌,但是这么多天过去了他们啥都没干。
我见过很多对TensorFlow的抱怨,但是之前从未听到过这样的事情。
这件事也引发了开发者们对TensorFlow甚至谷歌产品的吐槽:
作为谷歌曾经的拥趸,现在我对它的所有产品感到厌倦。所有事情都半途而废,看不到完成的可能性,也看不到对用户的关注。
TensorFlow真是糟糕透了。开发团队意识到 PyTorch 正在抢夺他们的用户,但他们仍和以往一样半途而废,没有将资源或 Keras 置于优先级较高的位置,因为他们内部并不使用。文档也很糟糕,是因为任何有自尊心的工程师都不想为写优秀的文档费心吗?
然而,竞争对手 PyTorch 的文档可读性就很强,PyTorch 官方甚至还提供了限时免费的权威官方教程书籍。
或许有一天谷歌也会出现一位像萨提亚 · 纳德拉那样的人物,改变谷歌的内部文化,更加关注用户和产品。而现在,谷歌只是停留在广告业务带来的收益上吃老底,这使得他们忽略了自己在几乎其他所有业务上的无能。
即便在事情引发热议后TensorFlow团队进行了回复,但这个 bug 仍有可能对TensorFlow造成影响。
下面这句评论或许最能反映广大开发者的心态:
「 这将破坏用户对TensorFlow的信任,可能有更多的开发者转用 PyTorch。 」
参考链接:
https://colab.research.google.com/gist/Santosh-Gupta/40c54e5b76e3f522fa78da6a248b6826/missingtrainablevarsinference_var.ipynb#scrollTo=28bP9FYpILJ9
https://www.reddit.com/r/MachineLearning/comments/hrawam/d_theres_a_flawbug_in_tensorflow_thats_preventing/
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- DeepFake疑遭审查,网友:此乃它“干爹”所为
- 网友对软件测试这个职位的6大误区
- Magento 2.3 更新,中国网友发布中文版
- 这是AI?这是爱?这是能全方位监控学生的“智能校服”
- 国产系统"强行"快于国外系统 网友:面对现实这么难?
- 杨幂换脸上热搜,1亿网友被AI骗了
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深入React技术栈
陈屹 / 人民邮电出版社 / 2016-11-1 / CNY 79.00
全面讲述React技术栈的第一本原创图书,pure render专栏主创倾力打造 覆盖React、Flux、Redux及可视化,帮助开发者在实践中深入理解技术和源码 前端组件化主流解决方案,一本书玩转React“全家桶” 本书讲解了非常多的内容,不仅介绍了面向普通用户的API、应用架构和周边工具,还深入介绍了底层实现。此外,本书非常重视实战,每一节都有实际的例子,细节丰富。我从这......一起来看看 《深入React技术栈》 这本书的介绍吧!