第二次课程笔记

本人参考:斋藤康毅:《深度学习入门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():?
相关推荐
Nuanyt25 分钟前
Hot 100 刷题笔记 · 数组与哈希专题(3 题)
java·笔记·算法·leetcode·哈希算法·1024程序员节
破芽2 小时前
learn-claude-code-s08-s09-学习笔记
笔记·学习
星恒随风2 小时前
Linux网络编程基础(二):彻底理解局域网通信、MAC与IP地址、数据封装、端口号、网络字节序及Socket接口
linux·网络·笔记·学习·tcp/ip·1024程序员节
星恒随风3 小时前
Linux线程同步与互斥:彻底理解读者写者问题、读写锁原理、读者优先与写者优先(附pthread完整实验)
linux·服务器·笔记·1024程序员节
ljt27249606614 小时前
Vue笔记(十五)--自定义引用
笔记·1024程序员节
xieyan08114 小时前
笔记不只是仓库:让 AI 帮旧想法重新参与思考
人工智能·笔记
江屿风5 小时前
【Linux-System】【System V共享内存:从原理到实战的完整解析】流食般投喂
linux·运维·服务器·笔记·系统架构·1024程序员节
東隅已逝,桑榆非晚5 小时前
搜索二叉树
c++·笔记·学习·1024程序员节
Young Doro15 小时前
从 DV 表示到 MI 下界,再到“置换技巧“(含“指数倾斜“完整推导)
笔记
ACP广源盛1392462567318 小时前
PCIe Gen3 交换芯片选型笔记:中小通道扩展方案 IX7012@ACP 评估
笔记·硬件架构·硬件工程·pcie·国产芯片