第 3 章 · 基础

前向传播:网络是个函数

把神经元一层一层接起来,会发生什么?答案朴素得惊人:你得到一个巨大的复合函数。这一章,我们看清数据如何一层层流过网络,以及为什么这样的函数理论上「什么都能表示」。

3.1 网络 = 函数套函数

第 1 章里,一个神经元是一个小函数:输入几个数,输出一个数。第 2 章给它换上了现代激活函数。现在做一件最直接的事——把一排神经元的输出,接到下一排神经元的输入上。这在数学上不叫别的,就叫函数复合

y = f3( f2( f1(x) ) )

x 是输入向量,f1、f2、f3 各是一层。每一层内部又是一样的老配方:先加权求和,再过激活函数。把第 l 层的输出记作 a(l),整个网络就是这条规则的反复套用:

a(l) = σ( W(l) · a(l−1) + b(l) ) ,   其中 a(0) = x
💡 一句话直觉

每一层都是对空间的一次变换:加权求和负责拉伸、旋转、平移,激活函数负责「折一下」。一层层复合下去,就像一张被反复揉折的纸——原本缠在一起、直线分不开的数据,折到最后变得一刀就能切开。

所以「神经网络」这个名字有点唬人。它的真面目是:一个由许多简单变换串联而成的、形状极其灵活的函数。所谓前向传播,就是把这个函数算一遍。

3.2 前向传播:按层记账

「前向」的意思是:从输入出发,顺着箭头往输出走,逐层把每个节点的两笔账记下来——先是加权和 z,再是激活后的 a。没有循环,没有反馈,没有魔法,就是按顺序算数:

z = w1x1 + w2x2 + b ,   a = tanh(z)

下面是一个 2→3→1 的小网络:2 个输入、3 个隐藏节点、1 个输出,所有节点(包括输出层)都用 tanh 激活。每个节点圆里是激活值 a,旁边标着 z 与 a 两笔账;连线的粗细和深浅反映权重绝对值,紫色为正、橙色为负,hover 连线可以看到精确数值。

演示 1 · 逐层数值流:2→3→1 小网络

拖滑块 · 看数值

来回拖动 x1,再拖动 x2,盯紧输出 ŷ 的变化幅度:输出对哪个输入更敏感?多点几次「随机权重」,你会发现这种敏感关系被完全改写——它由第一层那两个权重的绝对值说了算。

输出层 z 输出 ŷ

玩的过程中有三件事值得留意:某条连线权重接近 0 时,它上游的节点对下游几乎「失语」;隐藏节点的 a 被 tanh 压进 (−1, 1),所以单层数值不会爆炸;而最终的 ŷ,只是这些中间结果再加权求和一次。记账完毕,前向传播就结束了——无论网络有一百层还是一亿个参数,流程一模一样。

3.3 通用近似定理:为什么说「什么都能表示」

一个自然的问题:这种「函数套函数」的表达能力有上限吗?1989 年 Cybenko 等人给出了著名的否定答案——通用近似定理(Universal Approximation Theorem):

∑ 定理(人话版)

只要隐藏层足够宽,一个仅含一层非线性激活的前馈网络,就能以任意小的误差逼近任意连续函数。层数不是必需的,非线性才是。

一维情形下,这个定理几乎可以用肉眼验证。回忆 ReLU(x) = max(0, x) 的图像:0 之前平躺,0 之后以斜率 1 爬升。把它平移 c、斜率改成 a,得到一个「在 c 处拐弯的折线段」。把若干条这样的折线加起来:

g(x) = a1·ReLU(x − c1) + a2·ReLU(x − c2) + ⋯ + an·ReLU(x − cn)

每加一个单元,曲线就多一个可以自由调节的「折点」。折点够多,任何光滑曲线都能被一条折线贴得足够近——这就是一维的通用近似。别光听我说,亲手试:

演示 2 · ReLU 积木:拼出任意曲线

调拐点与斜率

灰线是目标,紫线是你的叠加结果,虚线是每个单元的贡献。攻略:先把拐点 c 撒开在曲线上,再逐个调斜率 a 贴合每一段。试试把均方误差压到 0.005 以下——你刚刚亲手验证了:折线段是万能积木。

单元数4 均方误差
⚠ 别误读这条定理

通用近似定理只说「存在一组好权重」,既不说怎么找到它,也不说找到它学得起。演示 2 里你手调 4~8 个单元已经需要耐心,真实网络有上百万个权重,靠人调是绝望的——第 5、6 章的反向传播和梯度下降,才是「找得到」的那把钥匙。

3.4 既然一层就够,为什么还要深?

如果单层网络理论上什么都能表示,为什么现实中的网络动辄几十上百层?定理没说出口的部分藏在「足够宽」三个字里——那个宽度可能宽到离谱。

回到演示 2:一层 k 个 ReLU 单元,最多拼出 k 段折线。但如果再叠一层,第二层会对第一层的折线再折一次,折线段数成倍增长;每多叠一层,复杂度就乘一次。同样是 100 个参数,「浅而宽」的网络只能买 100 段折线,「深而窄」的网络却能复合出成百上千段。深度,是用乘法换参数效率。

还有一个更贴近直觉的理由:分层抽象。以看图片为例,浅层只能学「像素 → 类别」的一步登天式映射;深层网络则自然地分工——底层认边缘和色块,中层拼纹理和部件,高层组装出「猫脸」「车轮」这样的概念。每一层站在前一层的肩膀上,这恰好符合我们理解世界的方式。

✓ 本章小结

网络就是一个复合函数 y = f3(f2(f1(x))),每层做一次「加权求和 + 激活」的空间变换。前向传播 = 从输入到输出按层记账,算出每个节点的 z 和 a。通用近似定理保证:一层足够宽的非线性网络能逼近任意连续函数(ReLU 折线段就是直观证据)——但它只保证存在,不保证找得到。深度用乘法级数提升参数效率,还带来分层抽象的能力。下一章要回答:算出了 ŷ,怎么衡量它错得有多离谱?