标签 #深度学习 #激活函数 #梯度下降 #反向传播 #过拟合学习周期2 天 | 核心目标理解深度学习核心概念掌握激活函数、梯度下降原理及过拟合应对方法6.2 深度学习基础概念深度学习是机器学习的一个子集基于多层神经网络自动学习数据的层次化特征表示。本章解释神经网络为什么能训练、为什么能收敛、为什么会出错的核心理论是看懂所有模型的基础。6.2.1 激活函数激活函数引入非线性使神经网络能够拟合复杂函数。没有激活函数多层线性层等价于单层线性变换。1. Sigmoid公式\sigma(x) \frac{1}{1e^{-x}}输出范围(0, 1)特点平滑、可导但存在梯度饱和两端梯度接近0导致梯度消失适用二分类输出层配合 BCELoss2. Tanh双曲正切公式\tanh(x) \frac{e^x - e^{-x}}{e^x e^{-x}}输出范围(-1, 1)特点零中心化优于 Sigmoid但仍有梯度饱和问题3. ReLURectified Linear Unit——隐藏层默认首选公式\text{ReLU}(x) \max(0, x)优点计算简单、非饱和正区间梯度恒为1缓解梯度消失收敛快缺点负区间梯度为0可能导致“神经元死亡”Dead ReLU变种Leaky ReLU、ELU4. Softmax公式\text{Softmax}(z_i) \frac{e^{z_i}}{\sum_{j} e^{z_j}}特点将 logits 转换为概率分布总和为1用于多分类输出层常与CrossEntropyLoss搭配该损失内部包含 Softmax代码示例绘制激活函数曲线import torch import torch.nn.functional as F import matplotlib.pyplot as plt x torch.linspace(-5, 5, 100) y_sigmoid torch.sigmoid(x) y_tanh torch.tanh(x) y_relu F.relu(x) plt.plot(x, y_sigmoid, labelSigmoid) plt.plot(x, y_tanh, labelTanh) plt.plot(x, y_relu, labelReLU) plt.legend() plt.grid(True) plt.title(常用激活函数) plt.show() # Softmax 示例 logits torch.tensor([2.0, 1.0, 0.1]) probs F.softmax(logits, dim0) print(probs) # tensor([0.6590, 0.2424, 0.0986])6.2.2 梯度下降与反向传播梯度下降Gradient Descent目标最小化损失函数 L(\theta)更新规则\theta \leftarrow \theta - \eta \cdot \nabla_\theta L(\theta)\eta学习率learning rate# 手动演示梯度下降一元函数 def f(x): return x**2 2*x 1 def grad_f(x): return 2*x 2 x 5.0 lr 0.1 for _ in range(20): x x - lr * grad_f(x) print(fx{x:.4f}, f(x){f(x):.4f}) # 最终 x 趋近于 -1函数最小值点反向传播Backpropagation利用链式法则从输出层向输入层逐层计算梯度PyTorch 自动微分机制封装了反向传播loss.backward()训练流程直观理解前向传播计算预测值 → 计算 loss反向传播计算每个参数对 loss 的影响程度梯度优化器按梯度更新参数# PyTorch 自动反向传播 x torch.tensor([2.0], requires_gradTrue) y x ** 2 3*x 1 y.backward() print(x.grad) # 7.06.2.3 批量大小Batch、迭代周期Epoch、学习率概念定义典型值影响Batch一次前向/后向传播使用的样本数32, 64, 128, 256大 batch 训练稳定但内存大小 batch 噪声大但泛化好Epoch遍历完整个训练集一次10, 50, 100欠拟合需增加 epoch过拟合需减少或加正则化学习率LR参数更新的步长0.001, 0.01过大震荡不收敛过小收敛慢from torch.utils.data import DataLoader, TensorDataset # 模拟数据 X torch.randn(1000, 10) y torch.randint(0, 2, (1000,)) dataset TensorDataset(X, y) # 设置 batch_size batch_size 64 dataloader DataLoader(dataset, batch_sizebatch_size, shuffleTrue) # 一个 epoch 的迭代次数 ceil(样本数 / batch_size) print(f每个 epoch 有 {len(dataloader)} 个 batch) # 学习率调整策略学习率衰减 optimizer torch.optim.SGD(model.parameters(), lr0.1) scheduler torch.optim.lr_scheduler.StepLR(optimizer, step_size30, gamma0.1)6.2.4 过拟合应对方法过拟合模型在训练集上表现很好但在验证/测试集上表现差。原因模型过于复杂、数据不足、噪声过多。1. Dropout原理训练时随机丢弃一部分神经元输出置0迫使网络学习冗余表示防止共适应。实现nn.Dropout(p)其中p是丢弃概率常用 0.5注意训练时开启model.train()测试时自动关闭model.eval()class NetWithDropout(nn.Module): def __init__(self): super().__init__() self.fc1 nn.Linear(784, 256) self.dropout nn.Dropout(0.5) self.fc2 nn.Linear(256, 10) def forward(self, x): x F.relu(self.fc1(x)) x self.dropout(x) # 训练时随机丢弃 x self.fc2(x) return x2. Batch Normalization批归一化原理对每个 mini-batch 的输入进行标准化均值0方差1加速收敛、允许更大学习率、有一定正则化效果位置通常放在全连接层或卷积层之后激活函数之前实现nn.BatchNorm1d(num_features)全连接 /nn.BatchNorm2d(num_features)卷积class ConvBNNet(nn.Module): def __init__(self): super().__init__() self.conv1 nn.Conv2d(3, 64, 3) self.bn1 nn.BatchNorm2d(64) self.conv2 nn.Conv2d(64, 128, 3) self.bn2 nn.BatchNorm2d(128) def forward(self, x): x F.relu(self.bn1(self.conv1(x))) x F.relu(self.bn2(self.conv2(x))) return x3. 早停Early Stopping原理监控验证集损失若连续若干 epoch 不再下降则停止训练防止过拟合实现保存最佳模型当patience次没有改善时停止best_val_loss float(inf) patience 5 counter 0 for epoch in range(epochs): train_loss train_one_epoch() val_loss validate() if val_loss best_val_loss: best_val_loss val_loss counter 0 torch.save(model.state_dict(), best_model.pth) else: counter 1 if counter patience: print(Early stopping triggered) break4. 其他正则化方法L1/L2 正则化在损失函数中加入权重的 L1/L2 范数PyTorch 优化器中weight_decay即 L2 正则化数据增强对输入数据做随机变换旋转、裁剪、翻转等增加样本多样性降低模型复杂度减少层数、神经元数量# L2 正则化weight decay optimizer torch.optim.Adam(model.parameters(), lr0.001, weight_decay1e-5) # 数据增强示例torchvision from torchvision import transforms transform transforms.Compose([ transforms.RandomHorizontalFlip(), transforms.RandomRotation(10), transforms.ToTensor(), ]) 完整示例带激活函数 Dropout BN 的神经网络# 导入 PyTorch 核心库 import torch # 导入神经网络模块用于定义层、模型等 import torch.nn as nn # 导入函数式接口包含激活函数、损失函数等这里未直接使用但通常和 nn 配合 import torch.nn.functional as F from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # 定义一个更高级的神经网络类继承自 nn.Module class AdvancedNet(nn.Module): # 构造函数input_dim: 输入特征数num_classes: 输出类别数 def __init__(self, input_dim4, num_classes3): # 调用父类 nn.Module 的构造函数 super().__init__() # 使用 Sequential 容器按顺序封装网络层 self.layers nn.Sequential( # 第一层全连接层将输入维度 input_dim 映射到 32 个神经元 nn.Linear(input_dim, 32), # 批归一化层Batch Normalization对 32 个神经元的输出做标准化加速收敛并稳定训练 nn.BatchNorm1d(32), # ReLU 激活函数引入非线性将所有负值置为 0 nn.ReLU(), # Dropout 层以 30% 的概率随机将神经元输出置为 0防止过拟合 nn.Dropout(0.3), # 第二层全连接层从 32 维映射到 16 维 nn.Linear(32, 16), # 批归一化层特征维度为 16 nn.BatchNorm1d(16), # ReLU 激活函数 nn.ReLU(), # Dropout 层同样 30% 丢弃率 nn.Dropout(0.3), # 输出层全连接层将 16 维特征映射到类别数 num_classes3 个类别输出原始分数 logits nn.Linear(16, num_classes) ) # 定义前向传播函数 def forward(self, x): # 将输入 x 依次经过 Sequential 中的各层并返回最终输出 return self.layers(x) # 加载数据 iris load_iris() X, y iris.data, iris.target # 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) # 标准化 scaler StandardScaler() X_train scaler.fit_transform(X_train) X_test scaler.transform(X_test) # 转换为 PyTorch 张量 X_train torch.tensor(X_train, dtypetorch.float32) y_train torch.tensor(y_train, dtypetorch.long) # 实例化模型使用默认参数输入维度 4输出类别 3 model AdvancedNet() # 定义损失函数交叉熵损失适用于多分类内部会执行 Softmax criterion nn.CrossEntropyLoss() # 定义优化器Adam 优化器学习率为 1e-3更新模型所有参数 optimizer torch.optim.Adam(model.parameters(), lr1e-3) # 训练循环共训练 100 个 epoch假设 X_train, y_train 已经事先定义好 for epoch in range(100): # 将模型设置为训练模式影响 Dropout 和 BatchNorm 的行为 model.train() # 清除之前累积的梯度 optimizer.zero_grad() # 前向传播将训练数据 X_train 输入模型得到预测输出 outputs model(X_train) # 计算损失比较预测 outputs 和真实标签 y_train loss criterion(outputs, y_train) # 反向传播自动计算损失相对于所有可训练参数的梯度 loss.backward() # 参数更新根据梯度执行一步优化Adam 算法 optimizer.step() print(fEpoch {epoch1}, Loss: {loss.item():.4f}) print(训练完成) 学习资料Obsidian 可直接收藏官方文档PyTorch 激活函数PyTorch 正则化层Batch Normalization 原论文中文教程深度学习中的激活函数反向传播算法详解Dropout 与 BatchNorm 对比视频推荐3Blue1Brown - 反向传播李宏毅 - 梯度下降优化 学习建议2 天计划第 1 天理解激活函数手动绘制曲线掌握梯度下降与反向传播的数学原理用 PyTorch 验证自动微分。第 2 天实践 batch、epoch、learning rate 对训练的影响在简单模型上添加 Dropout 和 BatchNorm观察过拟合改善情况。✅ 核心要点总结激活函数隐藏层用 ReLU默认首选多分类输出层用 Softmax。训练流程前向传播 → 计算 loss → 反向传播 → 更新参数梯度下降。关键超参数学习率步长、Epoch轮数、Batch批量大小。过拟合应对Dropout、Batch Normalization、早停、数据增强、正则化。所有深度学习模型都遵循这套原理理解本章是看懂一切模型的基础。练习题自测手动实现 Sigmoid 和 ReLU 函数不使用 torch 内置并绘制它们的导数曲线。使用 PyTorch 构建一个带有两个隐藏层每层 128 个神经元的 MLP分别使用 ReLU、Sigmoid 和 Tanh 激活函数在 MNIST 上对比收敛速度和准确率。在训练循环中实现早停机制并保存验证集最佳模型。对比有无 Dropoutp0.5时模型在测试集上的表现分析过拟合程度。尝试不同 batch size16, 64, 256观察训练时间与收敛效果的差异。
AI_深度学习-2.深度学习基础概念
发布时间:2026/6/18 17:03:26
标签 #深度学习 #激活函数 #梯度下降 #反向传播 #过拟合学习周期2 天 | 核心目标理解深度学习核心概念掌握激活函数、梯度下降原理及过拟合应对方法6.2 深度学习基础概念深度学习是机器学习的一个子集基于多层神经网络自动学习数据的层次化特征表示。本章解释神经网络为什么能训练、为什么能收敛、为什么会出错的核心理论是看懂所有模型的基础。6.2.1 激活函数激活函数引入非线性使神经网络能够拟合复杂函数。没有激活函数多层线性层等价于单层线性变换。1. Sigmoid公式\sigma(x) \frac{1}{1e^{-x}}输出范围(0, 1)特点平滑、可导但存在梯度饱和两端梯度接近0导致梯度消失适用二分类输出层配合 BCELoss2. Tanh双曲正切公式\tanh(x) \frac{e^x - e^{-x}}{e^x e^{-x}}输出范围(-1, 1)特点零中心化优于 Sigmoid但仍有梯度饱和问题3. ReLURectified Linear Unit——隐藏层默认首选公式\text{ReLU}(x) \max(0, x)优点计算简单、非饱和正区间梯度恒为1缓解梯度消失收敛快缺点负区间梯度为0可能导致“神经元死亡”Dead ReLU变种Leaky ReLU、ELU4. Softmax公式\text{Softmax}(z_i) \frac{e^{z_i}}{\sum_{j} e^{z_j}}特点将 logits 转换为概率分布总和为1用于多分类输出层常与CrossEntropyLoss搭配该损失内部包含 Softmax代码示例绘制激活函数曲线import torch import torch.nn.functional as F import matplotlib.pyplot as plt x torch.linspace(-5, 5, 100) y_sigmoid torch.sigmoid(x) y_tanh torch.tanh(x) y_relu F.relu(x) plt.plot(x, y_sigmoid, labelSigmoid) plt.plot(x, y_tanh, labelTanh) plt.plot(x, y_relu, labelReLU) plt.legend() plt.grid(True) plt.title(常用激活函数) plt.show() # Softmax 示例 logits torch.tensor([2.0, 1.0, 0.1]) probs F.softmax(logits, dim0) print(probs) # tensor([0.6590, 0.2424, 0.0986])6.2.2 梯度下降与反向传播梯度下降Gradient Descent目标最小化损失函数 L(\theta)更新规则\theta \leftarrow \theta - \eta \cdot \nabla_\theta L(\theta)\eta学习率learning rate# 手动演示梯度下降一元函数 def f(x): return x**2 2*x 1 def grad_f(x): return 2*x 2 x 5.0 lr 0.1 for _ in range(20): x x - lr * grad_f(x) print(fx{x:.4f}, f(x){f(x):.4f}) # 最终 x 趋近于 -1函数最小值点反向传播Backpropagation利用链式法则从输出层向输入层逐层计算梯度PyTorch 自动微分机制封装了反向传播loss.backward()训练流程直观理解前向传播计算预测值 → 计算 loss反向传播计算每个参数对 loss 的影响程度梯度优化器按梯度更新参数# PyTorch 自动反向传播 x torch.tensor([2.0], requires_gradTrue) y x ** 2 3*x 1 y.backward() print(x.grad) # 7.06.2.3 批量大小Batch、迭代周期Epoch、学习率概念定义典型值影响Batch一次前向/后向传播使用的样本数32, 64, 128, 256大 batch 训练稳定但内存大小 batch 噪声大但泛化好Epoch遍历完整个训练集一次10, 50, 100欠拟合需增加 epoch过拟合需减少或加正则化学习率LR参数更新的步长0.001, 0.01过大震荡不收敛过小收敛慢from torch.utils.data import DataLoader, TensorDataset # 模拟数据 X torch.randn(1000, 10) y torch.randint(0, 2, (1000,)) dataset TensorDataset(X, y) # 设置 batch_size batch_size 64 dataloader DataLoader(dataset, batch_sizebatch_size, shuffleTrue) # 一个 epoch 的迭代次数 ceil(样本数 / batch_size) print(f每个 epoch 有 {len(dataloader)} 个 batch) # 学习率调整策略学习率衰减 optimizer torch.optim.SGD(model.parameters(), lr0.1) scheduler torch.optim.lr_scheduler.StepLR(optimizer, step_size30, gamma0.1)6.2.4 过拟合应对方法过拟合模型在训练集上表现很好但在验证/测试集上表现差。原因模型过于复杂、数据不足、噪声过多。1. Dropout原理训练时随机丢弃一部分神经元输出置0迫使网络学习冗余表示防止共适应。实现nn.Dropout(p)其中p是丢弃概率常用 0.5注意训练时开启model.train()测试时自动关闭model.eval()class NetWithDropout(nn.Module): def __init__(self): super().__init__() self.fc1 nn.Linear(784, 256) self.dropout nn.Dropout(0.5) self.fc2 nn.Linear(256, 10) def forward(self, x): x F.relu(self.fc1(x)) x self.dropout(x) # 训练时随机丢弃 x self.fc2(x) return x2. Batch Normalization批归一化原理对每个 mini-batch 的输入进行标准化均值0方差1加速收敛、允许更大学习率、有一定正则化效果位置通常放在全连接层或卷积层之后激活函数之前实现nn.BatchNorm1d(num_features)全连接 /nn.BatchNorm2d(num_features)卷积class ConvBNNet(nn.Module): def __init__(self): super().__init__() self.conv1 nn.Conv2d(3, 64, 3) self.bn1 nn.BatchNorm2d(64) self.conv2 nn.Conv2d(64, 128, 3) self.bn2 nn.BatchNorm2d(128) def forward(self, x): x F.relu(self.bn1(self.conv1(x))) x F.relu(self.bn2(self.conv2(x))) return x3. 早停Early Stopping原理监控验证集损失若连续若干 epoch 不再下降则停止训练防止过拟合实现保存最佳模型当patience次没有改善时停止best_val_loss float(inf) patience 5 counter 0 for epoch in range(epochs): train_loss train_one_epoch() val_loss validate() if val_loss best_val_loss: best_val_loss val_loss counter 0 torch.save(model.state_dict(), best_model.pth) else: counter 1 if counter patience: print(Early stopping triggered) break4. 其他正则化方法L1/L2 正则化在损失函数中加入权重的 L1/L2 范数PyTorch 优化器中weight_decay即 L2 正则化数据增强对输入数据做随机变换旋转、裁剪、翻转等增加样本多样性降低模型复杂度减少层数、神经元数量# L2 正则化weight decay optimizer torch.optim.Adam(model.parameters(), lr0.001, weight_decay1e-5) # 数据增强示例torchvision from torchvision import transforms transform transforms.Compose([ transforms.RandomHorizontalFlip(), transforms.RandomRotation(10), transforms.ToTensor(), ]) 完整示例带激活函数 Dropout BN 的神经网络# 导入 PyTorch 核心库 import torch # 导入神经网络模块用于定义层、模型等 import torch.nn as nn # 导入函数式接口包含激活函数、损失函数等这里未直接使用但通常和 nn 配合 import torch.nn.functional as F from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # 定义一个更高级的神经网络类继承自 nn.Module class AdvancedNet(nn.Module): # 构造函数input_dim: 输入特征数num_classes: 输出类别数 def __init__(self, input_dim4, num_classes3): # 调用父类 nn.Module 的构造函数 super().__init__() # 使用 Sequential 容器按顺序封装网络层 self.layers nn.Sequential( # 第一层全连接层将输入维度 input_dim 映射到 32 个神经元 nn.Linear(input_dim, 32), # 批归一化层Batch Normalization对 32 个神经元的输出做标准化加速收敛并稳定训练 nn.BatchNorm1d(32), # ReLU 激活函数引入非线性将所有负值置为 0 nn.ReLU(), # Dropout 层以 30% 的概率随机将神经元输出置为 0防止过拟合 nn.Dropout(0.3), # 第二层全连接层从 32 维映射到 16 维 nn.Linear(32, 16), # 批归一化层特征维度为 16 nn.BatchNorm1d(16), # ReLU 激活函数 nn.ReLU(), # Dropout 层同样 30% 丢弃率 nn.Dropout(0.3), # 输出层全连接层将 16 维特征映射到类别数 num_classes3 个类别输出原始分数 logits nn.Linear(16, num_classes) ) # 定义前向传播函数 def forward(self, x): # 将输入 x 依次经过 Sequential 中的各层并返回最终输出 return self.layers(x) # 加载数据 iris load_iris() X, y iris.data, iris.target # 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) # 标准化 scaler StandardScaler() X_train scaler.fit_transform(X_train) X_test scaler.transform(X_test) # 转换为 PyTorch 张量 X_train torch.tensor(X_train, dtypetorch.float32) y_train torch.tensor(y_train, dtypetorch.long) # 实例化模型使用默认参数输入维度 4输出类别 3 model AdvancedNet() # 定义损失函数交叉熵损失适用于多分类内部会执行 Softmax criterion nn.CrossEntropyLoss() # 定义优化器Adam 优化器学习率为 1e-3更新模型所有参数 optimizer torch.optim.Adam(model.parameters(), lr1e-3) # 训练循环共训练 100 个 epoch假设 X_train, y_train 已经事先定义好 for epoch in range(100): # 将模型设置为训练模式影响 Dropout 和 BatchNorm 的行为 model.train() # 清除之前累积的梯度 optimizer.zero_grad() # 前向传播将训练数据 X_train 输入模型得到预测输出 outputs model(X_train) # 计算损失比较预测 outputs 和真实标签 y_train loss criterion(outputs, y_train) # 反向传播自动计算损失相对于所有可训练参数的梯度 loss.backward() # 参数更新根据梯度执行一步优化Adam 算法 optimizer.step() print(fEpoch {epoch1}, Loss: {loss.item():.4f}) print(训练完成) 学习资料Obsidian 可直接收藏官方文档PyTorch 激活函数PyTorch 正则化层Batch Normalization 原论文中文教程深度学习中的激活函数反向传播算法详解Dropout 与 BatchNorm 对比视频推荐3Blue1Brown - 反向传播李宏毅 - 梯度下降优化 学习建议2 天计划第 1 天理解激活函数手动绘制曲线掌握梯度下降与反向传播的数学原理用 PyTorch 验证自动微分。第 2 天实践 batch、epoch、learning rate 对训练的影响在简单模型上添加 Dropout 和 BatchNorm观察过拟合改善情况。✅ 核心要点总结激活函数隐藏层用 ReLU默认首选多分类输出层用 Softmax。训练流程前向传播 → 计算 loss → 反向传播 → 更新参数梯度下降。关键超参数学习率步长、Epoch轮数、Batch批量大小。过拟合应对Dropout、Batch Normalization、早停、数据增强、正则化。所有深度学习模型都遵循这套原理理解本章是看懂一切模型的基础。练习题自测手动实现 Sigmoid 和 ReLU 函数不使用 torch 内置并绘制它们的导数曲线。使用 PyTorch 构建一个带有两个隐藏层每层 128 个神经元的 MLP分别使用 ReLU、Sigmoid 和 Tanh 激活函数在 MNIST 上对比收敛速度和准确率。在训练循环中实现早停机制并保存验证集最佳模型。对比有无 Dropoutp0.5时模型在测试集上的表现分析过拟合程度。尝试不同 batch size16, 64, 256观察训练时间与收敛效果的差异。