首页 / 第一部分 · 模型到底是个什么东西 / 第 01 篇

第 01 篇 · 第一部分 · 模型到底是个什么东西

模型就是一条会拐弯的线:从线性回归到神经网络

不必被"模型"这个词吓到。它最开始就是一条直线——给它一个输入,它给出一个数字,中间靠几个乘法和加法撑着。后来它学会了拐弯,于是能画曲线、能认图、能聊天。可底子还是那条线。这一篇就把这条线从头拆到尾,同时把"参数""拟合""模型大小"这几个经常被提及、却少有人讲清的说法梳理一遍。

一、从一个具体例子开始:怎么用面积估房价

假设你手里只有一份数据:一批房子的成交价,加上它们的面积。别的什么都不看——不看楼层,不看朝向,不看离地铁站多远。就一个输入"面积",要预测一个输出"总价"。

把点画在坐标纸上,横轴是面积,纵轴是价格。六十平的房子卖三百万左右,九十平的三百五十万上下,一百二十平的四百万出头。这些点大体排成一条斜向上的带子。你拿尺子比画一下,画一条直线穿过这些点:

价格 ≈ 1.8 × 面积 + 190    (单位:万元)

八十平代进去,1.8 乘 80 再加 190,大约三百三十四万,跟真实成交价大致相当。就这么一个动作,你已经"建了一个模型"。它不神秘,就是一条直线。

这条线就是所谓线性回归。名字听着像统计课本里的东西,本质是你初中学过的一次函数 y = kx + b,只是换了个说法,管 k 叫权重、管 b 叫偏置。整个深度学习的帝国,就是从这么一条线盖起来的。

二、参数和拟合:那条线为什么会动

线里那两个数字不是凭空来的。1.8 管倾斜程度,面积每多一平,价格往上抬多少;190 管整体高低,哪怕面积趋近于零,也有一笔起步价撑着——地段、学区这些底子。这两个数,就是我们能拧的旋钮。

这种"可以拧的数字"就叫参数。一条直线只有两个参数,稍微复杂点的模型可能有几百万、几亿、几千亿个。所谓"模型大小",本质上就是数这些参数总共有多少个——这事后面还会专门讲。

把参数调到位的这个过程叫拟合。看似玄妙,其实跟你调收音机找清晰电台是一回事:往左调一点有杂音,往右调一点也有杂音,慢慢逼近那个最清楚的位置。模型训练也是这么尝试——找一组参数,让所有样本上"预测值"和"真实值"的总差距尽量小。

差距怎么量?把每个样本的预测减真实,取平方(避免正负相互抵消),全部加起来求个平均。这套算法叫均方误差,下一篇会专门拆。"总差距"这个数越小,就说拟合得越好,线也就摆到了该在的位置。

三、直线不够用的时候:加一点弯曲(激活函数)

直线有个明显的局限:它只有一种固定的变化方式——输入翻倍,输出也跟着翻。可现实里的规律往往不是这样。房价超过某个面积后基本不再上涨,再大的房子单价反而往下走;气温和空调耗电量的关系,也是先平后陡再平。这些形状,单靠调整那两个参数无论如何都描不出来,一条直线永远笔直。

破局的办法很朴素:在直线的输出上再接一个非线性函数,让它拐个弯。最常用的一个叫 ReLU,定义只有一行:

ReLU(x) = max(0, x)

它像一道闸门:输入是负数,一律压成 0 放过去;输入是正数,原样放行。看着平平无奇,可它把"负数"这一大块切掉了,直线就不再笔直,能在 0 那个位置拐一个折角。

另一个更早出现的叫 Sigmoid,把任意大的数都挤压到 0 到 1 之间,形状像一条平缓的 S。它擅长表达"概率"这类量——比如把任意一个分数,映射成"及格的可能性有多大"这样的概率。这些函数统称激活函数。没有它们,不管你叠多少层线性运算,结果仍等价于一层线性运算,等于没有叠加。

四、从一条线到一个神经元

单输入的单条线太单薄。真实问题往往有好几个输入:面积、房龄、距离地铁多少米,一起影响价格。

把这件事写成一行,就是:每个输入乘上各自的权重,全部加起来,再加一个偏置,然后过一道激活函数。这一整套,就是神经元。它跟前面那条线唯一的区别,是末端多了一道激活。

用打分的类比会更直观:几个评委坐在一起评价一套房,有人最看重面积,给的权重最大;有人只在意房龄,权重就压得很低。每个评委按自己那套标准打一个分(输入乘权重),汇总成一个总分(求和),再举手表态"这房子值不值得买"(过激活)。训练要做的,是把每个评委心里的权重和那根及格线,都调到一个合理的位置上。

到这里,术语和直觉就接上了:权重是"在意程度",偏置是"及格门槛",激活是"要不要表态"。数学和比喻是同一件事的两张脸。

五、堆叠:深度是怎么换来表达能力的

一个神经元只能拐一次弯,描出的仍是一条折了一次的线。想让模型表达更复杂的形状,办法是增加神经元的数量,把它们的输出汇总到一处。

道理跟搭积木差不多:一段曲线能用好几段短直线去逼近,段数越多越贴合。你把好多个带不同斜率的神经元加起来,就能拼出一条弯弯曲曲的复线——层里的神经元越多,能拼出的花样越多。

光堆宽度还不够。把这些神经元排成一层,一层的输出整批喂给下一层,层与层接力,这就是深度。深有什么好?它能一层层往上抽概念。拿识图来说,最浅的层只认边和角这类最细碎的局部,往上一层把这些边角拼成眼睛、鼻子、轮子,再往上一层把眼睛鼻子凑成一张脸,最上面那一层才判断"这是猫还是狗"。每一层都在前一层的基础上,抽象出更高级的概念。

这里有个常被拿来讲的结论,叫万能逼近定理:只要一层里的神经元足够多,理论上就能以任意精度逼近任意一个连续函数。听起来很诱人,可代价是——这个"足够多"有时会大到不切实际,参数能堆到天文数字。换成深层结构,同样的表达力往往能用少得多的参数换到,这就是为什么大家普遍选择加深而非加宽。

六、参数量:模型"大小"到底指什么

现在可以说清"模型多大"了。它指的是模型里所有可训练权重和偏置的总个数,单位是 M(百万)或 B(十亿)。这个数是硬件成本的直接来源:参数越多,占用的存储越多,算起来越慢,运行起来越占显存。

感受一下量级。老牌的 ResNet-50 有约 2500 万个参数;BERT-base 约 1.1 亿;GPT-2 约 15 亿;再大一档的 GPT-3 到了 1750 亿。从千万级跳升到千亿级,中间隔了约四个数量级,硬件开销也随之增长了好几个数量级。反过来,一个专门识别人脸的轻量网络可能只有几十万参数,装在手机里也不费力。

有一点需要提醒:参数量、计算量、显存占用是三件事,别混着看。参数量是权重个数;计算量通常用 FLOPs 表示,是运行一遍要做的浮点运算次数;显存占用又跟 batch 大小、推理时缓存了什么东西有关。一个模型参数量不大,但如果每步要处理很长的序列,计算量和显存照样会急剧增长——这事等到讲 Transformer 和 KV 缓存时会再算一遍。

七、模型不是数据库:它记的是规律不是答案

一个容易走偏的理解是:模型训练完了,是不是把训练数据原样背下来了?不是。权重里存的是统计规律,不是一摞答案。

打个比方,就像把许多食材压成一块压缩饼干。饼干带着原材料的营养和味道,但你没法从这块饼干里还原出某一颗具体的坚果。模型也是这样,它学的是"什么样的输入大概对应什么输出"这种趋势,而不是"第三万七千零一条数据长什么样"。正因为如此,即使给它一个训练时完全没有见过的输入,它也能给出一个合理的回答——这正是它的价值所在。

可硬币的另一面也跟着来了。规律学偏了,模型就会给出看似合理却错误的答案;规律被记过头了,它就只认训练数据里那几张熟悉的面孔,换一个场景便难以应对。后一种情况叫过拟合,本质是"背答案"而不是"懂道理",下一篇会用一整节来讲它。

八、收尾:预测不等于理解

一路看下来,模型这词可以退掉光环了。它是一台函数机器:输入一排数字,经过一串加权、求和、拐弯,输出一排数字。我们做的事,是给它挑一个函数形状,再找一组让误差最小的参数。

但有一条界线得划清楚:能预测,不等于理解。那条会拐弯的线可以把房价拟合得很准,可它不知道"学区"为什么影响价格,也不懂"地铁开通后房价会涨"这种因果。它只是在数据里找到了一条贴合的曲线。所以看到模型给出一个自信的答案,也不要轻易相信——它给的是"最像的答案",不是"想明白的答案"。

那么问题就来了:这几百万个参数,究竟是靠什么办法一步步调整到位的?这就得说说训练了。

参考资料

  1. Ian Goodfellow, Yoshua Bengio, Aaron Courville, Deep Learning, MIT Press, 2016. www.deeplearningbook.org(第 5、6 章讲线性模型与神经网络的基础)
  2. Michael Nielsen, Neural Networks and Deep Learning, 2015. neuralnetworksanddeeplearning.com(用梯度下降手把手教一个网络,适合零基础)
  3. Grant Sanderson (3Blue1Brown), Neural Networks 系列视频. 3blue1brown.com/topics/neural-networks(把权重、偏置、激活讲成动画)
  4. PyTorch 官方教程 Learn the Basics. pytorch.org/tutorials(想动手跑一个线性模型,从这里开始)