第07讲 | 深层神经网络:层、参数、激活与初始化 第07讲 | 深层神经网络层、参数、激活与初始化购买相关资料后畅享一对一答疑畅享超多免费持续更新且可大幅度提升文章档次的纯干货工具素材来源B站视频《第07讲〈深层神经网络层、参数、激活与初始化〉》UP主Ai学术叫叫兽。为什么一个神经元只是“加权求和 激活”但一堆神经元一层层堆起来以后模型就能识别猫脸、病灶、车辆、目标框这节课的答案可以概括成一句话深层神经网络不是简单地重复计算而是在一层一层组合特征从原始输入到低级特征再到中级结构最后形成高级语义。如果你正在从零学深度学习建议收藏这篇。今天我们只抓住 4 个核心问题层到底是什么参数 W 和 b 到底在学什么激活函数为什么不能省初始化为什么不能全设为 0一、先建立一张总图深层网络在做什么把一张图片交给深层神经网络它通常不是一步到位看懂“这是一只猫”。更像一个分工团队网络阶段它可能学到什么类比理解输入层原始像素、数值特征把图片/表格交给模型浅层边缘、颜色变化、简单方向先看“线条”和“局部变化”中间层纹理、局部部件、组合形状把边缘组合成眼睛、耳朵、轮廓深层对象语义、类别线索判断“像不像猫/病灶/目标”输出层类别概率、回归值、检测框给出最终任务结果图 1深层网络的特征抽象路线原始输入 X ↓ 第 1 层低级特征边缘、颜色、局部变化 ↓ 第 2~N 层中级特征纹理、局部结构、部件 ↓ 深层高级语义对象、类别、上下文 ↓ 输出层分类概率 / 回归值 / 检测框 ↓ Loss衡量预测错了多少 ↓ 反向传播把误差信号传回每一层更新参数这也是深层网络比单层模型更强的根本原因它能把简单模式逐级组合成复杂规律。二、一层神经网络到底包含什么对科研小白来说可以先把“一层”理解成两步第 1 步线性变换 Z A_prev × W b 第 2 步非线性激活 A g(Z)其中符号含义小白理解A_prev上一层输出这一层拿到的输入材料W权重矩阵每个输入特征的重要程度b偏置给模型一个可调整的基准量Z激活前结果加权求和后的中间值g激活函数决定哪些信号继续往后传A本层输出加工后的新特征如果网络有很多层就可以写成A0 X Z1 A0 × W1 b1, A1 g1(Z1) Z2 A1 × W2 b2, A2 g2(Z2) ... ZL A(L-1) × WL bL 输出 任务对应的结果记住这句话每一层都在上一层表示的基础上继续加工。所以深层并不是“同一件事做很多遍”而是“低级表达逐步升级成高级表达”。三、参数 W 和 b模型到底在学什么训练模型本质上就是在不断调整参数。在全连接层里如果输入维度是 d输出神经元个数是 h那么参数量是参数量 d × h h 权重数量 偏置数量举个例子把 28×28 的灰度图展平成 784 维再接一个 128 神经元的全连接层权重 W784 × 128 100352 偏置 b128 总参数100480如果后面再接一个 10 分类输出层权重 W128 × 10 1280 偏置 b10 总参数1290整个小网络的参数量就是100480 1290 101770这一步非常重要。科研新手不要只会“堆模型”一定要会看参数量。因为参数量直接影响模型容量能不能学复杂规律。过拟合风险会不会把训练集背下来。显存占用能不能跑得动。训练速度每轮迭代要算多少东西。实操建议每次搭网络后第一件事就是打印参数量。total_paramssum(p.numel()forpinmodel.parameters()ifp.requires_grad)print(fTrainable parameters:{total_params:,})四、激活函数为什么不能省很多小白第一次看网络时会觉得“不就是一层一层矩阵乘法吗那我多乘几次不就行了”问题就在这里如果没有激活函数多层线性层仍然等价于一层线性层。比如X × W1 × W2 × W3 X × W*中间乘了很多次本质上还是一个线性变换。模型表达能力没有真正变强。激活函数的意义就是给网络加入非线性让模型可以学习弯曲边界、复杂关系和多层组合特征。常见激活函数可以这样选激活函数常见位置优点注意事项ReLU隐藏层默认首选简单、快、缓解梯度消失可能出现“死亡 ReLU”LeakyReLU隐藏层负半轴也保留小梯度比 ReLU 多一个斜率超参GELUTransformer、现代网络平滑效果常较好计算略复杂Sigmoid二分类输出层输出 0~1 概率隐藏层中容易梯度消失Tanh小网络、RNN 早期常见输出以 0 为中心深层中也可能梯度消失Softmax多分类输出层输出类别概率分布常配合交叉熵损失Linear回归输出层不限制输出范围适合预测连续值小白记忆版隐藏层优先 ReLU / LeakyReLU / GELU 二分类输出Sigmoid 多分类输出Softmax 或直接输出 logits 后交给 CrossEntropyLoss 回归任务输出Linear五、初始化为什么不能把参数全设为 0这是本讲最容易被忽略、但非常关键的点。如果同一层的神经元参数都初始化为 0那么它们会看到一样的输入 得到一样的输出 收到一样的梯度 做出一样的更新 下一轮仍然一样结果就是你以为这一层有 128 个神经元实际上它们都在做同一件事。这叫对称性没有被打破。所以初始化至少要满足两个目标打破对称性让不同神经元从不同起点出发。控制信号尺度别让前向信号和反向梯度一路变得过大或过小。常用初始化方法使用场景推荐初始化简单解释ReLU / LeakyReLU 隐藏层He / Kaiming 初始化更适合 ReLU 的输出分布Tanh / Sigmoid 隐藏层Xavier / Glorot 初始化让前后层方差更稳定偏置 b通常初始化为 0偏置不会造成神经元权重对称问题输出层可用 Xavier 或框架默认重点看任务和损失函数坏初始化会带来什么现象可能原因后果参数全相同没有打破对称性多个神经元学成同一个权重太小信号逐层衰减梯度消失、学不动权重太大信号逐层放大梯度爆炸、Loss 变 NaN激活不匹配初始化方差控制不佳训练不稳定六、科研小白实操从 0 搭一个 MLP下面用 PyTorch 搭一个最小可运行的多层感知机。你可以先把它当成“深层网络骨架模板”。适用场景表格数据、展平后的图像特征、入门分类实验。importtorchfromtorchimportnnclassMLP(nn.Module):def__init__(self,num_classes10):super().__init__()self.flattennn.Flatten()self.fc1nn.Linear(28*28,128)self.act1nn.ReLU()self.fc2nn.Linear(128,64)self.act2nn.ReLU()self.outnn.Linear(64,num_classes)self.init_weights()definit_weights(self):nn.init.kaiming_normal_(self.fc1.weight,nonlinearityrelu)nn.init.zeros_(self.fc1.bias)nn.init.kaiming_normal_(self.fc2.weight,nonlinearityrelu)nn.init.zeros_(self.fc2.bias)nn.init.xavier_normal_(self.out.weight)nn.init.zeros_(self.out.bias)defforward(self,x):xself.flatten(x)xself.act1(self.fc1(x))xself.act2(self.fc2(x))logitsself.out(x)returnlogits modelMLP(num_classes10)xtorch.randn(32,1,28,28)logitsmodel(x)print(logits.shape)# torch.Size([32, 10])total_paramssum(p.numel()forpinmodel.parameters()ifp.requires_grad)print(fTrainable parameters:{total_params:,})这里有 3 个小白必须看懂的点Flatten()把图片展平成一维特征。隐藏层使用Linear ReLU。输出层没有手动加 Softmax因为CrossEntropyLoss里面会处理 logits。训练循环骨架loss_fnnn.CrossEntropyLoss()optimizertorch.optim.AdamW(model.parameters(),lr1e-3)forxb,ybintrain_loader:logitsmodel(xb)lossloss_fn(logits,yb)optimizer.zero_grad()loss.backward()optimizer.step()注意顺序前向传播 → 计算 Loss → 清空旧梯度 → 反向传播 → 更新参数七、搭网络时按这张清单检查科研新手最容易的问题不是“不知道高级模型”而是基础检查没做。建议每次搭模型都按下面 6 步走步骤要检查什么例子1输入形状图像是[B, C, H, W]还是[B, H, W, C]2每层输出维度Linear(784, 128)后输出[B, 128]3激活函数位置隐藏层后接 ReLU输出层按任务决定4初始化方式ReLU 配 HeTanh/Sigmoid 配 Xavier5参数量参数太少学不动太多易过拟合6Loss 是否下降先看能不能在小数据上过拟合推荐调试顺序先跑通一个 batch → 再跑通一个 epoch → 再看训练集 Loss 是否下降 → 再看验证集是否过拟合 → 最后再考虑换复杂模型八、常见问题排查表训练现象可能原因优先处理办法Loss 完全不下降学习率不合适、标签格式错、输出维度错先打印 logits.shape 和 y.shapeLoss 变 NaN学习率太大、初始化过大、数据异常降低学习率检查输入是否有 NaN训练集很好验证集很差过拟合加数据增强、正则化、Dropout、Weight Decay梯度接近 0激活饱和、网络太深、初始化不匹配用 ReLU He必要时加 BatchNorm显存不够batch 太大、层太宽、图片太大降 batch、降分辨率、减小隐藏层多个神经元学得一样初始化全相同使用随机初始化打破对称性九、这一讲的 3 句话复盘深层网络的强大来自层级组合。浅层学简单特征深层学复杂语义。激活函数是深度网络表达复杂关系的关键。没有非线性多层线性层仍等价于一层线性层。初始化决定训练能不能顺利开始。全 0 初始化会让神经元失去差异太大或太小都会让梯度不稳定。十、今天的学习任务如果你是科研小白今天不要急着刷下一个模型先完成这 4 个动作手画一个 3 层 MLP输入层、两个隐藏层、输出层。写出每一层的输入输出维度。算出每一层参数量。用 PyTorch 跑通一次前向传播确认输出 shape 正确。能完成这 4 步你就已经从“看模型结构”走向“能搭模型结构”了。写在最后学术因方向、个人实验和写作能力以及具体创新内容的不同而无法做到一通百通关注UPAi学术叫叫兽在所有B站资料中留下联系方式以便在科研之余为家人们答疑解惑本up主获得过国奖发表多篇SCI擅长目标检测领域拥有多项竞赛经历拥有软件著作权核心期刊等经历。因为经历过所以更懂小白的痛苦因为经历过所以更具有指向性的指导祝所有科研工作者都能够在自己的领域上更上一层楼