公众号关注 “视学算法”

设为“星标”,第一时间知晓最新干货~

转自:机器之心

参与:魔王、陈萍

诞生五年的 TensorFlow 出现大 bug,使用对应训练方式得到的模型甚至论文结果可能受到波及,然而相关 issue 提交 24 天后依然没有 TensorFlow 开发团队的处理。用户表示很失望,「怒而转用 PyTorch」。在事情发酵后,TensorFlow 团队终于回复了,表示已经在改,但对应的功能将在 2.4 版本中才能用。

谷歌团队 2015 年发布的 TensorFlow 框架是目前机器学习领域最流行的框架之一。虽然后起之秀 PyTorch 奋起直追,但 TensorFlow 框架的使用者仍然众多。

TensorFlow 经常被吐槽难用、新版本也常常收到差评,但不管怎样,已经诞生五年之久的 TensorFlow 应该不会有什么太大的 bug 吧?然而,事实似乎并非如此。

最近,机器学习工程师 Santosh Gupta 在使用 TensorFlow 时发现了一个问题:使用 Keras 功能 API 创建的模型自定义层中的权重无法进行梯度更新。

issue 详情:https://github.com/tensorflow/tensorflow/issues/40638

这个帖子在 reddit 上引起了热议,网友纷纷表示:「这是在逼我用 PyTorch!」

1

到底是什么惊天大 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-accessnot 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-accesstrainable_variables))if isinstance(optimizer, lso.LossScaleOptimizer):gradients = optimizer.get_unscaled_gradients(gradients)gradients = optimizer._clip_gradients(gradients)  # pylint: disable=protected-accessif 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 行代码就可以进行测试。

2

最新动向:引发热议后,谷歌回复

在 Francois Chollet 发推一小时后,谷歌工程师、TensorFlow 贡献者 Tomer Kaftan 在 GitHub 上回复了该 issue:

目前,TensorFlow 的情况是这样的:如果第一个参数中的所有输入来自其他 Keras 层,则当前层进入「functional api construction」模式。但是,你的第一个位置参数输入中包含 None,因此,无法触发「functional api construction」模式。

这导致该层与外部功能模型产生内联(inlined),而不是正确地被纳入外部模型。你可以更改层 API,排除掉输入中的 Nones,这样就可以解决该问题。

功能 API 的主要 cleanup/refactoring 已经大部分完成,以使功能 API 触发机制更加清晰(即使输入中出现任意符号值),并解决其他的一些 issue。但是,该功能将在 TensorFlow 2.4 版本中出现。

对此,issue 发起者 Santosh Gupta 表示同意:

3

网友:震惊,这是逼我用 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/ 

TensorFlow惊现大bug?网友:这是逼着我们用PyTorch啊!相关推荐

  1. TensorFlow惊现大bug?网友:这是逼着我们用PyTorch啊

    诞生五年的 TensorFlow 出现大 bug,使用对应训练方式得到的模型甚至论文结果可能受到波及,然而相关 issue 提交 24 天后依然没有 TensorFlow 开发团队的处理.用户表示很失 ...

  2. 京东末位淘汰 10% 高管 ;聊天宝惊现大 Bug:用户可提现百万;斗鱼回应“人去楼空” | 极客头条...

    「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有料的新闻资讯,让所有技术人,时刻紧跟业界潮流. 快讯速知 京 ...

  3. Log4j2惊现大漏洞? 开源维护者越来越难?

    Log4j2惊现大漏洞? 开源维护者越来越难? 作者:Filippo Valsorda 编译:郭露 原文链接:https://blog.filippo.io/professional-maintain ...

  4. 尴尬!OpenAI惊现大漏洞,一张手写纸条竟瞒过计算机视觉系统

    作者 | Carol 出品 | CSDN(ID:CSDNnews) 第一反应:这字是什么颜色? 正确答案:这两个字的颜色是黄色. 有没有第一反应是"红色"的小伙伴?恭喜你,你阅读文 ...

  5. Windows 多个系统版本惊现大漏洞,攻击者可随意操作程序!

    整理 | 伍杏玲 出品 | CSDN(ID:CSDNnews) 之前在文章Windows 7,难说再见中提到,即使离Windows 7退役时间还有不到200天,可截至到三月份,仍有35.63%的用户使 ...

  6. 我的世界服务器无限小号,我的世界惊现全新无限刷物品bug 服主大大都要注意了...

    来源:游戏园日期:2019-06-22 04:04:15 我的世界惊现全新无限刷物品bug 服主大大都要注意了.那今天给大家分享一个玩家无意间发现的新的无限刷物品bug,而且还是在服务器中哦!那感兴趣 ...

  7. 我的世界服务器怎么使用无限附魔bug,我的世界惊现全新无限刷物品bug 服主大大都要注意了...

    我的世界惊现全新无限刷物品bug 服主大大都要注意了.那今天给大家分享一个玩家无意间发现的新的无限刷物品bug,而且还是在服务器中哦!那感兴趣的玩家不妨进来看看哦! 在一个rpg服务器玩 开小号召唤b ...

  8. 我的世界服务器伤害增加bug,我的世界惊现全新无限刷物品bug 服主大大都要注意了...

    来源:游戏园日期:2019-06-22 04:04:15 我的世界惊现全新无限刷物品bug 服主大大都要注意了.那今天给大家分享一个玩家无意间发现的新的无限刷物品bug,而且还是在服务器中哦!那感兴趣 ...

  9. 王者荣耀服务器维护中有什么漏洞,王者荣耀:排位惊现漏洞,利用这个BUG一天上王者,三天登荣耀...

    原标题:王者荣耀:排位惊现漏洞,利用这个BUG一天上王者,三天登荣耀 玩王者荣耀最让人头疼的事情是什么?不是上不去王者,而是在某个段位一直上下徘徊,相信有99%的玩家赞同小编的这种说法,因为往往在你连 ...

最新文章

  1. 2022-2028年中国电力行业节能减排投资分析及前景预测报告
  2. seaborn将图例放置在图像外部并使用move_legend函数将图例(legend)放置在图像的顶部、且单行展开显示
  3. linux安装磁盘分区设置,Linux安装与磁盘分区.doc
  4. 如何存储 Git 大文件?
  5. struts.properties文件
  6. java如何去掉html标签_Java后端去掉HTML标签获取纯文本-Fun言
  7. mysql8.0 tar安装_CentOS7安装MySQL8.0 tar包
  8. HTML高仿哔哩哔哩(B站)视频网站整站模板
  9. linux安装thrift
  10. Python入门--以主程序的方式运行,if __name__==‘__main__‘
  11. 接口和一些抽象类的区别
  12. 《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果及其他。
  13. python-基础-面向对象2-异常-模块工厂模式
  14. 运用jmeter做接口与性能测试
  15. 软件测试bug文章,软件测试技术之说一个让你印象最深的bug?
  16. 【Proteus】多功能数字时钟设计
  17. 训练记录番外篇(2):2022 ICPC Gran Premio de Mexico 2da Fecha
  18. UG903中文文档分享(拒绝套路) | xilinx
  19. 数据结构 :: 顺序栈与链式栈的设计与实现
  20. 利用ipv6技术,废旧笔记本变成互联网server

热门文章

  1. 【第23周复盘】懒癌犯了,拖到今天!
  2. 冬奥会夺金的背后杀手锏,竟是位 AI 虚拟教练
  3. 从飞天到倚天 阿里云底层自研技术大爆发
  4. 对标Oculus Quest2,爱奇艺奇遇VR打的什么牌?
  5. 自动化神经网络理论进展缓慢,AutoML算法的边界到底在哪?
  6. 了解这4个重点,带你探索未来将如何设计智能系统和机器人!
  7. 前端也能玩转机器学习?Google Brain 工程师来支招
  8. 对标英伟达,依图发布AI芯片“求索”
  9. 自动驾驶公司Momenta完成超2亿美元融资,估值超10亿美元
  10. 特斯拉“国王”王权不保