AI深层神经网络(多层全连接)+ ReLU 激活 的完整处理流程,从输入 → 前向 → 反向 → 更新 → 推理。
一、整体结构
我们搭一个3层全连接深度网络:
输入层 → 隐藏层1(Linear+ReLU)→ 隐藏层2(Linear+ReLU)→ 输出层(Linear)
回归任务:输出是连续值,最后一层不加激活。
流程和简单网络完全一样,只是多了几层 + 每层加 ReLU。
二、核心知识点先说明
- 每层计算
z = xW + b,\quad a = \text{ReLU}(z) = \max(0,z)
- ReLU作用:引入非线性,让网络能拟合复杂函数
- 参数初始化:ReLU 必须用 He初始化
- 训练流程不变:
前向 → 损失 → 反向 → 更新 → 循环
三、完整流程 + PyTorch
- 准备:数据、模型、初始化、损失、优化器
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,保留有用信号
- 越深,特征越抽象、拟合能力越强
- 计算损失
loss = criterion(y_pred, y)- 衡量预测值与真实值差距
- 损失是所有参数的总误差
- 反向传播(深层网络的关键)
原理
从损失出发,从最后一层往第一层,用链式法则算梯度:
\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初始化保证梯度稳定传播,通过前向计算预测、损失衡量误差、反向传播求梯度、优化器更新参数,最终学习到输入到输出的复杂映射关系。