摘要

从整个训练过程的宏观视角看,x 和 y 是在变化的。但在微积分求导的那个瞬间,它们是固定的。
优化的是损失函数,此时不要注意x、y,要完全把损失函数当成变量是w、b的函数,此时求的是函数最低点

正文

你这个问题触及了深度学习优化中一个非常核心但容易混淆的点:在求导时,到底谁是变量,谁是常数?

你的直觉是对的,这里面确实存在一个“视角转换”的问题。我们来把它彻底理清。

1. 函数视角:区分函数本身和函数的参数

首先,我们要明确我们正在优化的是哪个函数

  • 损失函数(Loss Function): 这是我们最关心的函数,记为 L(θ)。它的变量(Variables)是模型参数 θ(比如权重 W 和偏置 b)。
  • 我们的目标是找到一组 θ,使得 L(θ) 的值最小。

那么 xy 在这里面是什么角色呢?
x(输入数据)和 y(真实标签)是定义这个损失函数的已知量。它们和模型结构(比如网络层数、激活函数)一起,共同决定了 L(θ) 这个函数的具体形式

类比:
想象一个二次函数 f(a) = a * x^2 + b * x + c

  • 如果你要研究 a 的变化如何影响 f(a),那么 a 就是变量
  • x, b, c 则是这个函数的系数或常数,它们决定了这个二次函数的形状(开口大小、位置)。

在深度学习的损失函数 L(θ) 中:

  • θ 相当于上面例子中的 a变量)。
  • x, y 以及模型结构相当于上面例子中的 x, b, c常数)。

2. 求导时的变量与常数

当我们计算梯度 ∇L(θ)(即对 L 求关于 θ 的偏导数)时,我们必须明确:

对谁求导,谁就是变量;其他一切都被视为常数。

因此,在计算 ∂L / ∂W∂L / ∂b 时:

  • 变量: 模型参数 Wb
  • 常数: 输入数据 x、真实标签 y、学习率、以及所有不是我们正在求导的参数的其它量。

一个简单的例子:线性回归
损失函数是均方误差:L(W, b) = (1/2) * (y_hat - y)^2,其中 y_hat = W * x + b

当我们计算 ∂L / ∂W 时(用链式法则):

  1. ∂L / ∂y_hat = (y_hat - y)
  2. ∂y_hat / ∂W = x
  3. 所以,∂L / ∂W = (y_hat - y) * x

在这个求导过程中,xy 是不是被当作常数处理了?是的!因为我们是在对 W 求导。

3. 为什么会产生“x, y 是变量”的错觉?

你的感觉也并非空穴来风,主要来自以下几个原因:

  1. 数据也是可变的(在不同的层面上): 虽然对于一次具体的参数更新来说,我们使用的 (x, y) 样本是固定的常数。但SGD的核心是在不同时间步,我们会使用不同的数据样本。从整个训练过程的宏观视角看,xy 是在变化的。但在微积分求导的那个瞬间,它们是固定的

  2. 另一种任务:函数拟合: 如果你的任务不是训练模型参数,而是要找一個函数 f 使得它能够完美地穿过所有给定的数据点,那么数据点 (x, y) 就变成了固定的“锚点”,而函数 f 的表达式(比如它的系数)才是要优化的变量。这其实就是机器学习在做的事情!我们正是在找一组参数 θ,使得函数 f_θ(x) 尽可能接近 y

  3. 概念名称的冲突: 在数学中,我们习惯说 y = f(x)x 叫自变量,y 叫因变量。在深度学习里,我们依然把模型的输入叫 x,输出叫 y_hat,这很容易让人带入“x 是变量”的思维定式。但请记住,在优化阶段,我们已经抽离到了更高的层次:损失函数 L 的输入是参数 θ,输出是损失值。

总结

让我们清晰地梳理一下:

场景/操作变量常数(在本次操作中固定)
单个模型前向传播输入数据 x模型参数 θ
损失函数求值模型参数 θ训练数据 (x, y), 模型结构
计算梯度(反向传播)模型参数 θ训练数据 (x, y), 模型结构
SGD整个训练过程模型参数 θ 不断变化模型结构 固定
训练数据 (x, y) 在不同步骤被采样优化算法(如SGD)的超参数 固定

核心结论:

在SGD优化器进行求导(计算梯度)的那个时刻,我们优化的对象——模型参数 θ(如W, b)是变量,而用来定义损失函数的数据 (x, y) 被当作常数。

你的困惑正是从“数据变量”思维切换到“优化变量”思维时产生的,理解这个视角的转换是理解深度学习优化的关键一步。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐