谷歌为何要养苹果的亲儿子Swift原来意

北京最好白癜风医院哪家好 http://pf.39.net/bdfyy/xwdt/
选自tryolabs作者:JoaquínThu机器之心编译参与:Panda、RacoonPython并不完美,而Swift则正在谷歌和苹果的共同养育下茁壮成长,有望成长为深度学习领域一门新的主要语言。近日,Tryolabs的研究工程师JoaquínAlori发布了一篇长文,从Python的缺点一路谈到了谷歌在Swift机器学习方面的大计划,并且文中还给出了相当多一些具体的代码实例。可微分编程真如YannLeCun所言的那样会成为新一代的程序开发范式吗?Swift又将在其中扮演怎样的角色?也许你能在这篇文章中找到答案。近日,国外一小哥在tryolabs上写了一篇博文,为我们详尽地介绍了Python的缺陷与相比之下Swift的优势,解释了为什么Swift版的TensorFlow未来在机器学习领域有非常好的发展前景。其中包含大量代码示例,展示了如何用Swift优雅地编写机器学习程序。两年之前,谷歌的一个小团队开始研究让Swift语言成为首个在语言层面上一流地整合了可微分编程能力的主流语言。该项目的研究范围着实与众不同,而且也取得了一些出色的初期研究成果,似乎离公众应用也并不很远了。尽管如此,该项目却并未在机器学习社区引起多大反响,而且很多实践者还对此浑然不觉。造成这种结果的主要原因之一是语言的选择。机器学习社区的很多人很大程度上并不关心Swift,谷歌研究它也让人们感到疑惑;因为Swift主要用来开发iOS应用而已,在数据科学生态系统中几乎毫无存在感。不过,事实却并非如此,只需粗略地看看谷歌这个项目,就能发现这是一个庞大且雄心勃勃的计划,甚至足以将Swift确立为机器学习领域的关键成员。此外,即使我们Tryolabs也主要使用Python,但我们还是认为Swift是一个绝佳的选择;也因此,我们决定写这篇文章以帮助世人了解谷歌的计划。但在深入Swift以及「可微分编程」的真正含义之前,我们应该先回顾一下当前的状况。Python,你怎么了?!到目前为止,Python都依然是机器学习领域最常被使用的语言,谷歌也有大量用Python编写的机器学习软件库和工具。那么,为什么还要用Swift?Python有什么问题吗?直接说吧,Python太慢了。另外,Python的并行性表现并不好。为了应对这些缺点,大多数机器学习项目在运行计算密集型算法时,都会使用用C/C++/Fortran/CUDA写的软件库,然后再使用Python将不同的底层运算组合到一起。对于大部分项目而言,这种做法其实效果很好;但总体概况而言,这会产生一些问题。我们先看看其中一些问题。外部二进制文件为每个计算密集型运算都调用外部二进制文件会限制开发者的工作,让他们只能在算法的表层的一小部分上进行开发。比如,编写自定义的卷积执行方式是无法实现的,除非开发者愿意使用C等语言来进行开发。大部分程序员都不会选择这么做,要么是因为他们没有编写低层高性能代码的经验,要么则是因为在Python开发环境与某个低层语言环境之间来回切换会变得过于麻烦。这会造成一种不幸的情况:程序员会尽力尽量少地写复杂代码,并且默认情况更倾向于调用外部软件库的运算。对于机器学习这样动态发展的领域来说,这并不是一个好现象,因为很多东西都还并未确定下来,还非常需要新想法。对软件库的抽象理解让Python代码调用更低层代码并不如将Python函数映射成C函数那么简单。不幸的现实是:机器学习软件库的创建者必须为了性能而做出一些开发上的选择,而这又会让事情变得更加复杂。举个例子,在TensorFlow图(graph)模式中(这是该软件库中唯一的性能模式),你的Python代码在你认为会运行时常常并不运行。在这里,Python实际上的作用是底层TensorFlow图的某种元编程(metaprogramming)语言。其开发流程为:开发者首先使用Python定义一个网络,然后TensorFlow后端使用该定义来构建网络并将其编译为一个blob,而开发者却再也无法访问其内部。编译之后,该网络才终于可以运行,开发者可以开始向其馈送数据以便训练和推理。这种工作方式让调试工作变得非常困难,因为在网络运行时,你没法使用Python了解其中究竟发生了什么。你也没法使用pdb等方法。即使你想使用古老但好用的print调试方法,你也只能使用tf.print并在你的网络中构建一个print节点,这又必须连接到网络中的另一个节点,而且在print得到任何信息之前还必须进行编译。不过也存在更加直接的解决方案。用PyTorch时,你的代码必须像用Python一样命令式地运行,唯一不透明的情况是运行在GPU上的运算是异步式地执行的。这通常不会有问题,因为PyTorch对此很智能,它会等到用户交互操作所依赖的所有异步调用都结束之后才会转让控制权。尽管如此,也还是有一些问题存在,尤其是在基准评测(benchmarking)等任务上。行业滞后所有这些可用性问题不仅让写代码更困难,而且还会导致产业界毫无必要地滞后于学术界。一直以来都有论文在研究如何调整神经网络中所用的低层运算,并在这一过程中将准确度提升几个百分点,但是产业界仍然需要很长时间才能实际应用这些进展。一个原因是即使这些算法上的改变可能本身比较简单,但上面提到的工具问题还是让它们非常难以实现。因此,由于这些改进可能只能将准确度提升1%,所以企业可能会认为为此进行投入并不值得。对于小型机器学习开发团队而言,这个问题尤为明显,因为他们往往缺乏可负担实现/整合成本的规模经济。因此,企业往往会直接忽略这些进步,直到这些改进被加入到PyTorch或TensorFlow等软件库中。这能节省企业的实现和整合成本,但也会导致产业界滞后学术界一两年时间,因为这些软件库的维护者基本不会立即实现每篇新论文提出的新方法。举个具体的例子,可变形卷积似乎可以提升大多数卷积神经网络(CNN)的性能表现,但论文发布大概2年之后才出现第一个开源的实现。不仅如此,将可变形卷积的实现整合进PyTorch或TensorFlow的过程非常麻烦,而且最后这个算法也并没得到广泛的使用。PyTorch直到最近才加入对它的支持,至于官方的TensorFlow版本,至今仍没有见到。现在,假设说有n篇能将准确度提升2%的论文都遇到了这种情况,那么产业界将错失准确度显著提升(1.02^n)%的机会,而原因不过是没有合适的工具罢了。如果n很大,那就太让人遗憾了。速度在某些情况中,同时使用Python与快速软件库依然还是会很慢。确实,如果是用CNN来执行图像分类,那么使用Python与PyTorch/TensorFlow会很快。此外,就算在CUDA环境中编写整个网络,性能也可能并不会得到太多提升,因为大卷积占据了大部分的推理时间,而大卷积又已经有了经过良好优化的代码实现。但情况并非总是如此。如果不是完全用低层语言实现的,那么由很多小运算组成的网络往往最容易出现性能问题。举个例子,Fast.AI的JeremyHoward曾在一篇博客文章中表达了自己对用Swift来做深度学习开发的热爱,他表示尽管使用了PyTorch那出色的JIT编译器,他仍然无法让RNN的工作速度比肩完全用CUDA实现的版本。此外,对于延迟程度很重要的情况,Python也不是一种非常好的语言;而且Python也不能很好地应用于与传感器通信等非常底层的任务。为了解决这个问题,一些公司的做法是仅用Python和PyTorch/TensorFlow开发模型。这样,在实验和训练新模型时,他们就能利用Python的易用性优势。而在之后的生产部署时,他们会用C++重写他们的模型。不确定他们是会完全重写,还是会使用PyTorch的tracing功能或TensorFlow的图模式来简单地将其串行化,然后再围绕它使用C++来重写Python。不管是哪种方式,都需要重写大量Python代码。对于小公司而言,这样做往往成本过高。所有这些问题都是众所周知的。公认的深度学习教父之一YannLeCun就曾说机器学习需要一种新语言。他与PyTorch的创建者之一SoumithChintala曾在一组推文中讨论了几种可能的候选语言,其中提到了Julia、Swift以及改进Python。另一方面,Fast.AI的JeremyHoward似乎已经下定决心站队Swift。谷歌接受了挑战幸运的是,谷歌的SwiftforTensorFlow(S4TF)团队接过了这一难题。不仅如此,他们的整个项目进展还非常透明。他们还发布了一份非常详实的文档(


转载请注明:http://www.aierlanlan.com/rzdk/7766.html