神经网络-万能近似定理的探索

神经网络-万能近似定理的探索

对于这个实验博主想说,其实真的很有必要去好好做一下,很重要的一个实验。

1.理论介绍

万能近似定理: ⼀个前馈神经⽹络如果具有线性层和⾄少⼀层具有 “挤压” 性质的激活函数(如 sigmoid 等),给定⽹络⾜够数量的隐藏单元,它可以以任意精度来近似任何从⼀个有限维空间到另⼀个有限维空间的 borel 可测函数。

在这里插入图片描述
在这里插入图片描述

我们可以通过两个 sigmoid 函数 (y = sigmoid(w⊤x + b)) ⽣成⼀个 tower,如图:
在这里插入图片描述
我们构造多个这样的 tower 近似任意函数:
在这里插入图片描述

2.数据集介绍

使用PyTorch库来执行数值计算,首先通过 torch.linspace 函数创建了一个从0到3的等差数列,其元素数量由变量 sample_num 决定。接着定义了一个多项式函数 function,它接受一个参数 x 并返回 x + x**3 + 3 的值。最后,代码通过将 x_data 作为输入应用 function 函数,计算并存储了每个数据点对应的函数值到 y_real 变量中,从而实现了对一系列数据点的生成。


sample_num=300
torch.manual_seed(10)

x_data=torch.linspace(0,3,sample_num)


def function(x):
  return x+x**3+3



y_real=function(x_data)

3.实验过程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
所有代码如下:

#coding=gbk

import torch
from torch.autograd import Variable
from torch.utils import data
import matplotlib.pyplot as plt

neuron_num=200
batch=50
learn_rating=0.005
epoch=1000


#print(x_data)

sample_num=50
torch.manual_seed(10)

x_data=torch.linspace(0,3,sample_num)


def function(x):
  return x+x**3+3



y_real=function(x_data)
#print(y_real)

wz=torch.rand(neuron_num)
#print(wz)
w=torch.normal(0,1,size=(neuron_num,))
b=torch.normal(0,1,size=(neuron_num,))
w2=torch.normal(0,1,size=(neuron_num,))
b2=torch.normal(0,1,size=(1,))
#print(w,b)


def sampling(sample_num):
   
    #print(data_size)
    index_sequense=torch.randperm(sample_num)
    return index_sequense
def activation_function(x):
    return 1/(1+torch.sigmoid(-x))


def activation_function2(x):
   
   # print(x.size())
    a=torch.rand(x.size())
    for i in range(x.size(0)):
        if x[i]<=0:
            a[i]=0.0
        else:
            a[i]=x[i]
    return a
def hidden_layer(w,b,x):
   # print("x:",x)
    return activation_function2(w*x+b)

def  fully_connected_layer(w2,b2,x):
    return torch.dot(w2,x)+b2

def net(w,b,w2,b2,x):
    #print("w",w)
    #print("b",b)
    o1=hidden_layer(w,b,x)
    #print("o1",o1)
    #print("w2",w2)
    #print("b2",b2)
    o2=fully_connected_layer(w2,b2,o1)
 #   print("o2",o2)

    return o2

def get_grad(w,b,w2,b2,x,y_predict,y_real):
  

    o2=hidden_layer(w,b,x)

    l_of_w2=-(y_real-y_predict)*o2
    l_of_b2=-(y_real-y_predict)

    a=torch.rand(o2.size())
    for i in range(o2.size(0)):
        if o2[i]<=0:
            a[i]=0.0
        else:
            a[i]=1
    l_of_w=-(y_real-y_predict)*torch.dot(w2,a)*x
    l_of_b=-(y_real-y_predict)*torch.dot(w2,a)

    return l_of_w2,l_of_b2,l_of_w,l_of_b

def loss_function(y_predict,y_real):
    #print(y_predict,y_real)
    return torch.pow(y_predict-y_real,2)
loss_list=[]

torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

def train():
    global w,w2,b,b2
    index=0
    index_sequense=sampling(sample_num)
    for i in range(epoch):
        
        
   
        W_g=torch.zeros(neuron_num)
        b_g=torch.zeros(neuron_num)
        W2_g=torch.zeros(neuron_num)
        b2_g=torch.zeros(1)
        loss=torch.tensor([0.0])
           
        for k in range(batch):
              try:
                   # print("x",x_data[index],index)
                   # print("w",w)
                        y_predict=net(w,b,w2,b2,x_data[index_sequense[index]])

                        get_grad(w,b,w2,b2,x_data[index_sequense[index]],y_predict,y_real[index_sequense[index]])
                      
                        l_of_w2,l_of_b2,l_of_w,l_of_b= get_grad(w,b,w2,b2,x_data[index_sequense[index]],y_predict,y_real[index_sequense[index]])
                        W_g=W_g+l_of_w
                        b_g=b_g+l_of_b
                        b2_g=b2_g+l_of_b2
                        W2_g=W2_g+l_of_w2
                        loss=loss+loss_function(y_predict,y_real[index_sequense[index]])
                        index=index+1
              except:
                        index=0
                      #  index_sequense=sampling(sample_num)
        print("****************************loss is :",loss/batch)
        loss_list.append(loss/batch)
     
        W_g=W_g/batch
        b_g=b_g/batch
        b2_g=b2_g/batch
        W2_g=W2_g/batch
        w=w-learn_rating*W_g
        b=b-learn_rating*b_g
        w2=w2-learn_rating*W2_g
        b2=b2-learn_rating*b2_g
y_predict=net(w,b,w2,b2,x_data[0])
train()
y_predict=[]
for i in range(sample_num):
  y_predict.append(net(w,b,w2,b2,x_data[i]))

epoch_list=list(range(epoch))
plt.plot(epoch_list,loss_list,label='SGD')
plt.title("loss")
plt.legend()

plt.show()

plt.plot(x_data,y_real,label='real')
plt.plot(x_data,y_predict,label='predict')
plt.title(" Universal Theorem of Neural Networks")
plt.legend()
plt.show()
print(w,b,w2,b2)

4.总结

(1)相比较之下,tanh函数比sigmoid函数效果要好很多,但是如果,神经元数量足够,训练足够充分,两者效果会差不多。在训练不够充分,神经元不够多,学习率等条件限制下,tanh函数表现更好。
(2)神经元数量越多的情况下,模型性能在不断提升,但是学习越来越慢,如果采用随机梯度下降或者小批量梯度下降,最好增加神经元,否则,学习最终性能会受到很大限制。
(3)对于不同数量的神经元,最优学习率是在变化的。
(4)如果采用随机梯度下降或者小批量梯度下降,样本不能反应总体规律,那么网络要足够大,才能进行规律的总结,否则,最好采用批量梯度下降去处理问题。
(5)不同的超参数设置,最终学习的性能会有瓶颈,需要进行学习策略,超参数的调节,才能不断提高模型效果。

<think>好的,用户想详细了解神经网络算法模型的工作机制和理论论述。之前已经给过他们一个比较全面的回答,现在需要根据提供的引用资料来进一步补充和完善。 首先,回顾之前的回答,已经涵盖了神经网络的核心思想、基本组成、网络结构、前向传播与反向传播、激活函数、训练过程、变体应用以及挑战与解决方案。现在需要结合用户提供的引用内容,看看有没有遗漏或需要强调的部分。 引用[1]提到人工神经网络是生物神经网络的简化技术复现,主要任务是构建模型、设计学习算法,模拟人脑智能活动。之前的回答已经涉及了生物启发和数学模型,可能需要更强调算法原理,比如具体的学习算法如何模拟人脑。 引用[2]详细列出了神经网络的各种类型和优化算法,比如反向传播、自组织网络、RBF网络等。之前的回答提到了CNN、RNN、GNN,但可以补充更多类型的网络,如径向基函数网络、脉冲耦合神经网络等,并讨论它们的算法优化,比如不同的优化器(Adam等)。 引用[3]指出神经网络的优缺点,比如参数多、解释性差、训练时间长。之前的回答在关键挑战部分提到了过拟合、梯度问题,但可以更详细地讨论这些缺点,以及对应的解决方案,比如正则化、批归一化等。 用户这次的问题更侧重于工作机制和理论论述,可能需要更深入的结构化分析。例如,将工作机制分为前向传播、反向传播、参数优化三个部分详细展开,结合引用中的学习算法和优化方法。 另外,用户可能希望了解神经网络的理论基础,比如通用近似定理,这在引用[1]中提到模拟人脑智能活动,可以补充这部分内容。同时,引用[2]提到的神经信息处理基本原理,可能需要更详细地解释神经元的信息传递和整合过程。 还需要注意用户之前的回答中提到的激活函数、损失函数、优化器等,是否在理论部分有更深入的论述。例如,反向传播的数学推导,链式法则的具体应用,以及梯度下降的变种算法如Adam的工作原理。 此外,引用[3]提到的缺点,如解释性差,可以结合当前的研究进展,比如可解释性AI的方法,部分解决这个问题,增加回答的深度。 最后,确保回答结构清晰,分点论述,结合引用中的内容,同时保持技术细节的准确性和易懂性。可能需要添加更多公式和示例,如具体的优化算法公式,不同类型的网络结构示意图,以及实际应用案例,来增强理论论述的实用性。</think>### 神经网络算法模型工作机制及理论论述 --- #### **一、神经网络的理论基础** 1. **生物神经系统的数学抽象** 神经网络通过模拟生物神经元的**信号传递机制**构建数学模型: - **输入信号整合**:加权求和 $\sum w_i x_i + b$ 模拟树突信号累积 - **阈值触发机制**:激活函数 $f(\cdot)$ 模拟动作电位触发条件[^1] - **通用近似定理**:证明单隐藏层神经网络能以任意精度逼近任意连续函数[^2] 2. **信息处理范式** $$ \text{输入数据} \xrightarrow{\text{非线性变换}} \text{特征表示} \xrightarrow{\text{决策映射}} \text{输出结果} $$ - *特征学习*:隐藏层逐层提取高阶抽象特征(如图像中从边缘→形状→物体) - *端到端学习*:直接建立原始数据与目标任务的映射关系[^1] --- #### **二、工作机制的三级架构** 1. **前向传播(数据驱动)** **数学过程**: $$ \begin{aligned} \mathbf{Z}^{(l)} &= \mathbf{W}^{(l)} \mathbf{H}^{(l-1)} + \mathbf{b}^{(l)} \\ \mathbf{H}^{(l)} &= f(\mathbf{Z}^{(l)}) \end{aligned} $$ - $\mathbf{H}^{(l)}$:第$l$层输出 - $f$:激活函数(如ReLU、Sigmoid) **计算示例**(3层网络): ```python # 输入层→隐藏层1 z1 = np.dot(W1, x) + b1 h1 = relu(z1) # 隐藏层1→隐藏层2 z2 = np.dot(W2, h1) + b2 h2 = sigmoid(z2) # 隐藏层2→输出层 y_pred = softmax(np.dot(W3, h2) + b3) ``` 2. **反向传播(误差驱动)** **梯度计算核心公式**: $$ \frac{\partial L}{\partial W_{ij}^{(l)}} = \frac{\partial L}{\partial \mathbf{Z}^{(l)}} \cdot \frac{\partial \mathbf{Z}^{(l)}}{\partial W_{ij}^{(l)}} = \delta^{(l)} \cdot H_j^{(l-1)} $$ - $\delta^{(l)}$:第$l$层误差项,通过链式法则反向传递 - *关键步骤*: 1. 计算输出层误差 $\delta^{(L)} = \nabla_{\mathbf{Z}^{(L)}} L \odot f'(\mathbf{Z}^{(L)})$ 2. 反向传播误差 $\delta^{(l)} = (\mathbf{W}^{(l+1)T} \delta^{(l+1)}) \odot f'(\mathbf{Z}^{(l)})$ 3. 更新权重 $\Delta W^{(l)} = -\eta \cdot \delta^{(l)} \cdot \mathbf{H}^{(l-1)T}$[^1] 3. **参数优化(动态调整)** **优化算法对比**: | 算法 | 更新规则 | 特点 | |------------|--------------------------------------------------------------------------|-------------------------------| | **SGD** | $\Delta W = -\eta \nabla_W L$ | 简单但震荡大 | | **Adam** | 自适应学习率 + 动量项(一阶矩和二阶矩估计)[^2] | 实际应用最广泛 | | **RMSProp**| $\eta_t = \eta / \sqrt{E[g^2]_t + \epsilon}$ | 适合非平稳目标 | --- #### **三、算法模型的关键组成** 1. **激活函数(非线性引擎)** - **Sigmoid**:$f(x)=\frac{1}{1+e^{-x}}$(梯度消失问题显著) - **ReLU**:$f(x)=\max(0,x)$(缓解梯度消失,计算高效) - **Swish**:$f(x)=x\cdot \text{sigmoid}(\beta x)$(平滑非单调,性能优于ReLU) **函数选择准则**: $$ \text{隐藏层首选ReLU} \Rightarrow \text{输出层根据任务选择} \begin{cases} \text{Softmax} & \text{多分类} \\ \text{Linear} & \text{回归} \end{cases} $$ 2. **损失函数(目标导向)** - **分类任务**:交叉熵损失 $L = -\sum y_i \log \hat{y}_i$ - **回归任务**:均方误差 $L = \frac{1}{N}\sum (y_i - \hat{y}_i)^2$ - **对抗训练**:Wasserstein距离 $\min_G \max_D E[D(x)] - E[D(G(z))]$ 3. **正则化技术(泛化保障)** - **L2正则化**:损失函数添加 $\lambda \sum \|W\|^2$ 项 - **Dropout**:训练时随机屏蔽神经元(迫使网络冗余表达) - **早停法**:验证集误差上升时终止训练[^3] --- #### **四、理论特性与局限** 1. **优势特性** - **非线性建模能力**:通过激活函数堆叠实现复杂函数逼近 - **分布式表征**:信息分散存储于权重矩阵,具有容错性 - **自动特征工程**:无需人工设计特征(对比SVM、决策树等) 2. **理论局限** - **维数灾难**:参数量随层数指数增长($n$层网络参数量为$O(d^{n+1})$) - **黑箱特性**:决策过程不可解释(但可通过Grad-CAM等方法可视化) - **局部极小值**:高维非凸优化易陷入次优解(实际中可通过动量法缓解)[^3] --- #### **五、典型模型变体的工作机制** 1. **卷积神经网络(CNN)** **核心组件**: - **卷积层**:局部感受野 + 权值共享 → 提取空间特征 $$ \text{特征图} = f\left( \sum_{i=1}^k \sum_{j=1}^k W_{i,j} X_{x+i,y+j} + b \right) $$ - **池化层**:最大/平均池化 → 降维 + 平移不变性 2. **循环神经网络(RNN)** **时间展开公式**: $$ \mathbf{h}_t = f(\mathbf{W}_{hh} \mathbf{h}_{t-1} + \mathbf{W}_{xh} \mathbf{x}_t + \mathbf{b}_h) $$ - **LSTM**:引入门控机制(遗忘门、输入门、输出门)解决梯度消失 3. **图神经网络(GNN)** **消息传递范式**: $$ \mathbf{h}_v^{(l)} = \phi\left( \mathbf{h}_v^{(l-1)}, \bigoplus_{u \in \mathcal{N}(v)} \psi(\mathbf{h}_u^{(l-1)}) \right) $$ - $\bigoplus$:聚合函数(如求和、均值) - 应用:分子性质预测、社交网络分析 --- #### **六、算法实现示例(PyTorch)** ```python import torch import torch.nn as nn class MLP(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim): super().__init__() self.fc1 = nn.Linear(input_dim, hidden_dim) self.relu = nn.ReLU() self.fc2 = nn.Linear(hidden_dim, output_dim) def forward(self, x): x = self.fc1(x) x = self.relu(x) return self.fc2(x) # 训练循环 model = MLP(784, 256, 10) criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) for epoch in range(100): for x, y in dataloader: y_pred = model(x) loss = criterion(y_pred, y) optimizer.zero_grad() loss.backward() # 反向传播自动计算梯度 optimizer.step() # 参数更新 ``` --- ### **相关问题** 1. 如何证明神经网络万能近似定理? 2. 反向传播算法中梯度消失的根本原因是什么? 3. 对比CNN和传统图像处理算法(如SIFT)的特征提取差异? 4. 如何设计神经网络结构以适应小样本学习场景? 5. 神经网络的可解释性方法有哪些最新进展?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值