Py学习  »  机器学习算法

听说你想学机器学习,于是我特地写了这篇文章给你

AINLP • 2 年前 • 253 次点击  


大家好,我是梁唐。

今天给大家聊点机器学习,不过这篇是给小白读者写的,会比较基础,不需要太多数学知识就能看懂。当然一篇文章入门是不够的,但一定可以让你理解机器学习最核心最根本的原理,理解整个算法运行的机制和主要脉络。

如果我们把机器学习的原理简化到极致,理解成一个黑盒的话,那么它其实可以看成是一个复杂的函数。

这个函数的输入有若干维度,它的输出则是我们想要的结果。用一张图来展示就是下面这样:

在机器学习领域,我们训练成型的算法会被称为模型,英文是model。我们不用去扣字面的意思,就简单理解成算法即可。

我们从易到难,先来看看最简单的输出。

模型的输出是什么?其实就是我们希望模型完成的事情,这个大家都知道。比如模型可以猜测用户喜好,可以做人脸识别, 还可以把一张人脸替换成另外一张。但这背后深一层的原理是,模型是如何完成的,又是以什么样的形式完成的呢?

首先,我们确立原则,围绕模型所有的一切都是数字。它的输入、输出、中间的参数全都是数字的形式存在的,即使很多我们表面上看起来不是数字的内容,最后也会转化成数字。比如说图片、文本、商品等等。模型之所以能够操作自然界复杂的实体信息,这背后包含了大量的建模工作。

再说明白一点,比如当我们使用人脸识别,我们看到的结果是一个框上面写着人名。但其实这中间过程远远比想的要复杂,首先,通过摄像头拍照获取图像。接着系统会对图像做一些处理,比如降噪、压缩等。处理完了之后会转化成特定的矩阵传入模型。

但对于模型来说,它的输出结果显然不可能是一个框,往往是一个向量,分别记录着识别到人脸的坐标,方框的长宽和对应的人名id等。这些信息被系统进一步加工并且和原图做整合,可以简单理解成完成画框的工作,最后显示给用户。

我们看起来神乎其技的人脸识别,去除掉各个系统的数据处理和建模过程之后,真正模型做的,可能就只是根据输入的数据,返回一个向量。所以算法模型到应用中间有很大的gap,需要很多系统支持,并不是单单靠算法就够的。

再比如,在推荐系统当中,用户看到的是根据自己偏好推荐的商品。但是推荐系统在推荐的时候,返回的只是一个数字,代表了用户的点击率。用户看到商品的背后,其实有一套根据点击率排序的建模过程。

我们直接来看模型能做的事情往往会觉得神奇,比如可以下棋,可以人脸识别还可以处理语音,但当我们把围绕输入和输出的建模过程全部省略之后,模型其实就和一个函数一样,有着固定的输入和输出。只不过唯一不同的是,这个函数内部的逻辑不完全是程序员编写的,有些是算法本身从数据当中学习到的。

我知道算法自我学习的这个概念听起来非常神奇,不要紧,我们先把它放一放,还是说回函数。

我们刚才聊完了模型这个函数的输出部分,接下来聊聊函数的输入。

对于一个函数调用来说,我们需要传入参数,对于模型来说也是一样,巧妇难为无米之炊,我们希望模型做事情,自然也需要传入数据。

对于模型来说,我们传入的这些数据也有一个专有名词,叫做特征,英文是feature。

我们来看一个最经典的波士顿房价预测问题,在这个问题当中,我们需要根据已有的数据来预测波士顿某幢房屋的成交价格。那么对于房屋买卖来说,会有哪些因素影响价格呢?

我想大家应该能想到很多,比如说最直接的房屋的面积,房屋的环境,房屋的采光以及装修。再比如交通的方便程度,是否靠着地铁、公交,周边的配套设施,是否有学校、超市、shopping mall。对于老外来说,可能还会考虑社区治安。

我们很容易想到,我们可以把这些变量统统数字化,比如我们设置一个评分标准,全部将它们转化成1-5的等级。于是我们就会得到一个全是由1-5数字构成的向量,比如[1, 4, 3, 5, 2]。有了这个向量之后,我们又会想到,我们可以给每一个特征设置一个参数,然后计算所有参数的加权和,让所有参数加权之后的结果等于房屋的价格。

比如我们随便写一个价格p = [37, 98, -3, 209, 61] * [1, 4, 3, 5, 2] + 10302,这里的乘法是矩阵内积,[37, 98, -3, 209, 61]就是特征的权重向量。

这里的权重是我们人工建模得出的,在机器学习出现之前,很多价格预测、销量预测都是统计师用往年的数据设特征算出合适的权重,然后加权求和来进行预测的。

如果特征数量很少,我们当然是可以人工以各种方式来运算的。但如果特征的数量很大,数十甚至上百个,人工就难以为继了。仅仅是把这些参数全部列成方程表达出来就是一个浩大的工程,更不要谈找到最优解了。正是因为参数过多的时候人工无法计算,所以计算学家们才会想到能不能设计一种方法来自动寻找这类问题的最优参数?这正式机器学习诞生的初衷。

如果大家学过统计学,就会知道这种线性加权求和的算法在统计学当中称为线性回归。这也是机器学习的入门模型,大家不要觉得惊讶,其实早年的机器学习在单独成为一门学问之前,是算作统计的一部分的。

早年机器学习领域很火热的R语言,本身就是数学和统计领域使用的。

现在,我们明白了模型的输入和输出,也了解了模型诞生的背景,可以尝试着来看看模型的原理了。

在此之前,我们先来梳理一下已经得到的结论。我们要做的事情是计算出合适的参数,使得根据这些参数加权预测得到的结果和真实的结果之间误差尽量小。但这些都是我们人类的思考,想要计算机能够识别,我们也需要进行建模来将误差这个概念量化。

我们用y来表示真实值,用来表示预测值,误差用e来表示。

的时候,误差为0,其他的时候误差应该都大于0。进一步可以想到我们可以使用绝对值来表示它,因为绝对值都大于等于0。

这样我们就得到了:,但是绝对值也有一个问题,我们计算起来不太方便,尤其是求导的时候不方便。所以我们自然又可以想到可以将它平方,这样得到的就一定是一个大于等于0的值了。

由于我们有多个样本,单个样本的误差为0并没有意义,我们要让整体的误差尽量小。整体的误差自然就是所有样本的误差之和,所以我们的误差公式就成了

误差的公式有了,我们想要让误差尽量小应该怎么办?剩下要做的就是想办法找到这个函数的极值,表面上来看这是一个二次函数,但实际上这里的是加权得到的,实际的公式比这个要复杂。再加上一些其他的考量,直接通过数学方法计算方程的极值点不可行或者不可取,所以我们采取一种其他的方法“曲线救国”。

怎么曲线救国呢?

首先,我们随机给模型当中的参数赋值,然后根据参数计算误差。得到了误差之后,我们计算误差e的梯度。我们沿着梯度下降的方向来更新这些参数的值,从而达到降低误差的目的。这样一轮一轮逐渐迭代,找到一个比较不错的参数取值。

这个就是机器学习的一个整体框架,无论模型是简单的线性模型,还是复杂的神经网络,无论损失函数是简单的均方差,还是复杂的自定义函数。无论模型是简单的房价预测,还是高大上的人工智能,背后的内核逻辑是几乎完全一样的。也就是根据函数计算误差,然后计算误差的梯度,根据梯度更新模型参数,这三板斧。

对于大多数初学者来说,学习的第一个模型一般都是线性回归。其实线性回归本身的原理逻辑,甚至是公式推导都不重要,真正重要的是机器学习的思想、逻辑、套路。套路都学会了,其余的内容万变不离其宗,学起来进展也就越来越快。

欢迎加入NLP相关方向技术交流群
请添加AINLP小助手微信(id: ainlper)
请备注具体方向+所用到的相关技术点

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。


阅读至此了,分享、点赞、在看三选一吧🙏

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/118404
 
253 次点击