yanchang
yanchang
发布于 2025-04-25 / 9 阅读
0
1

今天完成了鱼书

闲言:

今天都有哪些事呢,忘记拿我的电话卡了,算了下个月激活得了,电信卡注销了。不知道能返多少钱,据说是下个月了,然后宝贝的一条裤子退款还没到账呢,服了,据说是物流丢失了。上午尝试ipv6,远程实验室的电脑,结果是失败了emmmmm,明天再试试。明天开始yolo的学习。

第四章:神经网络的学习​​

1. 从感知机到神经网络​​

​​1.1 感知机的局限性​​

  • ​单层感知机​​:只能解决线性可分问题(如逻辑与、或、非),无法处理异或(XOR)等非线性问题。

  • ​数学表达​​:单层感知机的输出为 y = step(w·x + b),其中 step 是阶跃函数(非0即1)。

​​1.2 激活函数的引入​​

  • ​核心思想​​:用连续可导的激活函数替代阶跃函数,使模型能够通过梯度下降法学习参数。

  • ​常用激活函数​​:

    • ​Sigmoid​​:σ(z) = 1 / (1 + e^{-z}),输出范围 (0,1),但存在梯度消失问题(导数最大仅0.25)。

    • ​ReLU​​(Rectified Linear Unit):ReLU(z) = max(0, z),计算高效且缓解梯度消失,但负区间梯度为0。

  • ​非线性能力的来源​​:通过叠加多个激活函数层,网络可以拟合任意复杂函数(万能逼近定理)。

​​1.3 多层前馈网络的结构​​

  • ​层级划分​​:

    • ​输入层​​:接收原始数据(如图像像素、文本向量)。

    • ​隐藏层​​:至少一层,通过权重矩阵和激活函数提取高阶特征。

    • ​输出层​​:根据任务选择激活函数(如Softmax用于分类,Sigmoid用于二分类,线性激活用于回归)。

  • ​前向传播公式​​(以全连接层为例):

    z = W·x + b
    a = activation(z)
    • W 为权重矩阵,b 为偏置向量,activation 为激活函数。


​​2. 损失函数与梯度下降​​

​​2.1 损失函数(Loss Function)​​

  • ​作用​​:量化模型预测值与真实值的差异,指导参数优化方向。

  • ​常见类型​​:

    • ​均方误差(MSE)​​:适用于回归任务。

      L = 1/(2N) * Σ(y_pred - y_true)^2
    • ​交叉熵损失(Cross-Entropy)​​:适用于分类任务,与Softmax配合使用。

      L = -1/N * Σ y_true * log(y_pred)
    • ​二分类交叉熵​​:配合Sigmoid使用,处理二分类问题。

​​2.2 梯度下降法​​

  • ​核心思想​​:沿损失函数的负梯度方向更新参数,逐步逼近最小值。

  • ​参数更新公式​​:

    W = W - η * ∂L/∂W
    b = b - η * ∂L/∂b
    • η 为学习率(learning rate),控制更新步长。

  • ​三种实现方式​​:

    • ​批量梯度下降(BGD)​​:使用全部样本计算梯度,稳定但计算量大。

    • ​随机梯度下降(SGD)​​:每次随机选取一个样本,速度快但波动大。

    • ​小批量梯度下降(Mini-batch SGD)​​:折中方案,常用批量大小32/64/128。

​​2.3 数值梯度 vs 解析梯度​​

  • ​数值梯度​​(有限差分法):

    • 公式:∂L/∂w ≈ [L(w+ε) - L(w-ε)] / (2ε)(ε为微小扰动,如1e-7)。

    • 优点:实现简单,无需数学推导。

    • 缺点:计算效率低(需多次前向传播),精度受ε影响。

  • ​解析梯度​​(反向传播):

    • 通过链式法则直接计算梯度,高效且精确。

    • ​梯度检查​​:训练初期可用数值梯度验证反向传播的正确性。


​​3. 学习算法的核心步骤​​

​​3.1 随机初始化权重​​

  • ​必要性​​:对称权重(如全0初始化)会导致所有神经元输出相同,失去学习能力。

  • ​常用方法​​:

    • 小随机数初始化(如高斯分布 N(0, 0.01))。

    • 后续章节的Xavier/He初始化(根据激活函数调整)。

​​3.2 前向传播计算损失​​

  • ​计算流程​​:

    1. 输入数据通过各层传递:输入 → 隐藏层1 → 激活 → 隐藏层2 → 激活 → 输出层

    2. 输出层结果与真实标签计算损失值。

​​3.3 反向传播计算梯度​​

  • ​链式法则的应用​​:

    • 从输出层开始,逐层计算损失对参数的梯度。

    • 例如,对权重矩阵 W 的梯度:∂L/∂W = ∂L/∂a * ∂a/∂z * ∂z/∂W

  • ​计算示例​​(以Sigmoid激活的全连接层为例):

    # 输出层梯度
    dL_da = ∂L/∂a
    da_dz = a * (1 - a)  # Sigmoid导数
    dz_dW = x
    ∂L/∂W = dL_da * da_dz * dz_dW

​​3.4 梯度下降更新参数​​

  • ​参数更新​​:根据梯度方向和学习率调整权重和偏置。

  • ​代码示例​​(Python伪代码):

    python

    复制

    for param in [W1, b1, W2, b2]:
        grad = compute_gradient(param)  # 通过反向传播得到梯度
        param -= learning_rate * grad   # 更新参数

​​关键问题与注意事项​​

  1. ​梯度消失/爆炸​​:

    • Sigmoid激活函数在深层网络中易导致梯度消失(导数过小)。

    • 解决方案:使用ReLU、梯度裁剪(Gradient Clipping)、残差连接(ResNet)。

  2. ​学习率选择​​:

    • 过大会导致震荡不收敛,过小则训练缓慢。

    • 自适应学习率方法:AdaGrad、RMSProp、Adam(后续章节)。

  3. ​批量大小的影响​​:

    • 大批量训练更稳定,但可能陷入局部最优;小批量噪声大但泛化性好。

​总结​​

从感知机到神经网络的核心突破在于:

  • ​激活函数​​赋予网络非线性能力;

  • ​损失函数与梯度下降​​将学习转化为优化问题;

  • ​反向传播​​高效计算梯度,使深层网络训练成为可能。

这些理论为后续卷积神经网络(CNN)、循环神经网络(RNN)等复杂模型奠定了基础。


​​第五章:误差反向传播法​​

1. 计算图与链式法则​​

​​1.1 计算图的基本概念​​

  • ​定义​​:将复杂的数学计算分解为​​节点(操作)​​和​​边(数据流)​​构成的图结构,直观表示计算过程。

  • ​核心思想​​:

    • ​前向传播​​:从输入到输出,沿箭头方向执行计算(如 x → 加法 → 平方 → 输出)。

    • ​反向传播​​:从输出到输入,沿箭头反方向传递梯度,利用链式法则计算每个节点的局部梯度。

​​1.2 链式法则的数学原理​​

  • ​链式法则​​:复合函数的导数等于各层函数导数的乘积。

    • 例如,函数 L = f(g(h(x))) 的导数为:

      dL/dx = (dL/df) * (df/dg) * (dg/dh) * (dh/dx)
  • ​反向传播的数学本质​​:将链式法则应用于计算图,从输出端(损失函数)向输入端逐层传递梯度。

​​1.3 计算图的构建与示例​​

  • ​示例:简单函数 z = (x + y)^2

    • ​前向计算图​​:

      x → Add → Square → z
      y ↗
    • ​反向传播过程​​:

      1. 计算 z 对自身的梯度:dz/dz = 1

      2. 反向到 Square 节点:dz/d(Add) = 2*(x + y)

      3. 反向到 Add 节点:梯度分两条路径传递:

        • dz/dx = 2*(x + y)

        • dz/dy = 2*(x + y)


​​2. 反向传播的具体实现​​

​​2.1 关键步骤​​

  1. ​局部梯度计算​​:

    • 每个节点只需计算输入对输出的局部导数(如 加法 节点的导数为1,乘法 节点的导数为另一输入值)。

    • ​示例​​:乘法节点 z = x * y 的梯度为:

      ∂z/∂x = y,  ∂z/∂y = x
  2. ​梯度累加(加法节点)​​:

    • 若一个节点有多个上游梯度(如分支结构),梯度需累加而非覆盖。

    • ​示例​​:若 x 同时参与两个计算 a = x + 1b = x * 2,则 x 的梯度为 da/dx + db/dx

  3. ​分支处理(广播机制)​​:

    • 广播操作(如矩阵与标量相加)需在反向传播时调整梯度维度。

    • ​示例​​:A(矩阵) + b(标量),反向时 db = Σ所有元素的梯度

​​2.2 模块化设计​​

  • ​层的抽象​​:将网络拆分为独立模块(如 Affine, ReLU, SoftmaxWithLoss),每层实现前向传播(forward)和反向传播(backward)。

  • ​代码结构示例​​:

    python

    复制

    class Affine:
        def __init__(self, W, b):
            self.W = W
            self.b = b
            self.x = None
    
        def forward(self, x):
            self.x = x
            return np.dot(x, self.W) + self.b
    
        def backward(self, dout):
            dx = np.dot(dout, self.W.T)  # 输入梯度
            dW = np.dot(self.x.T, dout)  # 权重梯度
            db = np.sum(dout, axis=0)    # 偏置梯度
            return dx, dW, db
  • ​反向传播的链式调用​​:

    python

    复制

    # 网络的反向传播
    dloss = 1.0  # 损失函数的初始梯度
    dloss = softmax_layer.backward(dloss)
    dloss = relu_layer.backward(dloss)
    dloss, dW, db = affine_layer.backward(dloss)

​​3. 反向传播 vs 数值梯度​​

​​3.1 反向传播的优势​​

  • ​效率​​:计算复杂度为 O(N)(N为参数数量),只需一次前向和一次反向传播。

  • ​精度​​:解析梯度无近似误差,适合大规模训练。

​​3.2 数值梯度的作用​​

  • ​梯度检查(Gradient Check)​​:验证反向传播实现的正确性。

    • 步骤:

      1. 随机生成输入数据和初始参数。

      2. 计算反向传播得到的梯度 grad_backprop

      3. 用数值梯度公式计算 grad_numerical

      4. 比较两者的差异(如欧氏距离或相对误差)。

    • ​容错标准​​:相对误差小于 1e-7 为通过。

  • ​数值梯度公式​​:

    grad_numerical = (f(x + ε) - f(x - ε)) / (2 * ε)
    • ε 通常取 1e-7,过大导致误差,过小引入浮点计算误差。

​​3.3 梯度检查的代码示例​​

python

复制

def gradient_check(layer, x, epsilon=1e-7):
    # 计算反向传播梯度
    _, grad_backprop = layer.backward(x)

    # 初始化数值梯度
    grad_numerical = np.zeros_like(grad_backprop)
    
    # 逐参数计算数值梯度
    for i in range(grad_backprop.size):
        old_val = layer.params.flat[i]
        
        # f(x + ε)
        layer.params.flat[i] = old_val + epsilon
        fx_plus = layer.forward(x)
        
        # f(x - ε)
        layer.params.flat[i] = old_val - epsilon
        fx_minus = layer.forward(x)
        
        # 数值梯度
        grad_numerical.flat[i] = (fx_plus - fx_minus) / (2 * epsilon)
        layer.params.flat[i] = old_val  # 恢复参数
    
    # 计算相对误差
    diff = np.linalg.norm(grad_backprop - grad_numerical)
    grad_norm = np.linalg.norm(grad_backprop) + np.linalg.norm(grad_numerical)
    relative_error = diff / (grad_norm + 1e-12)
    
    return relative_error < 1e-7

​​关键问题与注意事项​​

  1. ​梯度爆炸与消失​​:

    • 深层网络中,梯度可能指数级增大(爆炸)或趋近于零(消失)。

    • 解决方案:权重初始化(Xavier/He)、梯度裁剪(Gradient Clipping)、残差连接。

  2. ​计算图的动态性​​:

    • 动态图框架(如PyTorch)允许运行时构建计算图,灵活但内存开销大。

    • 静态图框架(如TensorFlow 1.x)需预先定义计算图,高效但灵活性差。

  3. ​自动微分(Autograd)​​:

    • 现代深度学习框架(PyTorch、TensorFlow)自动构建计算图并实现反向传播。

    • 用户只需定义前向传播,框架自动追踪计算过程生成计算图。

总结​​

  • ​计算图与链式法则​​是反向传播的理论基础,通过分解复杂计算实现高效梯度传递。

  • ​模块化设计​​将网络层抽象为独立单元,简化实现并提高代码复用性。

  • ​数值梯度​​是验证反向传播正确性的关键工具,但实际训练中必须依赖解析梯度。

反向传播是深度学习的核心技术之一,理解其原理和实现方式对模型调试和优化至关重要。


​​第六章:与学习相关的技巧​​

1. 优化策略​​

​​1.1 参数更新方法​​

  1. ​SGD(随机梯度下降)的局限性​

    • ​基本公式​​:W=Wη⋅∂WL

    • ​缺点​​:

      • 在损失函数存在“峡谷”或“鞍点”时收敛缓慢(梯度方向震荡)。

      • 所有参数使用相同的学习率,无法自适应调整。

  2. ​改进优化器​

    • ​动量法(Momentum)​​:

      • 引入速度变量模拟物理动量,缓解震荡。

      • ​公式​​:v=βv+(1−β)⋅∂WLW=Wηv

        • β 为动量系数(通常取0.9),累积历史梯度方向。

      • ​效果​​:加速收敛,减少震荡(类似“惯性”冲过鞍点)。

    • ​Adam(Adaptive Moment Estimation)​​:

      • 结合动量法和自适应学习率(RMSProp)。

      • ​公式​​(简化版):mt=β1mt−1+(1−β1)⋅∂WL(一阶矩估计)vt=β2vt−1+(1−β2)⋅(∂WL)2(二阶矩估计)m^t=1−β1tmt​​,v^t=1−β2tvt​​(偏差修正)W=Wηv^t​​+ϵm^t​​

        • 默认参数:β1=0.9,β2=0.999,ϵ=1e−8

      • ​优势​​:自适应调整学习率,适合稀疏梯度或噪声数据。

​​1.2 权重初始化​​

  1. ​Xavier初始化​

    • ​适用场景​​:Sigmoid、Tanh等饱和激活函数。

    • ​数学原理​​:保持输入和输出的方差一致,避免梯度消失/爆炸。

    • ​公式​​:W∼Uniform(−nin+nout6​​,nin+nout6​​)

      • ninnout 分别为输入和输出的神经元数量。

  2. ​He初始化​

    • ​适用场景​​:ReLU及其变体(如Leaky ReLU)。

    • ​公式​​:W∼Normal(0,nin2​​)

    • ​原理​​:考虑ReLU的“单侧抑制”特性,调整方差为Xavier的2倍。


​​2. 正则化与泛化​​

​​2.1 过拟合对策​​

  1. ​L2正则化(权重衰减)​

    • ​原理​​:在损失函数中增加权重范数惩罚项,限制模型复杂度。

    • ​公式​​:Lnew=L+2λW2

      • λ 为正则化强度,越大则权重越小。

    • ​反向传播影响​​:梯度更新时额外减去 λW

  2. ​Dropout​

    • ​原理​​:训练时随机以概率 p 丢弃神经元,强制网络学习冗余特征。

    • ​实现​​:

      • 训练时:每个神经元以概率 p 置零,剩余神经元缩放为 1/(1−p) 倍。

      • 测试时:保留全部神经元,无需缩放。

    • ​效果​​:类似集成学习,提升模型鲁棒性。

  3. ​数据增强(Data Augmentation)​

    • ​图像任务​​:随机裁剪、旋转、翻转、调整亮度/对比度。

    • ​文本任务​​:同义词替换、随机删除/交换单词。

    • ​本质​​:通过扩展训练数据分布,提升模型泛化能力。

​​2.2 批量归一化(Batch Normalization)​​

  1. ​操作步骤​​:

    • ​输入​​:某层输出的批次数据 x(形状为 (batch_size, features))。

    • ​归一化​​:μ=N1xi,σ2=N1∑(xiμ)2x^i=σ2+ϵxiμ

    • ​缩放与平移​​:yi=γx^i+β

      • γβ 为可学习参数,恢复模型的表达能力。

  2. ​优势​​:

    • 减少内部协变量偏移(Internal Covariate Shift),加速训练。

    • 允许使用更大的学习率,缓解对初始化的敏感度。

    • 轻微的正则化效果(类似Dropout)。


​​3. 超参数调优​​

​​3.1 验证集的使用​​

  • ​训练集/验证集/测试集划分​​:

    • 训练集:更新模型参数。

    • 验证集:选择超参数(如学习率、正则化强度)。

    • 测试集:仅用于最终评估,避免数据泄露。

​​3.2 超参数搜索策略​​

  1. ​网格搜索(Grid Search)​

    • 遍历所有可能的超参数组合(如学习率 [0.1, 0.01] 和批量大小 [32, 64])。

    • ​缺点​​:计算成本高,维度灾难(超参数越多越不实用)。

  2. ​随机搜索(Random Search)​

    • 在超参数空间中随机采样(如学习率从对数均匀分布采样)。

    • ​优势​​:高维空间中更高效,可能更快发现优秀组合。

  3. ​其他方法​​(进阶):

    • ​贝叶斯优化​​:基于历史结果建模目标函数,指导下一步采样。

    • ​自动化调参工具​​:如Hyperopt、Optuna。

​​3.3 关键超参数​​

  1. ​学习率(η)​

    • 常用范围:[1e-5, 1e-1],可从对数均匀分布采样(如 10^{-4} \sim 10^{-2})。

    • 学习率衰减:训练后期逐步减小学习率(如 η = η0 * 0.95^epoch)。

  2. ​批量大小(Batch Size)​

    • 权衡:大批量训练稳定但内存占用高,小批量噪声大但泛化性好。

    • 常用值:32、64、128、256。

  3. ​正则化强度(λ)​

    • L2正则化:范围 [0.0001, 0.1]

    • Dropout概率:[0.3, 0.7](输入层较低,隐藏层较高)。


​​关键问题与注意事项​​

  1. ​梯度消失/爆炸的联合应对​

    • 组合使用权重初始化(He)、批量归一化、残差连接。

  2. ​过拟合的诊断与处理​

    • ​训练损失低,验证损失高​​ → 加强正则化(增大λ或Dropout概率)。

    • ​训练和验证损失均高​​ → 检查模型容量或优化策略。

  3. ​Batch Norm的部署细节​

    • 训练时使用批次统计量,测试时使用移动平均统计量。

    • 与Dropout共用时注意顺序(通常为 Conv → BN → ReLU → Dropout)。


​​总结​​

  • ​优化策略​​:从SGD到Adam,结合自适应学习率与动量,加速收敛。

  • ​正则化技术​​:L2、Dropout、Batch Norm共同提升泛化能力。

  • ​超参数调优​​:随机搜索为主,验证集严格隔离测试数据。

这些技巧是构建高性能深度学习模型的基石,后续章节(如CNN、RNN)将在此基础上引入领域特定的结构设计。


​​第七章:卷积神经网络(CNN)​​

1. 卷积层的核心思想​​

​​1.1 局部感受野(Local Receptive Field)​​

  • ​基本概念​​:
    卷积核(Filter/Kernel)仅关注输入数据的局部区域,而非全连接层的全局连接。

    • ​示例​​:3×3的卷积核每次仅处理输入图像的3×3区域。

  • ​生物学启发​​:模仿视觉皮层神经元对局部刺激的响应。

  • ​优势​​:

    • ​参数减少​​:避免全连接层的参数爆炸(如输入224x224图像,全连接层参数量级为10^7,而3x3卷积核仅需9个参数)。

    • ​局部特征提取​​:捕捉边缘、纹理等底层特征。

​​1.2 权值共享(Weight Sharing)​​

  • ​定义​​:同一卷积核在输入的不同位置重复使用,提取相同类型的特征。

  • ​数学表达​​:
    输入矩阵 X,卷积核 W,输出特征图 Y 的每个元素为:Yi,j=m=0∑k−1n=0∑k−1Wm,nXi+m,j+n+b

    • k 为卷积核大小(如3),b 为偏置。

  • ​参数量计算​​:
    单个3×3卷积核的参数量为 3×3×Cin+1(偏置),Cin 为输入通道数。

​​1.3 填充(Padding)与步长(Stride)​​

  1. ​填充(Padding)​​:

    • ​目的​​:保持输出尺寸与输入一致(如边缘信息保留)。

    • ​操作​​:在输入周围填充零(Zero Padding)或其他值。

    • ​输出尺寸公式​​:Hout=⌊SHin+2Pk⌋+1

      • Hin:输入高度,P:填充数,k:卷积核大小,S:步长。

  2. ​步长(Stride)​​:

    • ​作用​​:控制卷积核滑动间隔,实现降采样(Downsampling)。

    • ​示例​​:步长2使输出尺寸减半。


​​2. 池化层与网络结构​​

​​2.1 池化(Pooling)​​

  • ​目的​​:降低空间分辨率,减少计算量,增强平移不变性。

  • ​类型​​:

    • ​Max Pooling​​:取区域最大值,保留最显著特征。

    • ​Average Pooling​​:取区域平均值,平滑特征。

  • ​操作示例​​:2×2池化窗口,步长2,输出尺寸减半。

  • ​反向传播​​:Max Pooling需记录最大值位置,梯度仅传递到对应输入位置。

​​2.2 经典CNN架构​​

  1. ​LeNet-5(1998)​

    • ​结构​​:

      Input(32×32) → Conv6(5×5) → AvgPool → Conv16(5×5) → AvgPool → FC(120) → FC(84) → Output(10)
    • ​应用​​:手写数字识别(MNIST),首次展示卷积层的实用性。

  2. ​AlexNet(2012)​

    • ​创新点​​:

      • 使用ReLU激活函数缓解梯度消失。

      • 引入Dropout和Data Augmentation防止过拟合。

      • 多GPU训练(当时硬件限制下的分布式计算)。

    • ​结构​​:

      Input(224×224×3) → Conv(11×11, 96, stride4) → MaxPool → Conv(5×5, 256) → MaxPool →  
      Conv(3×3, 384) → Conv(3×3, 384) → Conv(3×3, 256) → MaxPool → FC(4096) → FC(4096) → Output(1000)
    • ​意义​​:在ImageNet竞赛中突破性表现,推动深度学习复兴。

  3. ​通用结构模式​​:

    • 堆叠模块:Conv → ReLU → Pooling 重复多次,后接全连接层(FC)。

    • 深层网络趋势:VGG(小卷积核堆叠)、ResNet(残差连接)等。


​​3. 可视化与可解释性​​

​​3.1 卷积核可视化​​

  • ​浅层卷积核​​:

    • ​示例​​:第一层卷积核学习到边缘检测器(水平/垂直/斜边)、颜色斑块。

    • ​可视化方法​​:将卷积核权重映射为图像(如3×3×3的RGB卷积核显示为3×3彩色块)。

  • ​深层卷积核​​:

    • ​特征抽象​​:高层卷积核响应复杂模式(如车轮、动物眼睛、纹理组合)。

    • ​可视化技术​​:

      • ​激活最大化​​:生成使某神经元激活最大的输入图像。

      • ​遮挡实验​​:遮挡图像区域,观察输出概率变化。

​​3.2 CNN的先天优势​​

  1. ​平移不变性(Translation Invariance)​

    • ​定义​​:目标在图像中平移后,CNN仍能识别。

    • ​来源​​:池化操作(如Max Pooling)忽略局部位置细节。

  2. ​层次化特征学习​

    • ​浅层​​:边缘、颜色、纹理(通用特征)。

    • ​中层​​:部件组合(如车轮、窗户)。

    • ​深层​​:语义对象(如人脸、车辆)。

  3. ​空间层次性(Spatial Hierarchy)​

    • 小卷积核捕捉局部细节,大感受野(通过堆叠层)整合全局信息。


​​关键问题与扩展​​

  1. ​1×1卷积的作用​​:

    • 降维/升维(调整通道数),跨通道信息融合,替代全连接层。

  2. ​空洞卷积(Dilated Convolution)​​:

    • 扩大感受野而不增加参数量,用于分割任务(如WaveNet、DeepLab)。

  3. ​转置卷积(Transposed Convolution)​​:

    • 实现上采样,用于生成(GAN)或分割网络。


​​总结​​

  • ​卷积层​​通过局部连接和权值共享,高效提取空间特征。

  • ​池化层​​降低维度并增强模型鲁棒性。

  • ​经典架构​​(LeNet、AlexNet)奠定CNN基础,后续模型(ResNet、Transformer)在此范式上创新。

  • ​可视化​​揭示了CNN从底层到高层的特征学习过程,证明其符合人类视觉认知规律。

CNN的设计思想深刻影响了计算机视觉领域,并启发了自然语言处理(如TextCNN)、语音识别等跨学科应用。


评论