计算神经网络参数
对于参数,拟合的好才是真的好!
那么,怎么理解“拟合的好”呢?
还记得高中时学习的“残差”吗?与之类似。

如图,我们可以在每个点(真实数据)和函数之间画一条竖直的线,使之与直线相交。那么这条线的长度就是真实值和预测值之间的误差。
如果将每条线的长度加起来,便得到了最基本的“损失函数”!
不过,绝对值函数在数学优化时会带来麻烦——它在零点不可导,这会让求解过程变得困难。因此,我们可以像平时解题那样,用平方来代替绝对值。这样不仅保证了函数的光滑性,还能放大较大误差的影响。再取平均数,便有了广泛应用的"均方误差"。
均方误差L(w,b)就是损失函数的一种,它量化了模型预测与真实值之间的整体差距。损失值越小,说明模型拟合得越好!
既然我们知道了什么是“拟合的好”,那么要怎么样做,才可以拟合好呢?
很简单,想要拟合得好,就是要让损失函数最小化。在数学上,我们通常让函数的导数等于零来寻找极值点。对于多元函数的损失函数,我们需要让它的每个偏导数都等于零。
![]()
![]()
好了,现在我们知道了怎样让损失函数最小。但是,一个神经网络往往是极其复杂的,我们没有办法直接解出它导函数等于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)的偏导数
同理可以得到b对L(w,b)的偏导数
我们要做的,就是让w和b不断向偏导数的反方向变化。我们再添加一个系数来控制它们变化的快慢(这个系数就是学习率)
![]()
而这些偏导数所构成的向量
就是梯度,而这个让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的偏导数:
这就是“链式法则”(其实就是复合函数求导)
因为我们是从右向左计算的,,所以这也叫做“神经网络的反向传播”。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)