AI深层神经网络(多层全连接)+ ReLU 激活 的完整处理流程,从输入 → 前向 → 反向 → 更新 → 推理。

​一、整体结构
我们搭一个3层全连接深度网络:
输入层 → 隐藏层1(Linear+ReLU)→ 隐藏层2(Linear+ReLU)→ 输出层(Linear)

回归任务:输出是连续值,最后一层不加激活。

流程和简单网络完全一样,只是多了几层 + 每层加 ReLU。

二、核心知识点先说明
1. 每层计算

z = xW + b,\quad a = \text{ReLU}(z) = \max(0,z)

2. ReLU作用:引入非线性,让网络能拟合复杂函数

3. 参数初始化:ReLU 必须用 He初始化

4. 训练流程不变:
前向 → 损失 → 反向 → 更新 → 循环

三、完整流程 + PyTorch

  1. 准备:数据、模型、初始化、损失、优化器

1)造模拟数据(回归)

​import torch

import torch.nn as nn

import torch.optim as optim

数据:随便构造一个回归任务

x = torch.randn(1000, 5) # 输入:1000个样本,每个5维特征

y = 3 * x[:,0:1] + 2 * x[:,1:2] + 5 + 0.1 * torch.randn(1000, 1)

2)定义深度神经网络(多层 + ReLU)
​class DeepNet(nn.Module):
def init(self, in_dim=5, hidden_dim=16, out_dim=1):
super().init()
# 隐藏层1
self.fc1 = nn.Linear(in_dim, hidden_dim)
# 隐藏层2
self.fc2 = nn.Linear(hidden_dim, hidden_dim)
# 输出层
self.fc3 = nn.Linear(hidden_dim, out_dim)
# ReLU激活
self.relu = nn.ReLU()
def forward(self, x):
# 第1层:线性 + ReLU
out = self.fc1(x)
out = self.relu(out)
# 第2层:线性 + ReLU
out = self.fc2(out)
out = self.relu(out)
# 输出层:只线性,不加激活(回归)
out = self.fc3(out)
return out
model = DeepNet()

​3)参数初始化(ReLU 用 He)

​# 对每个 Linear 层做 He 初始化

def init_weights(m):

if isinstance(m, nn.Linear):

    # ReLU 专用:He/Kaiming 初始化
    nn.init.kaiming_normal_(m.weight, nonlinearity='relu')

    nn.init.constant_(m.bias, 0.0)

model.apply(init_weights)

​4)损失 + 优化器
​criterion = nn.MSELoss() # 回归损失
optimizer = optim.Adam(model.parameters(), lr=1e-3)
​1. 前向传播(核心:深层+ReLU到底在算什么)

数学公式(每层)

  • 第1层
    z_1 = x W_1 + b_1,\quad a_1 = \text{ReLU}(z_1)
  • 第2层:
    z_2 = a_1 W_2 + b_2,\quad a_2 = \text{ReLU}(z_2)
  • 输出层:
    \hat{y} = a_2 W_3 + b_3
    ​PyTorch 代码
    ​y_pred = model(x)
    ​内部发生了什么:
  • 数据经过多层线性变换提取特征
  • ReLU 把负数压成0,保留有用信号
  • 越深,特征越抽象、拟合能力越强

  1. 计算损失
    ​loss = criterion(y_pred, y)
    ​- 衡量预测值与真实值差距
  • 损失是所有参数的总误差
  1. 反向传播(深层网络的关键)
    原理
    从损失出发,从最后一层往第一层,用链式法则算梯度:

\frac{\partial Loss}{\partial W_3},\ \frac{\partial Loss}{\partial b_3},\quad
\frac{\partial Loss}{\partial W_2},\ \frac{\partial Loss}{\partial b_2},\quad
\frac{\partial Loss}{\partial W_1},\ \frac{\partial Loss}{\partial b_1}

ReLU 的梯度:

  • z>0,梯度=1
  • z<0,梯度=0

ReLU 会让一部分神经元梯度为0,不更新 → 所以必须用 He初始化 避免大量神经元死掉。
​optimizer.zero_grad() # 清空上一轮梯度
loss.backward() # 反向传播,计算所有参数梯度

​4. 参数更新

所有层的 W,b 一起更新:
W = W - \eta \cdot \nabla W
b = b - \eta \cdot \nabla b
​optimizer.step()
​每更新一次:

  • 浅层、深层参数一起优化

  • 网络整体变得更准
    ​5. 完整训练循环
    ​epochs = 2000
    for epoch in range(epochs):

    1. 前向传播

    y_pred = model(x)

    2. 计算损失

    loss = criterion(y_pred, y)

    3. 反向传播

    optimizer.zero_grad()
    loss.backward()

    4. 更新参数

    optimizer.step()

    if epoch % 200 == 0:
    print(f"Epoch [{epoch}/{epochs}], Loss: {loss.item():.4f}")
    ​- Loss 持续下降

  • 深层网络能很好拟合数据

​6. 推理阶段(用训练好的深度网络)

只前向,不计算梯度,不更新参数
​x_test = torch.randn(1, 5) # 新样本

model.eval() # 推理模式
with torch.no_grad(): # 关闭梯度计算(省显存、提速)
pred = model(x_test)

总结:

深层神经网络通过多层Linear+ReLU提取非线性特征,用He初始化保证梯度稳定传播,通过前向计算预测、损失衡量误差、反向传播求梯度、优化器更新参数,最终学习到输入到输出的复杂映射关系。​

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐