首页 / 资讯中心 / 文章详情

机器学习如何学习?从数据到参数修正的完整闭环

机器学习如何学习?从数据到参数修正的完整闭环 ★ FEATURED ARTICLE
机器学习这几年几乎成了绕不开的话题但有个问题我一直觉得特别值得掰开揉碎讲清楚机器学习到底是怎么“学习”的很多人把“学习”这个词想得太玄了以为模型跟人一样看着图片就能“理解”猫长什么样读几篇文章就“明白”了语义。实际完全不是这么回事。我当年第一次接触机器学习时也犯过这个迷糊后来亲手训练过几个模型、调过一堆参数、踩过无数的坑之后才真正想通机器学习的“学习”本质上是一种基于数据的反复试错与参数修正。这篇内容就把这条路径从头到尾讲清楚适合完全零基础、但想搞明白机器学习原理的读者也适合已经会用框架调接口、却对底层机制似懂非懂的同学。1. “学习”这个词放到机器上含义发生了哪些变化1.1 机器学习的“学习”是统计逼近不是理解先问一个问题你凭什么说一个程序“学会”了人学会认猫是因为形成了对“猫”这个概念的理解——能区分猫和狗能认出不同品种的猫甚至一只从没见过的猫你也能一眼认出来。机器学习模型“学会”认猫靠的可不是理解力它本质上是学会了“一组数值映射”。什么意思呢模型内部是一堆参数比如几百万个权重系数。所谓“学习”就是不断调整这些数值让模型输出结果接近正确答案。你说“猫”这个概念它懂吗它不懂。它的世界里只有数字——输入图片的像素值经过层层计算最后输出一个“是猫”的概率。调整参数让概率分布逼近正确答案这就是它学习的方式。这个区别非常关键。理解了这一点你就能明白为什么机器学习模型会犯那些离谱的错误比如把一张贴满对抗噪声的图片认成完全不相干的东西。因为它的判断逻辑建立在数值统计上不是建立在语义理解上。所谓“机器会思考”目前离我们还很远所谓“机器会学习”准确说是“机器会从数据中找出统计规律并用数值形式固化下来”。1.2 一次学习的完整闭环数据、模型、目标、优化搞懂机器学习的“学习”绕不开四个要素数据、模型、目标函数、优化算法。你可以把它们理解成学做菜的四样东西。数据就是菜谱里的成品照片和口味反馈。机器从数据中找规律数据是什么样学出来就是什么样。模型是你的做菜流程规定了输入怎么处理、输出怎么产生。模型的复杂程度决定了你能学多难的东西。目标函数相当于裁判每次模型给出一个预测裁判打分说“这次做得好不好、错得离谱不”。机器学习里通常叫损失函数损失越小说明预测越准。优化算法是调整流程的手段。既然裁判说了做得不好那就改改做菜步骤再试一次改了再试试了再改直到裁判给出低分。整个学习过程就是一个不断重复的循环模型对一批数据做预测目标函数给出误差优化算法根据误差调整模型内部的参数然后再预测、再算误差、再调整。循环成千上万次之后模型的预测越来越准参数逐渐稳定我们就说它“训练好了”。这个循环一旦你想明白了机器学习对你来说就不再是黑魔法。后面的内容我全部围绕这个循环展开。2. 一个最简单的模型长什么样从瞎猜到按规律调整2.1 用一条直线理解“参数”和“输出”理论说太多容易飘拿一个具体例子走一遍。假设我们要根据房子的面积预测房价。你手上有一些历史数据比如面积50平方米的房子卖了100万80平方米卖了160万120平方米卖了230万。现在要预测一套95平方米的房子能卖多少钱。最老实的做法是画一条直线来拟合这些数据点。直线的公式写出来很简单y w * x b其中x是面积y是预测价格w是斜率每平方米带来的价格增量b是截距面积为零时的基础价格。这就是一个最简单的线性模型。关键的地方来了模型里的w和b就是机器学习要“学”的东西。一开始你根本不知道w和b该取什么值于是随手初始化一下比如w1b0。代入数据看看结果面积50平方米的房子预测价格是50万可真实价格是100万。预测偏了。没关系机器学习的特点就是不怕一开始错得离谱就怕没有反馈机制。现在有了误差目标函数会把这个误差算出来优化算法会拿着误差去反向调整w和b。调完之后再做预测误差变小一点。循环往复w越来越接近1.8左右b越来越接近一个合适的基础值模型预测越来越准。这个“从瞎猜走向按规律调整”的过程就是机器学习的核心。2.2 损失函数怎么告诉模型“你错了”上面那个例子说“预测偏了”这个“偏了多少”必须用一个数值精确表示这就是损失函数干的事。最常见的做法是均方误差把每个样本的预测值和真实值相减取平方再求平均。假设有三个样本真实价格分别是100万、160万、230万当前模型的预测结果是50万、90万、130万。差值分别是50、70、100平方后是2500、4900、10000平均数是5800。这个5800就是当前的损失值。损失越小说明模型预测和真实情况的差距越小。那模型怎么知道把w调大还是调小这就轮到优化算法出场了。既然损失函数是一个关于w和b的函数问题就变成了“找一组w和b让损失函数的值最小”。这是最朴素的数学优化问题机器学习里最常用的套路是梯度下降下面重点展开。3. 损失函数和梯度下降机器“调整自己”的幕后机制3.1 下山类比梯度下降到底在做什么不扯数学符号先想象一个场景你被蒙住眼睛丢在一座山上要走到山谷最低处。你能感觉到脚下的坡度——如果左边更陡、更低你就往左迈一步如果前面平缓但稍微向下你就往前挪一点。这个“感知坡度并顺着下坡走”的过程就是梯度下降的直观版本。模型里的参数w和b相当于你在山上的横纵坐标位置损失函数的值相当于你所在位置的海拔。我们想找的是损失最低的那个点也就是山谷底部。梯度就是“当前点最陡峭的上升方向”把它取反就是最陡峭的下降方向。沿着这个方向走一小步损失就会变小一点然后再重新计算梯度、再走一步直到走到损失几乎不再下降的地方。实际的更新公式长这样对每个参数都做同样的操作# 伪代码梯度下降的参数更新 w w - learning_rate * d_loss_d_w b b - learning_rate * d_loss_d_b这里的learning_rate是学习率也就是你“每次迈步的步子大小”。学习率太大你可能一步跨过了山谷在两边来回震荡学习率太小你走得极慢训练要磨蹭很久。选择合适的学习率是实际调参中最常碰到的第一个坑。3.2 学习率之痛步子大了扯到蛋步子小了到不了我刚开始训练模型的时候犯过一个特别经典的低级错误。把学习率设成0.5结果损失值在训练过程中不但不降反而一顿乱跳上千次迭代后数值还越跑越大。后来把学习率降到0.01损失才乖乖往下走。这个现象背后的道理就是上面说的步伐太大参数更新时直接越过最优点甚至因为函数曲面不平整越跳越高。学习率怎么选实操层面有几个体会从0.01或0.001这种常见月量级开始试观察损失曲线的形态。如果损失震荡剧烈、下不去果断调小学习率。如果损失下降得太慢、半天不见动静适当调大一点。进阶做法是用“学习率衰减”训练初期步子大一点快速接近最优区域训练后期步子小一点精细收敛。一张损失曲线图能告诉你很多信息直线不降说明学习率太小或者模型结构有问题震荡不降说明学习率太大曲线平滑下降然后平台期说明可以停了。我到现在训练任何新模型第一步永远是看损失曲线别急着看精度。3.3 局部最低点和全局最低点实际训练里的妥协搞理论的会告诉你梯度下降有个经典困境山区里不止一个谷底你很可能会走到一个局部最低点——周围都比它高但整体来看它不是真正的最低处。蒙着眼睛下山的你根本不知道自己是不是站在了全球最低谷因为你看不到全局地形。现实中怎么办训练深度学习模型时大家会同时用几个技巧来缓解这个问题动量给下山过程加一点“惯性”如果之前一直在朝某个方向走就算当前坡度变缓了也会借着惯性冲过去不容易卡在浅坑里。随机梯度下降不用全部数据算梯度每轮随机抽一小批样本来估算方向。这样引入一点“噪声”反而有机会从局部坑里跳出来。多尝试几次不同初始化每次都从不同位置开始下山最后看哪个谷底最低就用哪个。如果只记一个概念记“梯度下降是顺着损失下降最快的方向调整参数”就够了。深层的优化技巧等真开始训练复杂模型时再逐个研究也不迟。4. 训练与推理学完之后模型到底怎么干活4.1 训练阶段和推理阶段的完全分工很多人忽略了机器学习里最有意思的一个切换训练阶段和推理阶段的行为模式完全不同。训练阶段模型需要数据、损失函数、反向传播一遍遍调整参数这个阶段你的计算机特别忙GPU风扇狂转全部在计算梯度。推理阶段模型已经训练好了参数固定不再调整。你丢给它一个新输入它往前算一遍直接给出预测结果。此时不再计算梯度也不再更新参数。这两个阶段对计算资源的需求天差地别。一个极端例子训练一个大模型可能要几百张显卡跑几个星期但部署之后做单次推理可能只需要几十毫秒。所以行业里常说“训练贵、推理便宜”本质就是这个分工带来的。你自己动手做模型时也要形成这个意识训练脚本里写着反向传播的代码但部署时要把梯度计算全部关掉才能跑得快、省内存。很多刚入门的同学在这个环节翻车——用训练模式去做推理速度慢到怀疑人生。4.2 训练集、验证集、测试集为什么要分三份数据怎么用是一个看起来简单实则坑极多的话题。标准做法是把手上的数据拆成三份训练集、验证集、测试集。训练集模型用来学习的材料参数更新的依据。验证集训练过程中用来挑超参数比如学习率、模型层数的参考。模型不会在验证集上更新参数但我们会根据它在验证集上的表现来决定“这个超参数组合好不好”。测试集所有训练结束后用来最终检验模型泛化能力的数据要求模型在训练过程中完全没见过。为什么要这么麻烦因为模型有一个投机取巧的倾向它会“背题”。如果让它反复看同一批数据并从中调参它很容易把训练数据上的细节甚至噪声都记住新数据一来就露馅。这跟学生做课后题全对、一上考场就懵是一个道理。验证集的存在就是让你在“正式考试”之前先有个大概的感觉测试集则是最终验收只有在上面跑过一遍你才敢说模型是真会还是假会。4.3 数据泄漏训练里最隐蔽的翻车现场初学的时候很容易踩一个叫数据泄漏的坑。举个例子你想对一整年的房价做预测把数据按天排序后随手切了70%做训练、30%做测试。如果没打乱顺序直接切可能导致训练集全是一月到九月的房子测试集全是十月到十二月的房子。如果这期间房价整体上涨了那模型其实没学到预测能力只是学到了“往高了猜”——测试分数好看换个时间段马上崩。更隐蔽的泄漏发生在数据预处理阶段。比如你要做特征归一化正确的做法是只在训练集上计算均值和标准差然后把这个均值和标准差套到验证集、测试集上。如果你先对整个数据集做了归一化再切分那测试集的统计信息就已经“泄漏”给了模型测试分数就虚高了。这类问题我自己踩过多次教训就一句话任何来自测试集的信息都不能在训练阶段被用到。这个原则想清楚能避开大量看似玄学的“为什么线下分数那么好上线效果一塌糊涂”事故。5. 数据质量和特征设计决定了学习的天花板5.1 垃圾进垃圾出数据比算法更影响结果很多初学者把精力全放在模型结构、调参上面却忽略了一个残酷的事实模型的上限是由数据决定的算法只是去逼近这个上限。给模型一堆有噪声、不完整、互相矛盾的数据再厉害的模型也白搭。我在实践里的感受是真正的机器学习工程数据清洗和特征处理占的时间远远超过训练模型本身。“特征工程”这个词听起来老土但它极其重要。同样一批原始数据你设计了合理的特征比如从日期里拆出星期几、节假日标志、历史均值差模型效果可能直接上一个台阶你什么都不处理直接灌进去模型的拟合能力再强也玩不出花。还有数据量的问题。和数据质量同样关键。深度学习方法动辄需要海量数据数据很少时模型很难学到有泛化能力的规律。一个粗暴的经验法则样本数量至少要大于模型参数数量的一个量级否则很容易过拟合。当然很多实际的模型参数远大于样本数那就必须靠正则化等手段来兜底。5.2 过拟合模型学会了“背答案”而不是“做题目”过拟合这个概念值得单独拿出来说因为它是机器学习实践中遇到最多的问题没有之一。过拟合的表现很典型训练集上的损失降到特别低验证集上的损失却不降反升或者测试集上的表现远差于训练集。这是模型把训练数据里的个别特性当成了通用规律。想象一个学生做练习册他不去理解出题规律而是把每一道题的答案都背下来。老师出了一道稍微改过的题他立刻懵了。模型过拟合就是这个状态。对抗过拟合有几个常规打法增加数据量见得多想背也背不住。数据增强图片翻转、裁剪、加噪声让每次看到的样本都略有不同。正则化给参数大小加惩罚逼着模型用更“平滑”的方式拟合而不是疯狂增大某些权重去硬记。早停训练过程中不断在验证集上做测试一旦发现验证集误差开始上升马上停止训练不让模型在训练集上继续挣扎优化。Dropout深度学习中很常用的招训练时随机让一部分神经元失效逼网络学习冗余的通用特征而不是死记某个神经元的组合。我记得第一次体会到早停的威力是在某次训练过程中训练损失一直在降各路指标看着很美但我随手测了一把验证集发现它的误差正在悄悄爬升。那一刻我明白如果不干预模型接下来就是在“背”训练集了。从此之后早停成了我所有训练流程的默认配置。5.3 验证集上的“试错权”也要控制次数一个常见的隐性误区验证集虽然不参与参数更新但如果你反复用它在训练过程中做决策选超参数选了很多轮之后验证集的信息其实也在被你“用”进去了。你会不知不觉对这个验证集产生过拟合——选出来的超参数在验证集上表现好换到全新的测试集上却打折扣。实操对策很简单测试集的使用次数越少越好最好只在最后用一次。如果验证集用了很多轮心里要清楚最终分数可能偏高最好再留一撮真正没碰过的数据做最终确认。这个“数据洁癖”是训练高质量模型的基本素养。6. 零基础从“理解”到“动手”的一条可行路径6.1 先跑通一个最小例子再追求“理解全部细节”聊到这里原理层面的东西基本搭起了一个框架。但我知道很多人看完了还是觉得虚道理懂了代码不会写。我的建议非常直接不要试图读完理论再动手直接找一个经典的入门任务照着代码跑通再回头对照这里讲的概念。我自己的路径是找一个公开的经典数据集分类任务几十行代码就能训练一个像样的模型。第一次跑通时你不需要理解每一行的含义只需要观察几个东西训练集的损失是不是在下降跑完一轮之后验证集准确率大概多少改一改学习率损失曲线有什么变化把训练集缩小到原来的十分之一看看模型是不是立刻变笨。这四个小实验动手做一次比看十篇理论管用。等你能解释“为什么缩小训练集之后模型变笨了”你就算真正跨进了机器学习的门槛。选环境上我建议用一个成熟的机器学习框架起步而不是自己重复造轮子。现代框架帮你把反向传播、梯度计算、参数更新都封装好了你可以先用它建立直觉以后再慢慢深入底层。6.2 看完陌生概念时先问三个问题学习过程中会遇到大量新名词神经网络、卷积、RNN、自注意力、过拟合、正则化、批归一化……它们看上去很猛但只要你脑子里始终装着之前说的那个学习闭环任何新概念都可以用三个问题去拆解它在模型里承担什么角色它改变了目标函数吗它影响了优化过程吗比如卷积层它本质上是在限定模型用某种局部模式去提取特征属于“模型结构”的变化批归一化则是让每一层的输入数值分布更稳定方便梯度下降跑得更顺畅属于“优化过程”的辅助手段正则化加在损失函数上属于“目标函数”的调整。想清楚这些问题陌生概念就不再吓人。6.3 对“AI新闻”保持一种祛魅的心态当你真正动手训练过几个模型之后再看市面上的AI新闻你的视角会发生根本变化。以前你可能觉得“某个模型又实现了什么新能力”像魔法现在你会下意识地追问它用了什么数据用了多大模型训练花了几张显卡损失函数是怎么设计的这个能力在训练数据之外的场景上是否依然成立这种祛魅不是泼冷水反而是一种更健康的和AI相处的方式。机器学习也好深度学习也罢本质上就是“用大量数据加上数值优化找出一个能有效预测的函数”。魔术不妨欣赏但要清楚幕布后面是什么。我到现在仍然记得第一次看着损失曲线从几百降到零点几时的兴奋感。那种感觉没法替代——它让你亲眼看到一堆冰冷的数字是如何在一遍遍自我修正中“长出”预测能力的。如果你也对这一点感到好奇那就按上面的路子找一个小项目动手试试。理论看一百遍都不如亲眼看着那条曲线降下来一次来得真实。
阅读完成 · 觉得有帮助?
咨询建站