[控场AI]
· 5 分钟阅读· 2,747 字

用积木讲透万能近似定理:神经网络为何能逼近任意函数

用积木讲透万能近似定理:神经网络为何能逼近任意函数

用“搭积木”可视化拆解万能近似定理:单隐藏层网络如何逼近任意连续函数。

本文围绕万能近似定理,借助 Michael Nielsen 第4章的可视化论证与 Reddit 创作者的动画和代码,拆解了单隐藏层网络逼近任意连续函数的构造逻辑。核心思路是把单个 Sigmoid 神经元调权重后近似为阶跃函数,两个阶跃相减得到局部凸起“砖块”,再叠加多个凸起逼近目标曲线。文章同时澄清了定理的边界:它只保证存在性而非可训练性或泛化能力,对网络规模给出悲观界,深层结构的优势在于参数效率而非表达能力。最后建议通过三步代码复现来真正理解定理。

用积木讲透万能近似定理:神经网络为何能逼近任意函数

一个只有单隐藏层的前馈神经网络,真的能逼近任意连续函数吗?这是深度学习理论中最反直觉、也最常被问到的命题之一。Michael Nielsen 在《Neural Networks and Deep Learning》第 4 章中给出了一个几乎不依赖公式的可视化论证:神经网络本质上是一堆微小的“砖块”,通过堆叠砖块来拼出任意形状的函数曲线。

Reddit 上一位创作者把这个论证做成了逐步展开的可视化视频,并附带了 Python 代码仓库,让抽象证明变成了可以被“看见”的过程。本文沿着这条可视化思路,拆解万能近似定理背后的构造逻辑。

万能近似定理到底在说什么

定理的表述并不复杂:一个带有非线性激活函数的单隐藏层前馈网络,在隐藏层神经元数量足够多的前提下,可以以任意精度逼近任意连续函数。

这句话常被误读成“一个隐藏层就够了,所以深层网络没必要”。实际上定理只保证存在性,不保证可学习性——网络可能需要指数级宽的隐藏层,而深层结构能用少得多的参数达到同样效果。Nielsen 在第 4 章反复强调的正是这一点:定理回答的是表达能力上限,不是训练可行性。

Reddit 原帖用一句话概括了核心直觉:“a neural network really is a pile of tiny bricks”——网络不是在拟合一条复杂曲线,而是在用许多简单的小块拼出这条曲线。

砖块是怎么造出来的:从阶跃函数到 Sigmoid

要理解堆叠,先要看清单个神经元能做什么。

加权和加偏置:制造一个“开关点”

单个神经元先对输入做加权求和并加上偏置,再送入激活函数。在可视化论证中,关键是把偏置调到让加权和在某一点附近从大幅负值跳到大幅正值。这时 Sigmoid 输出会呈现出一个陡峭的 S 形过渡——本质上就是一个被“软化”的阶跃函数。

把权重调大,过渡会变得更陡,S 形越来越接近理想阶跃。于是单个神经元就成了一块“带斜坡的砖”。

Sigmoid 函数定义为 σ(z) = 1/(1+e^{-z}),其导数 σ'(z) = σ(z)(1-σ(z)),在 z=0 处取得最大值 0.25。这个性质解释了为什么单纯增大权重能让过渡变陡:当权重 w 增大时,加权和 z = wx+b 在 x 附近的变化率变大,经过 Sigmoid 后输出的过渡区间宽度大致与 1/|w| 成正比。因此,通过调节权重可以控制“砖块”斜坡的陡峭程度,而调节偏置则控制斜坡发生的位置。这正是构造阶跃近似时两个可调旋钮的数学来源。

两个阶跃相减:得到一块凸起的砖

一块阶跃只能让函数整体抬高。要造出局部凸起,需要两块阶跃相减:用一个神经元在左端点抬起,用另一个神经元在右端点压低,两者输出相减,就得到一个矩形脉冲。

这就是可视化论证里最关键的“积木”单元:一个隐藏层神经元对可以构造出一个任意位置、任意宽度的凸起。把这组凸起叠加起来,就得到了对目标函数的分段逼近。

用两个 Sigmoid 相减构造凸起,本质上是利用了 Sigmoid 的差分近似:当两个 Sigmoid 的过渡点分别位于区间 [a, b] 的两端时,它们的差在区间内部近似为常数,在区间外部趋近于零,从而形成一个矩形脉冲。更形式化地,若 σ(w(x-a)) - σ(w(x-b)) 在 w 很大时,其值在 a 与 b 之间约为 1,在区间外约为 0,宽度为 b-a。这与用两个 Heaviside 阶跃函数相减得到矩形窗的经典信号处理思想完全一致,只不过 Sigmoid 提供了平滑可导的版本,使得后续基于梯度的训练成为可能。

堆叠砖块:逼近任意曲线的构造逻辑

有了凸起砖块,剩下的就是堆叠。

Reddit 视频沿 Nielsen 的路径逐步演示:目标函数越弯曲,需要的砖块越多;砖块越窄,逼近误差越小。把隐藏层神经元数量增加到足够多,就能用有限个凸起把目标曲线包住到任意精度。

这个构造给出了定理证明的骨架,但也暴露了它的代价。为了逼近一条剧烈振荡的函数,所需的砖块数量可能随精度要求呈指数增长。这正是 Nielsen 指出的核心张力:万能近似定理保证了表达能力的上限,却对所需的网络规模给出了一个非常悲观的界。

视频作者在帖子里提到,GitHub 仓库中附带了对应的 Python 代码,可以亲手复现这些砖块的叠加过程——对理解定理来说,动手拼一遍比读十遍证明更有效。

单隐藏层的“能”与“不能”

可视化论证容易被过度解读,有几个边界值得单独说清。

第一,定理针对连续函数。 对不连续函数、定义域无界的情形,标准表述需要额外条件。

第二,逼近不等于泛化。 存在一个能拟合训练数据的宽网络,和这个网络能在新数据上表现良好,是两件事。可视化论证只处理前者。

第三,深度带来的是效率而非表达力。 单隐藏层在表达能力上不输深层网络,但深层结构可以用更少的参数表达同样的函数族,这在实践中决定了可训练性。Nielsen 的书里对这层关系有专门讨论,Reddit 视频则把重心放在构造本身。

定理的标准形式通常表述为:对定义在紧集上的任意连续函数 f 和任意 ε>0,存在一个单隐藏层网络,使得对所有输入 x 都有 |f(x) - 网络输出| < ε。这里“紧集”指有界闭集,排除了定义域无界的情形;而“连续”排除了跳变点。此外,定理的经典证明(如 Cybenko 1989、Hornik 1991)依赖激活函数满足非多项式有界等条件,Sigmoid 和 ReLU 均满足。值得注意的是,定理并不要求隐藏层神经元数量在精度提高时保持多项式增长——构造性证明中神经元数量通常随 1/ε 增长,这正是“悲观界”的来源。

为什么这个可视化值得看

关于万能近似定理的证明,多数教材选择用测度论或泛函分析的语言完成,读者能验证每一步,却很难形成直觉。Nielsen 第 4 章的价值在于把证明换成了“搭积木”的叙事:先造砖,再堆砖,最后用砖拼出曲线。

Reddit 这位创作者做的事情,是把这条叙事链进一步动画化,并配上可运行的代码。对于正在读这本书、或者被定理的抽象表述卡住的人来说,这种呈现方式降低了理解门槛,也让“神经网络为什么能拟合一切”从一句口号变成了一套可以自己复现的操作。

如果你打算动手,建议的顺序是:先用代码复现单个 Sigmoid 阶跃,再复现两块阶跃相减的凸起,最后叠加多个凸起逼近一个非平凡函数。走完这三步,定理就不再需要背了。

#万能近似定理#神经网络可视化#Michael Nielsen#Neural Networks and Deep Learning#单隐藏层网络#Sigmoid 激活函数#深度学习理论
分享:

相关推荐