当前位置: 首页 > 科技观察

很酷!5分钟看懂Python中的人工智能优化算法

时间:2023-03-16 17:41:58 科技观察

概述梯度下降是神经网络中流行的优化算法之一。通常,我们希望找到使误差函数最小化的权重和偏差。梯度下降算法迭代更新参数以最小化整个网络的误差。梯度下降是一种迭代方法,可用于解决最小二乘问题(线性和非线性)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(GradientDescent)是最常用的方法之一,另外一种常用的方法是最小二乘法。在求解损失函数的最小值时,可以采用梯度下降法逐步迭代求解,得到最小化的损失函数和模型参数值。反之,如果我们需要找到损失函数的最大值,就需要使用梯度上升法进行迭代。在机器学习中,在基本梯度下降法的基础上发展了两种梯度下降法,即随机梯度下降法和批量梯度下降法。该算法迭代地更新损失函数梯度上的??权重参数,直到达到最小值。换句话说,我们沿着损失函数的斜率下坡,直到到达山谷。基本思想大致如图3.8所示。如果偏导数为负,则权重增加(图左),如果偏导数为正,则权重减小(图右)42。学习率参数决定了达到最小值所需的步数大小。图3.8 随机梯度最小化误差面的基本思想寻找全局最优解同时避免局部极小值是一项具有挑战性的任务。这是因为误差面有很多波峰和波谷,如图3.9所示。误差表面可能在某些方向上高度弯曲,但在其他方向上可能是平坦的。这使得优化过程非常复杂。为了防止网络陷入局部极小值,通常需要指定一个动量(momentum)参数。图3.9 典型优化问题的复杂误差面我很早就发现使用梯度下降的反向传播通常收敛得非常慢,或者根本不收敛。在用非常小的数据集编写我的第一个神经网络时,我使用了反向传播算法。网络花了3天多的时间才收敛到一个解决方案。值得庆幸的是,我采取了一些措施来加快这个过程。说明虽然与反向传播相关的学习率相对较慢,但作为一种前馈算法,它在预测或分类阶段非常快。随机梯度下降传统的梯度下降算法使用整个数据集来计算每次迭代的梯度。对于大型数据集,这会导致冗余计算,因为在每次参数更新之前都会重新计算非常相似样本的梯度。随机梯度下降(SGD)是真实梯度的近似值。在每次迭代中,它随机选择一个样本来更新参数并在与该样本关联的梯度上移动。因此,它遵循一条通往最小值的曲折梯度路径。部分由于缺乏冗余,它往往比传统的梯度下降更快地收敛到一个解决方案。解释随机梯度下降的一个非常好的理论特性是,如果损失函数是凸函数,43则可以保证找到全局最小值。代码实践理论说完了,接下来我们来敲一下真正的代码。一维问题假设我们要求解的目标函数是:()=2+1f(x)=x2+1很明显一看,它的最小值是=0x=0,但是这里需要用到梯度下降Python代码实现的方法。#!/usr/bin/envpython#-*-coding:utf-8-*-"""一维问题的梯度下降法示例"""deffunc_1d(x):"""目标函数:paramx:argument,Scalar:return:dependentvariable,scalar"""returnx**2+1defgrad_1d(x):"""目标函数的梯度:paramx:independentvariable,scalar:return:dependentvariable,scalar"""returnx*2defgradient_descent_1d(grad,cur_x=0.1,learning_rate=0.01,precision=0.0001,max_iters=10000):"""一维问题的梯度下降法:paramgrad:目标函数的梯度:paramcur_x:当前x值,初值可以由参数提供:paramlearning_rate:学习率,也相当于设置步长:paramprecision:设置收敛精度:parammax_iters:最大迭代次数:return:localminimumx*"""foriinrange(max_iters):grad_cur=grad(cur_x)ifabs(grad_cur)