第二次课程笔记

本人参考:斋藤康毅:《深度学习入门1》,《深度学习入门2》。宋老师课程资料。黑马程序员《深度学习从入门到精通》

底层原理:https://blog.csdn.net/2302_80118884/article/details/159921583?spm=1001.2014.3001.5501

神经网络基础与核心组件

1. 神经元模型与前向传播

  • 计算公式 : z=w⋅x+bz = w \cdot x + bz=w⋅x+b,继而通过激活值 a=f(z)a = f(z)a=f(z)。
  • 全连接层 (FCNN) : 第 NNN 层每个神经元与 N−1N-1N−1 层所有神经元相连。特点是数据以二维形状(Batch, Features)传递。

2. 激活函数 (Activation Function)

  • 作用: 引入非线性因素,使网络能拟合复杂函数。
  • Sigmoid : 映射至 (0,1)(0, 1)(0,1)。易导致梯度消失,常用于二分类输出层 。

如图 :考虑到sigmoid函数值域在0,1之间,y(1-y)势必小于1。反向传播过程中,若是sigmoid层数量比较多,会造成梯度消失

  • Tanh : 映射至 (−1,1)(-1, 1)(−1,1),以 000 为中心,收敛快于 Sigmoid,用于隐藏层。

  • ReLU (首选) : max(0,x)max(0, x)max(0,x)。计算简便,有效缓解梯度消失,但需注意"神经元死亡"问题。

  • Softmax : 将输出转换为概率分布(和为1),用于多分类输出层。

3. 参数初始化 (Initialization)

  • Xavier (Glorot) 初始化 : 保持输入输出方差一致。适用于 Sigmoid / Tanh。
  • He (Kaiming) 初始化 : 考虑了 ReLU 零点附近的特性。适用于 ReLU 及其变体。

4. 损失函数 (Loss Function)

  • 分类任务 :
    • nn.CrossEntropyLoss: 多分类(内含 Softmax)。
    • nn.BCELoss: 二分类。
  • 回归任务 :
    • nn.L1Loss (MAE): 对异常值鲁棒。
      会导致某些权重值变为0,减少特征。可用于对模型进行轻量化。也可防止过拟合
    • nn.MSELoss (L2): 惩罚大误差。
      会导致权重值减小,防止过拟合。
    • nn.SmoothL1Loss: 结合 L1 和 L2,误差小时平滑,误差大时线性。

优化算法与正则化

1. 优化器 (Optimizers)

  • SGD: 基础梯度下降。
  • Momentum: 引入动量(指数加权平均),加速通过平缓区,减少震荡。
  • RMSProp: 自适应学习率,限制梯度平方的累积,适合非稳态目标。
  • Adam (全能): 结合 Momentum 和 RMSProp,自适应学习率且稳定。

2. 学习率策略 (LR Scheduler)

  • 目的: 前期大学习率快速收敛,后期小学习率避免震荡。
  • 常用:StepLR (等间隔)、MultiStepLR (指定轮次)、ExponentialLR (指数衰减)。

3. 正则化 (防止过拟合)

  • Dropout : 训练时随机让部分神经元失效 (p=0.2∼0.5p=0.2\sim0.5p=0.2∼0.5),测试时全部开启。需配合 model.train() / model.eval()。

  • Batch Normalization (BN):

    • 对 Batch 数据进行标准化,解决内部协变量偏移。
    • 位置: 通常在"线性层/卷积层"之后,"激活函数"之前。
    • 效果: 加速收敛,提升模型稳定性。

PyTorch 框架速查

底层原理:https://blog.csdn.net/2302_80118884/article/details/159921583?spm=1001.2014.3001.5501

1. 张量 (Tensor) 操作

  • 创建 : torch.tensor(data), torch.randn(size), torch.zeros(size)。
  • 转换 :
    • Tensor 转 NumPy: t.numpy() (共享内存) 或 t.numpy().copy()。
    • NumPy 转 Tensor: torch.from_numpy(arr)。
  • 形状变换 :
    • reshape(shape): 改变形状。
    • squeeze() / unsqueeze(dim): 压缩/增加维度为1的轴。
    • transpose(d1, d2) / permute(dims): 交换维度。
    • view(): 仅限连续内存 Tensor,不连续需先调用 contiguous()。
  • 拼接 : cat (现有维度拼接), stack (新建维度拼接)。

2. 自动微分 (Autograd)

  • 设置 requires_grad=True 开启追踪。
  • loss.backward() 计算梯度,x.grad 获取梯度值。
  • optimizer.zero_grad() 必须在每次反向传播前清空梯度。
  • detach(): 分离张量,使其不再参与梯度计算。

3. 构建模型模板 (nn.Module)

python 复制代码
class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.net = nn.Sequential(
            nn.Linear(input_dim, 128),
            nn.BatchNorm1d(128),
            nn.ReLU(),
            nn.Dropout(0.3),
            nn.Linear(128, output_dim)
        )
        
    def forward(self, x):
        return self.net(x)

4. 标准训练循环

  1. optimizer.zero_grad():梯度清零。
  2. output = model(input):前向传播。
  3. loss = criterion(output, target):计算损失。
  4. loss.backward():反向传播(算梯度)。
  5. optimizer.step():更新权重。
  6. scheduler.step():更新学习率(可选)。

调优 CheckList

  • 输入数据是否进行了 StandardScaler 或 MinMaxScaler ?
    例如,输入数据单位不同,容易导致不平衡
  • 隐藏层是否使用了 ReLU ?
    有效防止梯度消失,过拟合
  • 是否在全连接层添加了 BatchNorm 和 Dropout?
  • 优化器是否首选 Adam?
  • 学习率是否设置了衰减策略?
  • 训练时是否使用了 model.train(),评估时是否使用了 model.eval() 和 with torch.no_grad():?
相关推荐
糖炒栗子03267 分钟前
深度学习笔记-FCN
笔记
星恒随风12 分钟前
Linux开发工具详解(二):Git版本控制、GitHub协作与GDB调试实战
linux·笔记·git·学习·github
by2099911 小时前
学会使用std::string类,并理解其内部是如何管理字符串的详细阐述(上)
c++·笔记·字符串·类和对象·string
笑鸿的学习笔记12 小时前
C++笔记之大块顺序写
java·c++·笔记
山岚的运维笔记13 小时前
ComfyUI NVIDIA安装教程:官方便携版下载+run_nvidia_gpu.bat启动,8G显存Windows实操
运维·服务器·windows·笔记·prompt·aigc·comfyui
知潮网16 小时前
手机号注销两年,免密扣款仍在继续
笔记
Seraphina3616 小时前
DVWA(SQL注入-low,medium,XSS反射-low)
前端·数据库·笔记·sql·网络安全·web·xss
维克兜率天18 小时前
【维克】配对交易的季节性:哪些品种适合长拿?
android·开发语言·笔记·python·算法·kotlin·量化
路弥行至19 小时前
【Head First 设计模式】第 2 章:观察者模式 —— 用现代 C++ 重新解读“交互对象的松耦合
c++·经验分享·笔记·观察者模式·设计模式·入门教程·headfirst
坤坤子吖20 小时前
Python基础语法学习:条件、循环与程序控制
开发语言·笔记·python·学习