ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

函数逼近:AI数学基石,从误差度量到神经网络

函数逼近:AI数学基石,从误差度量到神经网络 简介函数逼近是人工智能数学基础的重要专题这套资源面向机器学习与深度学习初学者系统演示多项式逼近、样条函数逼近、核函数逼近和神经网络逼近等核心思路。包内共34个文件包含22个可直接运行的Python脚本、11张运行截图和1个数据文件压缩包仅896KB轻量便于下载学习。脚本覆盖函数插值、曲线拟合、最佳逼近、三次样条插值、切比雪夫近似、勒让德最佳平方逼近、BP神经网络与RBF神经网络拟合正弦函数、支持向量回归、三次贝塞尔曲线等典型实验并附黄河小浪底调水调沙实际问题脚本帮助读者将数学理论对应到代码实现。运行截图直观展示输出效果便于自查排错。目前已有134人学习下载适合正在补数学基础或准备算法实现的人工智能学习者。 有句话说得很通俗把人工智能拆开来看剩下的几乎全是函数。图像分类是函数语音识别是函数自然语言翻译也是函数——输入是一堆像素、波形或字符输出是一个标签、一段文字或一个概率中间那层看不见摸不着的映射关系就是函数。而“函数逼近”恰恰是这套体系里最核心的一块基石。这篇是“人工智能数学基础”系列的第七篇专门把函数逼近拆开聊透。这一篇适合谁读我觉得主要是两类人。一类是刚入门的AI学习者高数、线代学了一堆却不知道这些东西到底在哪里起作用另一类是做工程做了几年的开发者天天调模型、换Loss但对“为什么有效”这层机理缺少系统梳理。下面我会尽量用大白话讲原理也会把实际项目里踩过的坑一起写出来。1. 从“猜猫游戏”说起AI到底在求什么我经常跟新同事解释AI工作时用的比喻是“猜猫游戏”。你给模型看一万张猫的照片和一万张狗的照片模型要学到的其实是一套规则什么纹理、什么形状、什么颜色组合更像猫什么更像狗。这套规则用数学语言写出来就是某个函数 f它把一张图片x映射成一个类别标签y也就是 y f(x)。问题是这个f没有人能直接写出来。你没法用手写公式的方式精确描述“猫”这种生物在像素层面到底是什么。现实世界太复杂特征之间互相纠缠非线性关系到处都是。所以机器学习走了一条完全不同的路不试图精确写出f而是找一个足够好的近似函数g让g和真实f之间的误差尽量小。这个过程就叫函数逼近。你可以把真实世界比作一段坑坑洼洼的土路AI要做的不是把整段路做成绝对笔直的柏油马路而是尽量铺出一条让人走得舒服、误差可以接受的平路。1.1 机器学习里的“函数”和我们高数里学的“函数”很不一样高数里我们熟悉的函数比如 y x² 或者 y sin(x)是明确写出来的解析表达式。但机器学习里的函数本质上是一个黑箱输入输出关系非常复杂不可能用闭式表达式直接表示。比如一个图像分类模型输入可能是一个 224×224×3 的像素矩阵大约15万个数字输出是1000个类别的概率分布。这个从15万维到1000维的映射你说它是什么公式没人知道。但神经网络可以把它逼近出来——通过一层层的线性变换加激活函数像搭积木一样一块一块拼出这个复杂的映射关系。这里有个关键点为什么不是直接拟合而是“逼近”因为真实函数f要么不存在解析式要么复杂到无法精确表达要么数据本身就带着噪声。你硬要追求严格相等反而会把噪声也学进去结果就是过拟合。1.2 监督学习的本质用样本反推函数现在主流的监督学习做的事情可以精确概括为给你一堆样本点 (x₁, y₁), (x₂, y₂), ..., (xₙ, yₙ)这些样本点分布在某个未知函数f的图像上可能带噪声你要找一个函数g让g在这些样本点上的输出尽量接近真实y值。这就是一个典型的函数逼近问题。注意样本是有限的但f是定义在整个输入空间上的所以你必须从有限的点出发推断出无限空间上的一个合理近似。这个“从有限到无限”的泛化过程是函数逼近的核心难点也是泛化误差的由来。我举个更直白的例子你有一组房价数据面积50平、80平、100平的房子各卖掉了几套价格各不相同。你要预测75平和120平的房子大概卖多少钱。这种预测背后其实就是最朴素的函数逼近用已知点推测未知点。只不过机器学习把这件事做得更复杂、更自动化了。2. “逼近”意味着不相等误差的度量才是真正的裁判很多人初学函数逼近时最容易忽略的一个问题是什么算“好”的逼近这听起来像废话但仔细想就会发现在数学里“误差小”这件事本身有多种定义方式。你定义误差的方式不同最后得到的逼近函数可能完全不同。打个比方测量一个物体的长度你可以用最大误差来衡量也可以用平均误差来衡量。如果某个点在最大误差标准下很重要在平均误差标准下就可能被淹没掉。同样函数逼近里的“误差度量”直接决定了你会得到什么样的近似函数。2.1 三种常用的逼近误差度量第一类是最大偏差度量数学上叫切比雪夫范数。它关注的是在定义域内近似函数g和真实函数f的最大偏差是多少。这种度量追求的是“最坏情况下也不能差太多”。比如航天器轨道计算中某个点的偏差如果过大可能导致灾难性后果此时就应该用最大偏差来度量逼近质量。第二类是平方误差度量也就是L2范数。它把所有点上的偏差平方后求和再开方相当于对所有偏差做了一个“平均”处理。这种度量对异常点比较敏感因为平方放大了大偏差的权重。机器学习里最常见的均方误差MSE损失函数本质上就是在用L2范数度量逼近误差。第三类是绝对误差度量也就是L1范数。它把所有偏差的绝对值求和比L2更抗异常点干扰。我在实际工作中如果数据里有明显的离群点比如某套房的成交价明显低于市场价那么用平均绝对误差MAE作为损失函数会比MSE更稳定。2.2 插值和逼近一字之差天壤之别这里必须区分两个特别容易混淆的概念插值Interpolation和逼近Approximation。插值要求函数g在所有已知样本点上完全贴合也就是 g(xᵢ) yᵢ 对所有样本点i都严格成立。看起来这很完美但它有个致命问题当数据带噪声时插值会把噪声当信号学进去函数曲线会变得极度扭曲在样本点之间剧烈震荡。这就是过拟合的数学本质。逼近不要求严格经过每个样本点只要求整体误差最小化。就像你去修一条从A到B的路不要求每块石头都和地面严丝合缝只要整体平整、车跑起来不颠就行。我刚开始做机器学习时总想着让模型在训练集上得分越高越好后来发现训练集上接近满分的模型一到新数据上就崩盘——这就是把逼近做成了插值。数据里的噪声被模型一字不差地记住了真正的规律反而没学到。2.3 用范数理解风险最小化理解了误差度量之后机器学习的训练目标就变得清晰了寻找一个函数g使得在给定的误差度量下g和真实f之间的误差最小。这个目标在机器学习里叫“风险最小化”。实际操作中我们计算不了g在整个输入空间上的真实误差只能通过有限样本估计它这叫经验风险最小化ERM。但这里有个坑如果只在训练集上算误差模型很容易走捷径。为了解决这个问题工程上引入了正则化项本质上是对逼近函数本身施加约束——比如限制函数不能太复杂、不能太“扭曲”。我习惯把正则化理解成给函数逼近加上了一把尺子你是可以逼近但也得注意形象不要太张牙舞爪。这个形象约束在数学上就体现为各种范数惩罚比如L2正则化对应的是控制函数能量L1正则化对应的是鼓励稀疏解。3. 经典逼近工具箱泰勒、傅里叶、切比雪夫各有什么脾气在神经网络火爆之前做函数逼近主要靠数学工具箱里的几把老工具泰勒展开、傅里叶级数、切比雪夫多项式等。这些工具到今天依然有用理解他们的适用边界能帮你看清楚神经网络为什么能被选中。打个比方这就像手工木匠的工具箱里既有刨子也有凿子各有各的用途。只有理解了每把工具的脾气才能选对工具干好活。3.1 泰勒展开局部视野很好的“近视镜”泰勒展开的本质是用多项式在某个点附近去近似一个函数。它的核心思路是如果你知道函数在某个点的函数值和各阶导数值就可以构造一个多项式让它在这一点附近跟原函数在局部范围内非常接近。比如 eˣ 在x0附近的泰勒展开是 1 x x²/2 x³/6 ...你取得项数越多在0附近就越接近eˣ。但泰勒展开有个致命弱点它是一个“近视镜”只在展开点附近效果好离展开点越远误差越大。而且有些函数比如 |x| 这种带尖角的函数在尖角处不可导泰勒展开根本玩不转。我在实际工作中很少直接用泰勒展开做全局逼近但它有一个重要价值很多算法推导里要用到局部近似的思想比如梯度下降里的步长设计、牛顿法里的二阶近似本质都是利用泰勒展开对整个复杂函数在局部做一个简化处理。3.2 傅里叶级数周期性信号的“标配工具”傅里叶级数解决的是另一类问题把周期性函数分解成一系列不同频率的正弦波之和。这个直觉非常漂亮——再复杂的周期信号都可以理解成不同频率、不同振幅、不同相位的基本波形的叠加。我印象最深的应用是在音频处理里一段钢琴演奏的音乐被麦克风录下来以后是一个时域波形看起来乱糟糟的。但如果用傅里叶变换把它变成频域表示就能清楚看到每个音符对应的频率成分。傅里叶逼近的问题在于它对非周期函数的适应力有限而且在处理有突变比如方波的函数时会出现Gibbs现象——在跳变点附近傅里叶近似会持续震荡增加项数也只能缩小震荡范围无法消除。这就意味着如果你的函数有很多陡峭的跳变用傅里叶逼近会很难受。3.3 切比雪夫多项式全局均匀的“老技师”切比雪夫多项式是一种专门设计的高质量逼近工具它的最大特点是能最大程度地压制最大偏差也就是我们前面说的切比雪夫范数最小化。用切比雪夫多项式逼近一个函数能保证在整个区间上误差相对均匀不会出现“某点超好、别的点超差”的情况。相比泰勒切比雪夫逼近是全局运作的相比傅里叶它又不要求函数有周期性。所以在数值计算领域切比雪夫多项式非常受欢迎特别是在解微分方程、信号滤波的多项式近似里。但传统工具都有一个共性问题维度灾难。当输入维度从1维变成10维、100维时这些方法需要的参数数量和计算量会爆炸式增长。比如一个多项式逼近如果要把每个维度的交互都考虑进来需要的项数是天文数字。这也正是神经网络能后来居上的核心原因之一。3.4 一图理解传统方法为什么在高维世界吃不开我用一个表格把这几种传统逼近方式的关键特性和局限放在一起对比逼近工具适用范围核心优势致命短板泰勒展开局部光滑函数局部精度高、推导简单远离展开点误差骤增要求可导傅里叶级数周期函数全局频率分解清晰对非周期、突变函数效果差切比雪夫区间连续函数最大误差最小化、全局均匀高维时参数爆炸这个表背后其实是同一个问题这些工具都是在“人为设计好的函数空间”里寻找近似。泰勒假设函数像多项式傅里叶假设函数像正弦波切比雪夫假设函数有比较好的全局平滑性。这些假设在低维简单问题上很好用一旦遇到图像、语言这种高维复杂数据根本架不住。4. 神经网络为什么能“逼近一切”万能逼近定理的真相我不能不提那个在深度学习中地位极高的结论万能逼近定理。这条定理说一个足够宽的、带非线性激活函数的单隐层前馈神经网络可以在任意精度下逼近定义在紧致集上的任何连续函数。第一次听到这个定理的人通常会欢呼“神经网络天下无敌”但这里面有几个非常重要的细节必须搞清楚。4.1 万能定理说的是“存在”不是“能找到”万能逼近定理的核心保证是理论上存在一组网络参数能让这个神经网络足够接近那个目标函数。但它完全没有告诉我们这组参数怎么找、能不能在合理时间内找到。这就像告诉你“这座山上一定有金子”但没告诉你铲子从哪借、从哪个方向挖、挖多久能挖到。在实际训练中我们用的是梯度下降法在巨大的参数空间里搜索找到的往往不是全局最优而是一个足够好的局部最优。定理只管上限不管你能不能到达。我在项目里见过太多次这样的情况理论分析时模型精度似乎应该很高但实际训练出来的效果远不达预期。后来才明白这多半是优化过程没有充分展开而不是模型结构本身有问题。4.2 深度比宽度更“划算”的本质原因单隐层网络其实已经能满足理论上的万能逼近为什么现在的模型动不动就是几十层、上百层原因在于效率和可训练性。我做过一个通俗类比宽度大的网络像一个人记性特别好什么知识点都能背下来但理解起来缺乏层次深度大的网络像一个小团队每一层负责处理不同抽象级别的信息底层处理细节边缘中间层识别部件形状高层理解整体语义。这种层次化结构对复杂函数的逼近效率要高得多。更关键的是深度网络在实践中更容易优化。虽然深度网络的理论分析更难但大量实验表明在相同参数量预算下更深的结构往往比更宽的结构更容易训练出好的结果。这也解释了为什么ResNet、Transformer这些深层架构能统治现在的AI领域。4.3 激活函数的选择本质上是在决定“逼近工具”的形状神经网络的逼近能力很大程度上来自激活函数的非线性。如果没有激活函数多层线性变换叠在一起还是线性变换再深的网络也等价于单层线性模型根本不可能逼近非线性函数。选择激活函数是门手艺。ReLU简单高效、计算快但有“神经元死亡”问题Sigmoid容易导致梯度消失现在已经很少在隐藏层用了GELU在Transformer里表现出色因为它提供了一个更平滑的非线性。我的经验是如果模型训练正常但精度不够先别急着换激活函数先看看数据集和特征处理如果模型出现梯度消失或梯度爆炸再优先考虑激活函数和权重初始化方案。选激活函数的背后其实是选择了一个什么样的函数空间来逼近目标。5. 误差三分法逼近误差、泛化误差、优化误差锅到底该甩给谁模型效果不好是每个做AI的人都会头疼的事。学了函数逼近之后你会发现原来模型效果差这件事也有清晰的“分工体系”。把误差因素拆解清楚调优方向就变得有的放矢了。我习惯把模型总误差拆成三个部分逼近误差、泛化误差、优化误差。这三者的来源和应对策略完全不同。5.1 逼近误差模型家族的天花板逼近误差衡量的是“你选的模型类型本身”和“真实目标函数”之间的差距。比如你用线性模型去拟合一个明显非线性的数据那么不管你怎么调参都不可能做好因为线性模型这个“家族”本身就装不下非线性函数。这个误差直接对应模型复杂度。要是发现训练集上的损失都降不下去数据也没问题那多半就是逼近误差太大了——模型根本不够复杂。解决办法是换更大的模型、更深的网络或者给模型增加更强的特征表达能力。5.2 泛化误差从训练样本到整个世界的距离泛化误差来自训练样本的有限性。因为你只能看到一部分数据模型在训练分布上表现好不代表在测试分布上表现好。这就像你只在某个小区见过商品房就以为全国房子都长这样——样本量太小或覆盖不全损失就大。这个误差在工程上对应偏见-方差困境模型太简单方差低但偏见大容易欠拟合模型太复杂偏见低但方差大容易过拟合。应对泛化误差最有效的手段有三个增加数据、加正则化、做交叉验证。我在实际工作中经常先跑一个小模型做baseline再来判断当前的主要矛盾到底是逼近误差还是泛化误差。5.3 优化误差梯度下降没走到位优化误差是指“理论上模型能达到的最好效果”和“实际训练出来的效果”之间的差距。这种情况太过常见模型结构没毛病数据也够了但训练过程卡在局部最优或者loss震荡不收敛最后训练出来的参数并没有学到理想状态。优化误差的问题功夫通常在调参上换优化器、调整学习率、加学习率衰减、改变批次大小。在我踩过很多次坑之后深刻体会是一上来就追求花哨的优化算法没太大意义先把训练过程可视化、确认loss在平稳下降再考虑更复杂的调度策略这样才不会迷路。5.4 用一张误差排查表指导调参方向下面这张表可以帮助快速判断主要矛盾在哪里症状主要误差成分优先应对策略训练集损失高测试集损失也高逼近误差换更大更深的模型、增强特征表达训练集损失低测试集损失高泛化误差增加数据、正则化、早停、数据增强训练过程震荡不收敛优化误差调整学习率、换优化器、调整batch size训练loss一直高但验证集还行数据/特征问题排查标签噪声、特征预处理、归一化这个表不是万能的但它给了我一个非常明确的调参起点。6. 工程里的三种“对不上”现象以及我的排查顺序前面讲了理论框架这一章我想结合自己的项目经验聊聊函数逼近在实际代码里最常见的三种翻车方式。搞懂这三种“对不上”是怎么来的再看那些经验帖就会有真正的体感。6.1 现象一欠拟合——不管怎么学都学不进去特征很明显模型在训练集上loss高在验证集上loss也高两者差距不大就是整体都很高。这时候我基本断定是逼近误差太大模型容量不够。遇到过最典型的案例是一次做风速预测当时觉得数据量不大直接用了一个浅层网络结果训练集loss下不去加到两层之后效果明显变好。后来又试着增大隐层宽度但收益递减很明显说明模型容量已经基本够用。中学数学告诉我们函数逼近的核心矛盾是模型复杂度要匹配问题的复杂度。问题本身复杂模型太简单怎么优化都白搭。这时候优先做的是换更大的模型而不是死磕优化器和学习率。6.2 现象二过拟合——模型把所有答案背下来了过拟合的表现是训练集上得分极高验证集或测试集上迅速变差。这就是典型的泛化误差失控。我最早做图像分类时也有过这种经历训练集准确率99.6%测试集却只有87%。当时明白过来模型在训练数据里“插值”过头了把每一张训练图的像素噪声都背了下来。后来加了数据增强、正则化把测试集分数拉到93%收敛了很多。必须强调一点过拟合不是“模型坏掉了”而是函数逼近的固有风险。你对训练样本拟合得太精确失去了对“整个函数空间”的合理泛化。解决它的核心思路就是降低模型对单个样本的敏感度增加对整体规律的依赖程度。6.3 现象三优化失败——模型学不进去loss像心电图跟欠拟合不一样优化失败的标志是训练过程极不稳定loss不断震荡或者突然变成NaN或者卡在一个平台期下不去。之前做自然语言处理项目时遇到过一次loss在初期就卡住的问题。排查了很久最后发现是学习率设得太大导致梯度更新在损失曲面里来回弹跳根本落不到谷底。把学习率从1e-3调到1e-4之后训练曲线马上进入了正常下降通道。优化失败的核心原因可能来自学习率不匹配、梯度消失或爆炸、权重初始化不当、数据未归一化等。我的排查顺序一般是这样先看数据分布是否正常、特征尺度是否一致再看梯度范数是否异常最后调整学习率和优化器设置。按照这个顺序来一般能快速定位到问题根源。6.4 一套快速定位问题的组合拳总结一下我在工程里的实操流程第一步先确保训练集上能过拟合。如果模型连训练集这个小样本集合都拟合不到很好的程度说明模型容量或优化流程有问题先解决这一步再往下走。第二步确认训练集和验证集的差距。差距过大就重点做泛化控制差距不大但整体loss高就继续扩大模型能力。第三步画出loss曲线观察趋势。收敛但缓慢可能是学习率太小震荡剧烈可能是学习率太大或者batch size太小。这套组合拳虽然朴素但它在绝大多数情况下能先指出主要矛盾在哪个环节帮助你把注意力集中在真正需要修改的地方而不是东一榔头西一棒子地乱调。很多新人在项目里扑腾很久就是因为没有先判断问题属于哪一类误差把所有手段都试一遍效率自然很低。我自己的体会是搞明白函数逼近之后很多看似玄学的训练问题都有了清晰的解释框架。模型拟合不好你不再只会盲目加层数或加数据而是会先问自己到底是模型空间不够大、数据覆盖不够广还是优化过程没走到位想清楚这三件事调参的效率和准确率都会有明显的提升。本文还有配套的精品资源点击获取
返回列表