找回密码
 立即注册
搜索

写给程序员:一次性掌握机器学习基础知识脉络

来源 | AI科技大本营在线公开课
嘉宾 | 张相於
整理 | suiling
本次公开课AI科技大本营邀请到了阿里巴巴的高级算法专家张相於,他将从数据的概率分布开始介绍机器学习核心概念之间的有机关系,帮助大家建立知识脉络,做到知识的有机吸收。同时,讲解机器学习的元知识,介绍系统性持续学习的方法和技巧。最后介绍算法工程落地能力的入门和提高,避免只会算法不会落地的尴尬。当然,随手推荐一波独特有效的学习资料不在话下。


以下是公开课内容整理
我们这次分享的题目叫做《机器学习第二次入门》。我先简单自我介绍一下,我现在在做算法工作,在阿里做高级算法专家,主要关注的领域是在推荐系统、机器学习、金融风控这些方面。


视频回放:https://edu.csdn.net/huiyiCourse/detail/860


本次分享包括三个内容,先讲一下机器学习的知识脉络,这是我们这次分享的核心内容。第二点是工程能力。现在网络上有很多机器学习入门的材料,所以本次课程中会稍微提一下。最后,会相对深入地推荐一些内容、资料,会给大家介绍一些书的特点,不是简单拉个单子,我觉得拉单子这个东西可能大家也会迷失在其中。


机器学习的知识脉络


下面我们看第一个章节——机器学习的知识脉络。为什么叫做第二次入门?第一次入门大家可能会是这样一种状态:想从事机器学习行业,你会去找一些视频或者是学习材料,一上来可能就会给你一些常用的模型,跟一些实用的demo这方面的东西。这些东西对于上手是非常有用的,也是一个必经之路,但是往往会忽视一些比较靠下的基础理论知识。这就会导致有的同学会很困惑,感觉机器学习的理论点特别多,知识特别多,好像永远也学不完的样子。但其实这背后是有一些规律的。今天我们会从其中一个角度进行分析,它只是一部分的知识脉络,希望能给大家打开一个新的视角,对于你持续地去学习,去更深入地掌握知识是有好处的。









首先,我们看这样一个问题,你如何能把一棵树上的所有叶子都抓在手里面,或者所有的叶子都把它收起来?
第一种方式,我用一个不好的比喻来讲,有点像狗熊抓树叶一样,因为有个词叫“狗熊掰棒子”大家都知道,什么叫狗熊抓树叶?就是树叶落一地,我就一片一片去捡,但是这个其实效率很低的。因为在你看来它们就是一些没有区别的叶子,在那儿一个劲地捡。但是还有种方式——倒过来去抓这个叶子,从根上去抓,大家都知道《水浒传》里有鲁智深倒拔垂杨柳,从根上到枝干上,然后倒着这么去走,其实是能够提纲挈领地去抓住所有的叶子。是这样一个比喻。







那么反过来,我们看机器学习现在很热的一个知识,怎么能够去学好机器学习知识?有一个很常见的办法,我经常建议大家去翻一下算法比赛,此前有则新闻,Kaggle 上面一个最年轻的 Grandmaster 诞生了,他是一个高中生,他自学了三年算法的知识,他一下子就变成了 Grandmaster。这个是实践的一个很好的方式。
但是从另外一个角度来讲,如果你想比较深入地去研究这个东西,想走得比较远,建议你还是能够把基础先连根拔起,能够了解它整个的知识脉络和知识系统,对于后面的学习非常有好。
树叶丢掉还会长出来,但是根没有你就完蛋了,这是什么意思?对于我们学习一些知识来讲,其实大家应当会有这种感受,就是我学一个知识点可能过一段时间忘掉了,如果你的学习不成体系的话就会这样子,有点像现在很多所谓碎片化阅读什么的,但其实不是所有的知识都适合碎片化阅读,有的东西它还是适合系统化地去学习。如果你系统化地学习之后,有的东西忘掉其实不是很大的问题,还是可以很容易地把它捡回来,因为你知道它在什么位置。有的如果你脑子里面没有这个系统的话,你就会觉得所有的点就是一个一个点,不是很好地联系起来。这就是我们讲这门课的一个动机。







首先我们来看一下这个概念,统计学习。现在最火的概念叫人工智能,但是其实也有一些比较冷静、客观、低调的大神批判说你们这根本不是人工智能,其实就是机器学习。机器学习,其实可以再上升一点说机器学习大部分其实都还是统计学习。统计学习是什么?统计学习其实就是基于大量的数据,说得直白点就是学出一套规则来。它的核心其实就是拟合数据,特别简单,如果你看一些基础理论书的话,机器学习就是拟合数据。
拟合数据一般来讲有两种套路,就是说首先你有一堆数据,就是所谓的观察,你有一堆数据,然后你想知道它背后究竟是一个什么分布,这个东西就是生成式模型,生成式模型你可以理解为它就是一个上帝视角,你学好了之后它就是一个上帝视角。比如说 100 万个点,任何一个点它的生成概率是多大,这就是统计学习里面最基础的一个概念,就是概率分布,也就是说这个数据究竟是由它的,我看到它的 population,它真实的生成概率是什么样子,这就是生成式模型。生成式模型我们一般会把它拆成 X 和 Y,x就是一些特征变量,y就是你观测到的结果,比如说一些标签,会通常拆成这样一个形式,就是y的概率乘以y下面看到x概率。
生成式模型虽然很牛逼,它是一个上帝视角的东西,但是很多时候你会发现好像也不是百分之百地需要这个东西,因为绝大部分情况下我们的问题,像课前交流时候有的同学也说了,绝大多数的问题其实它就是一个监督问题,就是一个分类问题,在这些场景下面我其实不需要真的知道它的联合分布是什么东西,我只需要知道一个判别概率,一个条件概率就知道了,也就是说在知道 X 的情况下,Y 有多大的概率。比如说我们常用的点击率模型,点击的概率有多大,核心想知道的是这样一个问题。所以说就有另外一种拟合方式,就是判别式模型,就是我最终想拟合出来的东西是这样一个概率。







我们要拟合数据,第一个概念就是假设集合。假设集合决定了我要以什么概率函数的形式去拟合这个数据,也就是说我们选一个什么样的函数的样子,通俗一点说长什么样子来去拟合它。举个例子,比如说我们如果是拟合条件的话,我用一个逻辑回归,其实你默认了一个思想你选择这个假设集合就是长这个样子。就是1除以1加e的-x次方这样一个东西。这是你的假设集合。
假设集合选出来之后,我们先不讲怎么去得到这个假设集合里面的具体东西,因为你的流程其实就是一步步地选,我先选出假设集合来,然后我再从假设集合里面再选一个具体的东西出来,就有点像我们经常学的那种抓球,有两个袋子,一个袋子里面是红球,一个袋子里面是蓝球,然后我再从这两个袋子里面决定选出哪个袋子来,然后再从那个袋子里面拿出一个球来。其实机器学习从最高的角度去看就是这样一个东西,所以说第一步你是选这个假设集合是什么,然后在假设集合内部,我们等会儿再讲,其实后面的学习过程就是从假设集合里面再挑出一个球出来。
我们在优化之前,在得到模型之前,都需要做一件事情,就是先要知道怎么样判断拟合得好不好。我很推崇的一句话,就是说“你如果不能衡量一个事情,你是没办法改进它的”,这个其实不仅适用于数学或者什么,其实整个在工作中也会有这样的问题。你想做一件事情,一定要先有目标,没有这个目标就不能说这件事做成没做成,做好没做好。所以我们首先要去引入几个概念,怎样评判我从假设集合里面选出的一个东西来,它是一个好的假设还是一个不好的假设。


这里面首先第一个概念就是我怎么衡量它的分类能力?为了更好地解讲这个问题,我们把它局限到一个分类问题上的话,那么最直接衡量分类能力,最概括的那个指标叫做 VC Dimension。VC Dimension这个我相信大家很多人都见过,好像也是面试里面特别喜欢考的一个知识,但是我之所以把它放在这个地方讲,就是让大家知道,VC Dimension 它是一个什么位置,为什么要出现这个概念?因为这个概念它不是从天上蹦下来的,它不是从石头里面蹦出来的,我突然就说我需要一个 VC Dimension,它不是这样的,它一定是在衡量一个什么东西。
VC dimension 衡量的是什么?它衡量的是假设集合的好坏,它不是在衡量一个具体的假设。刚才有同学说假设集合就是算法,你可以理解为假设集合就是模型。比如说逻辑回归它是一个模型,它就是一个假设集合。这个 VC Dimension 它衡量的就是逻辑回归在某一方面能力怎么样,或者是决策树在某一方面能力怎么样,它还没有到评估说具体某一个拟合出来的模型好不好。
VC Dimension 什么含义?有的同学可能看过,这里简单说一下。它其实讲的是特别简单的事情,VC Dimension 如果是 N 的话,就代表我给你 N 个点,然后把这 N 个点,每个点都有两种选择,比如说是红蓝两种颜色,我对这些点做任意的着色,你这个模型都能够分出这两种颜色来,就是红的还是蓝的。这里面有一个典型的,比如说一个线性模型,它的 VC Dimension 是什么?线性模型的 VC Dimension 就是 N+1,N就是它的维数,大家可以想像一个特别简单的场景,一个二维平面上的直线,它的VC Dimension 就是 3,为什么?因为你对于任意三个点,你随便在脑子里面画上三个点,随便给它着色,红的,上面是红的,下面是蓝的,你都可以画一条线,把这个红蓝区分开。所以它的 VC Dimension 是可以到 3 的。但是 4 个 OK 吗?你找出四个点来,你对它任意着色,它一定会找到一种情况,是一条直线分不开的,没有办法说直线的一边就是红色,一边全是蓝色。所以说 VC Dimension就是这样一个东西,它是衡量一个假设集合的一个分辨能力。
有了 VC Dimension 我们就知道了一个假设集合的好坏,那么 VC Dimension 是不是越大越好?比如说我刚才说线性模型的 VC Dimension是 N+1,我们是不是要找一个无限大的 VC Dimension,这样一个假设集合就是最好的?其实并不是的,因为无限大的 VC Dimension 就代表着你会拟合得非常严重。所以说我们引入第二个概念就是 error。
Error 在机器学习里面,基础概念里面它是一个比较复杂的概念,它是三个东西组成的,一个叫 bias,一个叫 variance,一个叫 noise。我们先说一下 noise, noise 是什么东西?noise 是噪音,噪音在机器学习里面它的概念就是说,这个噪音你可以认为这个模型再怎么牛逼,它都分不出来的点,这就是噪音。
举一个例子,比如我们的样本集里有两条样本,两条样本的特征是完全一样,比如 10 个特征,每个特征上取值都是一样的,但是第一个样本它是一个正例,第二个样本它是一个负例。这种情况你说你该给这两个点分什么例?如果都判成正例,一定会有一个是错的,如果都判成负例,一定也会有一个是错的。这个就是 noise,这就不是你模型能决定的东西。noise 叫做irreducible error,就是不可约错误,就是模型再怎么牛逼你都干不掉,这是noise。







除了 noise 它剩下的两部分叫做 reducible error,也就是 bias+variance这两个东西。所以说我们后面会讲,小孩子才分对错,大人只看bias和variance。我觉得在机器学习里面它的核心就是在平衡这两个点。
关于 bias 和 variance,其实很多同学都看过,我也面试过一些同学,大家对这个东西多少都知道一点,但是其实大部分同学都是一知半解,都不是特别地懂这个东西,好像都能说出来,bias 好像是说它准不准,然后 variance 是说它的方差大不大,但是这个 bias 和 variance具体它是怎么算出来的?其实很多同学没有很深刻地理解,在这里我们对这个东西做一个解释。
因为大家知道在概率里面,你看到 bias 和 variance 第一个想到的是什么东西?一定是概率里面的 bias 和 variance,举个最简单的,比如说有一组随机概率分布的点,你会算它的 variance,variance 就是方差,这个是很好理解的。但是,在机器学习里面它的 variance 指的是什么?









我们看一下这个公式。最上面这个就是 reducible error。它本身是一个期望,大家看到期望会想到什么?期望其实指是一个概率分布的期望,如果期望不好理解的话你就理解成平均数。它既然涉及到平均数、平均值,它一定就要涉及到好多个点,对好多个点算均值才有含义。
就是这个方括号里面这个玩意儿,



,那么 Eout 指的是什么?就是在测试集上面的评估结果,这个应该相对好理解,也就是说你训练一个模型,然后在 Eout 上面去评估。这个Eout指的就是你在测试集上的一个结果。那个 g 是什么?就是你的假设集合。比如简单讲,我就选了一个逻辑回归,这就是逻辑回归,我要训练逻辑回归了。右上角这个 D 指的是数据集,就是选定一个一个训练数据集,我在这个数据集上训练出一个结果来,然后在我的测试集上评估,就得到了Eout里面的一个点。然后 out 集上得到的好多点就是这个 Eout。然后再对 D 做平均数,取好多好多个数据集,我在每个上面训练一个结果,然后在测试集上评估一下,然后得到一个结果。这就是这个东西的来源。
所以说现在第一概念就是 bias 和 variance 它的基础单位都是数据集,然后要算这个数据集上面的误差,就是这个 error,叫 reducible Error。然后下面这个可以先不用关注它是怎么出来的,然后它通过两步计算,就把这个error 分成了两个部分,大家可以看到左下角这个部分和右下角这个部分,这两个东西其实就是 bias 和 variance。右边这个是什么?我解释一下,就是g bar,g 的平均值,x 这个,它其实指的是你在所有数据集上估的那个模型再取一个平均。比如说我有 10 个数据集,我估出 10 个结果来,我最终预测结果就把这 10 个模型的预测结果平均一下,这是g bar 的含义。然后f(x) 特别好理解,f(x) 就是原始函数,就是原始真实的那个函数,假设它有一个真实的函数。这个东西它就是 bias。
左边这个就是它的 variance。variance 是什么?你可以看到 bias 它是没有外面这个E的,它是不用算均值的,但是为什么 variance 需要算?因为variance 是概率里面一个基础概念,就是你需要把好多点去取方差。所以说它的计算方式就是说用在每一个集合上估出来的结果减去这个平均函数估出来的结果,然后看每一个集合,它其实衡量的是在每个数据集上估出来的结果和你平均结果是一个平均误差,这个东西就是 variance。所以说我希望通过这段讲解让大家能够知道 bias 和 variance 它俩究竟指的是什么,大家说起来好像都知道,一个是衡量偏差的,一个是衡量方差的,但是偏差和方差是什么?它就是这两个含义。
下面这个图,它是有两个组成部分。左边是个特别简单的图,它表示的是什么含义?它表示这个H是我的假设空间,是这样一个圆圈,里面只有一个点,因为这是一个极端情况,就是说我的假设空间里面只有一个点。我举个例子,什么叫只有一个点?就是说估出我的模型,就是 g(x)=1,就是不管你给我什么数据,我的模型就是这个结果,然后我对你所有的结果都预测,不管你给我什么特征我就预测 y 值=1,就是这样一个模型,其实特别傻的一个模型。这个模型它的variance是多少?它的variance是0,为什么它的variance是 0?它的方差为什么是 0?因为你不论给它什么数据集,它估的结果都是一样的,并且和平均结果是一样的,因为你所有的结果都是一样的,那一平均自然也是一样的。所以说它的方差是 0。
那么它的偏差是什么?大家可以看到右边有个 f 这个小圆点,这个点和这个f中间的差距这个就是偏差。所以说这个模型的方差特别低,它就是 0,你不可能比这个更低,因为方差带平方的,所以方差不可能比这个更低了。所以这就是一个极端的 case,它的方差是 0,它的偏差一般来说会非常大。任何 x 给的y都等于 1,那你自然不会得到一个好的结果了。
右边这个它是一个反向的例子,就是说它的假设空间点特别多,然后这里面有一个点,颜色偏浅的一个点。右边这个图是什么含义?就是说假设空间特别多的点,真实的点,真实的那个 f(x) 是右边这个颜色不太一样的点,大家应该能够分辨出来。那么这个集合你可以看到它的方差会非常大,因为什么?它每一个黑点都代表着我给你一个数据集,你给我估一个 g 出来。我给你100 个数据集你就估出 100 个 g 来,这 100 个 g 各不相同,所以它的方差会很大。但是它的偏差有可能会比较小,就是阴影部分覆盖住的这些黑点,它的平均点大概率其实是在颜色不一样的点附近,所以它的偏差有可能会比较低,但是它的方差是非常大的。
这里核心想让大家 get 的一个点是什么?就是在说机器学习模型的偏差和方差的时候,它的核心元素是一个点,这个点是怎么得到的?就是在一个数据集上估出来的结果。这个数据集,因为我刚才讲的是实际中的情况,理论上你是从总的那个样本中抽的,就是我知道真实分布,然后我抽 100 个点,再抽 100 个点,每抽一次就得到一个数据集点,就得到这个公式里面的一个D,后面的偏差和方差其实都是对这个 D 来讲的。
Eout 其实就是 g(D) 减去 f(x) 得来的。这个公式是不是看着很眼熟?这就是平均展开,a 减 b 的平方等于a 的平方加 b 的平方减去 2ab。然后为什么到下一个等号了?它减去g bar x平方,加了一个 g bar x 平方,然后就出来这个东西了。后面这个又根据这个平方差公式然后得到了这个图。


这个公式中,这个 Eout 其实就是你的 g(D)减去 f(x) 得来的。这个公式你不是看着很眼熟吗?这就是平均展开,a 减 b 的平方等于 a 的平方加 b 的平方减去 2ab。然后为什么到下一个等号了?它减去 g 一半 x 平方,加了一个 g 一半 x 平方,然后就出来这个东西了。后面这个又根据这个平方差公式然后弄了这个图。
然后再从直观的去理解一下这个图。这是四种情况,四种情况分别代表了高和低的方差、偏差的点。先看左上角这个点,这是最牛逼的点,它有很低的偏差,还有很低的方差。偏差低大家很好理解,就是预测准确率特别好。那为什么关注方差要低?方差低就代表着你在任意一个数据集上得到的结果都特别接近在所有数据集上得到的结果,这是一个保证。这是一个什么保证?就是说在没有办法得到全部数据集的情况下,只得到了部分数据集。在这个上面的结果和在所有数据集上得到的结果不会差特别多,是这样一个保证,这就是方差,这就是稳定的问题。
然后最不理想的情况是什么?就是右下角这个情况——偏差又大,方差又大,那这个模型就没什么用了,既估不准,而且在不同的数据集上跳得还特别厉害。值得关注的是左下角这个点,左下角这个点叫做 High bias、Low variance。其实这种点看着好像离圆心挺远的,偏差不大好。但实际上这种点在实际中很多时候也是有用的,因为它有一个保证,有一个稳定性保证。如果你关注的是一个趋势的话,这样的数据集其实也是ok的,因为你知道它稳定地离你的圆心就是这么远,但是你不管拿什么数据它都是这么远,所以这种模型也是ok的。
然后看右上角这个点,可以看到它散得非常厉害,它的方差很高,它的偏差还是比较低的,这种点看起来好像也蛮好,但实际情况中这种模型不是特别好的点,因为你根本不知道你某个数据集能映射到哪个点上去,它没有一个保证。所以我们在现实中其实很多情况下,我们后面会讲这个东西和算法能力,和正常化是有关系的。就是为了要,不管你准不准先不说,你不要太散,在工业中应用我们还是很注重稳定性的。
这个大家下去可以再去理解一下,我们后面推荐的书里也会讲这个东西。
然后我们就讲到交叉验证,刚才讲这个 bias variance,可能有的同学会讲这个东西也就是面试会考一考,实际中好像也没有什么用处。我们下面讲一下它在实际中有什么用处。它的实际用处就是交叉验证,为什么做交叉验证?交叉验证的方法我就不重复了,大家应该知道,就是说你把数据分成 k 份,每次留一份出去,剩下的训练,你可以预测,然后把结果拿起来,然后去评估一下。但有没有想过你这么评估,评估的是什么东西?你评估的是什么东西?其实你评估的就是 bias 和 variance 的一个拆分,它就是 bias 和variance 拆解的一个直接应用。







流程我这儿简单写了一下,就是将数据划分为 k 份,每次留出一份作为测试,其余作为训练,记得到的误差为 ei,ei 就是第 i 份的,你把第 i 份去做测试的时候得到的误差,然后就得到了k份测试结果。你的 bias 是什么?就是每一份误差的一个均值,这个很好理解,这就是你的 bias。你的 variance 是什么?把这 k 个误差当做 k 个点,用统计学的方法算一下它们的方差,这就是它的 variance,这就能很好地评估你这个模型在这个数据集上它的稳定性如何,它的偏差如何,这就是这种方差、偏差分解在实际中的一个最典型的应用。
可能有的同学经常用交叉验证,但其实对它的深层次含义没有过太多的考虑,今天就给大家建立这样一种联系,其实是解决了两个问题,一是偏差、方差的分解究竟在现实中有什么用;二是反过来,这个交叉验证它的理论知识是什么,做这样一件事情它的意义是什么。
其实如果你不关注稳定性的话,你就直接再一个数据集上做一个测试就ok了,你得到的 bias 如果数据量大也是准的,但是你如果不划成k份,你做交叉验证你就没法知道它的稳定性是多少,我觉得这个应该说得比较清楚。
在上一步我们已经建立了一个方法,就是说我怎么评估一组模型的好坏?但是刚才我们经历了是如何评估一个假设集合的好坏,接下来还要想办法去评估具体一个模型,比如我们选定了一个袋子,下面从袋子里面选球,这个球的好坏怎么去评估。所以说第一步需要考虑的,我们这个reducible一共不就两步吗,一个bias,一个variance,我们如何减少bias?在考虑如何减少bias之前,首先要考虑如何评价bias,还是刚才那个理念,在改进它之前先要考虑好如何评价它。所以说我们在日常生活中用的怎么评价bias,其实就是各种损失函数,你的loss function方程是什么?刚才有同学说Cross Entropy。定义出来然后去优化它,这是我们后面会讲的一个优化方法。







那么如何减少 variance?就是正则化,这里面就有一个延伸问题,就是常用的正则化方法,比如说 L2 正则、L1 正则,L1 正则很暴力,就把一些它认为没有用的干掉了,L2 正则它是限制一些参数的大小。这里面其实可以有个问题给大家想想,为什么限制参数的大小以及限制参数的数量就可以减少variance?这个问题其实和我刚才讲的从假设集合那个角度去考虑它是有关系的,我们刚才有一个比较极端的图,我们再回去看一下。它左边是一个极端小的假设集合,右边是极端大的一个假设集合,从一个很粗的角度去理解,就会发现这个假设集合里面的东西如果特别少的话,它的稳定性就特别好。因为一共可选的就一个,极端情况下,那当然很稳定了。但是如果你可选的东西特别特别多,那你的东西自然就不会很稳定。所以说我们提供一个特别粗,这不是一个理论证明的角度去理解它。
那么参数数量越少,取值越被限制,它的变化的可能性就越少,那么它自然也就越稳定。所以说这就是正则化为什么能够约束 variance,为什么能够起到稳定模型的一种理解角度,其实就是我要减少你的假设集合的大小,不能让你像孙猴子一样到处跑,那你就不稳定了,我这次抓你在五指山,下次抓你上西天了,那就不好。把你放在一个笼子里,这个笼子就这么一亩见方,怎么抓你也不会跑出这个东西里头,所以它就是减少模型复杂度。模型复杂度其实特别简单,就是参数越少,取值范围越小,这个东西就越好。
那么定义就是这么一个定义方法。比如说在树模型里面可能就不是说参数大小,那可能就是剪枝。剪枝是干什么?剪枝其实也不是让你跑太远。比如每一层 2 分裂,每一层 2 分裂,就分裂很多很多,但是就不让你分裂那么多,因为分裂得越多,代表着越能生出很多不同种类的数来,当然就飘得很厉害了,这次抓你在这儿,下次抓你在那儿。所以说让你稳定,就能减少方差。
优化方法,其实好多时候偏差和方差是在一起优化的,后面会讲到。







OK,讲到这儿,我们又往前走了一步,我们又知道了具体,我们刚才讲的如何衡量损失,如何衡量一个 error,现在我们又知道了如何分别去衡量它俩,如何分别去衡量这两个东西。
我已经定义好的假设集的好坏,又建立了定义一个模型的好坏,我们怎么去得到一个比较好的东西?最理想的方法就是所谓的解析解,就是我们上学时候学的比如说二次方程、三次方程。这里举一个例子,就是最小二乘法。如果数据量不是很大的话,其实可以一步,单变量的一个线性模型的话,你可以一步就算出它的模型它的解来,它的 β0 就等于这个东西,它的 β1 就等于这个东西。但是这个东西太美好了,大部分情况下是得不到的。所以说我们还有一种方法,现在用得更多的方法,就是一个梯度法,尤其到了神经网络这一块,感觉可能都是梯度到处走。梯度法的核心思想就是开局一个点,后面全靠挪,我就空降把你扔到一个点上,然后你就去找我究竟应该去哪里。
它的核心思想就是我每走一步我都要比上一步更接近目标,它就是这么一个思想,就是一个很朴素的思想,但是当它大规模推广开以后会有非常好的效果。
我们选讲一个,就是大家最常用的梯度下降的方法。梯度下降其实也是一个很直观的方法,但是还是这样,如果再深究一句为什么梯度下降?可能我们还是需要再有一点点比较深入的想法,一些深入的理解在里头。







首先第一步,我们是有这样一个结果,θ0,θ 是我们的参数,就是你要估的参数,就是权重,最简单的理解。我们可以把它做一个约等于。这个东西是什么?这个东西其实就是泰勒展开,就是最简单的泰勒展开,也就是它在 x0附近的泰勒展开,就是 f(x0) 加上 θ 减去 θ0 乘以它的一个梯度,你看这个梯度开始出现了,这是它第一次限时。到这一步你看没有建立梯度,我为什么要往梯度的负方向走这样一个概念。然后做一个变换,把右边这个 θ 减去 θ0 变换成 n 乘以 v,因为 θ 减去 θ0 是一个向量,一个向量把它取标准化,v 是标准向量,标准向量是什么?就是它的模等于1的这样一个向量,然后n把它常数提出来,成了这样一个形式。
然后我再做一个变换,把 f(θ) 减去 f(θ0),然后就等于右边这个东西。大家看到最后有个小于 0,小于 0 是什么意思?我要要求 f(x) 减去 f0,我们刚才讲的开局一个点,后期全靠挪,但是有一个要求,必须每一步挪都比上一步更接近最优值。所以 f(x) 代表的是什么?f(x) 代表的就是误差,代表你的损失函数,loss 当然越小越好,损失越小越好,所以 f(x) 减去 f(x0) 我要求它是小于 0 的。所以说到这一步你可以怎么理解?就是 θ0 是我当前点,是我当前这组参数,就是开局这个点,你空降到一个点了。然后你下一步走的这个 θ,我就一个要求,希望你要比我的 θ0 导致的误差数要低,就是一个非常朴素的要求。然后我们把右边这个约一下,把这个常数干掉,就变成了v乘以这个梯度小于 0 了。
ok,下一步就是比较神奇的事情发生了,v 和后面这个梯度你看着它吓唬人,但是它本身也是个向量,如果你是一维它就是一个常数,如果是多维的、高维的它就是个向量。
那么我怎么样要求它乘它小于 0?。我们说回这个向量相乘,向量相乘小于 0 的条件是什么?向量相乘和余弦是有非常紧密关系的,简单来讲,两个向量的夹角如果大于90度,它们俩向量相乘就小于 0,如果是小于 90 度就是大于 0 了。所以说我要求小于 0,我还要求你小于 0 得越厉害越好,就代表我这一步走得比你原来更接近最优值,更小,小得更厉害,那我就要你们去反向。比如说如果A是你的梯度的话,那我的v一定要是 B 方向,它俩乘起来这个值是最小的,对应的是 f(θ) 减去 f(θ0) 最小。然后再经过一些常数的变化,就得到这样一个结果。


如果我们不考虑常数的话,那么v就等于负的 f(θ0) 的梯度,负梯度方向。然后由于 v 是单位向量,所以我要除一个它的模。后面再把这个n加回来,因为常数和常数是可以合并的,θ 就变成 θ0 减去这个东西,这个其实就是非常地朴素。有的同学说 learning rate 要变化,是要变化,learning rate 反映在哪里?反映在这个常数里面,为什么要 learning rate?这是另一个小的知识点,learning rate 其实是梯度下降能够成立的一个基本原则。learning rate 如果太大,步子迈太大,它的展开就不成立,它的展开的前提是在 x0 附近的一个展开,如果步子太大你就已经不是附近了,而且learning rate 还有比较多的因素在里面,但是作为今天入门课程里面就不讲了。


所以你看到虽然是负梯度方向,是一个看起来很直觉,因为很多老师都会给你讲比喻,就像爬山一样,往这个山的梯度的负方向走就对了,它很好直观理解。但是你如果真的想深刻地理解它为什么,还是要把它掰开了揉碎了去看一看。所以这个流程,我们给大家介绍最简单的一个梯度下降的怎么来的,就是从它的泰勒展开,一步一步。其中就两个核心点,一个是它的梯度,一个就是负方向,就是两个向量相反的方向是乘积最小的,负向最小的。ok,这就是一个优化方法。
优化方法有了之后你能够得到什么?优化方法有了以后你就能得到你梦寐以求的模型了,经过刚才那么一长串,优化完了,你就会得到具体的参数,w1 是多少,w2 是多少,到这儿就完了,模型就出来了。但是完了吗?其实还没有完,为什么?还有个决策理论在里头,决策理论是什么东西?我举一个简单的例子。
模型拟合不是最终目的,拟合出模型来就像你买一个东西,你最终是要用它的。模型讲一个最简单的应用,它有两种应用,一种是排序,一种是分类,比如说排序典型的 learning to rank 大家都在用,分类不用说,你做反欺诈,这是好人这是坏人。


这里面就有一个问题,为什么要按照 CTR 的高低排序,从高到低,为什么从高到低排序?肯定要从高到低排,要不然还能从低到高排?这里面大家的直觉是对的,因为很多数学理论用了就用了,它和直觉是一样的,这是非常好的一件事情。还有比如说分类,为什么书上就讲分类阈值设为 0.5,这又是一个什么意思?其实背后都是有更深刻的理论在里头。


比如说,其实大家可以简单算算就可以得到一个结果,就是按照CTR从高到低排序,它得到的结果是期望总点击数是最大的。如果说你的目标就是期望总点击数,那么你就按 CTR 排序,它从高到低排就是这个结果,它得到的就是期望总点击数是最大的,这就对齐了你的一个目标。
分类阈值对应的是一个什么概念?就是一个稍微复杂一点的理论,叫做贝叶斯决策理论的其中一部分,我们这里给大家简单介绍一下。







左边是公式,右边是图。我们做一个分类模型,设一个阈值,一定会有错,我把阈值设为 0.5,我肯定会有分错的,有的把应该是正的分成负的,应该是负的分成正的。右边这个图里大家可以看到有红色的一部分,右下角还有一个灰色的部分,这分别你可以理解为代表是两类错误,一类错误是原来是正的你分成了负的,一类错误是应该是负的你分成了正的。
我们可以稍微看一眼左边这个 P(error),就是错误概率是什么?这两边面积加起来,积分积起来。那么我自然就要想,那怎么能把错误最小化?那么对应到这个图上来讲,就是想要这个面积是最小的,我们先不管理论了,就是红色面积加灰色面积要得到最小。大家动用一下你的空间想象能力你就会发现,这有个小三角,两条线中间夹了个小三角,这个东西我要让它更小。你发现这个线往左移一移,红色面积再往左走一走,走到这个交叉点这儿,你会发现这个时候它面积最小。这个时候对应的是什么?就是你把上面这个面积就干掉了,上面这个面积是什么?其实就是 reducible error,我们刚才讲了半天,说 bias、variance,其实对应的就是这个东西,就对应到了你的reducible error。那么你的模型如果把 reducible error 干到最低,那你模型的Error就是最低的,你的error就只有下面这两片小的面积。
所以说每一个分类阈值其实就对应了这样一条竖直的线,你把它插在这个地方你就变为会有两个 error 出现,如果你插在最中间这条线上,其实就是对应的 0.5 的分类阈值,0.5 的分类阈值对应的就是这条线。那么这个对应的其实是一个什么含义?它对应的含义是,把正例分错和负例分错,我付出的代价是一样的。但是如果说,比如说你在一些 case 里面,你把正例分成负例代价会非常严重。所以说你每个分的阈值对应的都是这上面的一条线,一条竖线,0.5 对应的就是交叉的这个线,在这个计算公式下面。如果你把阈值往高了提,红色面积增大,灰色面积减小,那就是某一类错误会增大,某一类错误会减小。就是如果 0.5 的分类阈值对应的就是它俩的代价是相等的,犯第一类错误和犯第二类错误都可以接受,同等代价,但是很多场景,比如金融场景,宁可误杀一个不能放过一个,这时候就不是 0.5 的分类阈值了,左边这个复杂的公式就需要发生一个变化,会得到的就是另外一个结论。
这就是从模型得到决策的一个东西,因为贝叶斯这个决策理论稍微有一点复杂,尤其是贝叶斯错误率这个概念。







这个时候建立了决策理论,建立了模型,训练出模型来,拿它去做决策。其实到这个时候,一条相对完整的脉络就有了。我其实就是把刚才讲的这些东西串了一遍。我们要知道问题的本质是数据拟合,然后需要出一个假设集合,比如说这就是大家经常问的,面试时候问的,给你一个问题你怎么解?你用逻辑回归,还是决策树?其实就在问假设集合是什么。怎么评估假设集合的好坏?其实就是说假设集合的好坏是 VC 维和偏差方差分解。这就是为什么我们经常说线性模型非常好?因为它特别稳定,其实就是说它的方差特别低。
这个东西怎么映射到现实的应用中?那就是交叉验证,交叉验证不仅能够得到误差,还能够得到你的方差,就是在不同数据集上面去跑,得到一个什么结果。我们还知道了一点,就是说方差低的一个最大的实惠,就是说有一个保证,保证你不管怎么样得到一个数据集,它的评估结果都和你得到所有数据集的评估结果相差不会太多,这是非常好的一个性质。
然后我们又知道了怎么在一个模型里面具体地衡量方差和偏差,那就是定义损失函数来衡量偏差,用智能化的方法来控制方差。那么就知道了正则化究竟是来干什么的,然后我还简单聊了一下为什么控制参数的个数和参数的取值,以及树的深度的这些东西能够起到减少方差的作用,因为它限制了假设集合的数据。你在这儿建立好了评价指标之后,终于可以去优化它了,那就有了各种优化方法,比如说基于梯度的方法,还有一些基于置信域的方法等等,我们就不展开了。
得到模型之后,你要拿它去用,无论是去做排序,还是做分类,拿它用的时候背后一定会有一个思想、原则在里头,就是为什么这么做阈值?我为什么从高到低排序?有很多这样的思想在里头。





到这里就建立了一个从最初拿到数据的假设开始,一直到最终决策这样一个链条。可以这么讲,就是你在机器学习中遇到的绝大部分的知识点都可以映射到这个链条当中的某一个环节。这是为什么我们今天要从这个维度去讲这些事情。
有了这个链条之后,还是之前强调的那一点,你能够系统化地去学习一个东西。那么这里介绍几点,就是如何构建你自己的知识网络。





第一,一定要谨慎对待“狗熊掰棒子式”的学习,因为特别容易忘,就是理解不深刻,总是东一个点西一个点,你没有办法建立这个知识点之间的有机联系。说远点就谈到碎片化阅读这件事,碎片化阅读我觉得它不适合所有的领域,包括机器学习你可以碎片化阅读,但前提是什么?你一定要建立起一个相对完整的知识体系,然后再在里面,碎片化阅读是什么?就是贴叶子,枝干已经有了,我这儿贴一个叶子,那儿贴一个叶子,慢慢的就有了这整个的知识体系了。
第二,MVP式扩展学习法。MVP 有的同学知道,就是最小可行产品。就是建立一个最小的可行的机器学习体系,比如我刚才讲的,你只知道一种学习算法,你就先只学逻辑回归,然后围绕逻辑回归你把我刚才那条链条你都打通了,就构造出了一个 MVP 版的东西。它有点像什么?有点像大家上高中数学的时候,老师讲题,数学老师一般他会先讲一个最简单,根据定义最直观好理解的做法,让所有同学都能理解,然后他才会讲一个所谓的高阶做法,让这些所谓的尖子生有一个取巧的办法去做。这里面其实也是一样,一定要首先建立一个 MVP 的链条,麻雀虽小五脏俱全的这样一个链条,然后再针对性地去补充,比如说你发现我只会一个模型不行,我去学模型,但是这时候你知道,它是落在了假设集合里头,我去补充模型。然后补充模型的时候就会讲,我这个模型它的 bias 怎么样,variance 怎么样,它的优化方法是什么。然后你看到比如说梯度下降它是个优化方法,比如置信域也是个优化方法,你就能知道你每个知识点落在什么地方去了。
第三,看到新知识,扩展到对应的位置,不要让它落单。比较忌讳你学零散的知识点,但是不能让它落到某一个具体的系统位置里面去。


就是这样一些学习方法,有的同学在新学这个行业的时候,会感觉知识点特别多,感觉学不完的样子。事实确实也学不完,但是一定要知道自己学的是哪一块知识,然后也知道自己哪强哪块弱,不至于看到什么东西都想学。这就是自己的一个知识网络。
算法工程能力入门


后面简单说一下工程的问题。因为我之前在校招面试的时候,聊过一些东西,就是一些学生朋友把这个简历上写得其实还蛮漂亮的,就是模型各方面都懂,但是让大家写一些题的时候,确实容易会差一点。一些简单的,都谈不上是算法题目,一些简单的面试题目都写得不是特别好。然后也有同学在公众号后台问我怎么学算法这些东西。其实我相信大家学算法的能力是很强的,你有这个驱动力,但是工程方面还是要加强。







这里放了一张图,这个图是一个特别简单的图。上面那个图可以说你的计划从 A 到 B,骑着小车过去,下面是现实,你会发现好多好多坑。这其实代表一定程度上代表算法工程师的一个窘境。一开始你觉得我学会模型了,我理论学得挺明白的,就可以走上人生巅峰了。但其实你会发现你真的到工作中做的时候,这些东西坑非常多,你一落地会有很多东西需要去加强,需要去夯实。





工程能力是很大的一个概念,它是非常大的一个概念,因为我是做算法策略多一点,但是我也会接触不同工程的东西,所以从我的角度去跟大家分享一下这个概念。它分两方面,一方面是所谓的离线工程,它的核心内涵是什么?就是支持快速、可维护、可规模化、可扩展的实现算法。可能一开始你到一个公司,领导交给你这个小数据做一个模型,这算第一步,工程化,但是后面如果你是在一个业务快速增长的环节上,它一定会快速地需要很多模型在里面,会加很多的特征,加很多的样本,加很多的问题在里头,所以就要求快速、可维护、可规模化、可扩展地去做很多问题。具体可能需要你做一些数据流的 pipeline,还要求你有一些逻辑抽象复用能力,最重要的还需要一个 Debug 能力。
数据流 pipeline 这块其实现在工具也比较多,像 Spark 上面有很多实现比较好的东西,相当于牛人已经给你实现出很多东西来了,可以现成去用。
抽象逻辑复用能力,它和你做不做算法没有关系,这是一个工程师的基本素养,包括这个 Debug 能力是一个工程师的基本素养。
我觉得这方面有的同学如果纯学理论,可能对这块有点过于不重视了,但是在现实中如果抽象复用能力不够的话,你会发现你每天都在写一样的东西。然后 Debug 能力不足那就更不用说了,尤其越复杂的模型,你结构不对,那你很难去调试到一个合理的结果。这块能力我还是希望,尤其是在校的同学,你一定要加强你的基础编程能力,一定要知道算法工程师他是一个偏正短语,他的核心词还是工程师,他的核心还是工程师,你一定要是一个合格的工程师,你才能是一个算法工程师,一定不能只看算法俩字,不看工程师,只看算法那叫研究员。


工程能力讲的是在线工程能力,比如我们做一个模型它是要上线的,尤其比如推荐,可能需要一个在线实时的API去预测,那么它的核心诉求是什么?支持一个高效、高可用、稳定、可扩展地提供服务,企业里面都是这样一些要求,你要实时预测&训练服务、实时数据读取&更新、离线在线数据同步等等这些东西,这些也都是工程的同学需要去做的。但是作为一个算法同学,你为什么也要适当去了解这些东西?因为毕竟他要上线的是你做的东西,如果你做这个东西的时候完全不考虑说对方怎么去用,其实问题到时候还会有很多反过来去报复你的。
离线和在线的考虑会有很大的不一样,典型的有些分歧比如计算量,离线我们习惯于批量的计算,你算很大量的东西都没关系,在线的话它会每次只算一条,它会对这方面要求比较高。还有复杂性、扩展性,要求其实都不一样。离线的问题出了问题怎么都好说,但是在线出了问题就很难讲了。





这里给大家一个简单的建议,如何锻炼工程能力?
第一,勤奋+懒惰。勤奋是指你一定要勤于动手,看 paper,看算法,但是一定要勤于动手。懒惰指的是什么?就是不能太勤于动手,要做适当的抽象,适当的复用。因为我曾经有一些同学就是特别勤奋,100 个重复的任务他真的就提交 100 次,他没有想办法去做一些抽象,做一些复用,这个就是太勤奋了,作为工程师一定要有一定的懒惰,然后去抽象它。所以思考要勤奋,动手要适当地懒惰。
实践其实特别简单就是用自己的真实数据设计一个真实的场景,然后自己搭建一个流程,然后给自己不断地加戏,演自己的对手戏,去不断地锻炼。





这里举一个例子,比如在线工程,这个其实大家都可以去做,你是学生,你是做算法,都可以去做这样一个实验。比如你去获得一个中等以上规模数据集,比如说你去爬一堆垃圾邮件数据集,这个网上还是蛮好获取的。然后你离线随便拿什么东西训练一个模型都ok。然后你尝试着搭建一个在线服务,它要求什么?我用邮件 ID 去请求,然后你去返回给我它是垃圾邮件的概率。这里面涉及到什么技术点?如何实时获取特征?因为你传的是 ID,你需要实时获取特征。你得到特征以后如何去获取实时的权重?然后你如何去计算实时的概率?这些问题你在离线做的时候,可能调一个包就完成了,但是你在线做的时候,很多事情都是需要你自己去做的,你自己把这个东西从头到尾做一遍,哪怕你就做一个小 demo,你就知道了我做这些东西需要考虑什么点。那么你在以后和工程同学配合的时候,你就知道你应该如何更好地去服务他,去配合他。
如果你觉得这个太小意思了,我做得很爽,那么你再给自己加一点戏。比如说使用多种类型的特征类型,比如有标签类的,有向量类的,有统计量,你看一下你还能不能很好地实时地去处理它。然后你再引入很多特征工程的方法,特征交叉、按类细分等等,你看还能不能处理好它。然后再模拟一个高并发的请求环境,比如前面都处理得特别好,那很棒,但是你会发现,一次请求1秒钟,太慢了,模拟高并发请求,服务还扛不扛得住?发现扛不住了,你看瓶颈在哪里,如何做优化。这其实是一个很好的例子,如果是在校学生的话,你可以有充足的时间去实现这样一个东西,来去打磨一下你的工程能力,其实你也可以找找感觉,我究竟喜欢做工程还是喜欢做模型。乐趣其实是不同的,大家也不要觉得现在这个世界上只有算法工程师值钱,其实根本不是,后台工程师也非常值钱。
今天知识点的分享基本就到这儿了,后面推荐一些资料。







第一个资料,有的同学已经知道了,就是 Learning from Data,其实我第一部分知识脉络很大一部分都是从这本书里去引入出来的,中文课程叫《机器学习基石》,英文也有一门课程,是一个加州理工的老师上的,非常地不错。它重点是介绍一些基础概念,比如说我这里面没有讲可学习性,学习的可行性,VC 维,训练和测试的关系等等。如果说模型是果实的话,其实基础真的就是枝干,特别适合作为第一次学习的一个课程和课本。这本书可能不会有很多人去推荐给你,但是我推荐你去看一下这本书,也不是很厚。
下一本书,也是很著名的一本书,这本书的中文翻译应该叫《统计学习概论》,但是你搜 ISLR 估计就能搜到这本书。它是更重要的一本书,有人翻译成《统计学习要素》,Elements of Statistical Learning 这本书的一个实践应用版,它更好地平衡了实践和应用之间的关系,它以实践为目的,并且加以适量的理论讲解。这本书中文版叫《统计学习导论》,大家可以去找一下。这本书有很多统计学角度的讲解,反正我个人是比较喜欢这种角度的讲解,它更深入理论层次或者更直达它的核心,我觉得非常有趣,能够帮助你更深入地理解模型。我此前在 CSDN 上其实录过一期这本书的课程,有兴趣的同学在我的公众号上回复这四个字母 ISLR 去获取这些资料,有一些中文的和英文的学习资料。这本书还是非常推荐,如果你只读一本上手类型的书,这本书更好。刚才那本书更多的是基础理论的讲解,这本书会有很多实际的讲解,还有很多数据集和例子,非常地好。
下边也是我重磅推荐的一本书,叫 ALL of Statistics,它没有中译本,你可以理解为它叫全部的统计学,但是你看它副标题是统计推论的一门简练课程,是一个很精炼的课程,它其实是统计学的非常经典的一本教材,我也是偶然看到的,但是后来发现其实在国外还是蛮流行的一本教材,也就是二三百页,简短、全面,并且非常实用。刚才有的同学说我的概率都忘光了,我的统计都忘光了,你特别适合拿这本书来补补课,快速地能够把一些东西补起来,然后还很适合做案边参考,就放在你的手边,有什么问题,概念忘掉了,你就把这本书拿出来看一下。非常好的一本参考。
在课程最开始有人问我,说有没有第一次入门的?其实我当时没有想到这个问题,我就给这个分享起了这样一个名字。但是这次分享的源头应该是我去年在《程序员》上发表过这样一篇文章,就是如何成为一名机器学习算法工程师。它更实用,它会从模型、方法、工具的角度去切入,还有一些行业的角度去切入。我觉得它不能代替本次分享的内容,本次分享更多的是基础脉络的一些角度,这篇文章更多的是偏实践,如果你把这方面内容掌握了,你去做一份工作还是没有太大问题的。
(*本文为AI科技大本营原创文章,转载请联系微信1092722531)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

大神点评20

菜菜乱舞 2023-7-22 15:39:17 显示全部楼层
转发了
回复

使用道具 举报

独倚超色 2023-7-22 15:40:12 显示全部楼层
转发了
回复

使用道具 举报

信大少女 2023-7-22 15:40:28 显示全部楼层
转发了
回复

使用道具 举报

砖业八级 2023-7-22 15:40:50 显示全部楼层
转发了
回复

使用道具 举报

马来头白 2023-7-22 15:41:10 显示全部楼层
转发了
回复

使用道具 举报

yqamigoqi 2023-7-22 15:41:30 显示全部楼层
先转发
回复

使用道具 举报

蝉子 2023-7-22 15:42:06 显示全部楼层
转发了
回复

使用道具 举报

机器学习
回复

使用道具 举报

GcQhnDrs 2023-7-22 15:42:18 显示全部楼层
我也准备学习机器学习,可否罗列一下学习机器学习需要用到的数学知识?我现在在补高数 概率论和数理统计 线性代数,不知道要看啥,只能全都看看一下了[捂脸]
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies