专栏名称: StuQ
实践驱动的IT教育平台
目录
相关文章推荐
51好读  ›  专栏  ›  StuQ

万字长文|入门机器学习 (下)

StuQ  · 公众号  ·  · 2017-06-30 20:53

正文

请到「今天看啥」查看全文


作者|卢誉声&金柳颀
没赶上6.8日《1小时机器学习入门》公开课或听过后还想再认真研读一遍的小伙伴们,StuQ为你们准备了本次公开课详翔实的文字稿,本篇为下半部分,想看上半部分的小伙伴可点击文末传送门。

本文为StuQ公开课《1小时机器学习入门》文字整理稿的后半部分。

如何学习机器学习技术



学习路线


首先, 机器学习这个东西,你想入门的话并不困难,因为简单的机器学习算法,它的思路其实很朴素的 只要你学过一些基础的概率统计的知识,你都可以去理解它。就像说我们这边并不会完整的介绍机器学习的东西,因为它的历史非常长,门类非常繁多,我们最关注的主要的方法还是基于统计的机器学习。说到这,我就会从统计方法上来给大家讲一个机器学习的例子。

比如说这边有很多人,都应该非常喜欢看书,但是大家都知道书店里面书非常多,现在网上也有非常多的卖书平台,比如京东,当当,那么我们怎么知道自己喜欢看什么书呢?

一般的做法我们会先选一个分类,比如说你喜欢历史,你会选择历史书,你喜欢计算机,你就会选择计算机的书。但是这样就缺少一个惊喜,你不知道里面还有什么书,其实我很喜欢,但是我又想不到它。大家都知道,很多线下的实体书店都会提供一种服务,叫做书籍推荐。比如说新华书店等,他们有一个最简单粗暴的方法,就是把销量最高的书最热门的书摆到前台,叫热销书。比如有一百个人进去,有25个人在那边驻足停留,那么他们就达到了他们的目的。

大家都知道,现在网上最大的卖书平台就是亚马逊了,亚马逊当年最有名的服务就是他们的荐书服务。他们就是组织一个非常专业的荐书团队,这个荐书团队会为不同的用户去推荐他们可能喜欢的书。就像你刚进亚马逊的首页上你看到的书,发现都是你喜欢的书,你会感到非常惊喜和意外。不过后来亚马逊直接把这个荐书团队给开除了,因为后来亚马逊他们自己的人直接写了一个图书推荐系统,而且后来通过实际的运营发现,这个图书推荐系统比荐书团队准确率还高。

为什么这个荐书系统准确率会这么高呢?

我可以用非常简单的方式讲一下荐书系统的原理。它在机器学习里面的算法就叫做 关联规则算法 ,因为亚马逊他发现了一个规律,比如说如果很多人喜欢去买A这本书,然后买A这本书的人又会以很高的概率去买B这本书。比如说一百人买了A,其中90人买了B,那么有一个人来买A的时候,他是不是也有可能喜欢B?那么我们考虑这种情况,如果有一百个人同时买了A,B,C 3本书,其中70人都买了D这本书。那么如果有一个人买了A,B,C这三本书,那么是不是也有可能会喜欢D?我们甚至可以认为这个人喜欢D这本书是板上定钉的事了。

所以说你会发现亚马逊不仅会在首页上推荐你喜欢的书,它可能已经筛选了你买过的所有的书,从这中间找出关联的你可能会喜欢的书。同时你买任何一本书的时候,他还会给你推荐一个书籍组合,让你去买组合里面的另外一本书。就像刚刚有同学讲到啤酒和尿布,这个故事也是一个非常经典的故事,这些类型的推荐系统全部都是用了关联规则的方法,但关联规则方法是包括很多算法,我们后面会在讲机器学习技术的时候谈到这些东西。当然,除了亚马逊网站以外,你现在去,比如说电影网站淘宝,他们都会有一个推荐系统。

所以我们可以从这个最简单的例子看到,虽然机器学习是一门听起来非常高大上的学科,但是其实里面非常多的简单的算法,它的思想是非常朴素的,比如我们刚刚讲的关联规则,这其实就是我们高中和大学学到的概率论里面的 统计思想 。所以说大家都应该可以非常简单地去理解这个原理,而且我们要知道机器学习里面最重要的一个流派就是统计学这个流派。

刚刚可能有同学看到,我说机器学习入门不困难,他可能就觉得机器学习这门课不难。这里我要说一下,我刚刚只是说机器学习入门不难,但是说实话,如果你想学深入的话,它是非常困难的一门学科,为什么呢?

有这么几个方面,首先,虽然说很多机器学习算法它的思想是非常简单的,我们会尽量说用比较朴素的语言把它的思想讲给大家,但是其实它是有很深的数学理论背景的,就跟我们学算法的时候不仅要知道算法的思想,也要去证明这个算法是不是正确的,还要知道这些算法背后的逻辑推理的过程。

如果说你数学确实不好的话,你最多也就是去简单的使用那些现成的模型,学一下一些传统的成熟的机器学习方法,学会用这些方法去解决一些实际中的问题,可能说你的目的也就是这样。其实对于大多数人来说,这样也就差不多了,但是如果你想创造性去做一个工作,比如你想发明一个新的机器学习算法,或者说你想根据实际情况去调整很多模型的参数,想得到更好的训练效果,那么就是一件相对比较困难的事情。

第二个问题,机器学习模型。虽然不能说浩如烟海,但其实也是非常非常多的。就跟你做数学题一样,你要解一个问题,你脑子里会去想你要用什么方法解决这个问题?我们在用机器学习方法去解决一个问题的时候,也会说我们到底要用哪个机器学习方法去解决它。我们肯定要去选择一个合适的模型,如果我们想把这个问题套到上面去呢,他毕竟不是万金油,还可能需要去改一些模型的细节和参数, 所以这是一个非常有经验性的事情。而经验是需要在日常工作中积累的,所以这需要一个比较长的积累的时间

第三个问题就是所谓的机器学习的性能的问题。说实话,有些机器学习的模型的效果非常好,比如现在深度学习的深度神经网络,深度神经网络的效果非常好,尤其是在现在互联网上数据量非常大的情况下,深度神经网络,基本上一个CNN就可以干掉大部分传统模型。但是其实是有利有弊的。虽然深度神经网络效果非常好,但是他的速度真的是非常慢,尤其是深度神经网络里面的卷积层,在优化的时候都在想怎么,去优化卷积层里面的卷积速度。

总之,对一个深度学习的系统的性能优化问题,对一个做深度学习的公司来说是非常重要的。优化速度,一方面我们可以去提升程序的性能,比如说优化代码和硬件资源,但它毕竟是有限的。比如说当你遇到一个1000层的神经网络,在每层上再给他搞个一百万的特征,你就算把程序优化得再好,神也拯救不了。所以说有的时候我们必须得去简化网络,简化网络就是我们可能要砍掉网络里面的许多层,也要简化每一层的网络参数,说白了就是要减少计算量。

深度学习有一个问题说,如何在精简模型减少参数的情况下保证它有一个比较高的准确率?就是说它的准确率不会下降很厉害,可以在可承受的范围之内。这个是一个非常重要的课题。这种优化的问题其实挺多的,如果你感兴趣的话,可以在自己学习之余去找找看。总之,在实际使用的时候,速度是很关键的问题。

刚刚有一个人提到问题说, 机器学习不是很多都用Python吗?为什么会讲C++呢?

说实话Python非常好,有句话讲得好,“人生苦短,为什么不用Python”。但是Python主要是用在一种实验场景下,如果你有一个想法,想验证这个想法的正确性,我拿一个小规模的数据集来做实验,或者说一个东西不是用在一个产品上,可以等一天,那你是可以用Python的。

但是现在有一个问题就是性能问题,如果你想把你的东西放在生产环境中来使用,比如说现在大部分深度学习系统,你别看 他上面给你的都是Python的接口,但是它里面所有的东西都是用C++实现的 ,因为它对性能的要求非常高,它需要用任何的方式去提高它的速度,这种事情除了C++还没有什么能够做到。我们后面会有更加深入的去讲解实际应用中的优化问题,必须得去讲一些C++的内容。

最后一个问题就是说无论你的机器学习模型准确率再高,那么你还是有可能会出现预测错误的。比如说两年之前做的一个项目,它是给一个研究院做的迎宾系统,比如说你人走过来,要识别出你是什么人,就是给你拍张照做一个人脸识别,我们当年还没做人脸识别,就直接去买了当年国内最好的人脸识别引擎,它是一个小的设备,上面有一个摄像头。

我们当时测试是没有问题的,而且他们还有个经理每天都要去测两次,每次都是没问题的,最后验收的时候也是通过了的。结果有一天他们老总来了,这个系统把他识别成女的了,然后他们经理就打电话给我了。说实话,我心里也很苦啊,他们那个人脸识别的模型从准确率上来讲已经90%多了,这个产品其实挺牛逼的。但是就是点背,撞上这种小概率事件。而且你要知道对于一个使用机器学习系统的人来说,你的测试准确率可能是99.9%,他只看那失败的0.1%,因为他只有一次的使用机会。

那我们怎么去解决这个问题呢?我们还是只能不断的去优化我们的模型,真的碰到这种小概率事件,有的时候也就没办法。我们刚刚讲了机器学习里面的一些难度,说实话,你想深入学习机器学习是非常难的。那么我们肯定要制定一条路线,就是如何去学习这个机器学习。

好,我们来看学习路线,这里,我要跟很多人泼冷水了。学机器学习,你肯定还是要有数学基础的,这个数学基础并不是什么非常高深的数学。 对于非常简单的机器学习方法,我们是用高中的数学知识再加一些简单的离散数学知识就行了。 但是另一方面呢,如果说 想完全理解这些方法,那你肯定要自己去补微积分,概率论,线性代数,甚至后面很多关于复变,最优化这些东西 。说白了就是入门是很简单的,但是当你入门了之后,你会发现说数学会变成深入学习的障碍。

不是所有人都去做算法本身的,所以说我们这边很强调我们的目的是为了理解算法,并且再通过我们的工程能力去实现这些算法,所以本课程不会直接去讲数学,但是会在必要的时候提及这些数学知识。本课程的重点是用最基础的语言去描述这些内容,涉及到具体的数学知识的时候,会说让大家去学习具体哪方面内容。还有我说一下数学,其实数学都是可以补的。

说实话,我当年自己开始学高数的时候就考了66分,然后我发现数学这东西真的是太重要了,我还是要去学习它。

第二个就是说机器学习的思想和方法,这是本课程一大重点。学而不思则罔,思而不学则殆,放在机器学习里面,其实也是一样的。如果现在丢给大家一个实际问题,让大家去用机器学习里面的方法去解决,有一些人可能还是能想出123,但是大部分人想破脑袋也不可能知道怎么做。好在前人帮我们总结了很多套路,这些套路就是解决问题的时候,我应该按照什么方法来解决问题。你这些套路,我告诉你们,首先我应该怎么组织数据,然后我应该怎么写代码去训练这些数据,训练完之后你应该怎么用你训练出来的结果去预测最后的答案,而这些东西就是我们所谓的训练的方法,它的结果就是我们所谓的训练的模型。

因为去介绍这些东西可能对大家来说是最实用的东西,自古套路得人心,学完套路之后,你就马上可以去做一些实战训练了。不过另外一句话,学而不思则罔,学习完套路之后,必须要去理解为什么这些套路管用,我们要知道这些套路之后的原理是什么,只不过这些原理大多会涉及一些数学知识。本课程的方针就是说我们用最简单的语言来讲解这些原理,当然有些地方还是会提起一些数学公式,不过希望大家课后能够自己去看一些资料,更好的去思考和理解这些机器学习方法。

最后一步就是工程实践,说白了,计算机就是一门比较讲究实用性的领域。如果你是一个工程师,就算你懂得再多,最后也无法转变成能够实际工作的代码,那你是没有什么用处的。所以说本课程是教大家如何去实践机器学习,我们学习机器学习模型,直接去解决问题,这是本课程最大的特色。我们并不关注那些过于抽象的理论, 毕竟对于工程人员来说,动手是理解有问题最好的方式 。只有形象地的去理解一个问题,我们才能不断的去细究一个问题,去探索它的本质。本课程的不同之处在于我们虽然开始会用一些小规模的数据去做一些实验,但是我们并不只是针对每一个机器学习模型做一些小实验,我们最后会去开发一个完全可以实际使用的系统,教大家怎么用机器学习去解决我们现实的问题。

实现方法

我们现在来看一下,如果我们想在工程领域进行大规模机器学习,并且在线上应用,我们应该学习什么技术。

我们的关注点是如何进行大规模机器学习。大规模机器学习的第一点就是hadoop,大多数人应该都听过这个东西。虽然说现在更多,分布式数据处理工具层出不穷,但是它依然是屹立不倒最重要的工具之一。hadoop是一个分布式计算和存储平台,也就是说它又能搞分布式计算,又能搞分布式存储,可以说是一个全能选手。但它有个致命的问题,就是实时性不够,所以它不是一个解决问题的万金油。hadoop的细节我们之后用到的时候会详细讲,我这里提一句,hadoop里面有个项目叫mahout,这个项目已经使用一些可以扩展机器学习领域算法的实现,如果大家有兴趣可以去看一下。

第二个大规模工具是Spark,它的优点主要有两个:

  • 它的api使用了流模型,相对来说更易于使用。

  • 速度非常快。

hadoop会把它的中间计算结果存储在外部设备,比如说它的一个分布式完全系统上,它有一个网络和硬盘的IO问题。Spark为了弥补这个问题做了一个非常简单粗暴的选择,它把中间的计算结果全部存在内存里面,没有一个网络和硬盘的IO损耗,速度自然快。

第三个是STORM,它是完全瞄准hadoop的软肋,如果说Spark只是通过提高计算速度来缓解实质性的问题的话,那么STORM则是一次釜底抽薪。它直接换了整个计算模型,用一种网络的实时流模型来解决问题,我们会在后面用到的时候具体讲解这个模型。

第四个是Hurricane,他是一个用C++开发的系统,它的架构是模仿STORM,只不过是希望通过C++来提升它的计算速度,并且大家在做工作的时候就会发现我们需要做一些线性代数的计算,它的目的就是希望构建一个易于使用的分布式计算系统。

上面我们介绍了一些工具,这些工具都是一些大规模分布式计算的框架,如果说继续学习是一个工厂,那么它们就是工厂的主任,他们的职责就是负责指挥底下的工人去工作,但是我们最后肯定是要实践具体机器学习的方法,要有一些人来干实事。所以实际上工作中我们只有这些工具是不行的,所以我们在课程中会讲到生产实际中会用到的一些相关工具。

我们先看最上面的,一些深度学习的工具和框架,说白了就是,你用了这些框架之后,你就可以非常方便的去用这去用这些现成的深度学习工具训练一个模型,你只要输入数据,定一下网络结构,它就可以给你训练出你需要的东西。这里我们推荐有Tensorflow和Caffe。Tensorflow是一个第二代人工智能机器学习系统,虽然它是一个通用的机器学习框架,但是现在深度学习太热了,大家基本都用它来做深度学习。Tensorflow,是一个n维向量流模型,看起来很像STORM,它非常灵活。比如说你的机器不好用了,你随便接几台机器,随便加几张显卡,它都可以正常工作。

Tensorflow背后的支持者是谷歌,所以它拥有庞大的用户社区拥有很多资源。当你想要去验证一个实验性的想法的时候,它是一个非常好的选择。不过它也有它的缺点。

第一点,如果说你只有一个GPU的话,它的性能确实不敢恭维,而且由于封装太好了,它的内部代码相当复杂,开发调试起来非常令人讨厌,想要深度定制是非常困难的。因此在生产环境中并不会使用它,因为我们没有那么多的计算资源。

小公司里面生产环境首选我觉得还是Caffe,这个计算模型比较陈旧,但是因为它的历史比较长,所以支持的工具比较多,而且它的内部代码比较简单。同时它的优点是运行效率高,特别是应用于基础能力和硬件资源都不是非常理想的小公司,而且如果你的公司里面有一个技术能力非常强的人,他能够吃透Caffe之后你们还可以去维护自己的版本。对小公司来说,这是一个性价比非常高的选择。我们将在后面非常详细的去介绍它,因为我自己小的模型都是用它去做的。

深度学习的工具是一个执行训练和运行基石,在这上面还需要配套的工具来处理数据并调度任务。我上一节介绍的大规模处理数据的工具就是最好的选择,他们可以帮你做数据预处理,处理完之后,调用这些深度学习的框架,然后这些深度学习的框架就可以帮你去做最后深度学习的计算。

这里我们还要注意说,因为数据非常多,无论是我们训练数据也好,还是我们最后训练出来的模型也好,都是存储在一个分布式存储环境当中的。而我们就可以选择HDFS或者MongoDB,这是非常适合存储非关系型数据的系统。至于我们系统的数据就可以存储在MySQL这种传统的关系型数据库集群中。最后我们还可以用Redis这种内存数据库来做训练和预测的加速。比如说你可以预先加载一块东西出来,作为一个缓存,它可以有效降低我们预测和训练IO的延迟。

接下来我们来讲解机器学习里面推荐给初学者看的两本书:

一本是周志华的 《机器学习》 ,这本书是最近评价比较好的机器学习教材。当然他是一种科普性的教材,所以它并不适合完全自学,但是配合我们这个课程去看也是完全不错的。一些机器学习的技术算法在这本书里面都会有相应的介绍。 优点是对算法的描述比较简单直接,但相应缺点是缺乏一些深度的分析。

第二本是 《机器学习实战》 ,这本书顾名思义,它的重点在于实战,它也是一个入门的经典教材了。这本书对理论讲的比较简单形象,每个方法它都会使用Python代码教你怎么实现对小规模数据集的分析。 它的优点就是能够让你迅速抓住每个机器学习算法的理论核心思想,但因为是入门性质的书,所以说无论是理论还是代码方面都是讲的比较简单的。 理论上没有做一些深入的分析,这部分可能还不如周志华的那本书。 代码上,它的工程规范性相对是比较差的,也只是处理一些小规模的数据集。 所以实际上你还是得去自己优化代码的,不过这是我看到的最靠谱的实战类的书籍。

最后一部分是由2017年5月份,CSDN出版的程序员杂志,这本书刊登了Hurricane当时的一个实时处理系统的架构剖析,如果大家对大数据实时处理系统原理非常感兴趣,大家可以去看这一篇文章,里面也涉及了深度学习网络和机器学习相关的内容。

机器学习领域前景和就业


好,我们来看一看机器学习的就业前景和就业情况吧。我们知道,机器学习非常非常火,即便是像我们这种传统的IT公司,都已经开始踏入机器学习领域了。

就像我们之前介绍的,阿尔法狗和自动驾驶已经让我们体会到了机器学习和深度神经网络莫大的威力了。相比之下,很多新的领域有极大的用武之地。我们国家之前搞了一个“互联网+”的政策,提倡线上和线下结合。我们认为现在可以搞出一个“机器学习+”,鼓励大家利用机器学习去解决实际的问题。

我们来聊一聊人工智能的发展趋势。大家使用计算机解决实际问题的时候,像原来都会建立一个数学模型,用数学模型之间的逻辑关系来反映现实问题。只可惜在现在,实际问题越来越复杂,传统的数学模型方式基本上失效了,因此出现了机器学习。机器学习的一大流派呢,其实是统计学。统计学流派其实也就反映了机器学习跟传统数学模型之间的差异,他们关注的是现实问题在统计方法下的关联关系,而不是基于数学逻辑的因果关系,这点差别非常大。其实我们更希望的关注工程的、能解决实际的问题。

就像金老师介绍的这几本图书还有杂志,其实关心的更多的是概率问题,而不是为什么。可以通过机器学习去找一个规律的表现层,然后我们再来分析这个表层下的逻辑关系。最后我们来了解一下现在的大势所趋是什么,我个人觉得就是深度学习。

深度学习在处理很多很多问题的时候,特别特别牛逼,尤其是图像识别、模式匹配、语音识别这些领域。大家可以看到,苹果刚刚出的iOS11,里面新的Siri说话非常自然。怎么做到的呢, 这其实跟机器学习和深度学习有非常大的关系。 我也说过,神经网络其实三十年前就已经提出来了,为什么现在才这么火呢?最主要的一个原因就是深度神经网络极度依赖于数据量。

大数据时代一定程度地触发了人工智能的崛起,当数据量提升到一个数量级时,在深度学习上会有比较明显的效果提升。而很多传统模型则无法有效利用大量的数据,因此我们赶在大数据时代,也是一个好时代。另外一方面,深度神经网络实在是慢,尤其是卷积神经网络,各种矩阵运算是对机器性能极大的考验。不过十年前,那么大的数据也处理不来。所幸现在出现了非常先进的CPU和GPU技术。最后就是谷歌的TPU,直接生产在电路板上,就是为了神经网络和深度学习而构建,非常的牛逼。

所以我们发现现在的数据量和计算能力为深度学习、深度神经网络提供了完美的舞台,不火真是没有天理了,所以我们要学习深度学习和深度神经网络。

然后我们来看看 就业前景,现在其实对大数据要求非常旺盛 。即使是传统的IT企业,对人工智能方面的需求也非常地旺盛,尤其是在云计算平台上。从另一个方面也反映了对数据处理和算法工程师的需求非常旺盛。而且我也可以预见,在一定时间内也不会改变。

从另一方面, 几乎所有的行业都在应用深度学习或机器学习的技术。在机器学习领域,大数据、算法、数据挖掘这些岗位招聘的人数是陡增的,而且从我身边也能感受到,招聘这些的岗位也越来越多。

我身边的朋友或者创业的,都非常需要这方面的人才,需求量也非常大。所以我一直觉得在未来五到十年,人工智能或者深度学习技术,可能是未来软件行业发展的一个重大趋势和方向。 因为现在深度学习技术已经落地了,大家可以用各种开源的框架,或者说我们后面去开发各种各样的框架,都可以解决真正的实际问题。

机器学习能解决什么问题呢,比如:模式识别、人脸识别,还有一些智能推荐,趋势预测。另外大家可以看到的一个趋势就是苹果今年的WWDC,其实它很多的主题都已经在往机器学习领域上靠了。侧面印证,机器学习确实是将来的发展方向。

今天的内容大概就这么多,然后我们这边有一个课程。这个课程有一个深度神经网络的工程实战,我们会去讲解纯理论的一些东西,包括最基础的Python的编程。另外就是一些机器学习和深度学习理论上的东西,然后是转到工程实践的东西,会涉及C++和Python的编程,其实Java也是ok的。

想更深入了解深度学习?

这里有一套为想求职/转行/加薪人工智能领域的同学量身定制的大课《3个月成为AI实战工程师——深度神经网络实战》, 现在报名,还有早鸟票哦


再送 3 个 200元 本课程优惠码【 stuq630 】,先抢先得!点 「 阅读原文 」 立即使用。


传送门:

万字长文 | 入门机器学习 (上)







请到「今天看啥」查看全文