写在前面
上周末和一位学金融的师兄吃饭回来的路上,偶然间聊到了深度学习中的梯度下降方法,于是便有了下述的对话。
师兄:为什么要沿着梯度的反方向更新参数?
我:因为我们的目标是使损失函数值最小,而梯度的方向是函数值增加最快的方向,因此要沿着梯度的反方向更新参数。
师兄:为什么梯度的方向是函数值增加最快的方向?
我:。。。
说来惭愧,本人已入门机器学习近三年了,竟连这样一个基础的问题都没有回答上来,真的需要好好面壁一段时间了。当然,面壁归面壁,问题还是需要解决的。遂查阅相关资料,寻找到一篇讲解很清晰的博文:为什么梯度反方向是函数下降最快的方向?,然后在其基础上结合高数课本以及其余的一些博文、问答,整理出自己的一些见解,并以此记录之。余在此向网络上无私分享知识的前辈表以深深的感谢!PS:下文所述内容仅为个人见解,供大家参考。若有错误或不当之处,欢迎批评指正!
一元函数的导数
仅拥有一个自变量的函数称为一元函数,简记为
![]()
。在实际生活中,人们想要了解函数
![]()
在点
![]()
处的变化率。例如,一个非匀速运动的质点在某一时刻的瞬时速度;或者一条曲线上某一点的斜率。此时涉及到一个问题:
如何求出函数在某一个点的变化率呢?一般情况下,人们可以很容易求出函数在自变量变化某一段的变化率。例如,当自变量在
![]()
处产生一个增量
![]()
时,函数
![]()
也会产生一个增量
![]()
,此时
![]()
即为函数在自变量从
![]()
变化到
![]()
时的变化率。那么,
如何求出函数
在点
处的变化率呢?
为了解决上述问题,需要借助极限的概念(极限非此博文讨论的内容,若不太了解可自行查阅相关资料)。若了解极限的概念,便可十分容易理解下面的叙述:当
![]()
趋于
![]()
时,若
![]()
的极限存在,则此极限值即为函数
![]()
在点
![]()
处的变化率,
也将其称之为函数
在点
处的导数。具体过程如下图所示(图片来自于博文函数的导数概念),数学上可描述如下:
求导变化过程图
至此,一元函数导数的基本概念已介绍完毕。由于一元函数仅仅具有一个自变量
,因此这类函数仅且只能反应函数沿
轴方向的变化率。进一步讲,当点
![]()
确定后,函数在该点的变化率有且仅有一个,数值上为过该点的切线的斜率。当其大于
![]()
时,表明函数在该点有上升趋势;当其小于
![]()
时,表明函数在该点有下降趋势。
多元函数的偏导数
拥有多个自变量(
)的函数称为多元函数。这里以二元函数
![]()
为例讲解偏导数,其余情况以此类推(下文与此一致)。
由于二元函数具有两个自变量
![]()
,因此函数图像为一个曲面。与一元函数类似,
如何计算二元函数对曲面上一点
的变化率呢?此处需要注意的是,
因为过曲面上一点可以作出无数条切线,因此函数在该点也具有无数个变化率。为了简单起见,可以先考虑函数沿着两个坐标轴(
![]()
轴,
![]()
轴)方向的变化率。
- 当自变量
固定在
,函数在点
处的变化率称为函数在点
处对
的偏导数,记作
。
- 当自变量
![]()
固定在
![]()
,函数在点
![]()
处的变化率称为函数在点
![]()
处对
![]()
的偏导数,记作
![]()
。
二元函数图示例
多元函数的方向导数
当了解了多元函数的偏导数后,细心的读者可能会发现偏导数仅仅描述了函数在点
![]()
处沿两个坐标轴(
![]()
轴,
![]()
轴)方向的变化率,然而实际上函数在该点具有无数个变化率(在几何上表现为函数在该点具有无数个切线的斜率)。因此,
如何求出函数在点
处沿某一方向的变化率呢?万变不离其宗,此时仍然按照变化率的定义去求解,即只需求出
函数的增量与自变量沿着某一方向增量比值的极限即可。
二元函数在某点沿着某一方向的变化率
假设某一方向的单位向量为
![]()
,
![]()
为此向量与x轴正向夹角,显然
根据
的不同,此向量可以表示任意方向的单位向量。当点
![]()
沿着该方向产生一个增量
![]()
到达点
![]()
时(终点的坐标可以根据向量运算法则求出),函数
![]()
也会产生一个增量
![]()
。此时函数沿此方向的变化率为:
向量运算法则
上述公式的证明可参阅:方向导数公式的证明。至此,多元函数的方向导数概念已讲解完毕。
多元函数的梯度
在了解了多元函数的方向导数之后,一个很自然的问题是:既然函数在点
![]()
处沿着任意的方向都有一个变化率,那么
沿着哪个方向(
)函数的变化率最大呢?
二元函数在某点具有无数个变化率
根据上节的介绍,函数
![]()
沿着任意方向(
![]()
取任意值)的变化率为:
![]()
,因此接下来只需求得使其达到最大值时的
![]()
便可解决上述问题。由于上式可以看成两个向量的内积,令
![]()
,则:
其中,
![]()
为
![]()
和
![]()
的夹角。根据上式,可得出如下结论:
- 当
![]()
时,即
![]()
和
![]()
方向相同时,函数变化率最大,且在点
![]()
处呈上升趋势;
- 当
![]()
时,即
![]()
和
![]()
方向相反时,函数变化率最大,且在点
![]()
处呈下降趋势;
最后,当点
![]()
确定后,向量
![]()
也随即确定。由于向量
![]()
的方向为函数值增加最快的方向,而此方向经常被用于实际生活中,因此为便于表述,人们为其取了一个名字—梯度。换而言之,
多元函数在某一点的梯度是一个非常特殊的向量,其由多元函数对每个变量的偏导数组成(这即是为什么求梯度的时候需要对各个变量求偏导的原因),其方向为函数在该点增加最快的方向,大小为函数在该点的最大变化率。
总结
写到这里,即对为什么梯度是函数值增加最快的方向有了一个全面的了解,同时也明白了为什么在机器学习中,使用梯度下降方法去寻找损失函数的最小值。基于此事,也使得自己懂得,凡事既要知其然更要知其所以然的重要性。
参考贴
[1]为什么梯度反方向是函数下降最快的方向?