尧图精选

深度学习之零碎知识点__举例解释原理

🕒 发布时间:2026/9/16 22:01:26 📁 来源:尧图网络
一.为什么规范化会加快收敛速度1.绘制未标准化数据的等高线图#等高线可以直观的展示损失函数在不同参数组合的取值情况等高线上的每个点对应的损失函数值是相等的就像地图上的等高线表示相同海拔高度一样2.未标准化不同特征的尺度差异很大在某一方向上的变化率大很多会导致等高线在不同参数方向的拉伸程度不同呈现出扁长的椭圆形。在扁长的椭圆形的等高线中梯度方向会在不同参数方向上频繁摆动使得新路径的方向呈现锯齿状为了达到最优解需要得带多次所以收敛速度慢二.为什么参数更新完参数梯度清零1. 批次的Loss计算问题loss是批次中的总loss吗答案loss是当前批次batch的平均损失不是总损失。计算方式loss -(y_batch * torch.log(y_pred) (1-y_batch)*torch.log(1-y_pred)).mean()y_batch和y_pred的形状均为(batch_size,)。.mean()对所有样本的损失求平均等价于总损失除以batch_size。举例说明假设batch_size3且y_batch [1.0, 0.0, 1.0]真实标签y_pred [0.9, 0.2, 0.8]预测概率则损失计算过程对每个样本计算交叉熵样本1-1.0 * log(0.9) ≈ 0.1054样本2-(1-0.0) * log(1-0.2) ≈ 0.2231样本3-1.0 * log(0.8) ≈ 0.2231求平均loss (0.1054 0.2231 0.2231) / 3 ≈ 0.18392. 参数更新的具体过程问题param - lr * param.grad是基于哪个参数计算的梯度答案梯度是基于当前批次数据计算的参数更新是立即生效的即下一批次使用更新后的参数。# 手动梯度下降不借助optimizer with torch.no_grad(): for param in model.parameters(): param - lr * param.grad param.grad.zero_() # 清空当前批次的梯度流程梯度清零param.grad.zero_()清空梯度防止影响下一批次。参数更新param - lr * param.grad直接修改参数值。反向传播计算当前批次梯度param.grad。前向传播用当前参数计算y_pred。具体例子假设模型参数初始值w [0.0, 0.0],b 0.0学习率lr 0.1第一批次数据计算梯度w.grad [0.5, -0.3],b.grad 0.2。更新参数pythonw - 0.1 * [0.5, -0.3] → w [-0.05, 0.03] b - 0.1 * 0.2 → b -0.02梯度清零w.grad [0.0, 0.0],b.grad 0.0。第二批次数据使用更新后的参数w [-0.05, 0.03],b -0.02继续计算。3.param.grad.zero_()的作用问题为什么要清零梯度原因PyTorch默认会累积梯度param.grad new_gradients。如果不清零第一批次梯度w.grad [0.5, -0.3]第二批次梯度w.grad [0.5, -0.3] [new_grad]→ 梯度错误累积正确做法每批次更新后立即清零梯度pythonwith torch.no_grad(): for param in model.parameters(): param - lr * param.grad # 用当前梯度更新参数 param.grad.zero_() # 清零梯度4. 参数更新可视化批次参数w当前梯度w.grad更新后的w1[0.0, 0.0][0.5, -0.3][-0.05, 0.03]2[-0.05, 0.03][0.2, 0.1][-0.07, 0.02]3[-0.07, 0.02][-0.1, 0.4][-0.06, -0.02]5. 完整代码流程总结前向传播用当前参数计算批次预测值y_pred。损失计算求批次内所有样本损失的平均值。反向传播计算param.grad梯度基于当前批次数据。参数更新param - lr * param.grad立即更新参数。param.grad.zero_()清空梯度防止影响下一批次6. 梯度与参数的关系1.参数是变量比如线性回归中的w,b而在求解时会将参数初始化为0矩阵或者随机初始化即参数的初始值。2.梯度是损失函数对参数求导比如yx^2,对x求导后为dy/dx2x,求x的梯度需要在求导后带入x初始值(eg,x初始1.0)则x的梯度x.gard2*12,更新梯度x(new)x-lr*x,则新的X会作为下一次求导后带入的初始值。在下一次求导前首先需要将x的梯度清零。一方面本身就是要新的loss对参数求导比如对参数的求导公式是固定的同一模型中此处以yx^2,对x求导后为dy/dx2x为例导数公式一直为x.grad2x.只是因为更新后的x不一样所以每次会计算出不同的x.grad.4.反向传播每次求导后的公式都一样只是代入不同的参数值计算梯度吗”是的但不止如此求导公式固定梯度公式如 ∂L/∂w的形式由模型和损失函数决定与参数值无关。梯度值动态变化实际计算的梯度值取决于当前参数值影响 y^ 的计算。输入数据当前批次的 x 和 y。4. 具体例子说明假设参数初始值w[0.0,0.0], b0.0。第一批次数据输入 x[1.0,2.0]标签 y1。计算过程前向传播z0×1.00×2.000,y^σ(0)0.5z0×1.00×2.000,y^​σ(0)0.5梯度计算∂L∂w1(0.5−1)×1.0−0.5∂w1​∂L​(0.5−1)×1.0−0.5∂L∂w2(0.5−1)×2.0−1.0∂w2​∂L​(0.5−1)×2.0−1.0∂L∂b0.5−1−0.5∂b∂L​0.5−1−0.5梯度值w.grad[−0.5,−1.0],b.grad−0.5w.grad[−0.5,−1.0],b.grad−0.5参数更新后学习率 lr0.1lr0.1w[0.0,0.0]−0.1×[−0.5,−1.0][0.05,0.1],b−0.05w[0.0,0.0]−0.1×[−0.5,−1.0][0.05,0.1],b−0.05第二批次数据用新参数 w[0.05,0.1]b−0.05 重新计算梯度结果不同。5. 反向传播的动态性批次参数 w输入 x预测 y^梯度 w.grad1[0.0,0.0][1.0,2.0]0.5[−0.5,−1.0]2[0.05,0.1][−1.0,1.0]0.49[0.51,−0.49]梯度公式相同但梯度值因参数和数据变化。6. 代码验证w torch.tensor([0.0, 0.0], requires_gradTrue) b torch.tensor(0.0, requires_gradTrue) # 第一批次 X_batch torch.tensor([[1.0, 2.0]]) y_batch torch.tensor([1.0]) y_pred torch.sigmoid(X_batch w b) loss - (y_batch * torch.log(y_pred) (1-y_batch)*torch.log(1-y_pred) loss.backward() print(第一批次梯度:, w.grad) # 输出: tensor([-0.5000, -1.0000]) # 参数更新 with torch.no_grad(): w - 0.1 * w.grad w.grad.zero_() # 第二批次用更新后的参数 X_batch torch.tensor([[-1.0, 1.0]]) y_pred torch.sigmoid(X_batch w b) loss.backward() print(第二批次梯度:, w.grad) # 输出: tensor([0.5100, -0.4900])7. 总结梯度公式固定由模型结构和损失函数决定。梯度值动态变化依赖当前参数值和输入数据。反向传播的作用自动计算当前参数和数据下的梯度值指导参数更新。在 Python 中只有定义了__call__方法的对象才能被直接调用如函数或实现了__call__的类。你的LogisticRegression类可能没有实现__call__而是定义了forward方法。正确的调用方式如果模型是 PyTorch 的nn.Module子类应该通过forward方法或直接调用实例但需继承nn.Module并正确实现。class LogisticRegression(nn.Module):如果是从零实现的类需显式调用forward。# 必须显式调用 forward model LogisticRegression(2) y_pred model.forward(x_batch) # 正确调用 forward 方法8.一些公式偏置项的作用在机器学习模型中偏置项bias term用于调整模型的输出基准。对于线性模型如 Softmax 回归偏置项允许决策边界不强制经过原点。数学形式zxWbzxWb其中x∈R784x∈R784输入特征展平后的图像像素W∈R784×10W∈R784×10权重矩阵b∈R10b∈R10偏置向量X_train np.hstack([X_train, np.ones((X_train.shape[0], 1))]) # [60000, 784] → [60000, 785]np.ones((X_train.shape[0], 1))生成形状为[60000, 1]的全1矩阵代表偏置项。python# 示例输出前3行 [[1.], [1.], [1.]]np.hstack水平拼接原特征矩阵和全1列将偏置项合并到特征中。python# 拼接前X_train.shape [60000, 784] # 拼接后X_train.shape [60000, 785]3. 数学等价性合并后的操作等价于z[x 1][W b]T转置xWbz合并后的权重矩阵W′∈R785×10W′∈R785×10其中最后一行是偏置向量 bb。4. 数字示例假设某样本原始特征已归一化pythonx [0.1, 0.5, 0.3, ..., 0.8] # 长度784 x_with_bias [0.1, 0.5, 0.3, ..., 0.8, 1.0] # 长度7855. 为什么需要显式添加偏置项模型简化将 WW 和 bb 合并为单一矩阵 W′W′便于统一计算。代码实现避免在梯度计算中单独处理 bb。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →