TensorFlow 和 DMLC(分布式深度机器学习社区)这两个开源社区在今天围绕人工智能的计算机行业享有极大声誉。作为这两个开源项目的成员、目前任职 Uptake 数据科学家的唐源(Terry Tang)正在带领团队研发用于多个物联网垂直领域的数据科学引擎;同时,他也是开源软件社区内一位非常活跃的贡献者,是 TensorFlow、XGBoost、MXNet 等软件的 committer, 也是 Scikit Flow、ggfortify、metric-learn 等软件的作者。他曾因自己对开源社区的贡献而获得过谷歌 Open Source Peer Bonus,此外还获得过多项高校和企业编程竞赛的奖项。日前,机器之心对这位开源社区的活跃参与者进行了一次交流。他分享了自己在开源上的人生经历和经验,同时也呼吁大家能够更多地参与到开源项目的发展和建设中来。
唐源:我对自己参与过的项目都挺喜欢的,从中都学到特别多的东西,也认识了特别多的人。在这里我想简单谈谈我最近在做的 Scikit Flow,也就是现在被放在 TensorFlow.contrib 里面的 TF.Learn 模块,这是一开始我和谷歌的 Illia Polosukhin 一起建立的,现在由于被放在 TensorFlow 里面,谷歌的 TensorFlow 团队开始重视这个模块,也参与了它的发展,这个模块的目的是降低大家使用分布式机器学习和深度学习的门槛,让大家可以像使用 Python 里面的 Scikit-learn 那样很快地建立自己的机器学习和深度学习模型,比如说仅仅几行代码就能使用随机深林、深度神经网络等算法,而且可以很方便地部署到分布式的集群中,从而真正地使用到 TensorFlow 的分布式的优势。这些都是需要对低阶的 TensorFlow API 有深度的理解才能实现的一些功能。数据科学从事者没有必要为了使用最新的算法和技术又花许多时间来学习这些实现的细节,他们可以很快地直接将这些使用在工作和研究中。最近倾向于做这种能够简单易用,统一的界面,像 TensorFlow 这样的软件,有着自己独特的语法和使用方法,这迫使大家花时间学习,我觉得好的东西就应该有简单易用的使用方法。ggfortify 的构建初衷也比较类似,我们当时有太多的重复的代码来一遍又一遍实现同样的功能,比如说给聚类算法的结果用椭圆圈出集群的结果,又比如说对使用不同的 R 包生成的时间序列的分析结果进行可视化。ggfortify 达到的目的就是对比较常用的一些 R 数据分析包的结果进行可视化,避免用户花太多时间学习怎样用 ggplot2 的特殊语法来实现一个常见的可视化。我希望以后这样的软件包越来越多,让研究者和工作者能够不用担心太多实现细节,能够集中精力在他们的主要研究当中,从而在科学和技术上有着更快的实质性突破。
唐源: 大四的时候在一家创业公司实习,公司对开源的政策特别开放,我们用到了各种各样的开源软件,用的过程中发现各种问题以及对用户体验度有着各种不满,Github 上面有地方可以提交建议,但是项目的管理者太忙,我就干脆自己对源代码进行研究然后提交修改,这样养成了一种习惯,遇到问题的第一反应是自己研究研究代码,然后直接自己去解决问题,自己独立阅读代码的能力也就这样慢慢培养出来了。很多时候由于对于某个开源软件特别熟悉,经常在做项目中会想到一些有趣的点子来对项目的性能进行改进和功能进行延伸。
唐源:我从参与开源软件这个过程中获得了许多帮助,学到了很多,认识了许多志同道合的人,我也希望通过我的贡献来报答社区对我的帮助。我相信给予越多,获得的回报也越多。一开始因为只是工作需要对经常使用的软件进行各种修修补补,逐渐也养成了一种看源代码的习惯,对软件的架构好奇心也越来越强,老是主动去了解某个功能是如何具体实现的,这个过程让我受益良多。比如说我一开始自学了 Python 的基础,没有任何的项目实战经验,数据科学这一行对各种开源软件需要特别熟悉,因为不可能自己有时间把需要的功能自己实现一遍,通常你需要的功能其实都已经在开源软件里面实现了,然而随着对软件的熟悉,我就开始好奇以及研读具体的实现细节,这也让我打下了很好的对编程以及软件架构的基础,对一个编程语言的了解也逐渐深入了。比较大的开源项目比如说 pandas,有许多开发者在维护以及审阅新的贡献的代码,他们很认真的审阅了我提交的每一行代码,给予了很多很好的改进建议,这让我养成了许多写软件的好习惯。
唐源: 大部分的开源软件的发展都是在 Github 上完成的,大家需要去自己熟悉和实践一下 Git 的用法,Github 的开源项目里面一般大家都在 issues 里面讨论一的中会想到一些有趣的点子来对项目的性能进行改进和功能进行延伸。大家可以根据自己的兴趣爱好和需求选择自己想贡献的开源项目,fork 这个项目,对项目进行改进和修改,然后提交 pull request 来让项目管理者进行代码审阅。我最先开始参与的开源软件是 Python 的 pandas 库,它有着特别活跃的贡献者社区,也有着特别有耐心有帮助的项目管理者,每个 issue 都会被标上难易程度以及是否欢迎第一次贡献者,这样大家就可以先选择简单的 issue 来下手,开始熟悉这个贡献的流程。我的第一次代码贡献花了一周才被接受,项目管理者特别细心地对我写的每一行代码进行审阅和评论,保证我的改动不会影响现有用户以及要求新的代码必须有新的单元测试。我在这个过程中养成了很多很好的开发习惯也认识了世界各地的朋友,也希望我的这些建议能帮助到大家。
唐源:在参与这些开源项目的过程中,我深刻地体会到这个社区的活跃度以及创新能力。拿 XGBoost 举个例子,一旦有人在竞赛中使用 XGBoost 取得好的名字,这个项目也就得到大家的认可,更多的人就愿意尝试使用,甚至使用在公司核心的软件当中,这样一来,广大的社区能够很好的测试这个产品,我们也能够通过 Bug report 和 Feature request 来更好的理解用户的需求和改进产品,这个过程中几乎所有的对话都是公开透明的,大家都可以参与到这个过程当中,有时候一些小小的代码错误能够被广大开源社区发现,软件的性能甚至突然得到成倍的提升。对公司来说,开源代码也意味着大家都知道你的公司在用什么样的算法,其它公司也可以模仿使用,这样公司间的竞争更大。由于代码都是开放的,很多时候甚至有安全隐患,不过我相信公司开源代码前都是对这些隐患有深刻的理解和应对方式的。
唐源:这个有很多情况,比如说有些在公司使用了很多年的代码突然决定开源,这有可能是这个项目的某些员工离开了或者是算法过时了,没必要再保密了,公司决定不再花时间维护,而将维护和测试的责任交给广大的社区用户。也有可能是很新的项目,为了减少自己维护的成本,将项目开源,这样大家可以更全面的测试,也能够及早得到用户的反馈意见,打造更加满足用户需求的产品。也有公司的开源是战略性的,想让大家知道自己在这方面是专家,等等。不同的公司有着不同的开源软件维护方式,政策,和原因。一旦项目被开源,这也代表着所有的代码,算法,以及实现细节都是透明的,这意味着所有的竞争者都知道这个公司使用的技术以及在某个细节上的实现,这有一定的安全隐患,但是我相信在开源前这些都是考虑透彻了的。对员工来说,一个项目被开源意味着自己多年来在公司的心血和贡献都能够被大家知道,也让自己的工作更有动力。
唐源:开源往往是战略上的决定,往往是和商业利益上是没有冲突的,我之前也提到过,开源一个项目可以为这个项目节省不少成本,也可以给这个公司节省招聘合适人才所需要的开支,因为你可以招到已经熟悉公司所使用技术的员工,当员工加入公司时,不需要再花时间和精力来进行培训了。
唐源:我觉得这个没有必要担心,技术的更新换代太快了,可能今天比较火的技术和开源项目,明天就因为某个原因停止维护以及失去竞争力了,比如说以前比较火的 DeepLearning4J,因为有着比如像 MXNet 的 Scala 接口这样的竞争者,有着更好的性能也有着更了解用户需求的 DMLC 成员的维护,相信现在已经很难再有竞争力了。我们不应该担心这些,我之前也稍微提到的一点就是大家喜欢比较不同的框架,从而不断学习这些不同来改进自己的产品让它更有竞争力,互相竞争是很好的一种现象。我们能做到的就是使用自己喜欢的软件,来达到自己的研究和工作的需求,与时俱进。
唐源:开源可以让人工智能的研究的结果更有重现性然后能够更方便地让研究学者们分享研究结果。比如说我之前谈到的 TF.Learn,谷歌最近甚至最近的一篇论文是使用它来实现的,算法的实现也成为了 TF.Learn 里面的一个 Estimator,这样其它的业界人士也能直接使用到他们的工作研究当中,论文的结果也能很容易地再次得到。这些公司的开源项目都让大家有更多的学习资源,让大家有更好的工具来帮助自己的学习,工作,以及研究。这些开源项目也给了全世界各地的朋友互相交流,学习,以及一起开发产品的机会,我觉得是特别宝贵的,在芝加哥我们经常举行线下的见面会来进行交流,这样可以极大地扩展自己的视野,也认识到了一群志同道合的朋友。
唐源:这个奖首先是由谷歌内部员工提名推荐,然后再经过内部审核和讨论得到最后的获奖人名单的,我通过持续的贡献得到了他们的注意以及肯定,这是对我的一个很大的鼓励以及对我的贡献的认可。首先我会继续活跃在这个社区中,维护和继续贡献参与的软件,帮助大家解答使用软件时遇到的各种问题。很多时候在 Github Issues 和 StackOverflow 上会发现许多有趣的主意或者是某个人的问题和回答会激发新的灵感。然后我也一直在观察这一行的需求,其实有很多东西都是可以做的。我比较感兴趣的是那种能够让大家工作更有效率,让工作更不那么重复和繁琐的项目。
唐源:简单来说,DMLC 是为了帮助大家更方便使用一些最新的算法和技术,降低大家进入这一行的门槛。我们想把最先进的技术带给大家,这样感兴趣的朋友可以不必再花费时间来重新实现这些技术,从而可以直接应用这些技术到他们的研究和工作当中,集中精力在已有的技术上进行突破。我们觉得好的东西应该要分享给大家,这样可以提高大家的效率,也可以加快研究领域上的突破。我最先开始是一直在改进和延伸 DMLC 的 XGBoost 项目,比如说给 Python 包做了许多小的功能上的延伸,其中有不少的需求都是来自现在比较火的数据科学竞赛 Kaggle 用户,一些 DMLC 成员经常参加 Kaggle 里面的论坛,来帮助大家更好的使用 XGBoost 来满足他们各种创新的建模需求。在天奇的邀请下,我成为 XGBoost 的 committer,然后也就自然而然地花更多的时间在维护这个项目,后来又参与了 MXNet 的 Scala 接口的建设。
唐源: 我觉得 Python 接口只是让好的技术能够让更多人使用的一个很好的开始,Python 在数据科学和机器学习领域是非常火的,用户特别多,开源社区也比较活跃,是个很好的选择,大部分的深度学习领域的研究者都是 Python 用户,尤其是设计到图像处理,文本处理等领域。但是仅仅有 Python 接口是满足不了需求的,很多社会科学和生命科学领域经常使用 R,、Julia,在产业界最广泛使用的语言是 JVM 类的,比如说 Java 和 Scala,这也是我们后来为什么又把许多精力放在了其它语言上,比如说我花时间最多的 Scala 接口。我觉得一个好的产品不能一次性实现各种语言以及各种需求,我们首先用 Python 接口来做实验,看看需要满足用户的哪些需求,看看我们的方法能不能行得通,会不会受大众喜欢,接下来的其它的接口也都是看需求来的,这样我们能够更有效地利用时间。
唐源:我觉得这是非常好的现象,有竞争更能推进进步,大家都开源自己的独特框架,这更有助于学习、研究以及交流。DMLC 的天奇做的 nnvm 就很有学习价值,这是一个很轻量级的模块,实现了许多在深度学习系统比如说 TensorFlow 和 MXNet 中存在的对计算图进行优化,以及处理前后端,等等的一些需求。我非常开心能看到大家这样愿意将自己的研究成果开源,这样让后来的学习者少走了不少弯路。比较是好的,这样大家能看到自己的框架的优缺点,但是与此同时,因为各种条件的限制和变化,往往我们很难进行比较公平的比较。有些人喜欢拿自己框架擅长的方面来定制自己的衡量标准,希望大家能够全面的进行比较,不要以争取用户为目的来比较框架。
唐源:资源优势确实影响到了受欢迎程度,但也不是绝对的,因为最终的受欢迎程度是需要经过时间的考验的,最终的决定权还是在用户手上,有着不同需求的用户群体可以更好地全面地测试不同的框架,不管是大公司支持的还是草根阶级的,都会有着竞争的机会,不会被完全垄断的。我觉得不用太在意这些,自己了解自己项目的需求,然后考虑一下学习成本,看看哪个框架更适合自己就好。比如说很多人就不太喜欢学新的编程语言就仅仅为了使用 Torch7,很多统计学家熟悉 R 的话可以直接使用 MXNet 的 R 接口,等等。