与激活函数全解析)
如果神经网络只有线性层Linear那么无论叠加多少层最终结果仍然是一个线性变换。为了让网络变“聪明”我们引入了隐藏层和激活函数。1. 什么是多层感知机MLP多层感知机在输入层和输出层之间增加了一个或多个隐藏层Hidden Layers。线性堆叠的失效若无激活函数等价于一个新的线性层。非线性的引入在每层线性计算后加入非线性激活函数公式变为。这使得模型可以学习坐标系中扭曲、复杂的边界。2. 三大核心激活函数激活函数必须是非线性的。文件中重点提到了以下三种① ReLU (修正线性单元)特点目前最受欢迎。x 0时导数为 1x 0时导数为 0。优点计算简单有效缓解梯度消失问题。代码nn.ReLU()② Sigmoid特点将输入映射到区间。缺点在输入很大或很小时梯度接近 0容易导致梯度消失。③ Tanh (双曲正切)特点将输入映射到区间输出以 0 为中心。3. 代码实战简洁实现多层感知机文件演示了如何在 Fashion-MNIST 任务中加入一个拥有 256 个隐藏单元的层。Pythonimport torch from torch import nn from d2l import torch as d2l # 1. 搭建 MLP 网络 # Flatten: 展平图像 # Linear(784, 256): 隐藏层256个神经元 # ReLU: 激活函数引入非线性 # Linear(256, 10): 输出层 net nn.Sequential( nn.Flatten(), nn.Linear(784, 256), nn.ReLU(), nn.Linear(256, 10) ) # 2. 初始化参数 def init_weights(m): if type(m) nn.Linear: nn.init.normal_(m.weight, std0.01) net.apply(init_weights) # 3. 设置训练超参数 batch_size, lr, num_epochs 256, 0.1, 10 loss nn.CrossEntropyLoss() trainer torch.optim.SGD(net.parameters(), lrlr) # 4. 加载数据并训练 train_iter, test_iter d2l.load_data_fashion_mnist(batch_size) d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)4. 关键超参数隐藏单元个数在代码中我们将隐藏层设为256。为什么是 256这是一个超参数。隐藏单元越多模型的表达能力越强但也越容易过拟合Overfitting且计算量更大。设计准则通常设置在输入维度784和输出维度10之间且常用 2 的幂次方。5. 总结MLP 的三要素隐藏层提供模型深度。激活函数提供非线性动力。超参数调整通过调整层数和神经元个数来平衡模型的“欠拟合”与“过拟合”。 学习小结多层感知机是现代深度学习的基石。当你理解了非线性激活函数的重要性后你也就理解了为什么深度学习能处理比传统算法复杂得多的任务。