梯度下降原理解析

1 原理

在机器学习的核心内容就是把数据喂给一个人工设计的模型,然后让模型自动的“学习”,从而优化模型自身的各种参数,最终使得在某一组参数下该模型能够最佳的匹配该学习任务。那么这个“学习”的过程就是机器学习算法的关键。梯度下降法就是实现该“学习”过程的一种最常见的方式,尤其是在深度学习(神经网络)模型中,BP反向传播方法的核心就是对每层的权重参数不断使用梯度下降来进行优化。

梯度下降法(gradient descent)是一种常用的一阶(first-order)优化方法,是求解无约束优化问题最简单、最经典的方法之一。我们来考虑一个无约束优化问题 [公式] , 其中 [公式] 为连续可微函数,如果我们能够构造一个序列 [公式] ,并能够满足:

[公式]

那么我们就能够不断执行该过程即可收敛到局部极小点,可参考下图。

寻找最小点过程

那么问题就是如何找到下一个点 [公式] ,并保证 [公式] 呢?假设我们当前的函数 [公式] 的形式是上图的形状,现在我们随机找了一个初始的点 [公式] ,对于一元函数来说,函数值只会随着 [公式] 的变化而变化,那么我们就设计下一个 [公式] 是从上一个 [公式] 沿着某一方向走一小步 [公式] 得到的。此处的关键问题就是:这一小步的方向是朝向哪里?

对于一元函数来说, [公式] 是会存在两个方向:要么是正方向( [公式] ),要么是负方向( [公式] ),如何选择每一步的方向,就需要用到大名鼎鼎的泰勒公式,先看一下下面这个泰勒展式:

[公式]

左边就是当前的 [公式] 移动一小步 [公式] 之后的下一个点位,它近似等于右边。前面我们说了关键问题是找到一个方向,使得 [公式] ,那么根据上面的泰勒展式,显然我们需要保证:

[公式]

可选择令:

[公式]

其中步长 [公式] 是一个较小的正数,从而: [公式] .

由于任何不为0的数的平方均大于0因此保证了 [公式] .

从而,设定:

[公式] ,

则可保证:

[公式]

那么更新 [公式] 的计算方式就很简单了,可按如下公式更新 [公式]

[公式]

这就是所谓的沿负梯度方向走一小步

到此为止,这就是梯度下降的全部原理。

如果稍有不清楚的地方,再用下图重新回顾一下具体的设计过程:

梯度下降法的设计过程

### 梯度下降算法背后的数学原理 梯度下降是一种用于最小化损失函数的迭代优化算法,在机器学习领域广泛应用。其基本思想是从初始猜测出发,沿着负梯度的方向逐步调整参数值,直到达到局部或全局最小点。 #### 函数极小化的直观理解 对于给定的目标函数 \( f(\theta) \),其中 \( \theta \) 表示待求解的一组参数向量,梯度下降旨在找到使 \( f(\theta) \) 达到最小值的 \( \theta^* \)[^1]。假设存在一个连续可微分的成本函数,则可以通过计算该成本函数相对于各个参数的部分导数来获得梯度矢量: \[ g_i=\frac{\partial}{\partial \theta_{i}}f(\theta), i=0,\ldots,n-1 \] 这里 \( n \) 是参数的数量,\( g_i \) 则代表第 \( i \) 个维度上的偏导数值。整个过程可以被描述为沿最陡峭斜率方向前进的过程,即每次更新都朝着使得误差减少最快的方向迈进[^3]。 #### 迭代公式及其几何意义 具体来说,每一次迭代都会按照下面这个简单的规则修改权重: \[ \theta^{(t+1)} := \theta^{(t)}-\alpha\nabla_\theta J(\theta)| _{θ=θ(t)}, t = 0, ..., T-1 \] 这里的 \( α>0 \) 称作步长(也叫学习速率),它决定了每一步应该走多远;而 \( ∇_θJ(θ) \) 就是指上述提到过的梯度矢量。随着迭代次数增加 (\(T→∞\)) ,如果选择合适的步长并满足一定条件的话,最终能够收敛于某个稳定状态下的最优解附近[^2]。 #### 收敛性质分析 值得注意的是,并不是所有的目标函数都能保证通过这种方式一定能得到全局最优解。当面对复杂的非凸问题时,可能会陷入鞍点或是次优区域无法自拔。因此实际应用当中还需要结合其他策略比如引入动量项、自适应调节学习率等方式提高鲁棒性和效率。 ```python import numpy as np def gradient_descent(x_start, learning_rate, num_iterations): x = x_start for iteration in range(num_iterations): grad_at_x = compute_gradient(x) x -= learning_rate * grad_at_x return x def compute_gradient(x): # 假设这是一个简单二次方程作为例子 return 2*x - 4 # 使用实例 optimal_point = gradient_descent(-5, 0.1, 100) print(f"The optimal point found is {optimal_point}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值