什么是梯度下降?为什么梯度下降能优化模型?

87 阅读5分钟

家人们,我准备开启一个全新的系列,来聊聊——神经网络的原理与实现。

也许你已经听过“神经网络”这个词无数次,它是深度学习的基石,是 ChatGPT、图像识别、自动驾驶背后的关键技术。但你是否真正理解过,神经网络到底是怎么“看懂”图像、听懂语言,甚至学会写代码的?这些“看似智能”的行为,背后到底发生了什么?

这个系列将从最基础的多层感知器(MLP)出发,一步步揭开神经网络的神秘面纱,带你理解:
神经网络到底是什么?它是如何“模仿人脑”的?
● 什么是梯度下降?为什么梯度下降能优化模型?
● 什么是反向传播?
● 如何用代码手写一个简单的神经网络,从0开始训练识别手写数字?

这个系列会兼顾原理解释工程实现,面向所有对 AI 感兴趣的朋友,不管你是小白入门,还是进阶学习,相信都能有所收获。

此外,所有相关源码示例、流程图、模型配置与知识库构建技巧,我也将持续更新在Github:LLMHub,欢迎关注收藏!

本篇文章是该系列的第二篇

还是拿上一篇文章中的MLP为例,首先我们将完全随机的初始化所有权重和偏差,这个网络毫无疑问在给定的训练示例上的表现会非常差,因为他只是做一些随机的事情。

接下来我们要做的就是定义一个成本函数,告诉计算机结果的好坏,从数学的角度来说,可以将每个输出激活与目标值之间的差异的平方相加,这就代表单个训练示例的成本,我们可以通过数以万计的训练示例的平均成本衡量网络的好坏。

网络本身是一个函数,从某种意义上来说,他是由所有的权重和偏置参数化的。

成本函数的复杂度更上了一个层次,是将所有的权重和偏置作为输入,并输出一个数字来描述这些权重和偏置的好坏。

仅仅让计算机知道结果好坏还不够,还要让计算机知道如何改变这些权重和偏置,使他变得更好。对于简单的函数,可以很容易的算出最小值。

但是对于复杂的函数并不总是可行,参数规模庞大的神经网络更是不行,一种更灵活的策略是从输入开始,然后找出应该采取哪个方向来降低输出,具体来说,如果可以计算出函数的斜率,斜率为正,则将输入移到左侧,斜率为负,则将输入移到右侧,重复执行此操作,将接近函数的某些局部最小值,得到哪个局部最小值取决于从哪个随机输入开始,并且不能保证是全局最小值。如果步长与斜率成正比,当斜率趋于最小值时,步长将会越来越小,有助于避免过度调整。

将函数变得复杂一些,变成一个二元函数,同样,我们要考虑往哪个方向才能找到最小值,函数的梯度正提供了最快增加的方向,梯度的负值则提供了最快减小的方向,梯度向量的长度代表最陡坡度的陡度。

对于具有13002个输入的函数,他的处理思想是相同的,我们将所有的权重w和偏置b变成一个巨大的列向量,成本函数的负梯度只是一个向量,告诉对这些所有参数往哪个方向移动可以实现成本函数最快的下降。通过我们专门设置的成本函数,改变权重和偏置来使他减小意味着在所有样本上都有更好的表现。

有效计算梯度的方法实际上是神经网络学习的核心,也就是反向传播,下一篇文章中我会介绍。这种通过负梯度的某个倍数来反复推动函数输入的过程称为梯度下降,这是一种收敛到成本函数的某个局部最小值的方法。

负梯度的每个分量都告诉我们两件事,符号告诉我们输入向量应该向上还是向下移动,更重要的是这些分量的组成部分的相对大小告诉我们哪些变化更重要。

在网络中对每一个权重的调整对成本函数的影响都是不同的,其中一些连接对我们的训练数据更为重要,所以可以形象的把梯度理解成一个识别每个权重和偏置的相对重要性的工具,也就是哪一个变化可以带来更大的收益

总结一下,我们之前介绍的MLP网络本身就是一个函数,具有784个输入和10个输出,成本函数将13002个权重和偏置作为输入,并根据训练示例得出一个糟糕程度衡量标准,成本函数的梯度告诉我们所有权重和偏置的哪些变化会导致成本函数值得最快变化。

关于深度学习和大模型相关的知识和前沿技术更新,请关注公众号算法coting!

以上内容参考

Gradient descent, how neural networks learn

非常感谢,如有侵权请联系删除!