其他

机器学习为何那么难?也许你的方法不对

2018-04-14 从实践项目开始 AI前线

作者 | Jason Brownlee
译者 | 大愚若智
编辑 | Emily
AI 前线导读:日常生活中那些实用的技能,例如阅读、驾驶、编程,并不是通过这种方式学习的,实际上是通过一种完全逆转的,自上至下的方式学习的。这种自上至下的方式可以直接用于学习类似机器学习这种技术课题,并能让你用愉悦的方式,更快速地获得成效。

更多干货内容请关注微信公众号“AI 前线”,(ID:ai-front)

诸如数学、物理学,甚至计算机科学这些学科通常会使用自下至上的方式讲授。

这种方式会在学习的主题范围内以逻辑的方式列出需要学习的课题,并通过自然的过渡逐渐深入并变得复杂。

问题在于人类并不是执行学习程序的机器人,我们需要动机、激励,以及更重要的:将课题本身与切实的成效结合在一起。

日常生活中那些实用的技能,例如阅读、驾驶、编程,并不是通过这种方式学习的,实际上是通过一种完全逆转的,自上至下的方式学习的。这种自上至下的方式可以直接用于学习类似机器学习这种技术课题,并能让你用愉悦的方式,更快速地获得成效。

本文将介绍在学习技术课题时,自上至下和自下至上两种方式的差异,以及推荐使用这种方式学习机器学习技术以及相关数学知识的原因。

阅读完本文后,你将了解到:


  • 大学里讲授技术课题所用的自下至上的方式,以及这种方式存在的问题。

  • 人们如何通过自上至下的方式学习阅读、驾驶和编程,以及这种方式的原理。

  • 使用自上至下的方式学习机器学习技术及数学知识的大框架,以及快速获得成效的方法。

这就开始吧。

机器学习为何那么难?也许你的方法不对, 照片作者:popofatticus,保留部分权利

概述

这篇文章很重要,因为我觉得可以启发你放弃学院风格的自下至上的学习方式,用一种新方法学习机器学习技术。

本文将分为下列七部分:

  1. 自下至上的学习

  2. 学着阅读

  3. 学着驾驶

  4. 学着写代码

  5. 自上至下的学习

  6. 学习机器学习技术

  7. 学习数学

自下至上的学习

以某个专业,例如数学为例。

我们需要通过一种逻辑的方法列出数学领域的不同课题,这些课题之间相互紧密关联,我们需要通过自然而然的方式逐渐深入学习不同的技能、能力以及学识。

问题在于,这种逻辑式的进展也许只对已经位于另一端,可以凭直觉发现不同课题之间关系的人而言是合理的。

大部分学校会通过教材的安排采取这种自下至上的,自然而然的渐进式方法。有很多技术和科学领域的学习都是通过这种方式讲授的。

回想一下高中或者本科学习,以及你学习过的一些基础学科,例如:

  • 数学

  • 生物学

  • 化学

  • 物理学

  • 计算机科学

回想一些那些教材的安排方式,每周的安排,每学期的安排,每学年的安排。自下至上,逻辑上循序渐进。

但是通过教材安排在逻辑上循序渐进,也许并不是通过教材学习获得最高成效的最佳方法。

我们并不是执行学习程序的机器人。我们是有感情的人类,需要动机、兴趣、专注、鼓励,以及成果。

你可以用自下至上的方式学习技术课题,确实有少数人更喜欢这种方式,但这并不是唯一的方法。

如果你已经学完了某个技术课题,仔细回想一下吧,你实际上是如何学会的?我敢打赌绝对不是通过自下至上的方式。

学着阅读

再回想一下,你是如何学会阅读的?

我儿子已经开始阅读了。没有太多深思熟虑,他(实际上是学校和我们父母)使用了这些常规的技巧:


  • 直接从“读”着手,借此产生兴趣并看到成效。

  • 写下字母表,发出正确的读音。

  • 记住常用词,以及它们的读音和拼写方法。

  • 对于不认识的词,使用“拼读”的启发式方法学习。

  • 在大人辅导下通读全书。

  • 在没有大人辅导下通读全书。

重点在于他会不断意识到为何阅读这件事很重要,并将其与他想做的其他事情紧密联系在一起,例如:


  • 为了看懂电视剧的字幕。

  • 为了阅读他喜欢的故事,例如星球大战。

  • 为了出门在外能够看懂标志和菜单。

  • 等等等等……

另外一个重点在于,他可以立即获得能够回顾的结果,并能借此了解自己能力的提高程度。


  • 词汇量越来越大

  • 更流畅的阅读习惯

  • 更复杂的图书

他并没有采用下面这些方法学习阅读:


  • 词性的定义(动词、名词、副词等)

  • 语法规则

  • 发音规则

  • 人类语言发展史

学着驾驶

你开车吗?

不开车也没关系,但大部分成年人都有必要学会驾驶。整个城市乃至全社会都是围绕着每个人的移动能力设计而来的。

你是如何学习驾驶的?

我记得有些书面考试,甚至还有计算机上的考试。学习过程我完全记不起来了,不过肯定曾经学过。但我还记得一些事情。

我记得请了一位驾校教练,上了一些驾校课程。每节课都很实用,我们需要坐在车里实践那些必须掌握的技能,并学着在路上驾驶。

我的驾校教练没有向我讲授或讨论下列内容:


  • 机动车的发展历史

  • 内燃机理论

  • 车辆常见机械故障

  • 汽车的电气系统

  • 交通流量理论

尽管对这些知识完全陌生,但直至今日我依然安全驾驶无事故。

实际上我也从没想过要学习那些知识。我不需要,没兴趣学它们,它们也无法帮我实现我真正的目的:以简单安全的方式去往不同地点。

如果车坏了,找专业人员处理即可。

学着写代码

我初学编程时完全不懂代码或软件工程的真正含义。

当时我就是自己坐在家里摆弄各种 Basic 命令,摆弄 Excel 里的不同命令,随后试着修改计算机游戏。诸如此类,很有趣的操作。

当我开始学习编程以及软件工程时,我已经是大学生了,当时使用了自下至上的方法。

我们从这些话题着手:


  • 编程语言理论

  • 数据类型

  • 控制流结构

  • 数据结构

  • 等等等等……

当我们终于可以开始写代码时,只能使用命令行界面,并饱受编译器错误、路径错误等问题的折磨,当然免不了还有与编程本身没什么关系的各种错误。

我恨编程。

简单回顾一下过去几年。不知何故,我最终作为一名专业的软件工程师开始处理一些复杂的系统,这些系统对用户很重要,我很擅长这个工作,当然也很热爱它。

最后我参加了一些介绍如何创建图形用户界面的课程,此外还有介绍如何通过 Socket 编程让计算机相互通信的课程,以及介绍如何通过线程让多个东西同时运行的课程。

我将这些知识与我真正喜欢的东西紧密联系在一起:开发能解决实际问题,供他人使用的软件。我将其与真正重要的目标联系在一起,所以这些知识不再抽象,也不再难懂。

至少对我,以及很多像我这样的开发者来说,我们的学习方式完全错了。错得离谱。这样的方式浪费了我多年的时间和精力,而最终的结果 / 收效不堪一提,像我这样胸怀热情,有时间的学生,应该将这些时间和精力用在自己真正热爱的事情上。

自上至下的学习

自下至上的方式不仅仅是讲授技术课题的常见方式,似乎看起来也是唯一的方式。

但如果你仔细想一下自己实际上是如何学习的,情况就截然不同了。

大学课程的设计者往往是相关领域的专家,他们确实想帮助大家学习。他们会列出所有知识点,让你通过逻辑的方式循序渐进地学习他们设计的教材,他们认为这样可以帮你获得你所需,而他们恰巧具备(希望如此吧)的技能和能力。

正如上文所述,这种方式可能确实适合某些人。

但并不适合我,希望也不适合你。实际上我遇到过的程序员,很少能精通自己通过计算机科学课程学习的编程技能,就算精通,也是他们自己通过实践项目自学,而非学校学习获得的。

此时可以考虑换为选择自上至下的方法。

将习以为常的传统方式翻转过来。

不要从各种定义和理论着手,而是将课题与你希望的结果联系在一起,并学着掌握如何能快速直接地获得所需结果。

制定一个学习计划,专注于能获得最终结果的实践过程,根据需要深入学习其中的某些领域,但始终围绕真正需要的最终结果。

效果截然不同

这是一种与传统方式截然不同的方法。

如果采用这种方法,请绝对不要采用传统的思维方式或对照和比较。

所有责任都在于你,无法怪罪于其他原因,如果不能成功,原因只在于你自己中断了学习。


  • 这种方式是迭代的。 每个课题可能需要反复学习多次,每次都更加深入。

  • 这种方式并不完美。 一开始效果可能并不明显,但只要坚持就会好转。

  • 这种方式需要探索。 学习者必须抱有持之以恒坚持探索的心态。

  • 这种方式需要责任感。 学习者需要对自己的改进和提高负责。

  • 这种方式需要好奇心。 学习者必须密切关注自己的兴趣所在并坚持不懈。

这种方式有些危险

说真的,我多次听到一些“专家”说过类似的话,例如他们会说:

你必须先懂得理论,随后才能使用这种技术,否则肯定无法正确地使用。

我也同意,最初的效果可能并不明显,但是后续的提高和专业技能并非仅仅来源于理论和各种基本因素。

如果你认为新手程序员不应将变更推送到生产环境并部署,那么你一定会确信机器学习技术的新手也应该遵循相似的限制。

技能需要展示出来。

信任是自己赢得的。

无论如何获得某个技能,情况都是如此。

你是技术人员

真的吗!?

这是我经常听到的另一种针对这种学习方式的“批评”。

没错,我们想要成为技术人员,在实践中通过各种工具为人们提供帮助,我们不想成为学者。

你并不需要全面学习所有相同的基础知识,因为你学习的目的和他们截然不同。不过你也可以随时回过头来学习你认为有必要学习的任何知识,只要你觉得自己用得到。

业内的开发者并不是计算机科学家,他们是工程师,是以自己的作品引以为豪的技术人员。

高效、富有成效、有趣的学习方式

这种学习方式的收益远远大过可能面临的挑战:


  • 可以直奔目标着手参与。

  • 可以通过上下文情境将更深入的知识甚至理论联系在一起。

  • 可以根据项目的目标有效地筛选需要掌握的课题。

这种方法更快。

这种方法更有趣。

并且我敢说,这种方法可以让你感觉更好。

为何能感觉更好?

因为课题可以与你在感情上联系在一起。你可以将其与自己关注的成果或结果联系在一起,你在对自己投资,你可以证明自己的能力。我们都热爱自己擅长的事物(哪怕并未意识到自己到底有多擅长),这有助于让我们获得动机、热忱以及激情。

富有热忱的学习者将直接超越原教旨主义者。

学习机器学习技术

那么到底该如何学习机器学习技术?

你是否参加了大学里那些自下至上的课程?你是否在通过此类课程形成自己的学习体系?或者更糟糕的:

你是否采取了自上至下的方式,但却又心怀愧疚甚至不安全感?

你并不孤单,每天在网上帮助初学者时我都会遇到类似的情况。

为了帮你将目标与学习联系在一起,强烈建议使用自上至下的方式学习机器学习技术。


  • 不要从前导的数学知识学起。

  • 不要从机器学习理论知识学起。

  • 不要从零开始编写每种算法的代码。

这些事可以随后再做,可以在你将抽象的知识与目标联系在一起之后,完善并深化你的理解。


  1. 首先学习如何使用固定的框架以及免费易用的开源工具解决最简单的预测建模问题。

  2. 通过大量效性项目练手,并逐渐提高这些项目的复杂度。

  3. 通过公开的作品展示你的成果。

这样的方法我已经推荐过多次,有关如何通过自上至下的方式学习机器学习技术的更多方法和技巧,请参阅文末“扩展阅读”一节。

盘踞在大学里的“专家们”会说这种方法很危险。别理他们。

世界级的从业者会告诉你,他们就是通过这种方式学习并持续提高的。你也照着这样做吧。

记住:


  • 你是通过实际的阅读操作,而非通过学习语言理论学会阅读的。

  • 你是通过实际的驾车操作,而非通过学习内燃机理论学会驾驶的。

  • 你是通过实际的写代码操作,而非通过学习可计算性理论学会编程的。

那么你也可以通过进行预测性建模,而非学习数学和理论知识学会机器学习技术。

我不仅通过这种方式学会了机器学习技术并持续提高自己,这种方式还有效帮助了我的数万名学生(以及本文的数百万读者)。

学习数学

不要止步于此。

但我们总会面临这样的时刻:你可能想要或者需要揭开盖在机器学习技术中数学这个支柱上的幕布,例如线性代数、微积分、统计学、概率论等。

此时依然可以采用自上至下的方法。

选择一个自己重视的目标或结果,将其作为入口或筛选器,确定自己需要掌握的课题,试着根据实际需求逐渐深入下去。

例如,假设你需要掌握线性代数。

你可能是为了掌握 SVD 或 PCA,这些都是机器学习中用来进行数据推算、数据缩减以及特征选择类任务时所用的方法。

此时自上至下的方法可能是:


  1. 从诸如 scikit-learn 等高级库中实现这些方法并获得结果。

  2. 从诸如 NumPy/SciPy 等低层库中实现这些方法并重现结果。

  3. 在 NumPy 或 Octave 中使用矩阵和矩阵运算直接实现这些方法。

  4. 学习并掌握所涉及的矩阵数学运算。

  5. 学习并掌握所涉及的矩阵分解运算。

  6. 学习矩阵特征分解逼近的方法。

  7. 等等等等……

目标为你提供了情境,随后你可以在好奇心的指引下决定学习的深度。

按照这种方式,数学知识的学习将与编程、机器学习或其他技术领域的学习没有任何不同。

这种方式更富成效,当然过程也会更有趣!

扩展阅读

如果你还想深入了解,可以参阅本节提供的资源。

  • 我该如何上手?

  • 面向程序员的机器学习

  • 机器学习精通之法

总结

本文介绍了采用自上至下以及自下至上两种方法学习机器学习技术时效果的差异,以及从业者需要,甚至有必要采用自上至下的方法学习机器学习技术以及相关数学知识的原因。

尤其是,本文介绍了:

  • 大学中讲授技术课题所用的自下至上的方法,及其存在的问题。

  • 人们如何用自上至下的方法学习阅读、驾驶和编程,以及这种方式的效果。

  • 使用自上至下的方法学习机器学习技术甚至数学知识的框架,以及作为从业者,可以快速取得进展的具体做法。

作者:Jason Brownlee

阅读英文原文:

https://machinelearningmastery.com/youre-wrong-machine-learning-not-hard/

如果你喜欢这篇文章,记得给我们留个言点个赞,给编辑小哥哥小姐姐们鼓励一下吧!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存