作为目前最普及的深度学习框架,TensorFlow 实不必多做介绍。
无论国内国外,有相当数量的程序员以 TensorFlow 入门深度学习开发,逐步走上职业机器学习工程师的道路。然而,TensorFlow 有一定的使用门槛。不管是编程范式,还是数学统计基础,都为非机器学习与数据科学背景的伙伴们带来一定的上手难度,更不要提处理不同任务时需面对的各类算法模型。
鉴于此,雷锋网采访了 ThoughtWorks 高级咨询师佟达、数据架构师白发川,两位嘉宾将与大家分享新手入门 TensorFlow 容易遇到的一些问题,以及他们的入门经历与使用体验。详见下文。
嘉宾介绍
佟达,哈工大信息与通信工程硕士,在校时获得美国数学竞赛建模一等奖。当年加入 TW 咨询团队时,创下最年轻成员的记录。现任 ThoughtWorks 高级咨询师,中国区数据团队资深技术专家。
白发川,ThoughtWorks 数据架构师,深度学习框架 deeplearning.scala 贡献者。设计实现了金融、工业、互联网等多个领域的大数据平台建设和数据处理。
下面,我们来看两位老师对入门 Tensorflow 的建议,以及他们的经验之谈。
- 新手入门深度学习,选择 TensorFlow 有哪些益处?
佟达:首先,对于新手来说,TensorFlow 的环境配置包装得真心非常好。相较之下,安装 Caffe 要痛苦的多,如果还要再 CUDA 环境下配合 OpenCV 使用,对于新手来说,基本上不折腾个几天是很难搞定的。
其次,基于 TensorFlow 的教学资源非常多,中英文的都有,这对于新手也是非常有帮助的。Google 做社区非常有一套,在中国有专门的一群人,会在第一时间把 Google 的开发者相关的进展翻译成中文。
另外,由于有 Google 背书,TensorFlow 从长期演进来看,基本上可以保证这个技术不会昙花一现。对于一个深度学习新手来说,学习任何一个工具,都有成本,如果刚学会,这个工具就没人用了,这个沉没成本还是很高的。
白发川:TensorFlow 分为图和 session 两个部分,因为构建和执行在不同的阶段,所以很好的支持了模型的分布式,所以学习 TF 可以比较好的理解模型的分布式计算,另外 TF 支持直接从分布式文件系统,例如 HDFS 系统读取数据,所以可以说 TF 是接通机器学习和大数据的一个桥梁。
- 新人上手 TensorFlow 经常会遇到哪些问题或困难?
佟达:第一个困难应该是来自编程范式的变化,因为 TensorFlow 是声明式开发方式,通过 Session 真正执行程序,这和常见的开发语言编程范式不太一样。如果是曾经有过函数式编程的 Lazy Evaluation 经验,接受起来会好一点。
当掌握了基本的 TensorFlow 操作之后,就要使用 TensorFlow 做些真正有意义的事情。这时候的一大困难在于,TensorFlow 的报错信息不那么直观,如果执行出错,新手很难从一大堆调用栈中找到有用的信息。
白发川:首选遇到的应该是数学的知识,TF 本身是一个深度学习的框架,和我们常规的程序框架例如 Spring,Hibernate 之类的框架定位不太一样,会偏向数学部分一点,例如矩阵计算,求导等,虽然 TF 已经封装了对应的计算的 API,但是我们还是需要知道这些概念性的知识,这样才知道应该用什么 API。
其次 TF 通过图的构建和计算部分分离实现模型的分布式,这一块的理解对初学者来说有时候也不太容易。
- 学习遇到困难之后,有哪些途径可以寻求帮助?
佟达:如果身边有人可以提供指导,直接寻求帮助一定是最有效的。如果身边没有这样的人可以提供帮助,那么 StackOverflow 是在线寻求帮助的首选。Google 的 TensorFlow 开发团队会有人专门在 StackOverflow 上回答问题,当然除了 Google 的人,还有很多热心的开发者提供帮助,比如说我(笑)。
白发川:目前 TF 的中文资料相对匮乏,所以优先的参考途径肯定是 TF 的官方 doc 文档,目前极客学院对 TF 官方文档做了汉化翻译,不过相对会比官方的延后一点。
- 有没有推荐的学习资源?
佟达:资源太多了,比如 Udacity 的 Deep Learning 课程,Coursera 上的 Machine Learning 课程,还有 Stanford 提供的课程录像,比如 CS231n 和 CS224n。另外,被称为深度学习圣经的《Deep Learning》也在网上(http://deeplearningbook.org)免费提供。
白发川:Stanford 目前有很多针对机器学习的课程,例如 CS231N,还有针对 TF 的 CS20SI,这些都是很好的课程。
- 是否推荐新手从 Keras 入手?除 Keras,还有哪些适配 TensorFlow 的第三方工具推荐新手使用?
佟达:TensorFlow 的 API 比较底层,有时候要做一件很简单的事情,要写很多辅助代码。而 Keras 的接口设计非常简洁,做同样的事情,Keras 的代码大概是 TensorFlow 的三分之一到五分之一。不过我认为新手对两者都应该学习一下,这样对于理解原理更有帮助。事实上,我甚至推荐连 TensorFlow 都不用,先用纯 Python 自己做一个简单的神经网络。
除了 Keras 之外,tf slim,tflearn 等都是早期尝试简化 TensorFlow 的工具,不过自从 1.0 开始,TensorFlow 官方支持 Keras,估计以后 Keras 会成为主流。
另外,TensorBoard 是新手必须学会使用的,这个工具有非常好的可视化辅助工具,帮助工程师调试模型以及训练过程。tfdbg 是 1.0 之后发布的调试工具,可以在每一个 step 中实时查看数据变化。不过这个工具目前能做的还不多,而且还有性能问题,开调试模式和非调试模式内存相差好几倍,所以还有很大的提升空间。
白发川:Keras 相比 TF 来说封装的更好,可以说 API 更加工程化,所以如果说对于机器学习完全没有概念,Keras 是一个不错的选择。目前有很多围绕 TF 进行封装的框架或者工具,例如 Keras 本身就是对 TF 的包装,其次 TF Learn 等也可尝试。
- 能不能讲讲你们当初上手 TensorFlow 的经历?学习过程中都遇到了哪些困难,又是如何解决的?
佟达:我在使用 TensorFlow 之前,使用过其他一些机器学习 / 深度学习框架,比如主要用于语音识别的 Kaldi,图像识别的 Caffe,还有 Spark MLlib,DeepLearning4j 等。所以上手 TensorFlow 并没有带来特别大的困难。
当用 TensorFlow 做的事情越来越复杂之后,我开始尝试扩展 TensorFlow,比如写一些自定义的 Op。在 TensorFlow 中添加自定义 Op 需要用 C++ 实现,编译好之后,在 Python 里面讲动态库链接进来才能使用。这一过程还是有些复杂,尤其是 C++ 的代码有问题需要调试,需要使用 lldb(llvm 的 debug 工具,类似 gdb),这对开发这的要求比较高。另外 TensorFlow 的编译使用的是 Bazel,这是谷歌开源的一个多语言项目管理工具,要想把自定义的 Op 编译出来,还需要花点时间研究 Bazel。
实际上,Google 很成功的把 TensorFlow 封装的很好,开箱即用,然而,框架本身的复杂度还是很高,一旦你想要深入进去,还是需要下很大功夫。
白发川:TF 不是我接触的第一个深度学习框架。我是从大数据做起,到后来的开始用 Spark MLlib 做开发,也使用过 h2o 和 deeplearning4j 这些框架,最后才接触 TF 的。所以对于我来说,更多的是学习 TF 的 API 设计相关的改变,以及对比其他框架 TF 做了哪些差异化的地方。对于 API 这一块,直接参考 TF 的 Doc 就是最好的方法。
不过我可以介绍一下入门到机器学习的经历,我最开始的工作也是和大多数人一样,从事 web 开发,或者 mobile 的开发,所以我的情况应该和大多数人相同,后来我开始接触到机器学习的时候发现和之前的思维差别挺大的,首先在我们从事一般的像 mobile 之类的开发的时候,我们并不会关心什么是矩阵的逆,什么是函数的导数,更加不会关心什么是链式求导,而在机器学习里面,这些都是基础,所以我又重新捡回了大学的线性代数和微积分再次过了一遍。
TF 是个深度学习框架,所以使用 TF 的时候不可避免的要理解什么是隐层,什么是激活函数,激活函数有哪些,以及如何定义损失函数等等这一些概念,对于这一块我当时除了调研一些书籍外也通过看 stanford 的一些课程来学习,当然过程中也和很多同行进行交流和总结,特别是对于调参这一块,除了学习之外更多的需要自己进行实践。
- TensorFlow 升级到 1.0 版本之后,感觉到了哪些提升?
佟达:对我来说,TensorFlow 1.0 最重要的变化在于高阶 API,比如 Estimator,以及和 Keras 的集成,这些改变可以大幅度的减少我们构建模型的代码量。
另外,1.0 的 API 也经过了一些调整,这导致一些旧代码和新版本不兼容,不过从长期维护来看,1.0 的 API 有更好的一致性,对于开发者来说,还是利大于弊。
白发川:首先相比之前的版本,1.0 的速度肯定是变快了,这个官方也明确的提到了,并且也给出了一定的参考指标,TF 1.0 加入了 XLA,这也是为未来性能优化做的基础。
除了性能方面的体验外,在开发中,TF 的 API 进行的很大的修改,相比之前来说更加的人性化,感觉起来有点像 numpy 的感觉,所以如果不是 1.0 的代码,可能会不兼容,不过 TF 提供了转换的脚本,可以方便直接把代码转换到 1.0。
TF1.0 提供了调试工具 TFBDG,无论是大数据还是机器学习相关的开发,调试始终不是那么顺畅,而 1.0 提供的调试工具,可以说正在逐渐的弥补这一块,虽然目前还是有很多问题,不过已经有了很大的进步。
- 你们认为,目前 TensorFlow 有哪些局限性?其中又有哪些是开发者可以利用第三方工具克服的?
佟达:TensorFlow 的设计范式带来的一个天生限制就是在 TensorFlow 中,想要动态修改计算图比较困难。实际上动态修改计算图的需求并不少见,比如训练机器翻译或者聊天机器人的模型,句子长度不一样,计算图其实是不一样的。以前,要解决这个问题,就是设定一个比较长的输入长度,对于比较短的句子,填充一些占位字符。今年早些时候,TensorFlow 发布了一个工具,TensorFlow Fold,可以相对方便的动态修改计算图。不过总的来说,TensorFlow 在计算图的设计灵活性上还是有些欠缺。
白发川:目前来说,TF 要想发挥最大的效果,还是需要借助于 GPU,当然这并不算 TF 的局限,应该说所有数值计算的框架都有这个特点,对于这个目前大家的做法都是搭建自己的 GPU 集群,GOOGLE 甚至开发了自己的 GPU:TPU。
虽然大家都比较认可 TF 是工程化做的很好的深度学习框架,实际上它还是有一些门槛的,简单到 API 的设计,复杂到模型的训练和调参,其实还是是有一定门槛的,相比来说 Keras 的 API 设计更加直观化。
TF 虽然提供了 java 和 go 的 api,不过目前还不太成熟和稳定,所以对于开发语言,我还是推荐 python,或者说我建议大家想往这个方向学习的时候,尽量掌握 python 这门语言,在我们实际开发中,会有很多用处的。
- TensorFlow 在 ThoughtWorks 的业务中扮演了什么角色?对于公司进行产品开发,有没有更合适的选择?
佟达:TensorFlow 是 ThoughtWorks 目前在深度学习项目上的首选平台,因为它的工程化做的确实要比其他框架成熟,同时又和 Hadoop、Kubernetes 这些我们已经在很多项目中使用的工具兼容。
至于 “更合适”,现在还不太好下判断,Facebook 的 PyTorch 口碑很不错,MxNet 被 Amazon 和很多 IT 公司支持,而 Intel 的 BigDL 另辟蹊径,在 CPU 上优化深度学习,而且和 Spark 无缝集成,看起来对于已经使用云计算和大数据工具的公司来说吸引力也非常大。所以在深度学习框架这个领域,目前处于百花齐放的状态,最后谁会胜出,还不好说。
白发川:ThoughtWorks 有自己的机器学习团队,主要方向为大数据和人工智能,当然这两个方向的划分并不完全独立的,实际上在实际开发中我们是将两者结合,实现基于大数据下的人工智能,对于深度学习的框架,我们 spike 过目前存在的大多数框架,最终选择了 TF,所以我们的工作都是将 TF 工程化和市场化。
在选择对比了不同的框架之后,我们也比较明确现有框架的一些优缺点和局限,所以我们也研发了 TW 自己的深度学习框架:deeplearning.scala,框架本身是基于 scala 开发,具体的信息大家可以在 github 上看到,目前是开源的。
“TensorFlow & 神经网络算法高级应用班” 要开课啦!
雷锋网与跨国 IT 服务巨头 ThoughtWorks,联合举办线上培训课程 “TensorFlow & 神经网络算法高级应用班” 将上线 mooc.ai,特邀佟达、白发川两位老师向学员系统性地传道解惑。
你是否一直希望有个老司机能手把手带领入门?这就是一次好机会。
免费福利:下周,两位老师将以 “TensorFlow 在各场景的应用以及注意事项” 为主题,在雷锋网 APP 进行公开课直播。在培训开始之前,让大家对于 TensorFlow 能做什么以及实战流程,做个初步了解。时长一小时,免费观看答疑,敬请关注!
ThoughtWorks
授课方 ThoughtWorks 是全球领先的 IT 咨询公司,联合国妇女儿童组织、世界卫生组织合作伙伴。总部在芝加哥,42 个办公室分布在全球的 15 个国家。
2012 年,ThoughtWorks 排在 Google,Facebook 之前,被评为全球最难面试的公司。
2016 年,ThoughtWorks 力压群雄,获得全球 “最佳女性科技人员雇主” 奖项。
培训课介绍:
从初级到高级,理论 + 实战,一站式深度了解 TensorFlow!
本课程面向深度学习开发者,讲授如何利用 TensorFlow 解决图像识别、文本分析等具体问题。课程跨度为 10 周,将从 TensorFlow 的原理与基础实战技巧开始,一步步教授学员如何在 TensorFlow 上搭建 CNN、自编码、RNN、GAN 等模型,并最终掌握一整套基于 TensorFlow 做深度学习开发的专业技能。
两名授课老师佟达、白发川身为 ThoughtWorks 的资深技术专家,具有丰富的大数据平台搭建、深度学习系统开发项目经验。
开课时间:4 月 25 日(星期二)开课,每周二、四晚 20:00-21:00
开课时长:总学时 20 小时,分 10 周完成,每周 2 次,每次 1 个小时
线上授课,开放预约!
via 三川 (AI 研习社)