神经网络训练原理:从线性回归到梯度下降与反向传播

神经网络本质上是一系列线性变换与非线性激活函数的组合。通过多层“套娃”,这个结构能够表达极其复杂的非线性函数。我们的核心目标,就是找到网络中的权重(W)和偏置(B)参数,使得这个复杂的函数能够很好地拟合我们手中的真实数据。

那么,如何计算出这些W和B呢?我们从一个更简单的问题开始探索。

第一步:定义“好”的标准——损失函数

什么样的W和B是好的?答案很直接:能使模型预测结果尽可能接近真实数据的那一组参数就是好的。

直观上,我们可以比较预测直线与真实数据点的垂直距离。设真实值为 y,预测值为 \hat{y},那么这个差值(误差)就是 |y - \hat{y}|

为了评估整体拟合效果,我们自然想到将所有数据点的误差加起来,用它来反映模型与数据的整体差异。这个衡量误差的函数,我们称之为损失函数(Loss Function)

然而,绝对值在数学优化中并不“友好”(需要分类讨论,不够平滑)。因此,我们通常进行两项改造:

  1. 使用平方来代替绝对值,这样既平滑了函数,又放大了大误差的影响。
  2. 根据样本数量 m 求平均,以消除数据量多寡的影响。

于是,我们得到了最常用的损失函数之一——均方误差(Mean Squared Error, MSE)

L(W, B) = \frac{1}{m} \sum_{i=1}^{m} (y_i - \hat{y}_i)^2

从参数视角看,损失函数 L 就是关于 WB 的函数。我们的目标转变为:找到一组 WB,使得损失函数 L 的值最小。WB 怎么求解呢?自然就是用我们初中就学过的让其导数等于零,求极值点

第二步:从简单案例看求解思路——线性回归

考虑最简单的情况:用一个线性函数 y = Wx + B 来拟合数据。这就是线性回归

假设我们有4个样本点:(1,1), (2,2), (3,3), (4,4)。为了更简单,我们令偏置 B = 0,模型简化为 y = Wx

将数据代入均方误差公式并展开:
\begin{aligned} L(W) &= \frac{1}{4}[(1-W*1)^2 + (2-W*2)^2 + (3-W*3)^2 + (4-W*4)^2] \\ &= \frac{30}{4}(1-W)^2 \end{aligned}

看!损失函数化简后,变成了一个简单的关于 W二次函数(抛物线)。我们初中学过的知识派上用场了:W 求导,并令导数等于零,即可找到函数的最小值点

\frac{dL}{dW} = -15(1-W)
令其等于零:-15(1-W) = 0 \Rightarrow W = 1

解得 W=1,代回模型得 y=x,这正是最拟合我们数据的直线。在这个例子中,损失函数的图像是一条开口向上的抛物线,我们通过求导找到了它的最低点(极小值)。

如果考虑完整的线性模型 y = Wx + B,那么损失函数 L(W, B) 就是一个关于两个变量的二元函数。它的图像像一个三维空间中的“碗”。求解最小值需要让每个参数的偏导数都等于零

偏导数是什么?很简单:对 W 求偏导时,把 B 当成常数,像一元函数一样求导即可。几何上,这相当于固定 BW 方向上的变化率。

通过解由偏导数为零构成的方程组,我们就能找到最优的 WB。对于线性回归,这是一个可以一步到位求出解析解(精确解)的过程。

第三步:神经网络的挑战与迭代解法——梯度下降

神经网络是一个复杂的非线性函数,其对应的损失函数更是复杂无比,我们几乎无法像解线性回归那样,通过令导数等于零来直接求出最小值点(解析解)。

怎么办?人们的办法简单而有效:一点点试

假设初始参数 W=5, B=5,算出损失 L=10

  • 尝试将 W 加1变成6,发现损失降为9。说明这个调整方向正确。
  • 尝试将 B 加1变成6,发现损失升为11。说明这个调整方向错误,下次应调小 B

如此循环,每次都根据参数调整对损失的影响,将参数向使损失减小的方向调整一点点,直到损失足够小。

如何精确知道“调整的方向和幅度”?答案就是偏导数

  • \frac{\partial L}{\partial W} 表示 W 微小变化时,L 的变化率。
  • \frac{\partial L}{\partial B} 表示 B 微小变化时,L 的变化率。

我们应该让参数朝着其偏导数的反方向更新(因为导数方向是函数值增长最快的方向)。同时,用一个称为学习率(Learning Rate) 的系数 \eta 来控制每次更新的步长。

由此得到梯度下降的参数更新公式:
\begin{aligned} W &= W - \eta \cdot \frac{\partial L}{\partial W} \\ B &= B - \eta \cdot \frac{\partial L}{\partial B} \end{aligned}
所有参数的偏导数组成的向量 (\frac{\partial L}{\partial W}, \frac{\partial L}{\partial B}) 就叫做梯度(Gradient)。沿着梯度反方向下降,寻找损失函数最小值的过程,即为梯度下降法。

第四步:复杂网络中的梯度计算——链式法则与反向传播

关键问题来了:在复杂的神经网络中,损失函数对某一参数(例如第一层的 W_1)的偏导数 \frac{\partial L}{\partial W_1} 如何计算?

虽然整体函数复杂,但神经网络层与层之间的关系是清晰的。以一个极简网络为例:输入 X → 隐藏层 A = g(W_1 X + B_1) → 输出 \hat{y} = W_2 A + B_2 → 损失 L = (\hat{y} - y)^2

我们想求 \frac{\partial L}{\partial W_1}。可以这样思考:

  1. W_1 变化一点,如何影响 A?(即 \frac{\partial A}{\partial W_1}
  2. A 变化一点,如何影响 \hat{y}?(即 \frac{\partial \hat{y}}{\partial A}
  3. \hat{y} 变化一点,如何影响 L?(即 \frac{\partial L}{\partial \hat{y}}

根据微积分中的链式法则,这三者的乘积就是我们要的偏导数:
\frac{\partial L}{\partial W_1} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial A} \cdot \frac{\partial A}{\partial W_1}
这个过程可以形象地理解为“误差的反向传播”:我们从最终的损失 L 开始,从右向左,利用链式法则,将梯度一层层回传,直到第一层。

  • 前向传播:输入 X,逐层计算,得到输出 \hat{y} 和损失 L
  • 反向传播:利用链式法则,从损失 L 开始,反向计算损失对所有参数的梯度。

结合梯度下降,一次完整的训练迭代就是:

  1. 前向传播计算当前损失。
  2. 反向传播计算所有参数的梯度。
  3. 用梯度下降法更新所有参数。

神经网络通过多轮这样的迭代,参数被一点点调整,损失函数逐渐减小,最终逼近我们想要的那个能拟合数据的复杂函数。

总结回顾

  1. 目标:找到拟合数据的参数 WB
  2. 量化目标:定义损失函数,并将目标转化为最小化损失函数。
  3. 简单模型的解法:在线性回归中,可通过令(偏)导数为零直接求得解析解。
  4. 复杂模型的解法:对于神经网络,无法直接求解,转而采用梯度下降法进行迭代优化。
  5. 梯度的计算:利用链式法则,通过反向传播算法,高效计算网络中所有参数的梯度。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容