损失函数求导

  1. 可微性质的解释 – 可微性及其在机器学习中的重要性
    • 定义
    • 意义
      • 在该点或该区间内的变化是 平滑 的;可以求取极值
      • 通过梯度下降等基于导数的优化算法来最小化目标函数(损失函数)。梯度下降法依赖于可微性。
      • 凸函数:它的局部最小值就是全局最小值。
    • 为什么在机器学习中需要可微性?
      • 使用梯度下降进行优化 – 计算目标函数对参数的导数
  2. 可微性代表能够求导,并因此调整参数 θ \theta θ – 能够求导怎么就代表着可以调整参数了呢?
    • 2.3 参数调整的过程
    • θ : = θ − α ∇ J ( θ ) \theta := \theta - \alpha \nabla J(\theta) θ:=θαJ(θ)
  3. 可微性与均方误差(MSE)的证明 – 损失函数不仅仅只有MSE,但是可微性是选择损失函数的重要考虑因素之一。MSE是可微的。
    • 可微性让我们能够通过计算损失函数的梯度来调整模型参数
      θ
    • 3.4 MSE 的定义与可微性证明

1. 可微性及其在机器学习中的重要性

1.1 可微的定义

对于一个函数 f ( x ) f(x) f(x),如果在某个点 x 0 x_0 x0附近,函数的变化趋势可以用一个线性函数(即导数)来近似,则我们说这个函数在 x 0 x_0 x0可微。更形式化地,函数 f ( x ) f(x) f(x) 在点 x 0 x_0 x0 处可微意味着存在一个有限的导数:

f ′ ( x 0 ) = lim ⁡ h → 0 f ( x 0 + h ) − f ( x 0 ) h f'(x_0) = \lim_{h \to 0} \frac{f(x_0 + h) - f(x_0)}{h} f(x0)=h0limhf(x0+h)f(x0)

如果这个极限存在且是有限值,那么 f ( x ) f(x) f(x) x 0 x_0 x0处是 可微的,这个极限就是函数在 x 0 x_0 x0 处的 导数

直观理解:
  • 如果一个函数在某个点是 可微 的,那说明在该点附近,函数的变化是平滑的、没有尖锐的转折。也就是说,我们可以在该点画出函数的切线,切线的斜率就是该点的导数。
  • 如果函数在某个点是 不可微 的,那说明在该点可能有不连续、尖锐拐角(例如绝对值函数 ∣ x ∣ |x| x x = 0 x=0 x=0 处的尖角),或者变化非常剧烈。

1.2 可微的意义

a. 平滑性

函数可微意味着它在该点或该区间内的变化是 平滑 的,能够用一个切线近似函数在该点附近的变化。这在优化问题中非常重要。比如,在机器学习中,我们常常需要求解函数的极值,而这是通过计算函数的导数来实现的。如果一个函数不可微,那么导数就无法计算,导致优化过程无法顺利进行。

b. 优化中的应用

在机器学习模型的训练过程中,我们需要最小化目标函数(损失函数),这通常是通过梯度下降等基于导数的优化算法来实现的。梯度下降法依赖于可微性,因为我们需要计算损失函数的导数(或梯度)来调整模型的参数,使得损失函数最小化。

如果一个函数不可微,那么导数(梯度)就无法计算,也就无法使用梯度下降等基于导数的算法。因此,在机器学习中,设计可微的损失函数是非常重要的。

c. 函数的凸性

通常,机器学习中的损失函数(如均方误差)不仅是可微的,而且是凸的

凸函数的一个重要特性是:它的局部最小值就是全局最小值。

这使得基于梯度的优化算法(如梯度下降法)可以快速收敛到最优解。

1.3 可微与不可微的例子

可微的例子:
  • 线性函数 ( f(x) = 2x + 1 ) 在任意点都是可微的,导数是 2。
  • 二次函数 f ( x ) = x 2 f(x) = x^2 f(x)=x2 也是在任意点都可微的,导数是 f ′ ( x ) = 2 x f'(x) = 2x f(x)=2x
不可微的例子:
  • 绝对值函数 ( f(x) = |x| ) 在 ( x = 0 ) 处不可微,因为在该点有一个尖锐的转折,导数无法定义。具体来说:
    • 当 ( x > 0 ) 时,( f(x) = x ),导数是 1。
    • 当 ( x < 0 ) 时,( f(x) = -x ),导数是 -1。
    • 但是在 ( x = 0 ) 时,导数的左右极限不相等,因此导数不存在,函数不可微。
例子解释:
  • 对于 ( f(x) = |x| ),在 ( x = 0 ) 附近,函数的图像是尖锐的拐角,左右两边的斜率(导数)不同。因此,这个函数在 ( x = 0 ) 处不可微。

1.4 为什么在机器学习中需要可微性?

在机器学习中,特别是使用梯度下降进行优化时,目标函数的可微性是至关重要的。梯度下降的基本步骤是:

  1. 计算目标函数(损失函数)对参数 θ \theta θ 的导数(梯度)。
  2. 使用导数信息来更新参数,使得损失函数逐步减小。

因此,可微性确保我们可以计算导数,从而使优化过程可以顺利进行。

例子:均方误差的可微性

均方误差(MSE)定义为:
J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta) = \frac{1}{2m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})^2 J(θ)=2m1i=1m(hθ(x(i))y(i))2

这个函数是 可微的,因为它的平方项是一个光滑的函数。我们可以对其求导,进而使用梯度下降法进行优化。正是因为它的可微性,才能在训练模型时有效地调整参数 θ \theta θ ,让损失函数最小化。

1.5 可微性与连续性的关系

一个函数在某点可微,意味着它在该点也是 连续 的。但反过来,连续函数不一定是可微的。例如,绝对值函数 ( f(x) = |x| ) 在 ( x = 0 ) 处是连续的,但不可微。

总结

  • 可微 意味着一个函数在某点可以进行微分,能够求出该点的导数。可微性反映了函数在该点附近的平滑程度。
  • 在机器学习中,函数的可微性非常重要,尤其是在使用梯度下降等优化算法时,我们需要通过计算损失函数的导数来更新模型参数。
  • 均方误差 是可微的,因为它的定义中包含平方项,具有良好的平滑性和可微性,适合用于基于梯度的优化方法。

2. 可微性代表能够求导,并因此调整参数 θ \theta θ

2.1 可微性和求导的关系

  • 可微性 表示函数在某个点可以求导,也就是说该函数在这个点是光滑的,没有尖角、突变或不连续。
  • 求导 的过程就是计算函数在某个点的导数,导数代表了函数在该点的变化率。导数为正,说明函数在该点是上升的;导数为负,说明函数在该点是下降的;导数为零,可能意味着在该点达到了极值(最大值或最小值)。

2.2 可微性在参数优化中的作用

在机器学习中,我们通常定义一个损失函数来衡量模型预测值和真实值之间的差距(如均方误差 MSE)。为了使模型的预测更加准确,我们希望最小化这个损失函数【当读到这里的时候,可以写一下那个推导过程】,而这个过程涉及到 调整模型的参数 θ \theta θ

  • 梯度下降法 是一种常用的优化算法,基于损失函数的导数(梯度)来更新参数 θ \theta θ
  • 导数 给出了损失函数在某点的变化率。通过计算损失函数对 θ \theta θ 的导数,我们可以知道在当前参数设置下,如何调整 θ \theta θ 才能减小损失。

因此,正是因为损失函数 可微,我们才能通过 计算导数(梯度) 来更新参数,使损失函数逐步减小,从而找到使得损失最小的最优参数 θ \theta θ

2.3 参数调整的过程

假设损失函数 J ( θ ) J(\theta) J(θ) 是可微的,那么我们可以对 J ( θ ) J(\theta) J(θ) 求导,得到梯度 ∇ J ( θ ) \nabla J(\theta) J(θ),即损失函数对参数 θ \theta θ 的导数。梯度指向的是损失函数增长最快的方向,所以我们在更新参数时,按照 梯度下降 的思路,沿着梯度的反方向调整参数 θ \theta θ

更新过程如下:

θ : = θ − α ∇ J ( θ ) \theta := \theta - \alpha \nabla J(\theta) θ:=θαJ(θ)

其中:

  • θ \theta θ 是模型的参数向量。
  • α \alpha α 是学习率,控制每次参数更新的步长。
  • ∇ J ( θ ) \nabla J(\theta) J(θ) 是损失函数 J ( θ ) J(\theta) J(θ) 对参数 θ \theta θ 的导数。

2.4 可微性对梯度下降的影响

如果损失函数不可微(例如有尖锐的拐角),那么在这些不可微的点上,导数不存在,梯度无法计算,梯度下降法就无法正常工作。正因为损失函数是 可微的,我们才能用梯度下降法进行优化,调整参数使得损失最小化。

例子:

均方误差(MSE)损失函数是可微的。它的定义为:

J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta) = \frac{1}{2m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})^2 J(θ)=2m1i=1m(hθ(x(i))y(i))2

θ \theta θ 求导后,可以得到损失函数的梯度。通过梯度下降法,我们可以根据梯度信息调整 θ \theta θ 使损失逐步减小,最终找到最优解。

总结

  • 可微性 确保了我们可以对损失函数进行求导,而 导数(梯度) 是优化算法中用于调整参数的关键。
  • 正因为损失函数 可微,我们才能通过梯度下降等基于导数的优化方法,逐步调整参数 θ \theta θ,以最小化损失函数。
  • 在机器学习的模型训练中,损失函数的可微性是梯度下降法等优化算法能够有效工作的前提条件。

3. 可微性与均方误差(MSE)的证明

3.1 为什么要假设损失函数是可微的?

在机器学习中,尤其是在优化问题中,通常我们希望损失函数是 可微的,因为这意味着可以使用基于梯度的优化方法,如梯度下降法

可微性让我们能够通过计算损失函数的梯度调整模型参数 θ \theta θ,从而找到使得损失函数最小化的参数值。

3.2 损失函数不一定是 MSE

损失函数可以有多种形式,并不局限于 均方误差(Mean Squared Error, MSE)。例如,绝对误差(Mean Absolute Error, MAE)、交叉熵损失(Cross-Entropy Loss)等都是常见的损失函数。

  • MSE 是回归问题中常用的损失函数。
  • MAE 在某些情况下更适合处理异常值。
  • 交叉熵损失 在分类问题中使用较多,尤其是在神经网络的分类任务中。

3.3 MSE 是可微的吗?

是的,均方误差(MSE)可微的,它具有良好的平滑性,并且在整个定义域上都是连续可微的。接下来我们来证明这一点。

3.4.1. 均方误差 (MSE) 的定义

MSE 是回归模型中常用的损失函数,定义为:

J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta) = \frac{1}{2m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)})^2 J(θ)=2m1i=1m(hθ(x(i))y(i))2

其中:

  • m m m 是样本数。
  • h θ ( x ( i ) ) h_\theta(x^{(i)}) hθ(x(i)) 是模型的预测值,它是输入样本 x ( i ) x^{(i)} x(i) 在参数 ( θ \theta θ ) 下的预测结果。对于线性回归模型,预测值表示为:

h θ ( x ( i ) ) = θ T x ( i ) h_\theta(x^{(i)}) = \theta^T x^{(i)} hθ(x(i))=θTx(i)

  • y ( i ) y^{(i)} y(i) 是第 i i i 个样本的实际值。
  • θ \theta θ 是我们要优化的参数。

这里的 2 被放在分母是为了在后面推导梯度时使得计算更简洁,但不影响结果的本质。

3.4.2. 可微性证明

为了证明 MSE 是可微的,我们需要对损失函数 J ( θ ) J(\theta) J(θ) 关于参数 θ \theta θ 求偏导数。首先,我们明确一下 i i i j j j 分别代表什么:

  • i i i 表示样本的索引,取值范围是 1 1 1 m m m,对应 m m m个样本。
    - j j j表示参数的索引,取值范围是 1 1 1 n n n ,对应参数向量 θ \theta θ 的每一个维度。也就是说, j j j 是我们对参数 θ j \theta_j θj 求偏导的目标。

3.4.3. 梯度推导过程

现在,我们需要对 J ( θ ) J(\theta) J(θ) θ j \theta_j θj 的偏导数。

首先,重写 J ( θ ) J(\theta) J(θ)的表达式:

J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta) = \frac{1}{2m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)})^2 J(θ)=2m1i=1m(hθ(x(i))y(i))2

记住,预测函数 h θ ( x ( i ) ) = θ T x ( i ) h_\theta(x^{(i)}) = \theta^T x^{(i)} hθ(x(i))=θTx(i) 。接下来,我们对 θ j \theta_j θj 求导,使用链式法则,先求整体平方部分的导数,再求内部 h θ ( x ( i ) ) h_\theta(x^{(i)}) hθ(x(i)) θ j \theta_j θj 的导数:

∂ J ( θ ) ∂ θ j = 1 2 m ∑ i = 1 m 2 ( h θ ( x ( i ) ) − y ( i ) ) ⋅ ∂ h θ ( x ( i ) ) ∂ θ j \frac{\partial J(\theta)}{\partial \theta_j} = \frac{1}{2m} \sum_{i=1}^{m} 2(h_\theta(x^{(i)}) - y^{(i)}) \cdot \frac{\partial h_\theta(x^{(i)})}{\partial \theta_j} θjJ(θ)=2m1i=1m2(hθ(x(i))y(i))θjhθ(x(i))

其中, 2 2 2 1 2 \frac{1}{2} 21 相互抵消,简化为:

∂ J ( θ ) ∂ θ j = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) ⋅ ∂ h θ ( x ( i ) ) ∂ θ j \frac{\partial J(\theta)}{\partial \theta_j} = \frac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot \frac{\partial h_\theta(x^{(i)})}{\partial \theta_j} θjJ(θ)=m1i=1m(hθ(x(i))y(i))θjhθ(x(i))

接下来,我们需要求 h θ ( x ( i ) ) h_\theta(x^{(i)}) hθ(x(i)) θ j \theta_j θj 的偏导数。注意到 h θ ( x ( i ) ) = θ T x ( i ) = ∑ k = 1 n θ k x k ( i ) h_\theta(x^{(i)}) = \theta^T x^{(i)} = \sum_{k=1}^{n} \theta_k x_k^{(i)} hθ(x(i))=θTx(i)=k=1nθkxk(i),其中 x k ( i ) x_k^{(i)} xk(i)是第 i i i 个样本的第 k k k 个特征。根据导数规则, ∂ h θ ( x ( i ) ) ∂ θ j = x j ( i ) \frac{\partial h_\theta(x^{(i)})}{\partial \theta_j} = x_j^{(i)} θjhθ(x(i))=xj(i),即第 i i i 个样本的第 j j j 个特征。

因此,梯度表达式可以进一步简化为:

∂ J ( θ ) ∂ θ j = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) ⋅ x j ( i ) \frac{\partial J(\theta)}{\partial \theta_j} = \frac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)} θjJ(θ)=m1i=1m(hθ(x(i))y(i))xj(i)

3.4.4. 梯度解释

上面的公式表示,损失函数 J ( θ ) J(\theta) J(θ) 关于参数 θ j \theta_j θj 的偏导数,等于所有样本的预测误差 ( h θ ( x ( i ) ) − y ( i ) ) (h_\theta(x^{(i)}) - y^{(i)}) (hθ(x(i))y(i)) 和对应的特征 x j ( i ) x_j^{(i)} xj(i)的乘积之和,再除以样本数 m m m 。这个公式给出的是 梯度,表示损失函数随着参数 θ j \theta_j θj 的变化情况。

对于所有参数 θ j \theta_j θj j = 1 , 2 , . . . , n j = 1, 2, ..., n j=1,2,...,n),可以通过类似的方式求出偏导,然后利用梯度下降法来更新参数。

3.4. 5. 梯度下降的参数更新

在梯度下降中,我们根据梯度的方向调整参数,使得损失函数逐渐减小。参数更新的公式为:

θ j : = θ j − α ⋅ ∂ J ( θ ) ∂ θ j \theta_j := \theta_j - \alpha \cdot \frac{\partial J(\theta)}{\partial \theta_j} θj:=θjαθjJ(θ)

其中:

  • α \alpha α 是学习率,控制每次参数更新的步长。
  • ∂ J ( θ ) ∂ θ j \frac{\partial J(\theta)}{\partial \theta_j} θjJ(θ) 是损失函数关于 θ j \theta_j θj 的偏导数(即前面推导的梯度)。

总结

  • i i i 是样本的索引,表示我们在计算损失和梯度时考虑的第 i i i 个样本。
  • j j j 是参数的索引,表示我们对第 j j j个参数 θ j \theta_j θj 求偏导数。
  • MSE 是可微的,并且通过计算梯度,可以使用梯度下降法更新参数,使损失函数趋于最小,从而找到最优参数。
3.4.6.1. 批量梯度下降(Batch Gradient Descent)

在批量梯度下降中,梯度的更新公式为:

θ j : = θ j − α ⋅ 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) ⋅ x j ( i ) \theta_j := \theta_j - \alpha \cdot \frac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)} θj:=θjαm1i=1m(hθ(x(i))y(i))xj(i)

每次计算梯度时,需要使用整个数据集进行计算。对于大型数据集,梯度的计算过程非常耗时,因此训练时间会很长,特别是在样本量巨大的情况下。

优点

  • 由于每次计算都考虑了所有样本,梯度下降的方向非常精确,收敛过程较为稳定。

缺点

  • 每次更新参数都需要遍历整个数据集,计算代价大,尤其是当数据集非常大时,训练速度非常慢。
3.4.6.2. 随机梯度下降(Stochastic Gradient Descent, SGD)

为了解决批量梯度下降中每次都需要计算所有样本的问题,随机梯度下降(SGD)每次仅使用一个样本来更新参数。公式为:

θ j : = θ j − α ⋅ ( h θ ( x ( i ) ) − y ( i ) ) ⋅ x j ( i ) \theta_j := \theta_j - \alpha \cdot (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)} θj:=θjα(hθ(x(i))y(i))xj(i)

其中 i i i 是随机选择的某个样本的索引。由于每次更新只使用一个样本,计算速度会比批量梯度下降快得多。

优点

  • 每次只使用一个样本计算梯度,计算代价低,更新速度快,适合处理大规模数据集。
  • 可以更快地逃离局部最优解,因为它引入了随机性。

缺点

  • 由于每次计算的梯度基于单个样本,可能会导致梯度更新方向并不稳定,参数更新有时会向着错误的方向前进,因此收敛的过程会显得不平稳。
  • 虽然更新速度快,但收敛过程可能需要更多的迭代次数。
3.4.6. 3. 小批量梯度下降(Mini-batch Gradient Descent)

小批量梯度下降介于批量梯度下降和随机梯度下降之间,它每次使用一小部分样本(称为小批量,Mini-batch)来计算梯度并更新参数。更新公式为:

θ j : = θ j − α ⋅ 1 b ∑ i = 1 b ( h θ ( x ( i ) ) − y ( i ) ) ⋅ x j ( i ) \theta_j := \theta_j - \alpha \cdot \frac{1}{b} \sum_{i=1}^{b} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)} θj:=θjαb1i=1b(hθ(x(i))y(i))xj(i)

其中 b b b 是小批量的大小,通常是 32、64 或 128 这样的数字。

优点

  • 平衡了批量梯度下降和随机梯度下降的优缺点:小批量更新既有较快的计算速度,又比 SGD 稳定,梯度的波动性较小。
  • 对现代硬件(如 GPU)友好,可以进行并行计算。

缺点

  • 小批量的选择需要精心调整,过小的小批量会导致类似于 SGD 的不稳定性,而过大的小批量又会接近批量梯度下降的高计算成本。
3.4.6. 4. 各种方法的比较总结
  • 批量梯度下降:每次计算梯度都考虑所有样本,收敛过程稳定,但计算代价大,适合较小的数据集。
  • 随机梯度下降(SGD):每次计算梯度只考虑一个样本,计算速度快,但收敛过程不稳定,适合大数据集。
  • 小批量梯度下降:介于二者之间,计算速度较快且收敛过程相对平稳,常用在现代深度学习训练中。
3.4.6.5 示例

假设我们有一个数据集,有 1000 个样本,每个样本有 10 个特征:

  • 批量梯度下降:每次更新参数时,需要遍历 1000 个样本,计算 1000 次预测,代价较大。
  • 随机梯度下降(SGD):每次更新参数时,只需要使用 1 个样本,计算 1 次预测,代价极小,但更新过程不稳定。
  • 小批量梯度下降:设定小批量大小为 64,每次更新参数时,使用 64 个样本,计算 64 次预测,兼具较快的速度和较好的稳定性。

3.5. 为什么 MSE 可微?

从数学上来说,MSE 是由二次方项构成的函数,而二次函数是连续且在整个定义域上可微的。具体来说, ( h θ ( x ( i ) ) − y ( i ) ) 2 (h_\theta(x^{(i)}) - y^{(i)})^2 (hθ(x(i))y(i))2 是一个二次函数,对参数 θ \theta θ 来说,它在整个定义域上是光滑且可微的。因此,MSE 是可微的。

3.6. 结论

  • 损失函数 不一定是 MSE,有多种损失函数可以选择,但可微性通常是选择损失函数的重要考虑因素之一。
  • MSE 是一个常用的损失函数,尤其是在回归问题中,它不仅 可微,而且在优化过程中易于处理。
  • 我们已经证明了 MSE θ \theta θ 可微,这也是为什么可以用基于梯度的优化方法(如梯度下降)来优化 MSE。

4. 用矩阵的方式求取MSE的梯度

4.1. 标量形式的损失函数

在线性回归中,假设有 m m m 个样本,每个样本有 n n n 个特征。给定一个线性模型,模型的预测值为:

h θ ( x ( i ) ) = θ T x ( i ) h_\theta(x^{(i)}) = \theta^T x^{(i)} hθ(x(i))=θTx(i)

损失函数使用 均方误差(MSE),定义为:

J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta) = \frac{1}{2m} \sum_{i=1}^m \left( h_\theta(x^{(i)}) - y^{(i)} \right)^2 J(θ)=2m1i=1m(hθ(x(i))y(i))2

其中:

  • x ( i ) x^{(i)} x(i) 是第 i i i 个样本的特征向量,
  • y ( i ) y^{(i)} y(i) 是第 i i i 个样本的标签,
  • h θ ( x ( i ) ) h_\theta(x^{(i)}) hθ(x(i)) 是模型的预测值。

这里的 1 2 m \frac{1}{2m} 2m1 是为了将损失归一化到每个样本,这样无论数据集的大小如何,损失值的量级都保持一致。这样可以避免当数据集增大时损失函数值也随之变大,便于优化和比较。比如,如果没有 m 这个平均化因子,在大数据集上损失值会显得非常大,而在小数据集上损失值会很小,但实际上两者的误差程度可能是相同的。因此我们通常通过平均化来保持一致性。 1 2 \frac{1}{2} 21 是为了方便后续推导(消除求导时产生的 2)。

4.2 矩阵形式的损失函数

为了简化表示,我们可以将所有的输入样本和标签放入矩阵中,进行矩阵运算。

  • X X X 是一个 m × n m \times n m×n 的矩阵,代表 m m m 个样本,每个样本有 n n n 个特征,
  • θ \theta θ n × 1 n \times 1 n×1 的参数向量,
  • y y y m × 1 m \times 1 m×1 的标签向量。

在矩阵表示中,模型的预测值可以用 X θ X \theta 表示,预测误差则是 X θ − y X \theta - y y,即模型预测值与实际标签的差。

因此,目标函数的矩阵形式为:

J ( θ ) = 1 2 ( X θ − y ) T ( X θ − y ) J(\theta) = \frac{1}{2} (X \theta - y)^T (X \theta - y) J(θ)=21(y)T(y)

4.3. 矩阵形式与标量形式的转换

这里的矩阵形式和标量形式本质上是一样的。它们描述的都是相同的损失函数,区别只在于计算方式和表示形式。我们将标量求和形式转换为矩阵乘法形式,可以更高效地计算损失,特别是在处理大规模数据时。

a. 标量形式中的 m m m 为什么不见了?

在标量形式中,我们使用了 1 2 m \frac{1}{2m} 2m1 作为均方误差的归一化因子,因为我们对每个样本的误差进行了求和,并对其取平均。

但是在矩阵形式下,如果我们需要保持与标量形式一致的损失函数,也可以在矩阵形式的目标函数前加上 1 m \frac{1}{m} m1,这样可以得到:

J ( θ ) = 1 2 m ( X θ − y ) T ( X θ − y ) J(\theta) = \frac{1}{2m} (X \theta - y)^T (X \theta - y) J(θ)=2m1(y)T(y)

这个形式和标量形式完全一致。

b. 不加 1 m \frac{1}{m} m1 的情况

在某些理论推导或数学简化过程中,研究者或工程师可能省略了 1 m \frac{1}{m} m1,因为它不会影响参数的优化过程。例如,在梯度下降等优化算法中, m m m 只是一个常数,加入或省略它不会影响最终的参数更新方向。

不过,在实际计算损失时,特别是在需要跟踪和比较损失值的场景下,还是会保留 1 m \frac{1}{m} m1 来计算每个样本的平均损失。

4.4 线性回归目标函数推导过程

1. 目标函数 J ( θ ) J(\theta) J(θ)

在矩阵形式下,假设所有的输入 x x x 组成一个矩阵 X X X,标签组成一个向量 y y y,模型的参数是向量 θ \theta θ,那么目标函数可以写成:

J ( θ ) = 1 2 ( X θ − y ) T ( X θ − y ) J(\theta) = \frac{1}{2} (X \theta - y)^T (X \theta - y) J(θ)=21(y)T(y)

这里使用了矩阵乘法的简写形式,方便后续的推导。

2. 目标函数的求偏导

a.

我们首先展开目标函数 J ( θ ) J(\theta) J(θ)
J ( θ ) = 1 2 ( X θ − y ) T ( X θ − y ) = 1 2 ( θ T X T X θ − 2 θ T X T y + y T y ) J(\theta) = \frac{1}{2} (X \theta - y)^T (X \theta - y) = \frac{1}{2} (\theta^TX^TX\theta-2\theta^TX^Ty+y^Ty) J(θ)=21(y)T(y)=21(θTXT2θTXTy+yTy)

y T X θ y^T X \theta yT θ T X T y \theta^T X^T y θTXTy 是相等的。这是因为矩阵乘法具有某些性质,尤其是当它们产生标量(单个数值)时,二者等价。

b.

为了找到最优的参数 θ \theta θ,我们需要对目标函数 J ( θ ) J(\theta) J(θ) 求偏导,使其最小化。通过对矩阵形式的目标函数进行求导:

∇ θ J ( θ ) = ∇ θ ( 1 2 ( X θ − y ) T ( X θ − y ) ) \nabla_\theta J(\theta) = \nabla_\theta \left( \frac{1}{2} (X \theta - y)^T (X \theta - y) \right) θJ(θ)=θ(21(y)T(y))

这个过程的关键是将导数作用到 θ \theta θ 上。这里面有两个部分:

  1. θ T X T X θ \theta^T X^T X \theta θTXT 的导数是 2 X T X θ 2X^T X \theta 2XT
    • 这里使用了矩阵导数的一个重要公式: ∂ ∂ θ ( θ T A θ ) = 2 A θ \frac{\partial}{\partial \theta} \left( \theta^T A \theta \right) = 2A \theta θ(θTAθ)=2Aθ,其中 A A A 是一个对称矩阵(在这里, A = X T X A = X^T X A=XTX 是对称矩阵)。
  2. y T X θ y^T X \theta yT 的导数是 X T y X^T y XTy
    • 这个项是 θ \theta θ 的线性项,其导数直接是 X T y X^T y XTy

最终得到的结果是:

∇ θ J ( θ ) = X T X θ − X T y \nabla_\theta J(\theta) = X^T X \theta - X^T y θJ(θ)=XTXTy

3. 使偏导为0

为了找到最优的参数 θ \theta θ,我们让梯度等于0:

X T X θ − X T y = 0 X^T X \theta - X^T y = 0 XTXTy=0

从这里我们可以解出 θ \theta θ 的解析解:

θ = ( X T X ) − 1 X T y \theta = (X^T X)^{-1} X^T y θ=(XTX)1XTy

这就是 线性回归的正规方程解。它表示了通过最小化目标函数 J ( θ ) J(\theta) J(θ),我们可以直接计算出最优的参数 θ \theta θ

总结

这个推导过程展示了通过矩阵形式的最小二乘法求解线性回归的参数。通过矩阵运算将目标函数简化为一个可以直接求解的方程,避免了使用梯度下降等迭代方法。这个解析解能够快速、直接地找到最优参数。

5. 矩阵导数的证明 – θ T X T X θ \theta^T X^T X \theta θTXT 的导数是 2 X T X θ 2X^T X \theta 2XT

我们现在要证明矩阵导数的一个重要公式:

∂ ∂ θ ( θ T A θ ) = 2 A θ \frac{\partial}{\partial \theta} (\theta^T A \theta) = 2A \theta θ(θTAθ)=2Aθ

其中, A A A 是一个对称矩阵,即 A = A T A = A^T A=AT

5.1. 矩阵导数公式的背景

这个公式在机器学习和优化中非常常见,特别是在计算二次形式(如线性回归中的目标函数)时。我们要计算的是一个二次形式 θ T A θ \theta^T A \theta θTAθ 对向量 θ \theta θ 的导数,最后的结果表明该导数是 2 A θ 2A \theta 2Aθ

二次形式的定义

二次形式 θ T A θ \theta^T A \theta θTAθ 是关于 θ \theta θ 的一个二次表达式,其中 A A A 是一个 n × n n \times n n×n 的矩阵, θ \theta θ 是一个 n × 1 n \times 1 n×1 的向量。展开这个二次形式:

θ T A θ = ∑ i = 1 n ∑ j = 1 n θ i A i j θ j \theta^T A \theta = \sum_{i=1}^n \sum_{j=1}^n \theta_i A_{ij} \theta_j θTAθ=i=1nj=1nθiAijθj

我们要对 θ \theta θ 求导。

5.2. 证明步骤

为了证明公式 ∂ ∂ θ ( θ T A θ ) = 2 A θ \frac{\partial}{\partial \theta} (\theta^T A \theta) = 2A \theta θ(θTAθ)=2Aθ,我们可以使用直接求导的方法。

a. 将 θ T A θ \theta^T A \theta θTAθ 展开

首先,我们将 θ T A θ \theta^T A \theta θTAθ 写成标量的和:

θ T A θ = ∑ i = 1 n ∑ j = 1 n θ i A i j θ j \theta^T A \theta = \sum_{i=1}^n \sum_{j=1}^n \theta_i A_{ij} \theta_j θTAθ=i=1nj=1nθiAijθj

对于矩阵 A A A 中的每一个元素 A i j A_{ij} Aij,你会取 θ i \theta_i θi θ j \theta_j θj 作为系数,分别乘以 A i j A_{ij} Aij,然后将所有这些乘积求和。
这个展开公式清楚地展示了二次型表达式中的每一项是如何构成的,矩阵 A A A 的每一个元素都与 θ \theta θ 的两个不同元素进行配对相乘。

b. 对 θ k \theta_k θk 求导 – 偏导数求导

现在我们对每个 θ k \theta_k θk 求导。记住, θ T A θ \theta^T A \theta θTAθ θ i \theta_i θi θ j \theta_j θj 的二次项,所以我们需要分别考虑 i = k i = k i=k j = k j = k j=k 的情况。根据链式法则,对 θ k \theta_k θk 求导时:

∂ ∂ θ k ∑ i = 1 n ∑ j = 1 n θ i A i j θ j = ∑ j = 1 n A k j θ j + ∑ i = 1 n θ i A i k \frac{\partial}{\partial \theta_k} \sum_{i=1}^n \sum_{j=1}^n \theta_i A_{ij} \theta_j = \sum_{j=1}^n A_{kj} \theta_j + \sum_{i=1}^n \theta_i A_{ik} θki=1nj=1nθiAijθj=j=1nAkjθj+i=1nθiAik

i = k i = k i=k 时, θ k \theta_k θk 出现在 θ i A i j θ j \theta_i A_{ij} \theta_j θiAijθj 中;同样地,当 j = k j = k j=k 时, θ k \theta_k θk 也出现在 θ i A i j θ j \theta_i A_{ij} \theta_j θiAijθj 中。因此,整个表达式可以分解为:

∂ ∂ θ k ∑ i = 1 n ∑ j = 1 n θ i A i j θ j = ∑ j = 1 n A k j θ j + ∑ i = 1 n θ i A i k \frac{\partial}{\partial \theta_k} \sum_{i=1}^n \sum_{j=1}^n \theta_i A_{ij} \theta_j = \sum_{j=1}^n A_{kj} \theta_j + \sum_{i=1}^n \theta_i A_{ik} θki=1nj=1nθiAijθj=j=1nAkjθj+i=1nθiAik
注意,由于 A A A 是对称矩阵,即 A k j = A j k A_{kj} = A_{jk} Akj=Ajk,所以上式可以合并为:

∂ ∂ θ k ( θ T A θ ) = 2 ∑ j = 1 n A k j θ j \frac{\partial}{\partial \theta_k} (\theta^T A \theta) = 2 \sum_{j=1}^n A_{kj} \theta_j θk(θTAθ)=2j=1nAkjθj

将其表示为矩阵形式,我们可以写成:

∂ ∂ θ ( θ T A θ ) = 2 A θ \frac{\partial}{\partial \theta} (\theta^T A \theta) = 2A \theta θ(θTAθ)=2Aθ

这就证明了我们需要的矩阵导数公式。

5.3. 对称矩阵的使用

上面推导过程中使用了 A A A 是对称矩阵的性质。对于一个一般的矩阵 A A A θ T A θ \theta^T A \theta θTAθ 的导数为:

∂ ∂ θ ( θ T A θ ) = A θ + A T θ \frac{\partial}{\partial \theta} (\theta^T A \theta) = A \theta + A^T \theta θ(θTAθ)=Aθ+ATθ

但当 A A A 是对称矩阵时(即 A = A T A = A^T A=AT),这两个项是相同的,因此结果为 2 A θ 2A \theta 2Aθ

5.4. 直观解释

θ T A θ \theta^T A \theta θTAθ 是一个关于 θ \theta θ 的二次表达式。求导的过程类似于对一个二次函数求导。就像标量函数 f ( x ) = a x 2 f(x) = ax^2 f(x)=ax2 x x x 的导数是 2 a x 2ax 2ax,矩阵二次形式 θ T A θ \theta^T A \theta θTAθ θ \theta θ 的导数也是类似的,结果是 2 A θ 2A \theta 2Aθ

总结

我们证明了以下矩阵导数公式:

∂ ∂ θ ( θ T A θ ) = 2 A θ \frac{\partial}{\partial \theta} (\theta^T A \theta) = 2A \theta θ(θTAθ)=2Aθ

其中 A A A 是对称矩阵。这个公式在机器学习和优化中被广泛应用,尤其是在计算二次目标函数的梯度时。如果你还有其他问题,欢迎继续讨论!

6. 二次型 θ T A θ \theta^T A \theta θTAθ 的展开证明

6.1. 二次型的矩阵乘法步骤

我们将 θ T A θ \theta^T A \theta θTAθ 逐步展开:

θ T A θ = [ θ 1 θ 2 … θ n ] [ A 11 A 12 … A 1 n A 21 A 22 … A 2 n ⋮ ⋮ ⋱ ⋮ A n 1 A n 2 … A n n ] [ θ 1 θ 2 ⋮ θ n ] \theta^T A \theta = \begin{bmatrix} \theta_1 & \theta_2 & \dots & \theta_n \end{bmatrix} \begin{bmatrix} A_{11} & A_{12} & \dots & A_{1n} \\ A_{21} & A_{22} & \dots & A_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ A_{n1} & A_{n2} & \dots & A_{nn} \end{bmatrix} \begin{bmatrix} \theta_1 \\ \theta_2 \\ \vdots \\ \theta_n \end{bmatrix} θTAθ=[θ1θ2θn] A11A21An1A12A22An2A1nA2nAnn θ1θ2θn

6.2. 逐步展开

  1. 计算 θ T A \theta^T A θTA,其结果是一个 1 × n 1 \times n 1×n 的行向量。第 i i i 项为:

∑ k = 1 n θ k A k i \sum_{k=1}^n \theta_k A_{ki} k=1nθkAki

因此:

θ T A = [ ∑ k = 1 n θ k A k 1 ∑ k = 1 n θ k A k 2 … ∑ k = 1 n θ k A k n ] \theta^T A = \begin{bmatrix} \sum_{k=1}^n \theta_k A_{k1} & \sum_{k=1}^n \theta_k A_{k2} & \dots & \sum_{k=1}^n \theta_k A_{kn} \end{bmatrix} θTA=[k=1nθkAk1k=1nθkAk2k=1nθkAkn]

  1. 再乘以列向量 θ \theta θ,最终结果为标量:

θ T A θ = ∑ i = 1 n ( ∑ k = 1 n θ k A k i ) θ i \theta^T A \theta = \sum_{i=1}^n \left( \sum_{k=1}^n \theta_k A_{ki} \right) \theta_i θTAθ=i=1n(k=1nθkAki)θi

6.3. 化简为双重求和

将上式化简为双重求和形式:

θ T A θ = ∑ i = 1 n ∑ j = 1 n θ i A i j θ j \theta^T A \theta = \sum_{i=1}^n \sum_{j=1}^n \theta_i A_{ij} \theta_j θTAθ=i=1nj=1nθiAijθj

这个表达式表示对于每一对 θ i \theta_i θi θ j \theta_j θj,通过矩阵 A A A 的元素 A i j A_{ij} Aij 进行配对相乘并求和。

6.4. 数学解释

  • ∑ i = 1 n ∑ j = 1 n θ i A i j θ j \sum_{i=1}^n \sum_{j=1}^n \theta_i A_{ij} \theta_j i=1nj=1nθiAijθj 说明矩阵 A A A 中的每个元素 A i j A_{ij} Aij 通过 θ i \theta_i θi θ j \theta_j θj 相互作用。
  • 每个 A i j A_{ij} Aij 表示矩阵 A A A 的第 i i i 行和第 j j j 列的元素。
  • θ i \theta_i θi θ j \theta_j θj θ \theta θ 向量中的元素,分别与 A i j A_{ij} Aij 相乘后求和。

7. 什么是偏导数?-- 偏导数求导的意义

当我们处理多变量函数时(比如有多个变量 θ 1 , θ 2 , … , θ n \theta_1, \theta_2, \dots, \theta_n θ1,θ2,,θn),我们可以计算每个变量对整个函数的影响。这就是偏导数的概念。

偏导数 是指我们固定其它变量不变,仅仅改变一个变量,然后观察函数值如何随着这个变量的变化而变化。

在数学上,偏导数的定义是:对一个多变量函数 f ( x 1 , x 2 , … , x n ) f(x_1, x_2, \dots, x_n) f(x1,x2,,xn),其关于变量 x i x_i xi 的偏导数,记作 ∂ f ∂ x i \frac{\partial f}{\partial x_i} xif,表示保持其他变量不变,仅对 x i x_i xi 这个变量进行求导。

举个例子,假设有一个函数 f ( x , y ) = x 2 + x y f(x, y) = x^2 + xy f(x,y)=x2+xy

  • x x x 求偏导数时,我们固定 y y y 不变,看函数值随着 x x x 变化的变化率:

    ∂ f ∂ x = 2 x + y \frac{\partial f}{\partial x} = 2x + y xf=2x+y

  • y y y 求偏导数时,我们固定 x x x 不变,看函数值随着 y y y 变化的变化率:

    ∂ f ∂ y = x \frac{\partial f}{\partial y} = x yf=x

7.1. 优化问题中的偏导数

在优化问题中,我们的目标是找到使目标函数(例如 θ T A θ \theta^T A \theta θTAθ)最小化或最大化的变量组合 θ 1 , θ 2 , … , θ n \theta_1, \theta_2, \dots, \theta_n θ1,θ2,,θn

对于每个 θ i \theta_i θi 来说,偏导数表示如果只调整 θ i \theta_i θi,目标函数会如何变化。通过求偏导数,我们可以知道如何调整
θ i \theta_i θi 来使目标函数减小。

梯度 是由所有偏导数组成的向量,表示所有变量的变化方向。通过计算梯度,我们可以知道每个 θ i \theta_i θi 在函数中起的作用。

当所有偏导数都为 0 时,意味着在所有方向上,函数值都不会再变化,这通常意味着我们找到了一个极值点(最小值或最大值)。

7.2. θ 1 , θ 2 , … , θ n \theta_1, \theta_2, \dots, \theta_n θ1,θ2,,θn 是变量

在多变量优化问题中, θ = [ θ 1 , θ 2 , … , θ n ] T \theta = [\theta_1, \theta_2, \dots, \theta_n]^T θ=[θ1,θ2,,θn]T 是一个向量,每个 θ i \theta_i θi 都是一个独立的变量。我们需要分别计算每个 θ i \theta_i θi 对目标函数的影响。

在表达式 θ T A θ \theta^T A \theta θTAθ 中, θ 1 , θ 2 , … , θ n \theta_1, \theta_2, \dots, \theta_n θ1,θ2,,θn 都是变量,我们可以分别对它们求偏导数,以找到函数最优解(即使目标函数最小的点)。

8. 线性形式 a T θ a^T \theta aTθ 的导数推导 – y T X θ y^T X \theta yT求导

8.1. 线性形式 a T θ a^T \theta aTθ 的导数

假设我们有一个线性形式:

f ( θ ) = a T θ f(\theta) = a^T \theta f(θ)=aTθ

其中:

  • a a a 是一个 n × 1 n \times 1 n×1 的向量,
  • θ \theta θ 是一个 n × 1 n \times 1 n×1 的向量,
  • a T θ a^T \theta aTθ 是标量。

现在我们需要对向量 θ \theta θ 求导,求出 ∂ f ( θ ) ∂ θ \frac{\partial f(\theta)}{\partial \theta} θf(θ)

8.1.1. 逐元素展开

我们可以将 a T θ a^T \theta aTθ 展开为:

a T θ = ∑ i = 1 n a i θ i a^T \theta = \sum_{i=1}^{n} a_i \theta_i aTθ=i=1naiθi

这个和式是 a a a θ \theta θ 的内积,结果是一个标量。

8.1.2. 对 θ \theta θ 求导

现在,我们对向量 θ \theta θ 中的每个分量 θ i \theta_i θi 求偏导数。因为这是一个标量函数的求导,我们会得到向量形式的结果。根据标量求导的规则:

∂ ∂ θ i ( ∑ j = 1 n a j θ j ) = a i \frac{\partial}{\partial \theta_i} \left( \sum_{j=1}^{n} a_j \theta_j \right) = a_i θi(j=1najθj)=ai

因此,对 θ \theta θ 求导数的结果是向量 a a a,即:

∂ ∂ θ ( a T θ ) = a \frac{\partial}{\partial \theta} \left( a^T \theta \right) = a θ(aTθ)=a

8.2. 应用到 y T X θ y^T X \theta yT 的情况

现在我们回到你的例子: y T X θ y^T X \theta yT

8.2.1. 将 y T X θ y^T X \theta yT 转化为线性形式

首先,注意到 y T X θ y^T X \theta yT 也是一个线性形式,其中:

  • y y y 是一个 m × 1 m \times 1 m×1 的向量,
  • X X X 是一个 m × n m \times n m×n 的矩阵,
  • θ \theta θ 是一个 n × 1 n \times 1 n×1 的向量。

我们可以将 y T X θ y^T X \theta yT 看作是 θ \theta θ 的线性形式,其中 a T = y T X a^T = y^T X aT=yTX。因此, y T X θ y^T X \theta yT 是关于 θ \theta θ 的线性形式。

8.2.2. 直接应用公式

根据之前的推导,对于线性形式 a T θ a^T \theta aTθ,其导数是 a a a。在这里, a T = y T X a^T = y^T X aT=yTX,所以 a = X T y a = X^T y a=XTy

因此,对 y T X θ y^T X \theta yT 进行导数的结果是:

∂ ∂ θ ( y T X θ ) = X T y \frac{\partial}{\partial \theta} \left( y^T X \theta \right) = X^T y θ(yT)=XTy

8.3. 推导的解释

  • 线性形式 a T θ a^T \theta aTθ 的导数是向量 a a a,因为 a T θ a^T \theta aTθ θ \theta θ 中每个分量的线性组合,求导时对每个分量 θ i \theta_i θi 产生 a i a_i ai
  • y T X θ y^T X \theta yT y T X y^T X yTX 是关于 θ \theta θ 的线性形式。因此,按照矩阵导数的规则, y T X θ y^T X \theta yT θ \theta θ 的导数是 X T y X^T y XTy

8.4. 举个具体例子

假设:

  • y = [ y 1 y 2 ] y = \begin{bmatrix} y_1 \\ y_2 \end{bmatrix} y=[y1y2]
  • X = [ x 11 x 12 x 21 x 22 ] X = \begin{bmatrix} x_{11} & x_{12} \\ x_{21} & x_{22} \end{bmatrix} X=[x11x21x12x22]
  • θ = [ θ 1 θ 2 ] \theta = \begin{bmatrix} \theta_1 \\ \theta_2 \end{bmatrix} θ=[θ1θ2]

y T X θ y^T X \theta yT 是:

y T X θ = [ y 1 y 2 ] [ x 11 x 12 x 21 x 22 ] [ θ 1 θ 2 ] y^T X \theta = \begin{bmatrix} y_1 & y_2 \end{bmatrix} \begin{bmatrix} x_{11} & x_{12} \\ x_{21} & x_{22} \end{bmatrix} \begin{bmatrix} \theta_1 \\ \theta_2 \end{bmatrix} yT=[y1y2][x11x21x12x22][θ1θ2]

展开后:

y T X θ = y 1 ( x 11 θ 1 + x 12 θ 2 ) + y 2 ( x 21 θ 1 + x 22 θ 2 ) y^T X \theta = y_1(x_{11} \theta_1 + x_{12} \theta_2) + y_2(x_{21} \theta_1 + x_{22} \theta_2) yT=y1(x11θ1+x12θ2)+y2(x21θ1+x22θ2)

这就是一个线性组合。对 θ 1 \theta_1 θ1 θ 2 \theta_2 θ2 求导后,我们得到:

∂ ∂ θ 1 ( y T X θ ) = x 11 y 1 + x 21 y 2 \frac{\partial}{\partial \theta_1} (y^T X \theta) = x_{11} y_1 + x_{21} y_2 θ1(yT)=x11y1+x21y2
∂ ∂ θ 2 ( y T X θ ) = x 12 y 1 + x 22 y 2 \frac{\partial}{\partial \theta_2} (y^T X \theta) = x_{12} y_1 + x_{22} y_2 θ2(yT)=x12y1+x22y2

因此,整个导数结果是向量:

∂ ∂ θ ( y T X θ ) = [ x 11 y 1 + x 21 y 2 x 12 y 1 + x 22 y 2 ] \frac{\partial}{\partial \theta} (y^T X \theta) = \begin{bmatrix} x_{11} y_1 + x_{21} y_2 \\ x_{12} y_1 + x_{22} y_2 \end{bmatrix} θ(yT)=[x11y1+x21y2x12y1+x22y2]

这个向量正是 X T y X^T y XTy

8.5. 总结

  • a T θ a^T \theta aTθ 进行导数的结果是 a a a,这是一个常见的矩阵微积分规则。
  • y T X θ y^T X \theta yT θ \theta θ 的线性形式,类似于 a T θ a^T \theta aTθ,其中 a = X T y a = X^T y a=XTy
  • 通过这个推导,我们得出结论: y T X θ y^T X \theta yT θ \theta θ 的导数是 X T y X^T y XTy
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值