直观理解 梯度(gradient)

梯度

在机器学习中,我们通常需要对问题进行建模,然后可以得到一个成本函数(cost function),通过对这个成本函数进行最小化,我们可以得到我们所需要的参数,从而得到具体的模型。这些优化问题中,只有少部分可以得到解析解(如最小二乘法),而大部分这类优化问题只能迭代求解,而迭代求解中两种最常用的方法即梯度下降法与牛顿法。

梯度概念是建立在偏导数与方向导数概念基础上的。所谓偏导数,简单来说是对于一个多元函数,选定一个自变量并让其他自变量保持不变,只考察因变量与选定自变量的变化关系。数学上说,是指对于多元函数 y = f ( x 1 , x 2 , . . . x n ) y=f(x_1,x_2,...x_n) y=f(x1,x2,...xn),假设其偏导数都存在,则该函数共有 n n n个偏导数,可以表示为:
f x 1 = ∂ y ∂ x 1 , f x 2 = ∂ y ∂ x 2 . . . f x n = ∂ y ∂ x n {f_{{x_1}}} = {{\partial y} \over {\partial {x_1}}},{f_{{x_2}}} = {{\partial y} \over {\partial {x_2}}}...{f_{{x_n}}} = {{\partial y} \over {\partial {x_n}}} fx1=x1y,fx2=x2y...fxn=xny

偏导数只能表示多元函数沿某个坐标轴方向的导数,如对于二元函数 z = x 2 + y 2 z=x^2+y^2 z=x2+y2 ∂ z ∂ x = 2 x {{\partial z} \over {\partial x}} = 2x xz=2x表示函数沿 X X X轴方向的导数,而 ∂ z ∂ y = 2 y {{\partial z} \over {\partial y}} = 2y yz=2y表示函数沿 Y Y Y轴方向的导数。

除开沿坐标轴方向上的导数,多元函数在非坐标轴方向上也可以求导数,这种导数称为方向导数。很容易发现,多元函数在特定点的方向导数有无穷多个,表示函数值在各个方向上的增长速度。一个很自然的问题是:在这些方向导数中,是否存在一个最大的方向导数,如果有,其值是否唯一?为了回答这个问题,便需要引入梯度的概念。

一般来说,梯度可以定义为一个函数的全部偏导数构成的向量(这一点与偏导数与方向导数不同,两者都为标量)。一般将函数 f f f的梯度记为 ∇ f \nabla f f,即:
在这里插入图片描述
事实上,梯度向量的方向即为函数值增长最快的方向,为什么会如此,可以从几个角度去理解。
在这里插入图片描述
事实上,梯度向量的方向即为函数值增长最快的方向,为什么会如此,可以从几个角度去理解。
在上图中,我们可以看到,为了找到方向导数中的最大值,我们可以将其投影到 x y xy xy平面来理解,这种投影方式对应的便是等高线图。如对于一个二元函数 z = f ( x , y ) z=f(x,y) z=f(x,y),我们可以画出它的等高线图如下:
在这里插入图片描述
该函数的等高线图为圆心在原点的一系列圆,等高线的值由里向外逐渐增加。点 B ( x , y ) B(x,y) B(x,y)为点 ( x , y , z ) (x,y,z) (x,y,z) x y xy xy平面上的投影,可以看到向量 A B ⃗ \vec{AB} AB 即为函数在点 ( x , y , z ) (x,y,z) (x,y,z)处的梯度向量。根据方向导数的定义,方向导数 D u f = f x cos ⁡ θ + f y sin ⁡ θ {D_u}f = {f_x}\cos \theta + {f_y}\sin \theta Duf=fxcosθ+fysinθ,其中 θ \theta θ为此向量与 X X X正方向的夹角。由于梯度向量为 u = ( f x , f y ) u = ({f_x},{f_y}) u=(fx,fy),单位向量 w = ( c o s θ , sin ⁡ θ ) w = (cos\theta ,\sin \theta ) w=(cosθ,sinθ),则方向导数的大小可以表述为梯度向量与此单位向量的数量积,即:
D u f = f x cos ⁡ θ + f y sin ⁡ θ = u ⃗ ⋅ w ⃗ = ∣ u ∣ ⋅ ∣ w ∣ ⋅ cos ⁡ α = ∣ u ∣ ⋅ cos ⁡ α {D_u}f = {f_x}\cos \theta + {f_y}\sin \theta = \vec u \cdot \vec w = |u| \cdot |w| \cdot \cos \alpha = |u| \cdot \cos \alpha Duf=fxcosθ+fysinθ=u w =uwcosα=ucosα

其中 α \alpha α为梯度向量与单位向量之间的夹角,即 ∠ B A D \angle BAD BAD。可以看出,方向导数的大小可以看作梯度向量在指示方向导数方向的单位向量上的投影,即线段 A E AE AE的长度。显而易见,线段 A E AE AE的长度小于线段 A B AB AB的长度,也即梯度向量的模总是大于等于方向导数向量的模。这就解释了为什么沿着梯度向量方向是函数值增长最快的方向,而它正是函数所有偏导数构成的向量。

在上图中也可以看出,梯度向量垂直于等高线,这为我们提供了另一个观察梯度向量的角度。如对于函数 f ( x , y ) = x y f(x,y) = xy f(x,y)=xy,其等高线图与梯度向量如下:

在这里插入图片描述
我们可以两个角度考虑:第一,在特定函数点,固定每次移动的步长,向那个方向移动函数值增长最快?第二,固定需要增加的函数值,向哪个方向需要移动的步长最短?
在这里插入图片描述
在左图中,固定移动的步长,我们可以看到垂直于等高线图的方向即为函数值增长最快的方向,也就是梯度向量指示的方向。在右图中,假设函数值有一个固定的微小的增长,则明显梯度向量指示的方向所需要的步长最短,而这个向量也是垂直于等高线的。

梯度下降或上升法正是基于梯度指示函数值增长最快的方向而产生的,利用这个方法,我们可以使用迭代的方法计算函数的最大或最小值,从而解决机器学习中遇到的最优化问题。

梯度和方向导数的关系

https://www.zhihu.com/question/36301367

Reference:
https://www.v2ex.com/t/397822

梯度下降算法是一种用于优化问题的方法,特别是在寻找函数最小值时非常有效。直观上讲,梯度下降可以想象成在山丘上沿着最陡峭的方向向下行走以找到最低点的过程。 **梯度下降的工作原理**: 1. **选择初始位置**:开始时,随机选择一个起点作为参数的初始估计值。 ```markdown initial_guess = random_value() ``` 2. **计算梯度**:计算损失函数关于当前参数的变化率(梯度)。梯度是一个向量,表示了函数上升最快的方向。 ```markdown gradient = compute_gradient(current_parameters) ``` 3. **更新参数**:基于梯度方向和步长(学习率),调整参数的位置来减小损失函数的值。 ```markdown updated_parameters = current_parameters - learning_rate * gradient ``` 4. **重复过程**:重复执行上述步骤直到满足停止条件(如达到预定迭代次数或梯度接近于零)。 ```markdown while not stop_condition_met(): update_parameters() ``` **梯度下降的不同变体**: - **批量梯度下降**:每次更新参数时考虑所有训练样本。 - **随机梯度下降**:每次仅更新参数的一个样本。 - **小批量梯度下降**:介于两者之间,每次更新参数时考虑一部分训练样本。 梯度下降法的关键在于学习率的选择,如果学习率过低,算法可能收敛速度缓慢;如果过高,则可能导致无法收敛至全局最优解。 梯度下降直观理解通常通过动画展示不同迭代过程中参数的变化,帮助可视化这一过程是如何逐渐靠近极小值的。这种动态的视觉辅助对于理解梯度下降的迭代本质及其影响因素非常有帮助。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值