头图

写在最前

本故事讲的是关于机器学习的基本概念和训练过程。通过这个故事,你将对机器学习有一个直观的了解。随后,当你翻阅关于机器学习的书籍时,也许会有不同的感受。如果你有感觉到任督二脉被打通了,那我真是太高兴了。如果没有,我再努努力 ヘ(・_|

在这个 AI 内容生成泛滥的时代,依然有一批人"傻傻"坚持原创,如果您能读到最后,还请点赞或收藏或关注支持下我呗,感谢 ( ̄︶ ̄)↗

机器学习是什么?

丹尼尔:蛋兄,今天的天气真好啊

蛋先生:嗯,是啊,阳光明媚

丹尼尔:对了,蛋兄,什么是机器学习啊?

蛋先生:(lll¬ω¬) 你这,话题转得让人猝不及防啊,咋这么好学呢!

丹尼尔:只是爱瞎折腾,随便聊聊嘛 (~ ̄▽ ̄)~

蛋先生:好吧,先来说说“学习”二字。你觉得人类是怎么学习的?

丹尼尔:就是读读书、听听课呗

蛋先生:没错。你所说的读书和听课是获取信息的方式。然后我们把这些信息传递给大脑,大脑会进行整理和加工,从而理解这些信息,之后我们还可以学以致用

丹尼尔:那机器也这样吗?

蛋先生:机器学习的方式类似。我们需要给机器一堆训练数据(信息),让它自己去找出其中的规律(理解),然后让它处理类似的问题(学以致用)

丹尼尔:哇,真是太神奇了!

蛋先生:根据学习方式的不同,机器学习可以分为监督学习、无监督学习等,其中最常用的就是监督学习了


什么是监督学习?

丹尼尔:监督学习是啥?

蛋先生:先来说说“监督”二字。你要监督孩子做作业,前提是你手上有标准答案,才能衡量对错,对吧?

丹尼尔:嗯,所以监督学习是?

蛋先生:监督学习就像监督机器做家庭作业一样。我们提供题目(训练数据),同时也提供标准答案(标签),这样机器才能“知错能改”

丹尼尔:这听起来挺有趣的!您继续

蛋先生:想象一下,你有一堆加法题目和答案,比如 1+1=2,2+2=4 等等,但你事先并没有告诉机器加法的计算规则。机器会不断地尝试并对自己的答案进行调整,最终找到输入到输出的对应关系,从而学会了加法

丹尼尔:哇塞,比我还厉害!我学加法的时候可是先从数手指开始的,机器直接从题目和答案里学会了

蛋先生:是啊,一旦机器学会了加法,它就能独立解决新的加法题目了


机器学习都学了些什么?

丹尼尔:我挺好奇的,机器学习最终学到了什么呢?

蛋先生:其实,你经常听到某某大模型有多少亿的参数,这些参数就是机器学习最终学到的“知识”。具体来说,参数分为权重参数和偏置参数

丹尼尔:权重参数和偏置参数?这些到底是啥玩意儿?

蛋先生:我们用最简单的线性回归来解释吧。线性回归的基本公式是:y = wx + b。这里的 x 是我们给机器的输入数据(训练数据,也叫特征),而 y 则是对应的输出数据(标签),而 w 和 b 就是机器要学习的权重参数和偏置参数

丹尼尔:为什么叫 w 为权重参数,叫 b 为偏置参数呢?

蛋先生:因为 w 决定了每个 x 的重要程度,影响了 x 对最终输出 y 的贡献。而 b 就像一个基准线,可以调整整个公式的输出。只要机器确定了 w 和 b 的值,它就能计算出给定 x 对应的 y

丹尼尔:这个公式看上去有点简单

蛋先生:嗯,这个公式是可换的。比如在传统机器学习中,我们可以换成有多个 x 特征的线性公式,比如 y = w1x1 + w2x2 + b;或者换成非线性公式,比如 y = wx^2 + b;甚至还可以换成深度学习的神经网络

丹尼尔:神经网络?

蛋先生:神经网络,可以简单将它看成由很多个只进行最简单的一元线性方程的节点组合而成,然后再通过激活函数来实现非线性效果。这个属于深度学习的话题,咱们以后再聊吧!

丹尼尔:好滴,简单讲就是机器学习最终学习了权重参数和偏置参数

蛋先生:没错


机器学习是怎么学习的?

▶ 收集数据

丹尼尔:那机器是怎么学习到这些参数的?

蛋先生:首先,我们需要收集训练数据,而且这些数据得是高质量的

丹尼尔:这个容易理解,就像俗话说的,近朱者赤,近墨者黑嘛。数据质量越高,机器学习的效果自然也会越好。那怎么保证数据质量高呢?

蛋先生:这就涉及到数据清洗、特征工程、数据增强等数据预处理操作。这些内容可是一个大工程,这一时半会也说不完

丹尼尔:好的,我明白了。暂时我只需要知道需要收集数据,并且有数据预处理的环节就够了

蛋先生:明白人

▶ 划分数据

丹尼尔:那接下来呢?

蛋先生:接下来我们需要把数据划分成训练集、测试集和验证集

丹尼尔:为什么要这么做呢?

蛋先生:这样做是为了提高模型的泛化能力,避免过拟合

丹尼尔:慢着,什么是过拟合?

蛋先生:想象一下,你平时一直在做同一套习题。如果考试恰好出了你练习过的那些题目,当然能考高分。但如果考试出了你从没见过的题目,你就会不知所措。这就是过拟合,模型只能处理它见过的训练数据,对于新数据表现不好

丹尼尔:那什么是泛化呢?

蛋先生:泛化是指虽然考试出了你没做过的题目,但你仍然能利用平时练习时学到的知识,举一反三,依然能够取得好成绩。泛化能力强的模型能够处理没见过的新数据

丹尼尔:那训练集、测试集和验证集各自有什么具体作用呢?

蛋先生:别急,这个我们等会聊!

▶ 选择模型(算法)

丹尼尔:好吧,那接下来我们干什么呢?

蛋先生:接下来就是选择模型。你可以选择简单的线性回归模型,也可以选择复杂的神经网络

丹尼尔:怎么选择模型呢?

蛋先生:这要根据你要解决的问题来选择。不过今天我们主要聊训练的流程,这个问题就不深入探讨了。但有一点需要提一下,模型也属于超参数。训练时,你可能需要对模型进行调整。比如在传统机器学习中使用不同的公式,或者在深度学习中增加隐藏层等

丹尼尔:超参数是什么?

蛋先生:超参数不是机器要学习的参数,而是外部提供的参数,可以是人为设置,也可以通过算法自动调节

丹尼尔:听你这么一说,我的问题更多了。不过今天我只需要知道,在训练过程中需要根据实际情况对模型进行调整就好了

蛋先生:明白人

▶ 勇敢尝试

丹尼尔:感觉万事俱备,是不是可以开始学习了?机器是怎么找到合适的 w 和 b 的值呢?

蛋先生:一开始,谁也不知道合适的参数是什么(如果知道就不用折腾了),所以我们会先随机给出参数值,勇敢地迈出第一步

丹尼尔:也就是说,机器可以随便假设 w 和 b 为一个值,比如 0 或者其它随机的值?(初始值的选择其实是有讲究的,这个以后有缘再说)

蛋先生:没错!一开始就是这么做的。因为不知道正确答案,所以先大胆假设一个值

丹尼尔:那之后呢?

蛋先生:之后就像你走路发现方向不对会调整一样,机器也会根据情况调整参数

丹尼尔:首先,机器怎么知道参数不对劲呢?

蛋先生:机器使用假设的参数,计算出对应的 y`,也就是预测值

丹尼尔:恩

蛋先生:然后它会把预测值和真实值进行比较。如果预测值和真实值越接近,说明 w 和 b 的值越准确。预测值和真实值之间的差距就是误差,或称为损失。所以机器学习的目标就是要尽量减少损失,损失越小,预测值和真实值就越接近

▶ 计算误差

丹尼尔:计算误差就只是简单相减一下吗?

蛋先生:有专门的损失函数来解决这个问题,比如 MAE(平均绝对误差)和 MSE(均方误差)

丹尼尔:等等,别一下子讲这么多专业名词

蛋先生:其实很好理解。我们这里的损失值不就是预测答案与正确答案的差吗?当然,差有正有负,所以通常要取正值。取正值有两种简单的方法,一种是取绝对值,一种是取平方

丹尼尔:您接着说

蛋先生:我们的训练数据一般是有很多个的。每个数据都会有一个损失值,所以总损失值需要包含所有样本的损失值。计算总损失值有两种方法,一种是求和,一种是求平均。结合绝对值计算和平方计算,求和计算和求平均计算的所有组合,就得到了四种常见的损失函数:L1、L2、MAE 和 MSE


L1:绝对值计算 + 求和计算

L2:平方计算计算 + 求和计算

MAE:绝对值计算 + 求平均计算

MSE:平方计算计算 + 求平均计算

丹尼尔:哦,这么一解释,感觉清楚多了。那么该选择哪种损失函数呢?

蛋先生:建议优先使用 MAE 和 MSE,因为它们不受样本数量的影响。然后选择哪一个还取决于你对极端损失值的处理态度:是要严惩(MSE)还是忽略(MAE)

丹尼尔:哦,原来如此。那么只有这些损失函数吗?

蛋先生:当然不止这些。对于回归问题(可以简单理解为填空题),MSE 和 MAE 都是合适的。而对于分类问题(可以简单理解为选择题),有更合适的损失函数,可以避免在计算中使用大量内存来满足精度需求,比如交叉熵损失函数等

▶ 反复调整

丹尼尔:好吧,我们已经知道了当前的损失值,接下来要怎么调整 w 和 b 才能让损失值变小呢?

蛋先生:这时候就得靠梯度下降这个“指南针”啦!它会为机器指明 w 和 b 调整的大小和方向

丹尼尔:咦,这么神奇,那它是怎么做到的?

蛋先生:额,这么快就忘记了?回忆一下我们之前谈过的《梯度下降,原来如此?》

丹尼尔:哦哦,瞧我这个记性,记起来了。然后就是不断地反复操作,对吧?

蛋先生:对呀,就是这么反复尝试。一直调整,直到损失函数的值基本不再变小,这就算完成啦

▶ 小批量处理

丹尼尔:哦,这个过程中还有哪些细节要讲的吗?

蛋先生:在训练过程中,有一个重要的细节。如果我们每次迭代都处理所有的训练数据再更新参数,对于大规模数据集来说,会非常慢。所以,我们通常采用小批量处理的方式

丹尼尔:小批量处理?那是怎么一回事?

蛋先生:简单来说,就是每次迭代只处理一小部分训练数据,这部分样本数据可以看作是全部数据的代表。处理完这一批后,我们就更新模型的参数

丹尼尔:那这样处理完所有数据需要多少次迭代呢?

蛋先生:这取决于你每次批处理设置的样本数。比如,假设有 10000 个训练数据,如果每次批处理 1000 个,那么 10 次迭代就能处理完所有数据。当所有训练数据都被处理过一次,我们称之为一个 epoch。每个 epoch 结束后,我们可以用验证数据检验模型的性能,看看它是否有所提升

丹尼尔:原来如此!这样既节省了时间,又能有效地评估模型性能。绝了

蛋先生:训练数据、验证数据和测试数据的作用在聊到【划分数据】时并未提到,但刚刚已略作阐述。训练数据主要用于更新模型参数;验证数据则在每个 epoch 结束时用来评估模型的性能,尽管它不参与模型参数的更新,但可用于调整超参数。最后是测试数据,在模型训练完成后,用于评估模型在实际应用中的表现,这是对模型能力的最终检验,以确保其在未见过的数据上仍能保持良好的性能

丹尼尔:哦,差点忘记这事了

蛋先生:那暂时就没有什么要补充的了

丹尼尔:已经够多了,我得好好消化一下

蛋先生:那就此别过

丹尼尔:拜拜👋


写在最后

学习知识推荐采用自顶向下的方法,从大处着眼再到小处。本故事介绍了机器学习训练过程的一个大致轮廓,很多细节并没有展开,有缘再聊!

亲们,都到这了,要不,点赞或收藏或关注支持下我呗 o( ̄▽ ̄)d

《蛋先生说识》是一个致力于用通俗易懂的方式讲解各种知识的栏目。采用深入浅出的讲解方式,将复杂的概念变得简单易懂。请跟随蛋先生一起探索知识的奥秘,把难懂的知识变成好玩的故事吧!
公众号.png

蛋先生DX
307 声望2 粉丝

ncform / ncgen / nice-hooks 作者