作者 | 梁唐
出品 | 公众号:Coder梁(ID:Coder_LT)
大家好,日拱一卒,我是梁唐。
最近老梁新买了一本《机器学习实战第二版》对之前学过的内容做一个复习,就想着开一个新的系列,分享一下阅读笔记,给有需要的同学做一个参考。线性代数专题会继续更新,不会停的。
就是下面这本,首先声明这只是我个人推荐,所以我就不放链接了,有需要的同学可以某宝买一本。当然不买只看我的笔记也可以,凡是重要的知识点,我都会cover的。
本书的第一个章节,上来讨论了两个非常重要的问题:什么是机器学习?我们为什么需要机器学习?
这两个问题本质上是一个问题,新技术的出现往往都有时代背景,大部分新技术针对的都是旧有技术的薄弱点,机器学习也不例外。所以要更好地理解机器学习的原理,理解它的作用特点,都需要我们充分了解相关背景。
在机器学习出现之前,我们的程序只能解决确定的问题。比如渲染一个网页,计算一个结果,执行一个计算。而在不确定较高的问题上则表现非常有限。比如书中举了一个垃圾邮件识别的例子,传统方法识别垃圾邮件往往针对敏感词,比如促销、折扣等等。但所谓道高一尺魔高一丈,这样的垃圾过滤机制很容易被反制,比如最简单的可以使用近义词代替、换一种表述方法等等。
从本质上来说这个问题之所以困难是因为什么是垃圾邮件这个问题的定义本身就是模糊的,虽然垃圾邮件往往带有销售属性,但我们能说所有包含促销的邮件都是垃圾邮件吗?所有包含购物链接的邮件都是垃圾邮件吗?显然也不能,所以这个问题的边界是非常模糊的。
而传统方法当中写好的程序是确定的,也就是说程序的计算方法是可以确定的。确定的解法天然很难覆盖模糊的问题。所以在互联网早期阶段,程序在这类模糊问题上的表现都比较差劲。
既然确定的解法不能得到很好的效果,我们能不能用魔法打败魔法,设计一种灵活的方法能够自适应问题呢?就好像赋予机器学习的能力,让它能够从数据当中提取共性,从而自己学会分辨究竟怎样的邮件是垃圾邮件。
如果你想到了这一点,那么恭喜你,说明你的思路非常清晰。没错,机器学习正是这样一系列算法,让机器能够从数据当中提取出模糊的很难定义的共性,从而达到良好的效果。
这个想法很理想,但是实际执行的时候是比较困难的。毕竟共性是一个模糊的概念,很难量化成直观的算法。针对这个问题,机器学习的思路是通过大量的数据以及合理的模型,让算法能够从这些数据当中学习到一组合适的参数,用模型以及对应的参数拟合数据当中的共性。
程序员负责选择和设计合适的模型以及参数空间,具体的参数值是模型通过大量的数据自己“学习”得到的。
了解完机器学习的大致原理之后,我们就可以举一反三,把机器学习的原理往实际的问题上套。这样一套很容易就能发现,什么样的场景是真的大有可为,什么样的场景听起来更像是虚幻。
机器学习极大地拓展了我们程序能力的边界,以前只能解决确定的问题,现在还能解决一些拥有共性的问题。但如果问题本身没有共性,则使用机器学习也一样无法搞定。比如机器学习就预测不了地震、海啸等自然灾害。因为这些自然灾害本身就是没有征兆和共性的。
我再举两个正面例子,比如推荐系统、搜索引擎就是完美符合的场景。
用户打开电商首页看到一系列推荐展位,这些展位的商品是怎么选择的呢?因为用户刚刚打开app或网页,他/她和网页还没有任何的交互信息,所以服务端无从得知用户是抱着怎样的意图来的。毕竟我们每次打开淘宝的时候不会都说一声我们是来买包的,或者是来买衣服的。
这个时候要给出合理的推荐就是一个比较困难的问题,但好在这个问题也是有共性的。它的共性就是用户之前的行为,我们可以通过用户之前在网站上的行为提取用户的兴趣,再根据用户的兴趣给出合理的推荐。
再比如AlphaGo下围棋的例子,围棋本身是一个非常复杂的游戏,游戏状态非常庞大,使得以当前计算机的计算能力也没办法穷举所有的情况。所以目前围棋AI的方法其实是盘面评估法,每次落子之前都会枚举所有可以落子的地方,然后通过算法评估落子之后的胜率,选择胜率最大的位置进行落子。
表面上看AlphaGo是一个棋手在下棋,其实它核心的工作原理是评估棋盘的胜率。一局棋还没有结束想要判断胜负当然是非常困难的,但也不是无迹可寻的。通过大量的训练可以非常精准,这也是为什么如今的围棋AI非常强,人类已经不是敌手的原因。
看了这么多之后,我们再回到一开始的问题,什么是机器学习?
相信大家已经有一个比较模糊的答案了,本质上来说,机器学习是一个模型。这个模型当中有许多的参数,这些参数的选值不同可以得到不同的效果。可以理解成模型本身有一定可塑性。
举个例子,比如一开始的时候,牛顿只是感觉到万有引力和距离的平方成反比,但是只知道这个是没办法描述天体运行轨迹的。所以牛顿又研究了许多行星运行的轨迹,通过一系列计算出了万有引力常数,才把万有引力写成了清晰的公式。
机器学习的过程和这个有一些类似,我们先设定一系列参数对现实问题进行抽象和描绘。再通过大量数据的训练学习找到最合适的特征取值,使得模型得到的结果和现实结果尽量吻合。
但需要注意的是,天体运行轨迹是几乎可以完全描绘成数学公式的,而现实中的许多问题,比如商品推荐、围棋胜率评估等则是很难描绘成精确的数学模型的。所以在这些问题上,通常使用的模型的复杂度都会有些冗余,并且模型和实际问题之间也是有gap的。
这也是为什么机器学习的应用效果存在一点的玄学因素,很多时候是不直观甚至是反直觉的。想要模型有好的效果,除了需要对模型本身的原理以及特点有深入的理解之外,也少不了对于现实问题的深入思考和分析,并且还需要一定的经验。
所以一个好的算法工程师的能力体现在哪里,其实不在于代码实现,而在于对于问题、模型的理解和分析,对于模型设计和特征设计的思路和逻辑。
好了,关于机器学习的背景介绍就到这里。下一篇文章我们会来聊聊机器学习的简单分类。
喜欢本文的话不要忘记三连~