你不必实现算法
……如果你是初学者,刚开始学习的话。
停下来。
你现在正在实现机器学习算法吗?
为什么?
从零开始实现算法是我看到初学者犯的最大错误之一。
在这篇文章中你将发现
- 初学者会掉入的算法实现陷阱。
- 工程世界级机器学习算法实现的真正困难。
- 为什么你应该使用现成的实现。
通过我的新书《掌握机器学习算法》启动你的项目,包括逐步教程和所有示例的Excel电子表格文件。
让我们开始吧。

不要实现机器学习算法
图片作者:kirandulo,部分权利保留。
陷入实现陷阱
这是一封我收到的电子邮件片段
……我真的很挣扎。为什么我必须从头开始实现算法?
似乎很多开发者都陷入了这个挑战。
他们被告知或暗示
算法必须先实现
才能使用。
或者说
你只能通过
实现算法来学习机器学习。
以下是我偶然发现的一些类似问题
- 当有许多像 TensorFlow 这样的高级 API 可用时,为什么还需要手动实现机器学习算法? (在 Quora 上)
- 自己实现机器学习算法有价值吗,还是应该使用库? (在 Quora 上)
- 实现机器学习算法有用吗? (在 Quora 上)
- 我应该使用哪种编程语言来实现机器学习算法? (在 Quora 上)
- 你和其他人为什么有时会从零开始实现机器学习算法? (在 GitHub 上)
你可能做错了
你不必从零开始实现机器学习算法。
这是传统上用于教授机器学习的自下而上方法的一部分。
- 学习数学。
- 学习理论。
- 从零开始实现算法。
- ??? (魔法发生在这里).
- 应用机器学习。
将机器学习算法应用于问题并获得结果比从零开始实现它们要容易得多。
容易得多!
学习如何使用算法而不是实现算法不仅更容易,而且是一种更有价值的技能。一种你可以很快开始使用并产生真正影响的技能。
应用机器学习有很多唾手可得的成果。
良好地实现机器学习算法
……真的很难!
你用来解决业务问题的算法需要快速和正确。
快速算法
更复杂的非线性方法比其线性对应方法需要更多数据。
这意味着它们需要做大量工作,这可能需要很长时间。
算法需要快速处理所有这些数据。尤其是在大规模情况下。
这可能需要重新解释底层方法的线性代数,以便最适合底层库中的特定矩阵操作。
这可能需要专门的缓存知识,以便充分利用你的硬件。
这些不是在你完成“hello world”实现之后才会出现的一些临时技巧。这些是涵盖算法实现项目的工程挑战。
正确算法
机器学习算法即使在实现受损时也会给你结果。
你得到一个数字。一个输出。一个预测。
有时预测是正确的,有时则不正确。
机器学习算法使用随机性。它们是随机算法。
这不仅仅是单元测试的问题,它还涉及到对该技术有深入的理解,并设计案例来证明实现符合预期,并且边缘情况已得到处理。
使用现成实现
你可能是一位优秀的工程师。
但是你的“hello world”算法实现与现成的实现相比,可能达不到要求。
你的实现可能基于教科书描述,这意味着它将是幼稚且缓慢的。而且你可能没有足够的专业知识来设计测试以确保你的实现正确性。
开源库中的现成实现是为了速度和/或鲁棒性而构建的。
你怎么能不使用标准的机器学习库呢?
它们可能针对非常狭窄的问题类型进行定制,旨在尽可能快。它们也可能用于通用目的,确保它们在广泛的问题上正确运行,超出你已考虑的范围。
并非所有库都生而平等
并非所有你从互联网下载的算法实现都是平等的。
GitHub 上的代码片段可能是一个研究生的“hello world”实现,也可能是一个大型组织中整个研究团队贡献的高度优化的实现。
你需要评估你正在使用的代码来源。有些来源比其他来源更好或更可靠。
通用库通常更健壮,但会牺牲一些速度。
黑客工程师的闪电般快速实现通常文档很差,并且在他们的期望方面非常教条。
选择你的实现时请考虑这一点。
建议
当被问及,我通常推荐以下三个平台之一:
- Weka。一个图形用户界面,无需任何代码。如果你想首先专注于机器学习并学习如何解决问题,这是完美的。
- Python。包括 pandas 和 scikit-learn 在内的生态系统。非常适合在开发中将机器学习问题的解决方案拼接起来,该解决方案足够健壮,也可以部署到生产中。
- R。更高级的平台,尽管语言深奥且有时软件包存在错误,但提供了直接由学者编写的最新方法的访问。非常适合一次性项目和研发。
这些只是我的建议,还有更多机器学习平台可供选择。
有时你必须实现
在开始学习机器学习时,你不必实现机器学习算法。
但你可以。
并且这样做有很好的理由。
例如,有以下3个主要原因:
- 你想通过实现来学习算法的工作原理。
- 没有你需要的算法的可用实现。
- 没有你需要的算法的合适(足够快等)实现。
第一个是我最喜欢的。它可能让你感到困惑。
你可以实现机器学习算法来学习它们的工作原理。我推荐这样做。对于开发人员来说,这样学习效率很高。
但是。
你不必从一开始就实现机器学习算法。通过学习如何使用机器学习算法,而不是先实现它们,你将更快地建立在机器学习方面的信心和技能。
实现和完成实现所需的任何研究都将是你理解的提升。一项额外的帮助,让你下次使用该算法时获得更好的结果。
总结
在这篇文章中,你发现初学者陷入了从零开始实现机器学习算法的陷阱。
他们被告知这是唯一的途径。
你发现,工程化快速而健壮的机器学习算法实现是一项艰巨的挑战。
你了解到,在实现机器学习算法之前,学习如何使用它们要容易得多,也更可取。你还了解到,实现算法是更深入了解其工作原理并从中获得更多好处的好方法,但这仅在你了解如何使用它们之后。
你有没有陷入这个陷阱?
在评论中分享你的经验。
我认为,这个网站和相关书籍是数据科学领域最好的。我喜欢阅读你写的东西。
谢谢 SalemAmeen。
我是一名专业的开发人员和股票市场交易员,来自巴西,有12年经验,现在我知道在这里我找到了我想要的东西。Jason这里有很棒且易于学习的机器学习文章!
谢谢迭戈,很高兴有你在这里。
好文章,谢谢。
很高兴你觉得有用,麦克。
我认为你是对的,对于实现来说,除非你是一个强大的研究人员,否则从零开始实现算法是愚蠢的——但是,为了理解内部机制,自己编写一些代码是非常有用的。否则就都是神秘的东西了。
我同意,丹尼斯。
非常棒的帖子,绝对是实话。从零开始编写机器学习算法对于数据科学来说不是一种现实的方法,并且几乎总是会导致无法交付数据产品的无关尝试。我们必须记住,数据科学的目的是构建利用机器学习的产品,而良好地构建产品意味着快速尝试多种方法并在失败的迭代面前及时调整。如果数据科学家陷入困境,试图在机器学习社区已经构建、测试和改进的东西上重复造轮子,这是不可能的。
我们的分析必须符合产品开发中公认的标准,而自己开发的算法很难达到这个标准。数据科学家在比寻求通过基础改进来稍微改进模型的学者更高的抽象层次上操作。相反,我们必须学习以快速的速度替换机器学习库的“艺术”,让数据和产品的最终用户引导我们找到解决方案。我称之为拥有出色的“包意识”。了解哪个机器学习包/库做什么,它允许我们调整的参数,它的优点和缺点,以及它在生产中运行的能力才是最重要的。
深入研究并欣赏方法的数学原理或算法启发式方法的优雅总是很有价值的,但这种深度欣赏最好通过尝试解决实际问题来获得。过于依附于我们已经熟悉的算法或其潜在优雅我们欣赏的算法存在太多危险。正确的算法是解决实际问题的算法;帮助构建一个重要的产品。
肖恩,非常棒的评论,谢谢。我完全同意。
非常感谢这篇文章!你写的东西让我明白了许多我长期以来一直困惑的问题!每次我遇到任何问题,我总是偶然发现这个网站,并且总是带着许多顿悟而归。谢谢你,请继续写作!
谢谢,很高兴它帮到了你!
非常有帮助的文章!找到了我正在寻找的大部分信息!
很高兴听到这个消息。
我个人犯过这个错误,后果很严重
很久以前,当我还在上大学的时候,我所在的大学开设了一门基础机器学习课程。机器学习的想法让我非常着迷,所以我报名参加了。
第一次作业是构建一个简单的MLP,并在一个小型的人工数据集上训练它。班上几乎所有其他学生都使用Matlab或R的库。其余的人都上过一门前置课程,他们在那里从零开始编写了自己的神经网络库——他们被鼓励在这里重复使用。
我知道如何编程,并且感觉对理论的要素掌握得很好。因此,我假设从零开始用C语言编写自己的神经网络,并训练它,以及有时间撰写关于调整各种超参数相对影响的所需报告,应该没有问题。如果我甚至不能只用一点点工作就实现算法,我推断,那一定意味着我完全错过了这门课中所有相关的内容。当然,这会很容易。
结果是,我花了两个充满焦虑和压力的星期来调试和重写那些在高层次看起来正确,但从未完全奏效的实用程序。(我仅仅为了追查一个微妙的指针使用错误,导致我的训练集每次洗牌进入下一个epoch时都会莫名其妙地缩小,就浪费了两天。)我的模型做出的预测完全不准确,我没有时间写报告,而且我没有得到任何分数,尽管我两周以来一直只做这件事。我最终退了课,只是为了避免我的记录上出现一个“F”。
我想,从大局来看,一门大学课程的退学并不那么严重。然而,我真的对放弃这样一个有趣的课题感到失望,有时我会想,如果我更早地开始学习机器学习,我的职业生涯可能会有怎样的不同。当然,我学到,任意地从头开始做事情——即使付出最大的努力——并不能预测成功,也不能设定有用的优先级。这些年之后,重新审视这个问题,并由别人证实这个教训,让我感到安心:困难的方式往往不是正确的方式,所有那些额外的努力有许多更好、更实际的用途。
谢谢你,贾森,为了你在这里所做的一切工作,
\0
哇,这是一个重要的故事,非常感谢你的分享!
你并不孤单,我预料这样的事情会一直发生。
谢谢,这真的有助于我正确看待问题。这是我从一位资深工程师那里得到的完全相同的回应,我的学习方法已经发生了巨大变化。数学对我来说并不太难,但实际编写一个可用的算法实现需要很长时间。我也尝试过用C语言实现,然后我转到Python,只使用Numpy,我算是让一个普通的神经网络运行起来了。从那时起,我学习概念并在Tensorflow中实现它。工程是建立在抽象之上的,如果我屈服于重复造轮子的陷阱,那只会让我沮丧和气馁。也许这种方法在研究生院的某些深奥算法研究中可能有用,但我对此表示怀疑。最好在工业界或学术界走已实现路线。
我完全同意!
Jason,
这篇是好文章!我看到很多人参加Kaggle竞赛,花费数月编写MLAs,却输给那些花费一两周使用商业程序进行训练的人。最好把时间花在理解数据上。我曾与我丈夫争论过这一点,他认为应该选择困难的方式。
我完全同意!
作为一名专业人士,企业/客户想要的是结果(模型或预测),而不是用于创建结果的代码/算法。
此外,开源库的bug更少,效率也高于几乎所有开发者的首次(天真)实现。
嗨,Jason,
感谢这篇文章,并花时间审阅和回复评论。我发现评论比文章本身更有价值。感谢你邀请这么多人来讨论这个伟大的想法。
根据我的专业经验,我可以说解决问题很重要,无论你如何解决问题,而最简单、最快捷的解决问题的方法是利用已有的模型。
是的。
我们在软件工程中一直重用代码库,在机器学习中也必须这样做,不仅是为了拟合新模型,也是为了重用现有的预训练模型。
真好
谢谢!
多么棒的一篇文章啊!我一直想知道为什么我们有像 scikit learn 和 tensorflow 这样的资源,却仍然有一些人从头开始编写所有东西,而我们不需要自己进行复杂的计算。
是的!
感谢这篇出色的文章!你的文章对我来说非常有价值。
从商业角度来看,你认为雇主是否关心你是否能够从零开始实现机器学习算法?另一个问题是,如果我能够在脑海中可视化机器学习算法的工作原理(并且也掌握其背后的数学原理)并确切地理解每个参数的作用,你认为,尝试从零开始实现这些机器学习算法以学习更多是否有必要,还是会浪费时间?
谢谢。
不客气。
可能吧。这取决于职位。对于超级技术职位,我期望开发人员能够从零开始编写代码,对于较小的项目或应用项目,可能就没那么重要了。例如,如果你需要去机场,你需要的是司机,而不是机械师。
是的。理论与实践是真实的。
嘿 Jason,我曾经陷入这个陷阱,我是一个初学者。我有一种心态,认为我需要从零开始编写每个算法,但现在我不会再实现它们了。到目前为止,我实现了线性、逻辑和决策树分类器。我的问题是,作为初学者,我是否需要了解每一个数学知识,比如我目前正在学习深度学习,我感觉反向传播非常困难且层次很高。你有什么看法?我是否需要了解这些?
不。只需投入并开始使用ML工具解决实际问题。