程序员如何开启机器学习之路?我也遇到过这个问题

我曾是一名想进入AI行业的软件开发者。为了更快熟悉这里边的门道,我阅读了机器学习的书籍,浏览了不少帖子,还学习了Coursera上关于机器学习的课程。


但是,但是,依然不知道如何开始…...


你是否也有这样的经历呢?


程序员如何开启机器学习之路?我也遇到过这个问题_第1张图片

图片版权归Peter Alfred Hess所有


很多开发者都问我:我该如何开始学习机器学习?


记不清有多少人问过这个问题了。鉴于此,我专门写了一篇文章来解答大家的疑惑。通过本文,你会知道:


  • 为什么传统的教学方法不管用?

  • 如何把传统的教授机器学习方法的框架颠倒过来。


此外,我还会跟你分享我在学习机器学习方面积累的经验。


进入正题:


做过各种尝试,但依然无从下手


根据我以往的经历,我可以想象得出你做过哪些尝试,比如海淘各种博客帖子,学习斯坦福大学的机器学习公开课,尝试深入理解机器学习的相关概念和模型,尝试处理一些小数据集,不过依然会觉得不得其门而入。


程序员如何开启机器学习之路?我也遇到过这个问题_第2张图片

做过各种尝试,但依然无从下手


在我看来,问题在于你还没有将从课本和视频中学习的理论、算法和数学形成一个知识体系。


在真实工作场景中加深理解


假设你已经掌握了很多个分散的知识点,那么要考虑将其形成一个体系,最好的办法是在真实的场景中思考这些知识。比如下边列举的几个场景:


场景1:一次性模型


某天你的老板跟你说:小李啊,你懂机器学习吗?你能不能使用去年的客户数据来预测一下在我们销售渠道中哪些客户有可能继续跟我们续约?


我把这种情况称之为一次性模型。


问题由你的老板来提出。他给的数据非常小,甚至可以在微软Excel中打开。但他却需要精确并且稳定的预测。你可以交付,你还可以对最终结果进行相关补充说明。


场景2:嵌入式模型


你和你的团队对甲方软件项目进行需求收集。你了解到解决某个问题最好(或者唯一切实可行)的方法是设计并训练一个预测模型,并把它嵌入到你们的软件产品中。


我把这种情况称之为嵌入式模型。


这当中还有一些变体(比如这个模型是固定的呢,还是以后会自动定期更新?是在本地运行呢?还是通过API远程访问?),但这些都是只是细节而已。


这个场景中的重点是你具有的经验:识别一个需求,它的最好解决方式是使用一个预测模型,并且你具备设计、训练和部署这个模型的能力。


场景3:深度模型


你开始了一项新工作,工作的系统至少由一个预测模型组成。不管是维护系统,还是添加功能,都需要具备对这个模型的理解,它的输入是什么,输出是什么。


模型的预测精度是软件产品非常重要的一个指标,而你的工作职责包括提升模型预测精度。比如,测试预发布系统时,你展示的模型的准确度不能低于上个版本,或者要高于上个版本。


我把这种情况称之为深度模型。


你需要建立对一个特定预测模型的深入理解,并且用你的经验和技能来提升并且验证它的准确度。


以上这三个场景都是我曾经经历过的。


它让一件事情非常明确——虽然机器学习是非常吸引人的一个领域,但对一个软件开发者来说,机器学习只是另外一堆技巧,就像多线程编程或者3D图形编程。然而,机器学习是针对特定类别的问题进行设计的。


传统方法如何开启机器学习之路


找几本机器学习相关的书,你会发现这些书往往从基本的定义开始,然后是相关的数学公式阐述,最后是非常复杂的算法。


程序员如何开启机器学习之路?我也遇到过这个问题_第3张图片

传统的解答是自下而上的


基本概念的定义和数学理论的表述都是非常清楚、简洁并且绝不模棱两可的。但是,它们非常枯、无聊,并且需要具备一定的数学背景来分析和理解。


这也是大学将机器学习放在研究生课程中的原因?因为教授机器学习的基本原理需要具备多年基础积累。


比如,它建议你具备如下基础:

  • 统计

  • 概率

  • 线性代数

  • 多元变量统计

  • 微积分


如果你误入了某些奇怪的、有趣的算法,那你的机器学习之路将会更糟糕。


这个学习机器学习的自下而上和基于算法的方法无处不在。


MOOCs和YouTube上的在线课程也是仿效大学的方式来教授机器学习,如果你具备相关基础或者你已经投入了大量的时间来学习这些高级课程,这没什么问题。但是,这对于大多数的软件开发者并不管用。


如果你到Quora, StackExchange, Reddit这些网站求助如何开始机器学习,你大概会收到同样的答复。


难怪一些软件开发者会不断寻求正确的方法,但结果是不得不回到学校并获得研究生或者博士学历,只有这样他们才觉得可以开始学习机器学习了。


仔细思考一下这个自下而上的机器学习学习方法。它非常缜密、也更系统化,听起来没什么问题,但怎么可能出错呢?


为什么传统的学习方法是错的?


假设你是一个年轻的软件开发者。你已经或多或少学了一些编程语言。现在,你准备开始学习如何开发一个独立的软件。


你告诉你的朋友和家人,你希望以后你的工作是每天都在编程。但他们告诉你,在成为一名程序员之前,你需要一个计算机科学学位。


就这样,你开始了计算机学位的学习。一学期又一学期,你在学习着难解的线性代数,微积分和离散数学。你使用着过时的编程语言。这些都在消磨着你对编程和软件开发的热情。


程序员如何开启机器学习之路?我也遇到过这个问题_第4张图片

传统的学习方法与成为一名实践者之间有一个鸿沟


或许你成功的完成了学业,但回过头才发现你并没有学习到任何一个关于现代软件开发的技能、语言、工具,或者其它任何你能够用来开发软件的知识。


看到过与教授机器学习类似的案例吗?


幸运的是,编程已经具有很长的历史了,我们已经找到了正确的方式来教授年轻程序员相关的技能。


对于一个正在学习的程序员,没有必要让他学习计算理论或者计算复杂度理论,或者算法和数据结构的细枝末节。这些知识(算法复杂度和数据结构的细节内容)可以晚点再学。或许应该关注一些特定组合的工具,站在一个从事编程工作且能够交付软件的工程师的角度来看这件事。


如果一个软件开发者想要进行机器学习,他们真的有必要花费多年的时间和大量的金钱去获得数学和更高的学位吗?


答案肯定是否定的!还有更好的方式。


以正确的姿势开始机器学习


像计算机科学课程从来没有关注实践中需要的开发和交付软件的技能一样,机器学习课程和书籍也同样有这样的缺点。


对于机器学习,你需要自上而下的学习方法。这个方法更关注结果:采用最佳的工具组合和平台,解决真实的机器学习问题。


程序员如何开启机器学习之路?我也遇到过这个问题_第5张图片

自上而下学习机器学习


以下是我推崇的学习方法:


1.通过系统化流程迭代结果


一旦你会使用工具,那么通过机器学习算法解决问题就相对容易了,你称之为“完美”。


这就非常危险了。


你怎么知道你已经完美解决问题了呢?你怎么知道这个结果是最好的?你怎么就知道这个结果在这个数据集上面是可靠的?


使用机器学习解决相关问题时,你需要系统化。这是一个项目,和软件开发一样,通过良好的处理可以获得高质量的结果,通过不断地迭代得到进一步提升。


仔细思考这样一个系统的流程,你可以想到一些明确的要求,比如:


  • 一个系统的流程可以带你贯穿始终,从特定的问题到结果的呈现或者部署。与软件开发项目一样,你可能认为你已经完成了,但是你很可能没有。

  • 一个系统的流程可以带着你一步一步地完成你的任务,这样你就明确地知道下一步该做什么。不知道下一步该做什么简直就是项目的克星。

  • 一个系统的流程可以保证良好的结果,也就是说这个结果会比一般的好,或者远超项目的需求。在项目中经常要求提交有一定可靠度的结果,而并不一定是那个最好准确度的结果。

  • 一个系统的流程不拘泥于特定的工具、编程语言、算法模型。使用的工具在不断更新,因此这个流程必须具备适应性。考虑到学界对于算法的追求,时常会出现新的,更好的算法。


程序员如何开启机器学习之路?我也遇到过这个问题_第6张图片

选择一个系统的、可迭代的流程,从而可以不断地提升你所交付的结果。


有非常多的高质量的系统流程,包括一些比较老的系统流程,你都可以稍加调整使之能够满足你的要求。


2.为你的系统流程选择最佳的工具组合


机器学习的工具和库在不断地更新迭代,但在任何时候你都得选择与所选系统流程最适合的工具组合。


你不用验证和选择任何老的算法或者库,你需要所谓的最好组合,它可以给你快速的、可靠的、高质量的结果,并且能够尽可能地自动进行。


但是,你得根据自己的需要选择工具组合。


比如,对于以上三种场景,我建议使用的工具组合如下所示:


  • 一次性模型:使用Weka平台,可以在很短的时间加载CSV,设计一个实验,并获得最好的模型,并且几乎不用编程(请参考我对这流程的整理)。

  • 嵌入式预测模型:通过python使用Scikit-learn库,我可以使用同样的语言来开发模型。IPython是一个非常好的方式,可以向团队展示你的模型运行情况。MLaaS对于大数据而言是个很好的选择。

  • 深度模型:R语言,在R平台上,我可以快速并且自动地尝试很多最高水平的模型。


实际上,这三种情况下的三种工具组合也要依赖于特定的应用场景。


程序员如何开启机器学习之路?我也遇到过这个问题_第7张图片


和软件开发一样,你需要学习如何使用这些工具,从而可以最大程度地利用它们。此外,你也需要随时关注业界的发展,并且使用更好的工具。当更好的工具发布后,你可以不断调整工具来适应你那个系统流程。


3. 有选择性地开放你的项目


软件开发技能是通过开发大量软件产品得到的。对于机器学习,你可以使用类似的方法。


  • 仔细选择练习数据集


你最好选择一个真实的数据集,而不是人为杜撰的数据集。现在外面有大量的各种复杂度的数据集合。


我建议从一些小的数据集开始,可以从UCI机器学习库中获得。它们都非常有名,相对简洁,适合新手学习使用机器学习算法系统流程和相关工具。


之后,非常推荐使用一些更大的数据集,比如Kaggle和KDD比赛提供的数据集。它们相对会有点乱,要求使用更多不同的技能。


坚持使用表列数据,这是我对所有学生的建议。


处理图像和文本数据(分别是计算机视觉和自然语言处理)是一个新兴且不同的领域。它们会要求你使用该领域里面特定的某些方法和工具。如果你是想处理这类型的数据,那么你最好从那里开始。


在另外一篇博客中,我对于如何把练习做成开放式作品集进行了详细的阐述。“如何练习机器学习算法,从UCI机器学习数据库的小数据开始”


  • 记录结果,并建立公开项目集


在一个单独的文件中记录你做了什么,学到了什么。以便于你在其他项目中作参考。


这类似于软件开发者经常把每一个软件项目放在一个文件夹中一样,并使用以前工程中的代码和想法。这可以很大程度上加快研发速度,强烈地推荐这种方式。


整理好你的笔记、代码和生成的图片,但写下你的发现也是非常重要的。把这想成是对你代码的注释。一个独立的文档可以是一个简单的PPT或者文本文件,也可以制作得像演讲那种那么精致,或者像YouTube上面的视频一样好。


程序员如何开启机器学习之路?我也遇到过这个问题_第8张图片


把每一个项目都提交到一个公开的版本管理库中(比如Github),这样其它新手就可以学习你的经验,并进行一定的拓展。可以把项目链接放在你的博客,LinkedIn或者以其它任何公开的形式来展示你的精湛技能和能力。


关于这个想法更多的信息请参考我的另一篇博客“建立一个机器学习公开项目集:专注于完成一些小的项目并展现你的相关技能”


对于开发者来说,在Github上发布和维护项目已经成为简历中必不可少的一部分,尤其是特别关注技能和项目经验的公司。


以上是为软件开发者定制的学习方法,对于以上学习方法,你可以将其应用在机器学习领域。


学习机器学习,以上就够了吗?


不过,你也会有疑问。比如作为一个初学者,我需不需要写代码,是不是要求数学特别好,需不需要更高的学历,是否需要学习大数据相关的知识等。


哈,别着急,我们一个一个说。


1.需要写大量代码?


不一定。


你可能是一个网页开发者或者其它领域,你不用写很多代码。你可以使用这个方法来开始学习和使用机器学习。像Weka这样的工具,使得设计机器学习实验和建立模型变的非常简单,甚至于完全不需要什么编程。


能写代码方便你使用更多不同的工具,但这并不是必须的,而且也不是必须先学习的。


2.要精通数学吗?


不必。


就像软件开发一样,你不必非得了解像计算复杂度或者big O这样的概念过后才能写代码,才能交付有用并且可靠的软件产品,你可以从事机器学习方面的工作,不需要有统计学,概率论和线性代数相关的背景。


虽然我们并不是从理论学习开始,但是并不忽略它。当需要某个算法时,深入学习并理解相关方法或者算法就非常重要了。你会主动学习数学相关的知识,因为在追求更好的结果和更精确的预测时,你会尽可能地去查找资料,学习到足够多知识来解决你现有的问题。


如果你的目标是掌握理论,这个方法就会更慢,并且不是那么有效。但是,对一个致力于要从事机器学习工作的软件开发者而言,这个方法是行之有效的。


3.我需要一个更高的学位吗?


不需要。


当前网络这么发达,你可以轻松获得机器学习相关的知识,如非必要,不用花大量时间和金钱来获取更高的学位。


推荐你在思考获得更高学位之前,先想下一个实实在在的机器学习问题,并通过一段时间了来详细了解和构建一个项目,再去想是否真的需要一个更高的学历,这样你对这个领域也会理解的更加清晰。


对于我本人来说,我是考到了更高的学位,我喜欢做研究,但我也喜欢解决实际的问题,客户对我的方案也比较满意。不过我是从事机器学习工作一段时间后才去考了更高的学位。我都没意识到我已经掌握了相关资源和学习方法。


程序员如何开启机器学习之路?我也遇到过这个问题_第9张图片

这也是我想说服你开始机器学习的原因,其实你已经具备一定的基础了


4.需要从大数据开始吗?


不需要。


机器学习算法的学习和理解最好通过从小的数据开始。小到可以使用微软的Excel软件打开,可以加载到内存中,或者可以在你的工作站中运行。


大数据!=机器学习。你可以使用大数据构建一个预测模型,但是,这仅仅是你所拥有的技能在特定领域的特定表现。我一般建议我的学生在开始学习机器学习的时候,使用小的数据开始。


如果你学习机器学习是为了处理大数据,那么就从大数据开始吧。


5.我必须有一个高配电脑吗?


不需要。


确实,现在一些最高水平的算法,比如,深度学习,需要数以千万的计算单元,多个GPU协同工作。但是,这些算法依然可以用来解决一些比较小的问题,而这样的计算量是你当前电脑CPU就可以承受的。


你不必因为接触不到高性能的计算机而在机器学习上停滞不前。


在你准备购买一台高性能计算机或者租用一台非常大的EC2虚拟云服务器之前,花点时间学习如何尽可能地利用现有的算法,在较小且容易理解的数据上。


6.新手是不是需要花费大量时间


正如我之前所说,从事机器学习算法工作会让人上瘾。如果你参加了一个机器学习的算法比赛,你会很乐意牺牲一个月晚上看电视的时间来提升算法的准确度。


也就是说,如果你开始学习时,使用着清晰的系统流程和最佳的工具组合,那可能会耗费一个或者两个小时,也可能是一个或者两个晚上。


你可以把任务拆分成多个小任务,把它们都贴在看板上面逐个解决。


开发者容易犯哪些明显的错误,

如何避免?


1.不采取行动


所有的一切都安排好了,但是,我依然看到一些软件开发者并不采取行动。看电视或者新闻远比苦坐建立一个新的模型和学习一个重要的技能容易。


2.选择了一个太难的问题


我经常看到一些软件开发者一开始就选择了一个或者两个非常难的数据集开始。那是非常大,非常复杂的数据集。然而,这些软件开发者他们并不具备分析这些数据的能力。更可怕的是,这样的挫败将会抹杀掉他们的学习动力,以至于软件开发者们都退出了原有的学习计划。


选择一个小的问题,最好你可以在60分钟以内完成。坚持这样训练一段时间,再进行更大的挑战。


3.不坚持既定的流程


参与了一个敏捷开发过程中,如果你从这个过程当中偏离了,这个过程就会很难进行,并且结果往往会很糟糕。坚持从一而终地完成敏捷流程,这是一个系统地解决问题的方法,是非常重要的。


你可能会在开发过程中发现一些“有趣的问题”,但是,一定要先完成既定的开发过程,并及时交付。


4.不懂得利用资源


对于机器学习,网上充斥着各种各样的优质论文、书籍和大量的博客。你可以利用这些资源来改善你的系统流程,使用工具的技能,和模型的准确度。使用第三方资源来获取更多的算法和数据集,深入理解算法和问题框架,一个具创意的想法将会改变你项目的进程。记住,如果你是采用的自上而下的方式,那必须在收尾阶段进行相关理论研究。花点时间来理解你最终的模型。


千万不要犯以上这些错误。


下一步


我们已经讨论了很多内容了,同时,我希望我已经说服了你,你可以开始并且不断在机器学习中取得进展。在未来你作为一名软件开发者,同时又懂机器学习算法将会非常抢手。


你的下一步是:

  • 选择一个设计和使用机器学习算法系统的流程

  • 选择适合的工具和平台

  • 选择你的第一个数据集合

  • 在文末留言吧


小福利:下边这个思维导图总结了这个博客中非常重要的一些概念。


程序员如何开启机器学习之路?我也遇到过这个问题_第10张图片



原文发布时间为:2017-05-28 

本文作者:AI100

本文来自云栖社区合作伙伴“数据派THU”,了解相关信息可以关注“数据派THU”微信公众号

你可能感兴趣的:(大数据,嵌入式,数据结构与算法)