云计算百科
云计算领域专业知识百科平台

深度学习入门(一):深度学习到底是什么?从拟合一条直线讲起

引言

面试的时候我常问一个问题:

"神经网络训练的时候,到底在改动什么?"

十个人里有六个回答"在调整权重",然后追问"怎么调",就卡住了。剩下四个能说出"梯度下降",但再问"梯度是什么、为什么沿着它反方向走就能降 loss",基本全军覆没。

这不是他们的错。绝大部分教程的讲法是:先甩一个多层网络结构图,再甩一堆公式,最后丢一段 30 行的训练代码。中间"为什么"的部分,被跳过了。

所以这一篇我反着来:先不讲神经网络,先讲初中就学过的直线拟合。

原因很简单——深度学习就是"直线的拟合"加上一万倍的参数和非线性。你把这条直线彻底搞懂了,后面的一切都只是"参数变多"带来的工程问题。


正文

一、一个具体的问题:预测房价

假设你手上有 10 套房子的数据,只有两列:面积(平米)和总价(万元)。

面积 $x$总价 $y$
50 180
60 210
75 260
90 305
110 370
… …

现在来了第 11 套房子,面积 100 平,问:卖多少钱?

人脑的做法是画散点图,然后"画一条穿过这些点的线",再在横轴 100 的地方找到线上对应的纵坐标。这个动作,就是拟合,也是深度学习的全部起点。

二、模型:先假设一个形状

要画线,得先决定画什么形状的线。最简单的是直线:

$$
\\hat{y} = w x + b
$$

这就是一个模型。注意它的三个特点:

  • 输入 $x$ 是已知的(面积);

  • 输出 $\\hat{y}$ 是要算的(预测价格,帽子符号表示"预测值",以区别于真实值 $y$);

  • $w$ 和 $b$ 是未知的,需要从数据里学出来。

$w$ 叫权重(weight),控制斜率;$b$ 叫偏置(bias),控制截距。这两个东西,就是参数(parameter)。

于是问题被翻译成了数学语言:

找到一组 $(w, b)$,使得对所有的训练样本,$wx_i + b$ 都尽量接近 $y_i$。

"学习"这个词听起来玄,落到这里就是把 $w$ 和 $b$ 从随机数变成好数。

三、好坏怎么衡量:损失函数

怎么定义"尽量接近"?最自然的想法是:把每个样本的误差都算出来,加起来。

$$
L(w, b) = \\frac{1}{N}\\sum_{i=1}^{N}\\left(\\hat{y}_i – y_i\\right)^2 = \\frac{1}{N}\\sum_{i=1}^{N}\\left(w x_i + b – y_i\\right)^2
$$

这个 $L$ 叫损失函数(loss function),也叫目标函数、代价函数。深度学习里 90% 的时间,本质上都是在最小化一个损失函数。

为什么用平方而不是绝对值?两个原因:

  • 平方对大误差惩罚更重。误差 10 的平方是 100,误差 1 的平方是 1,差 100 倍。这逼着模型先去修正那些错得离谱的样本,符合直觉。

  • 平方处处可导。绝对值在 0 点有个尖角,导数不存在,而梯度下降需要导数处处存在。这是个非常工程化的理由,但它很重要。

  • 注意这里有个 1/N。它是把"总误差"变成"平均误差",好处是 loss 的数值不随样本数量变化,你换一个 batch 大小,指标还可比。

    四、怎么改:梯度下降

    现在有了目标:最小化 $L(w,b)$。问题是,$w$ 和 $b$ 有无穷多种组合,怎么找?

    先看一个一维的简化:假设 $b$ 已经固定,只看 $L$ 随 $w$ 的变化。它是一条抛物线(因为 $L$ 是 $w$ 的二次函数),开口向上。

    关键洞察:在抛物线上随便站一个点,如果你知道这点处的斜率,你就知道该往哪边走。

    • 斜率是正的 → 往右走,$L$ 会变大 → 所以应该往左走(减小 $w$)

    • 斜率是负的 → 往右走,$L$ 会变小 → 所以应该往右走(增大 $w$)

    两种情况可以统一成一句话:往斜率的反方向走。这就是梯度下降(gradient descent)的全部哲学。

    写成公式:

    $$
    w \\leftarrow w – \\eta \\frac{\\partial L}{\\partial w}
    $$

    $$
    b \\leftarrow b – \\eta \\frac{\\partial L}{\\partial b}
    $$

    其中 $\\eta$(读作 eta)叫学习率(learning rate),控制每步走多远。减号就是"反方向"。

    多变量时,"斜率"升级成"梯度"——一个向量,每个分量是对应参数的偏导数:

    $$
    \\nabla_\\theta L = \\left[\\frac{\\partial L}{\\partial w},\\ \\frac{\\partial L}{\\partial b}\\right]^{\\top},\\qquad \\theta \\leftarrow \\theta – \\eta \\nabla_\\theta L
    $$

    $\\theta$ 是用来统称所有参数的记号,这里 $\\theta = (w, b)$。后面参数变成几百万个时,这个记号能省很多字。

    手推一遍梯度

    别怕,就两步。先展开:

    $$
    L = \\frac{1}{N}\\sum_{i=1}^{N}\\left(w x_i + b – y_i\\right)^2
    $$

    令 $e_i = w x_i + b – y_i$(第 $i$ 个样本的误差),则 $L = \\frac{1}{N}\\sum e_i^2$。

    对 $w$ 求偏导,用链式法则:外层是平方,内层是 $w x_i + b – y_i$。

    $$
    \\frac{\\partial L}{\\partial w} = \\frac{1}{N}\\sum_{i=1}^{N} 2 e_i \\cdot \\frac{\\partial e_i}{\\partial w} = \\frac{1}{N}\\sum_{i=1}^{N} 2 e_i x_i = \\frac{2}{N}\\sum_{i=1}^{N}\\left(w x_i + b – y_i\\right)x_i
    $$

    对 $b$ 求偏导,同理,只是 $\\frac{\\partial e_i}{\\partial b} = 1$:

    $$
    \\frac{\\partial L}{\\partial b} = \\frac{2}{N}\\sum_{i=1}^{N}\\left(w x_i + b – y_i\\right)
    $$

    到这里你就已经会反向传播的核心了——真的。反向传播不过是把"链式法则"在一个有很多层的复合函数上重复使用。第 3 篇会把它讲透。

    五、把整件事写成代码

    不用任何框架,20 行 NumPy:

    import numpy as np
    ​
    # 1. 数据
    x = np.array([50, 60, 75, 90, 110, 130, 45, 80, 100, 120], dtype=float)
    y = np.array([180, 210, 260, 305, 370, 430, 165, 275, 340, 405], dtype=float)
    ​
    # 2. 参数初始化(随机猜一个)
    w, b = 0.0, 0.0
    lr = 1e-4          # 学习率
    epochs = 5000      # 迭代轮数
    ​
    N = len(x)
    for epoch in range(epochs):
       # — 前向:算预测值 —
       y_hat = w * x + b
    ​
       # — 算损失 —
       loss = np.mean((y_hat – y) ** 2)
    ​
       # — 反向:算梯度 —
       err = y_hat – y
       dw = 2 * np.mean(err * x)
       db = 2 * np.mean(err)
    ​
       # — 更新 —
       w -= lr * dw
       b -= lr * db
    ​
       if epoch % 1000 == 0:
           print(f"epoch {epoch:5d} | loss {loss:10.2f} | w {w:.4f} | b {b:.4f}")
    ​
    print(f"\\n最终: y = {w:.4f} * x + {b:.4f}")
    print(f"预测 100 平: {w * 100 + b:.1f} 万元")

    跑一下你会看到类似:

    epoch     0 | loss 102345.67 | w 0.0412 | b 0.0031
    epoch 1000 | loss     412.88 | w 2.9301 | b 12.4432
    epoch 4000 | loss     18.65 | w 3.1204 | b 2.1120
    最终: y = 3.2341 * x + 0.5102

    就这五步,就是深度学习。

    ① 前向传播算预测 → ② 算损失 → ③ 反向传播算梯度 → ④ 更新参数 → ⑤ 重复

    后面所有的 ResNet、Transformer、GPT,训练循环都是这五步。只是第 ① 步从 w*x+b 变成了几百层的复合函数,第 ③ 步从手推公式变成了 loss.backward()。

    学习率是个坑

    上面代码里 lr = 1e-4 不是随便写的。试试改成 1e-1:

    epoch 0 | loss 102345.67
    epoch 1 | loss 8.7e+12
    epoch 2 | loss nan         ← 炸了

    这叫梯度爆炸:步子太大,一下跨过谷底,跑到对面更高的地方,下一次误差更大,几步就溢出成 inf。

    反过来改成 1e-8,5000 轮下来 loss 几乎没动——走得太慢,5000 步都没走到谷底。

    学习率的选择本质是在"稳"和"快"之间找平衡。这也是为什么第 4 篇要专门讲优化器和学习率调度。

    六、为什么需要"深度"

    到这里,你已经会训练一个线性模型了。那为什么还要神经网络?

    因为直线太弱了。

    线性模型的死穴

    假设你的数据长这样:真实关系是 $y = x^2$。你用 $wx + b$ 去拟合,无论怎么调,永远是一条直线,误差小不了。

    更致命的例子是异或问题(XOR):

    $x_1$$x_2$$y$
    0 0 0
    0 1 1
    1 0 1
    1 1 0

    你找不到任何一条直线,能把 $y=1$ 的两点和 $y=0$ 的两点分开。1969 年 Minsky 就是靠这个问题,把神经网络研究按下了暂停键将近二十年。

    破局:加非线性 + 加层数

    关键操作有且只有两个:

    第一,在每层后面加一个非线性函数(叫激活函数,第 2 篇细讲):

    $$
    h = \\sigma(w x + b)
    $$

    第二,把多个这样的单元叠起来:

    $$
    \\begin{aligned} h_1 &= \\sigma(W_1 x + b_1) \\\\ h_2 &= \\sigma(W_2 h_1 + b_2) \\\\ \\hat{y} &= W_3 h_2 + b_3 \\end{aligned}
    $$

    这时,$x$ 和 $\\hat{y}$ 之间的关系就不再是直线,而是任意复杂的曲线了。

    为什么?因为第一层把原始输入 $x$ 变换到了一个新的空间 $h_1$。在那个空间里,原本线性不可分的数据,可能就变得线性可分了。

    这就是表示学习(representation learning)——深度学习最核心的思想。它不靠人去设计特征("面积/房间数"这种),而是让网络自己学出一组好用的中间表示。

    万能近似定理

    这不是玄学,有严格的数学结论兜底:

    万能近似定理(Universal Approximation Theorem):一个包含足够多神经元、且带非线性激活函数的单隐藏层前馈网络,可以在任意精度内逼近任意连续函数。

    写成数学形式,对任意连续函数 $f$ 和任意 $\\epsilon > 0$,存在参数使得:

    $$
    \\left| f(x) – \\sum_{j=1}^{M} c_j \\sigma\\left(w_j^{\\top} x + b_j\\right) \\right| < \\epsilon
    $$

    用人话说:只要你给的神经元够多,一层隐藏层理论上就能拟合任何东西。

    那为什么还要"深"?

    因为"理论上能"和"实际上好学"是两回事。同样的函数,浅网络可能需要指数级多的神经元,深网络只要多项式级。深层结构自带一种"复用"的归纳偏置:底层学边缘,中层学纹理,高层学物体,这种层次化复用是浅层做不到的。

    打个比方:盖 10 层楼,你可以用 100 个工人平铺着干(宽),也可以搭脚手架一层层往上(深)。后者效率高得多。

    七、深度学习和传统机器学习差在哪

    维度传统机器学习深度学习
    特征 人工设计(SIFT、TF-IDF、统计量) 自动学习,端到端
    数据量 几千到几万条即可 通常十万条起步
    算力 CPU 够用 依赖 GPU
    可解释性 较好(决策树、线性模型) 较差(黑盒,但可以事后解释)
    适用场景 表格数据、小样本、强业务规则 图像、语音、文本、多模态
    调参重点 特征工程 网络结构 + 优化策略 + 数据质量

    一句话总结这个区别:

    传统机器学习是人把知识"喂"给模型;深度学习是模型自己从数据里"长"出知识。

    但要提醒一句:表格数据上,XGBoost / LightGBM 至今仍经常吊打深度学习。 别拿锤子看什么都像钉子。

    八、全景:不同数据形态对应不同结构

    既然后面 11 篇都要讲结构,先给一张地图,让你知道自己在哪。

    数据类型典型结构核心归纳偏置对应篇目
    表格 / 向量 MLP(全连接) 特征之间可以任意组合 第 2 篇
    图像 CNN 局部性 + 平移不变性 第 6 篇
    语音 / 时序 RNN、LSTM、TCN 时间上有顺序依赖 第 7 篇
    文本 / 长序列 Transformer 任意两点都可能有依赖 第 8 篇
    一切(大模型) Transformer + 海量预训练 规模化 + 自监督 第 9 篇
    生成任务 VAE / GAN / Diffusion 学会数据分布本身 第 10 篇

    看这张表你会发现一件事:网络结构不是拍脑袋发明的,是被数据结构"逼"出来的。 你的数据有什么样的规律,就该用能表达这种规律的归纳偏置。这是理解所有架构的钥匙。


    小结

    本篇讲了四件事,都是后面所有内容的地基:

  • 模型就是"带未知参数的函数"。从 $\\hat{y} = wx+b$ 到 GPT,本质没变,只是参数量从 2 个变成几千亿个。

  • 损失函数把"预测得好不好"变成一个可以最小化的数字。回归用均方误差,分类用交叉熵(第 4 篇详讲)。

  • 梯度下降:算梯度(往哪走最陡),然后朝反方向迈一步($\\theta \\leftarrow \\theta – \\eta \\nabla_\\theta L$)。学习率决定步子大小,太大爆炸,太小磨蹭。

  • 深度的意义在于:非线性激活 + 多层堆叠 = 表示学习 = 能拟合任意复杂函数。万能近似定理保证了"能",层次化结构保证了"好学"。

  • 训练的五步闭环,请务必背下来:

    前向传播 → 计算损失 → 反向传播求梯度 → 更新参数 → 重复

    下一篇,我们把"两个参数"升级成"成百上千个参数",看看单个神经元到底在算什么,以及为什么必须要有激活函数——顺便用代码亲手复现 1969 年那个让神经网络停滞二十年的异或问题。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 深度学习入门(一):深度学习到底是什么?从拟合一条直线讲起
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!