对于参数,拟合的好才是真的好!

那么,怎么理解“拟合的好”呢?

还记得高中时学习的“残差”吗?与之类似。

如图,我们可以在每个点(真实数据)和函数之间画一条竖直的线,使之与直线相交。那么这条线的长度就是真实值和预测值之间的误差。        \left | y-\hat{y} \right |

如果将每条线的长度加起来,便得到了最基本的损失函数”!                                                                                        \sum_{i=1}^{N}\left | y_{i}-\hat{y} \right |

不过,绝对值函数在数学优化时会带来麻烦——它在零点不可导,这会让求解过程变得困难。因此,我们可以像平时解题那样,用平方来代替绝对值。这样不仅保证了函数的光滑性,还能放大较大误差的影响。再取平均数,便有了广泛应用的"均方误差"。

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​  ​​​ L(w,b)=\frac{1}{N}\sum_{i=1}^{N}(y_{i}-\hat{y})^{2}

均方误差L(w,b)就是损失函数的一种,它量化了模型预测与真实值之间的整体差距。损失值越小,说明模型拟合得越好!


既然我们知道了什么是“拟合的好”,那么要怎么样做,才可以拟合好呢?

很简单,想要拟合得好,就是要让损失函数最小化。在数学上,我们通常让函数的导数等于零来寻找极值点。对于多元函数的损失函数,我们需要让它的每个偏导数都等于零。

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​      \frac{\partial L(w,b)}{\partial w}=0                       \frac{\partial L(w,b)}{\partial b}=0                      


好了,现在我们知道了怎样让损失函数最小。但是,一个神经网络往往是极其复杂的,我们没有办法直接解出它导函数等于0时的解,怎么办呢?很简单,一点点试

想必大家都有过这样的经历,在写高考数学的导数题时(或者写真题卷时),题目要求你求函数的极值,你求出导函数时,导函数却很复杂,不好解。那么这时候你是怎么做的?是不是尝试去代入 x=0 , x=1 , x=−1 , x=e , x=1/e 等特殊值?

在神经网络中也是一样的,虽然我不会解,但我可以一点点试出来。

w 5 6 6 10
b 5 5 6 0
L(w,b) 10 9 10 0

假设 w 和 b 初始值都为 5,损失为 10。我们尝试不同的参数组合:

  • 当 w 从 5 增加到 6, b 保持 5 不变时,损失从 10 降到 9
  • 但当 b 也从 5 增加到 6 时,损失又回到 10
  • 最终我们发现当 w=10, b=0 时,损失降到了 0

通过这个过程,我们观察到:当 w 增大时,损失函数值会变小;当 b 增大时,损失函数值会变大。因此,我们应该让 w 逐渐增大,让 b 逐渐减小,直到损失函数趋近于最小值。

而w变化一点点会使损失函数变化多少,其实就是w对L(w,b)的偏导数   \frac{\partial L(w,b)}{\partial w}

同理可以得到b对L(w,b)的偏导数   \frac{\partial L(w,b)}{\partial b}

我们要做的,就是让w和b不断向偏导数的反方向变化。我们再添加一个系数来控制它们变化的快慢(这个系数就是学习率)  

        ​​​​​​​        ​​​​​​​        ​​​​​​​        w=w-\eta \frac{\partial L(w,b)}{\partial w}                   b=b-\eta \frac{\partial L(w,b)}{\partial b}

而这些偏导数所构成的向量\left ( \frac{\partial L(w,b)}{\partial w},\frac{\partial L(w,b)}{\partial b }\right )就是梯度,而这个让L(w,b)不断减小,以求出w和b的过程,就是“梯度下降”。


那么现在还有一个问题:这个偏导数应该怎么求?

神经网络的函数本身是非常复杂的,直接求导并不好求。那应该怎么办呢?

让我们回想一下神经网络的前向传播:

根据输入层x计算出隐藏层a的值,之后再根据隐藏层a计算出输出层y,然后再求出损失函数L。

以w1为例,要如何求出w1的偏导数?w1对L(w,b)的偏导数,其实就是w1变化一点点,会使损失函数变化多少,而从上图也可以看出来, w1 不能直接影响损失 L

  • w1​ 首先影响隐藏层输出 a
  • a 再影响预测值 y
  • y​ 最后影响损失 L

所以我们可以反过来,先求y对L的偏导,再一步步的得到w1的偏导数:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​                \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}}

这就是“链式法则”(其实就是复合函数求导)

因为我们是从右向左计算的,,所以这也叫做“神经网络的反向传播”。


Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐