为什么两层网络能够拟合任意函数

本文详细探讨了两层神经网络的强大拟合能力,通过1D函数示例,解释了如何通过密集采样和分段线性函数实现对连续函数的无限逼近。重点介绍了ReLU的引入如何使得网络具备非线性,从而适应复杂函数的拟合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在上CMU深度学习系统算法与实现的在线课程,里面有一页PPT讲解了为什么两层网络能够拟合任意函数。

神经网络由于强大的拟合能力以及数据驱动的方式,被广泛运用到不同的领域。但是为什么神经网络有这么强的拟合能力,我还一直没有深究过,只知道是线性和非线性的叠加。闲话不多说

 首先这个问题在1D情况,如图所示。对于任意的平滑函数,在封闭集合D范围内,我们都可以构建两层网络,让D内任意的数据的误差小于\epsilon,显然如果误差越小,网络的节点就需要越高

简单证明如下

 在封闭集合D中采样密集的数据点。我们能够构造2层网络通过所有的这些数据点(后面会详细证明),并且网络是分段的线性函数,同时被拟合的函数是连续函数,通过采样尽量多的点实现无线的逼近。

 首先说明网络为什么是分段线性。2层网络结构如下图所示,其中x是一维向量,W1,W2是网络权重,这里非线性函数选择RELU, h_\theta(x)=ReLU(XW_1)W_2=\sum_{i,j} w_{2j}max(0,w_{1i}x+b_i)+b_j

可以简化为

 函数可以由\pm max(0,w_ix+b),线性组合叠加,\pm max(0,w_ix+b)

形状如图所示 

 

由于relu存在引入了非线性,当你尝试用分段函数去表示的时候,你就会发现,我们实现下面的效果,

 

 

 每个数据点可以拟合一个分段,从而实现对所有集合的拟合

 

### 神经网络拟合任意空间的原理 神经网络之所以能够拟合任意的空间函数,主要依赖于其内部多层结构以及激活函数的存在。通过组合多个简单的数学运算单元——即神经元,神经网络能够在输入和输出之间建立复杂的映射关系。 #### 多层感知器的作用 多层感知器(MLP),作为最基础的一种前馈型人工神经网络形式,由若干个全连接层组成。每一层都包含了数量不等的节点或称为神经元,相邻两层之间的每一个节点都会相互连接并传递信号[^1]。当层数足够深时,这种架构允许模型捕捉到数据分布中的细微特征,并且表达出高度复杂的数据模式。 #### 激活函数的重要性 为了使神经网络具备非线性的表征能力,每层后的输出会经过一个非线性变换操作—也就是所谓的激活函数处理。常见的激活函数有Sigmoid、ReLU及其变体等。正是由于这些非线性组件的存在,才使得整个网络不仅仅局限于线性回归这样的简单任务上;相反,它可以通过调整权重参数来逼近几乎所有的连续函数,无论该目标函数多么曲折离奇[^2]。 #### 万能逼近定理的支持 理论层面来看,《Cybenko》等人提出的“Universal Approximation Theorem”,即通用近似定理指出:只要给定了适当宽度与深度的隐藏层,则单隐含层的前向传播网络便足以以任意精度去逼近定义域内任一闭区间上的任何Borel可测实值函数。这意味着即使是最基本类型的ANN也能完成对各种形状各异曲面的有效建模工作[^3]。 ```python import torch from torch import nn, optim import numpy as np import matplotlib.pyplot as plt class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.fc = nn.Sequential( nn.Linear(1, 50), nn.ReLU(), nn.Linear(50, 100), nn.ReLU(), nn.Linear(100, 50), nn.ReLU(), nn.Linear(50, 1) ) def forward(self, x): out = self.fc(x) return out def train_model(model, criterion, optimizer, epochs=10000): model.train() losses = [] for epoch in range(epochs): pred_y = model(X_train_tensor).squeeze(-1) loss = criterion(pred_y, y_train_tensor) optimizer.zero_grad() loss.backward() optimizer.step() if (epoch+1) % 100 == 0: print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}') losses.append(loss.item()) plt.plot(range(len(losses)), losses) X = np.linspace(-np.pi*2, np.pi*2, 1000) Y = np.sin(X)*np.exp(-abs(X)/8)+0.7*np.random.randn(*X.shape)*(1/(1+abs(X))) X_train_tensor = torch.tensor(X.reshape((-1, 1))).float() y_train_tensor = torch.tensor(Y).float() net = Net() criterion = nn.MSELoss() optimizer = optim.Adam(net.parameters(), lr=0.01) train_model(net, criterion, optimizer) plt.figure(figsize=(10,6)) predicted_values = net(X_train_tensor).detach().numpy() plt.scatter(X,Y,label='Original Data') plt.plot(X,predicted_values,'r',label='Fitted Curve by Neural Network') plt.legend(loc="upper right") plt.show() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值