写在前面
上一篇我们搞懂了 AI 的基本概念,今天我们来啃第一个真正的数学模型。
别怕,我不堆公式,咱们用“相亲”的例子来聊聊什么是回归。


💡 上章习题揭秘

1. 那个分袜子的例子

  • 场景 A(分袜子):这是无监督学习(聚类)。因为你没告诉 AI 哪双是“红袜子”,它只是把相似的凑一对。
  • 场景 B(垃圾邮件):这是有监督学习。因为你明确给了标签(“是”或“不是”)。

2. 为什么大模型会胡说八道?

  • 因为它不是在查数据库,而是在猜下一个字
  • 如果你问它一个也没见过的故事,它会根据概率瞎编一个通顺的句子,而不是告诉你“我不知道”。这就是幻觉的本质。

给初学者的定心丸
这一章我们只做一个数学题:算房价
但我们会从最简单的初中数学,一路推导到大模型底层的矩阵运算。掌握了这一章,你就懂了 AI 预测万物的基本逻辑。


1. 到底什么是“多元线性回归”?

别被这个学术名词吓到了。我们把它拆开来看,其实就是小学数学。

1.1 拆解名字

  1. 回归 (Regression):意思是预测一个具体的数字
    • 比如:预测房价是 500 万,还是 505 万?(如果是预测“是/否”,那叫分类)。
  2. 线性 (Linear):意思是**“简单的加减法”**。
    • 我们假设每个因素的影响都是独立的,直接加起来就行。没有奇奇怪怪的平方、开根号。
  3. 多元 (Multivariate):意思是**“参考多个线索”**。
    • 世界太复杂了,光看一个因素(比如面积)肯定预测不准,还得看地段、房龄、楼层等等。

1.2 通俗比喻:相亲打分表

想象你手里有一张相亲打分表,用来预测你对一个人的满意度yyy)。

你心里有一杆秤(模型):

  • 线索 A (x1x_1x1):颜值。你是个颜控,觉得这很重要,权重 (w1w_1w1) 设为 10分
  • 线索 B (x2x_2x2):存款。你觉得钱够用就行,权重 (w2w_2w2) 设为 2分
  • 线索 C (x3x_3x3):脾气。你讨厌脾气差的,权重 (w3w_3w3) 设为 -50分(严重扣分项)。
  • 基础分 (bbb):只要是个人,起步分就是 60分

当遇到一个相亲对象时,你的大脑就在做“多元线性回归”:
满意度=(10×颜值)+(2×存款)+(−50×脾气)+60满意度 = (10 \times 颜值) + (2 \times 存款) + (-50 \times 脾气) + 60满意度=(10×颜值)+(2×存款)+(50×脾气)+60

  • 训练模型:就是你谈了 10 次恋爱后,总结出“原来我最看重颜值,不太看重钱”的过程(调整 www 的大小)。
  • 预测:就是你拿着这套标准,去评估下一个新认识的人。

1.3 从“一元”到“多元”的数学表达

回到房价预测的例子:

  • 一元(只看面积)
    • 公式:y=w⋅x+by = w \cdot x + by=wx+b
    • 图形:一条直线。
  • 多元(看面积、距离、房龄…)
    • 公式:y=w1x1+w2x2+w3x3+...+by = w_1x_1 + w_2x_2 + w_3x_3 + ... + by=w1x1+w2x2+w3x3+...+b
    • 图形:一个平面(2个特征)或超平面(更多特征)。

在这里插入图片描述

图解

  • 左图 (一元):只有一个变量(面积),模型是一条线
  • 右图 (多元):有两个变量(面积+距离),模型变成了一张(平面)。
  • 虽然维度变了,但道理是一样的:找一个最合适的平面,去拟合所有的数据点。

2. 深度拆解:机器是怎么“思考”的?

这一节我们手动模拟 AI 的大脑,看它是如何修正错误的。

2.1 初始化(瞎猜)

机器一开始脑子一片空白,它随机初始化了一组权重:

  • w1w_1w1 (面积权重) = 1.0
  • w2w_2w2 (地铁权重) = 1.0
  • bbb (基础价) = 0

2.2 第一轮预测(Forward Pass)

来了一套真房源:面积 100平,距离 5km,真实卖了 300万
机器开始算:
预测价=1.0×100+1.0×5+0=105万预测价 = 1.0 \times 100 + 1.0 \times 5 + 0 = 105万预测价=1.0×100+1.0×5+0=105

2.3 计算误差(Loss)

误差=真实值−预测值=300−105=195万误差 = 真实值 - 预测值 = 300 - 105 = 195万误差=真实值预测值=300105=195
机器发现:少算了太多了!

2.4 归因与修正(Backward Pass)

机器开始反思:为什么算少了?

  • 是因为 w1w_1w1 (面积) 太小了吗?还是 w2w_2w2 (距离) 太小了?
  • 特征越大,责任越大:面积是 100,距离是 5。面积这个特征数值很大,所以如果稍微把 w1w_1w1 调大一点点,预测结果就会涨很多。
  • 修正策略:大幅调大 w1w_1w1,小幅调大 w2w_2w2
    • w1w_1w1 = 2.5
    • w2w_2w2 = 1.2
  • 再次预测2.5×100+1.2×5=256万2.5 \times 100 + 1.2 \times 5 = 256万2.5×100+1.2×5=256
    • 你看!误差从 195万 缩小到了 44万。

这就是梯度下降的直观过程(下一章细讲数学原理)。


3. 工程师的进阶视角:矩阵运算 (Matrix Multiplication)

这是大模型工程师必须理解的深度内容。
很多教程直接甩公式,我们这里先慢下来,搞清楚什么是矩阵

3.1 什么是矩阵?(What is a Matrix?)

别把矩阵想得太复杂,它本质上就是一个Excel 表格

  • 标量 (Scalar):一个单独的数字。比如 x = 100
  • 向量 (Vector):一排数字。比如 [100, 5, 20](一套房子的三个特征)。
  • 矩阵 (Matrix):多行多列的数字。比如你有 1 万套房子,把它们的数据堆在一起,就是一个大矩阵。

例子
X=[100580212010]←第1套房:100平,距地铁5km←第2套房:80平,距地铁2km←第3套房:120平,距地铁10km X = \begin{bmatrix} 100 & 5 \\ 80 & 2 \\ 120 & 10 \end{bmatrix} \quad \begin{matrix} \leftarrow \text{第1套房:100平,距地铁5km} \\ \leftarrow \text{第2套房:80平,距地铁2km} \\ \leftarrow \text{第3套房:120平,距地铁10km} \end{matrix} X= 100801205210 1套房:100平,距地铁5km2套房:80平,距地铁2km3套房:120平,距地铁10km

  • 行 (Row):代表样本(每套房子)。
  • 列 (Column):代表特征(面积、距离)。
  • 为什么要这么排? 因为这样最整齐,计算机读起来最舒服。

3.2 为什么需要矩阵运算?

【深度解惑:物理结构决定命运】
你可能会问:“为什么不把 CPU 也设计成有 1000 个核,让它也能并行?”
答案是:地皮不够用了。

在这里插入图片描述

我们来看看芯片内部的装修图(如上图):

  1. CPU (包工头) —— 复杂的脑子

    • 装修策略:CPU 必须聪明。因为通过它运行的程序非常复杂(比如操作系统、浏览器),经常有 if-else 跳转。
    • Control (指挥部):占据了巨大的面积。为了预测下一步该干嘛(分支预测),防止流水线停顿。
    • Cache (大缓存):占据了巨大的面积。为了让数据存取极快,不让 CPU 等内存。
    • ALU (干活的手):最后留给计算单元(ALU)的地方,只剩下一点点了(通常只有 4-64 个核)。
    • 结论:CPU 的晶体管都用来**“动脑子”**了,没地方长手了。所以它只能串行,或者低并发。
  2. GPU (搬砖队) —— 简单的肌肉

    • 装修策略:GPU 假设你要做的计算是**“傻瓜式重复”**的(比如矩阵乘法,每一行都是 y=wx+by=wx+by=wx+b)。
    • Control/Cache:砍掉!砍掉!既然不需要复杂的逻辑判断,就不需要聪明的指挥部。
    • ALU (干活的手):腾出来的面积,全部塞满计算单元!一张显卡里可以有 几千甚至上万个 微小的核心。
    • 结论:GPU 牺牲了“脑子”,换来了成千上万只“手”。

终极答案

  • CPU 只能串行(或少并行),是因为它为了通用性逻辑处理,不得不把芯片面积让给控制单元。
  • GPU 可以大规模并行,是因为它专为重复计算设计,把芯片面积全让给了计算单元。

3.3 公式变换

我们来看一下矩阵乘法到底是怎么“并行”的:

在这里插入图片描述

  • 人类视角(For循环)
    • 先算第 1 个房子的价格:100×2.5+5×(−1)=245100 \times 2.5 + 5 \times (-1) = 245100×2.5+5×(1)=245
    • 再算第 2 个房子的价格:80×2.5+2×(−1)=19880 \times 2.5 + 2 \times (-1) = 19880×2.5+2×(1)=198
    • … 循环 1 万次。
  • 矩阵视角(一次性)
    • 把所有房子数据堆在一起(矩阵 XXX)。
    • 把权重放旁边(矩阵 WWW)。
    • GPU 一声令下:第 1 个核心算第 1 行,第 2 个核心算第 2 行…
    • 瞬间出结果:所有预测值(矩阵 YYY)同时蹦出来。

这就是为什么大模型(LLM)必须用 GPU 跑。ChatGPT 每生成一个字,都要做几千亿次这种运算,用 CPU 跑可能一个字要憋一小时。
Y=X⋅W+BY = X \cdot W + BY=XW+B

  • XXX (Input Matrix):[10000行, 3列] 的矩阵(1万套房,3个特征)。
  • WWW (Weight Matrix):[3行, 1列] 的向量(3个权重)。
  • YYY (Output Matrix):[10000行, 1列] 的结果(1万个预测房价)。

大模型本质
ChatGPT 的一次推理,其实就是拿着你的输入 XXX,和模型里几千亿个 WWW 进行了一次超级复杂的矩阵乘法
所以,买显卡就是为了算矩阵乘法!


4. 多元线性回归的潜在陷阱(避坑指南)

做算法工程师,最怕的不是模型跑不通,而是模型跑通了,但结果是错的。以下是两个最经典的“隐形杀手”。

4.1 陷阱一:特征量纲不一致 (Feature Scaling)

【案例:谁是老大?】
假设你要预测一个人的健康分。

  • 特征 A:身高(单位:米)。范围 1.5 ~ 2.0。
  • 特征 B:白细胞数量(单位:个)。范围 4000 ~ 10000。

后果

  • 在机器眼里,数字越大越牛。
  • 白细胞一波动就是几千,身高一波动才 0.1。
  • 机器会觉得:“哇,这个白细胞太重要了,它的变化对结果影响巨大!”
  • 结局:模型会拼命去拟合白细胞,完全忽略身高的影响。哪怕身高其实更重要,也没人理它。

【解决办法】
归一化 (Normalization):大家统统把衣服脱了,把数值都压缩到 0 到 1 之间

  • 身高 1.8米 -> 0.6
  • 白细胞 7000 -> 0.5
  • 这样大家就在同一起跑线了。

4.2 陷阱二:多重共线性 (Multicollinearity)

【案例:左右脚打架】
假设你预测走路速度。

  • 特征 A:左脚迈出的步数。
  • 特征 B:右脚迈出的步数。

问题

  • 正常人走路,左脚迈一步,右脚肯定也迈一步。这俩数据是**完全同步(强相关)**的。
  • 模型懵了
    • 模型:“我发现步数越多速度越快。但是……到底是左脚的功劳,还是右脚的功劳?”
    • 方案 1:给左脚权重 1.0,右脚 0。
    • 方案 2:给左脚 0.5,右脚 0.5。
    • 方案 3:给左脚 100,右脚 -99(这也能凑出结果!)。
  • 后果
    • 权重乱跳:数据稍微变一点点,模型参数就剧烈波动。
    • 解释性差:你根本不知道哪个特征是真的重要。

【解决办法】

  1. 删特征:两个特征太像了?删掉一个,留一个就行。
  2. 正则化 (L2 Regularization):这是后面的大招。强迫模型“雨露均沾”,不让某个参数变得特别离谱。

5. 动手写代码 (Code Time)

光说不练假把式。作为工程师,我们需要把上面的数学公式翻译成 Python 代码。

5.1 用 Numpy 手搓一个预测器

我们来模拟一下显卡里的矩阵运算。

import numpy as np

# 1. 准备数据 (矩阵 X)
# 3套房子,每套有2个特征:[面积, 距离]
X = np.array([
    [100, 5],  # 第1套
    [80,  2],  # 第2套
    [120, 10]  # 第3套
])

# 2. 准备权重 (向量 w) 和 偏置 (b)
# 假设我们已经训练好了参数
w = np.array([
    [2.5],  # 面积的权重
    [-1.0]  # 距离的权重
])
b = 10      # 基础价格

# 3. 矩阵运算 (GPU 就在做这一行代码)
# y = Xw + b
# np.dot 是矩阵乘法
y_pred = np.dot(X, w) + b

print(y_pred)
# 输出结果(瞬间算出3套房价):
# [[255.]
#  [208.]
#  [300.]]

5.2 用 PyTorch (大模型主流框架)

在大模型开发中,我们通常用 PyTorch。写法几乎一模一样,但它可以自动用 GPU 跑。

import torch

# 1. 定义线性层 (Linear Layer)
# 输入特征 2个 (面积, 距离),输出特征 1个 (房价)
model = torch.nn.Linear(in_features=2, out_features=1)

# 2. 塞入数据
X = torch.tensor([[100.0, 5.0], [80.0, 2.0]])

# 3. 前向传播 (Forward Pass)
y_pred = model(X)

总结
你看,所谓的“多元线性回归”,在代码里就是一行 torch.nn.Linear
大模型(Transformer)里有成千上万个这样的 Linear 层,它们一层套一层,就变成了能听懂人话的 AI。


6. 🧠 脑洞时间:课后思考与练习

练习题 1:当一回 AI(升级版)

假设我们要预测相亲成功率

  • 特征:x1x_1x1=颜值(1-10分), x2x_2x2=年薪(万), x3x_3x3=犯罪记录(0或1)。
  • 模型:y=10x1+1x2−1000x3y = 10x_1 + 1x_2 - 1000x_3y=10x1+1x21000x3
  • 案例
    • 高富帅:颜值9,年薪100,无犯罪(0)。得分 = 90 + 100 - 0 = 190 (成)
    • 逃犯:颜值9,年薪100,有犯罪(1)。得分 = 90 + 100 - 1000 = -810 (不成)
  • 思考:线性回归能做到“一票否决”吗?
    • 答案:可以,只要给那个特征一个巨大的负权重(比如 -10000)。但如果逻辑是“只有当年薪>50且颜值>8时才行”,这种组合逻辑(AND关系),线性回归就很难做到了。这需要神经网络。

练习题 2:拟合直线

拿一张纸,随便画三个点(不共线)。
试着画一条直线,让这条线尽量靠近这三个点。

  • 思考:除了这三个点,直线外的区域是什么?
    • 是模型的泛化 (Generalization)。模型通过这三个点学会了规律,就可以预测任何其他点的位置。

👉 下一章预告:梯度下降法
刚才我们在 2.4 节里手动调了一下权重,觉得挺简单?
但如果有 1000 亿个参数,靠人脑怎么调?
下一章,我们将介绍 AI 自动调参的唯一真神——梯度下降

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐