手动编写机器学习算法的若干理由
随着开源思想的逐渐兴起,很多机器学习领域的算法都已经实现为开源的库、包或代码。如何在这些已有资源的基础上进行高效开发,是最近几年热议的话题。那么,是不是公司或个人就不需要再对这些算法进行手动实现了呢?近日,Quora网站发起了对于 以下问题的讨论 :为什么有这么多API还要手动编写机器学习算法呢?
首先,Quora的工程副总裁 Xavier Amatriain 从公司的角度回答了该问题。Xavier表示,作为一个公司,选择自己开发机器学习算法的原因可以归结为以下几点:
- 性能。很多公开的算法实现的效率并不高。如果项目对于该算法的执行效率有一定的要求,自己进行重新实现不失为一个好的选择。
- 正确性。很多开源的算法实现是存在功能缺陷的。它们很多只是针对简单的测试集进行了部分验证,并不能保证很多边界情况或者大规模测试的正确性。事实上,很多算法包/库并没有进行很好的单元测试和功能测试。因此,算法本身存在bug也不足为奇。公司也可以选择在此基础上进行完善,然后再反馈给社区。但是,在多数情况下,重新实现算法的代价更低一些。
- 编程语言。以 Libsvm 为例,它只存在C++和Java的开源版本。如果希望用Python或其他语言实现,公司只能自行开发。
- 系统集成。更多情况下,算法只是整个系统的一部分。系统需要集成很多的库和资源。如果这些库或资源分别来自scikit-learn、Tensorflow、Theano以及Ranklib等不同的地方,系统集成势必要花费大量的时间和精力。相比而言,自己开发这些算法可能要高效很多。
- 版权。对于公司而言,即使采用开源算法,也可能存在版权问题。因此,自己开发要安全很多,可以有效避免版权纠纷。
接下来, Charles Gee 则站在个人的角度上,分析了手动实现机器学习算法的好处。
- 作为一个初学者,自己实现算法有助于帮助理解算法的工作原理及其实现细节。直接使用现成的包的确有助于加速产品研发,但却阻碍了工程师对其内部的理解。
- 作为一个研究人员,自己实现算法可以掌握和修改所有的细节。在研究过程中,工程师难免需要修改算法的一些内部实现细节,或者输入接口。现成的库或包未必能够满足这些需求。
- 作为一名老师,自己实现算法有利于教学任务的深入浅出。老师可以将算法的具体运行过程呈现给学生,便于学生一步步慢慢理解。
- 作为用户,自己实现算法可以方便调试或完善功能。
Simon Maby 表示,一般需要自己实现算法的情况包括:
特殊的性能需求、Q-learning和定制化的代价与功能、特殊的应用领域等。此外, Chomba Bupe 将原因归结为创新、不同的项目目标、代码安全、兼容性以及深度理解五个方面。 Shehroz Khan 则主要从理解和掌控代码的角度出发,认为手动实现算法有助于进一步删减或扩展部分功能以及开发新的相关算法。最后,多年从事 有限元分析(Finite Element Analysis,FEA) 的 Debiprasad Ghosh 预测,机器学习社区未来会出现与FEA社区类似的分化:绝大部分成员要么为用户,要么为专家。用户主要了解商用软件和产品;而专家主要关心不同的开源代码和FEA的内部细节,用于进一步的研发。因此,机器学习领域也需要一批掌握算法细节的专家,来指导算法未来的发展。
来自: http://www.infoq.com/cn/news/2015/12/manual-machine-algorithm-reason