无约束优化算法-第二节:梯度类算法(代码片段)

快乐江湖 快乐江湖     2023-03-26     782

关键词:

文章目录

梯度类算法:梯度类算法本质是使用函数的一阶导数信息选取下降方向 d k d^k dk,这其中最基本的算法是梯度下降法,也即直接选择负梯度作为下降方向 d k d^k dk,此外还有BB方法,是一种梯度法的变形,虽然理论性质目前仍不完整,但由于它有优秀的数值表现,也是在实际应用中使用较多的一种算法

一:梯度下降法

(1)梯度下降法概述

梯度下降法(Gradient descent,GD):使用梯度下降法寻找函数极小值时,会沿着当前点对应梯度(或近似梯度)的反方向 d d d所规定的步长 α \\alpha α内进行迭代搜索。当然如果沿着梯度正方向搜索,就会接近函数的局部最大值,此时对应梯度上升法

我们经常会用下山这个例子来理解梯度下降法:现在你可以想象自己站在一座高山上的某一位置,需要下山,那么此时最快的下山策略就是环顾四周、哪里最陡峭就沿着哪个方向下山,每到一个新的地方后再次执行这个策略

  • 在机器学习中,上面的初始位置就相当于损失函数的初始值,山体的陡峭程度则是梯度,对应于损失函数的导数后偏导数

可以看出梯度下降有时得到的是局部最优解,如果损失函数是凸函数,梯度下降法得到的解就是全局最优解

因此,梯度下降法公式为

θ i = θ i − α ∂ J ( θ 0 , θ 1 , . . . , θ n ) ∂ θ i \\theta_i=\\theta_i-\\alpha \\frac\\partial J(\\theta_0,\\theta_1,...,\\theta_n)\\partial \\theta_i θi=θiαθiJ(θ0,θ1,...,θn)

(2)梯度下降法求解步骤

梯度下降法求解步骤:如下

  • 确定当前位置的损失函数梯度,对于 θ i \\theta_i θi,其梯度表达式为 ∂ J ( θ 0 , θ 1 , . . . , θ n ) ∂ θ i \\frac\\partial J(\\theta_0,\\theta_1,...,\\theta_n)\\partial \\theta_i θiJ(θ0,θ1,...,θn)
  • 用步长乘以损失函数梯度,得到当前位置下降的距离,也即 α ∂ J ( θ 0 , θ 1 , . . . , θ n ) ∂ θ i \\alpha \\frac\\partial J(\\theta_0,\\theta_1,...,\\theta_n)\\partial \\theta_i αθiJ(θ0,θ1,...,θn)
  • 确定是否所有的 θ i \\theta_i θi梯度下降的距离都小于 ξ \\xi ξ,如果小于则算法终止,当前所有的 θ i \\theta_i θi即为最终结果。否则转入下一步
  • 更新所有的 θ i \\theta_i θi,即 θ i = θ i − α ∂ J ( θ 0 , θ 1 , . . . , θ n ) ∂ θ i \\theta_i=\\theta_i-\\alpha \\frac\\partial J(\\theta_0,\\theta_1,...,\\theta_n)\\partial \\theta_i θi=θiαθiJ(θ0,θ1,...,θn),更新完毕后转入第一步

(3)Python实现

  • 注意 a l p h a alpha alpha的选择可以参照前文,这里固定 a l p h a alpha alpha为0.01
import numpy as np
import torch
from sympy import *

# 计算梯度函数
def cal_grad_funciton(function):
    res = []
    x = []
    x.append(Symbol('x1'))
    x.append(Symbol('x2'))
    for i in range(len(x)):
        res.append(diff(function, x[i]))
    return res

# 定义目标函数
def function_define():
    x = []
    x.append(Symbol('x1'))
    x.append(Symbol('x2'))
    # y = 2 * (x[0] - x[1] ** 2) ** 2 + (1 + x[1]) ** 2
    # Rosenbrock函数
    y = 100 * (x[1] - x[0] ** 2) ** 2 + (1 - x[0]) ** 2
    
    return y

# 计算函数返回值
def cal_function_ret(function, x):
    res = function.subs([('x1', x[0]), ('x2', x[1])])
    return res

# 计算梯度
def cal_grad_ret(grad_function, x):
    res = []
    
    for i in range(len(x)):
        res.append(grad_function[i].subs([('x1', x[0]), ('x2', x[1])]))
    return res

def norm(x):
    return sqrt(np.dot(x, x))

def gradient_descent(function, grad_function, x):
    k = 1
    
    d = cal_grad_ret(grad_function, x)
    d = np.dot(-1, d).tolist()
    alpha = 0.01
    while norm(d) > 0.00001 and k < 1000:
        d = cal_grad_ret(grad_function, x)
        d = np.dot(-1, d).tolist()
        # armijo_goladstein准则选择步长
        # alpha = armijo_goldstein(function, grad_function, x, d)
        # armijo_wlofe准则选择步长
        # alpha = armijo_wlofe(function, grad_function, x, d)
        x = np.add(x, np.dot(alpha, d))
        k = k + 1
    
    # 返回最小值点,函数最小值和迭代次数
    return x, cal_function_ret(function, x), k


if __name__ == '__main__':
    function = function_define()
    grad_function = cal_grad_funciton(function)
    print("函数为:", function)
    print("梯度函数为:", grad_function)

    x0 = [-10, 10]
    Min, MinValue, Iterator = gradient_descent(function, grad_function, x0)
    print("最小值点为:", Min)
    print("最小值为:", MinValue)
    print("迭代次数为:", Iterator)

(4)常见梯度下降算法

A:全梯度下降算法(FGD)

全梯度下降算法(FGD):计算训练集所有样本误差,对其求和再取平均值作为目标函数。权重向量沿其梯度相反的方向移动,从而使当前目标函数减少得最多。因为在执行每次更新时,需要在整个数据集上计算所有的梯度,所以速度会很慢,同时,其在整个训练数据集上计算损失函数关于参数θ的梯度

θ = θ − η ⋅ ∇ θ J ( θ ) \\theta = \\theta -\\eta \\cdot \\nabla_\\thetaJ(\\theta) θ=θηθJ(θ)

B:随机梯度下降算法(SGD)

随机梯度下降算法(SGD):由于FGD每迭代更新一次权重都需要计算所有样本误差,而实际问题中经常有上亿的训练样本,故效率偏低,且容易陷入局部最优解,因此提出了随机梯度下降算法。其每轮计算的目标函数不再是全体样本误差,而仅是单个样本误差,即每次只代入计算一个样本目标函数的梯度来更新权重,再取下一个样本重复此过程,直到损失函数值停止下降或损失函数值小于某个设定的阈值。此过程简单,高效,通常可以较好地避免更新迭代收敛到局部最优解。其迭代形式为

θ = θ − η ⋅ ∇ θ J ( θ ; x ( i ) ; y ( i ) ) \\theta = \\theta -\\eta \\cdot \\nabla_\\thetaJ(\\theta;x^(i);y^(i)) θ=θηθJ(θ;x(i);y(i))

  • x ( i ) x^(i) x(i):表示一条训练样本的特征值
  • x ( i ) x^(i) x(i):表示一条训练样本的标签值

C:小批量梯度下降算法

小批量梯度下降算法:小批量梯度下降算法是FG和SG的折中方案,在一定程度上兼顾了以上两种方法的优点。每次从训练样本集上随机抽取一个小样本集,在抽出来的小样本集上采用FGD迭代更新权重。被抽出的小样本集所含样本点的个数称为batch_size,通常设置为2的幂次方,更有利于GPU加速处理

  • batch_size=1,则变成了SGD
  • batch_size=n,则变成了FGD

θ = θ − η ⋅ ∇ θ J ( θ ; x ( i : i + n ) ; y ( i : i + n ) ) \\theta = \\theta -\\eta \\cdot \\nabla_\\thetaJ(\\theta;x^(i:i+n);y^(i:i+n)) θ=θη查看详情

无约束优化问题

无约束优化问题无约束优化问题基本形式例子强凸性质条件数下降方法梯度下降法GD算法步骤收敛分析例子最速下降法SD标准最速下降法最速下降法坐标变换的角度来理解最速下降法算法步骤收敛性分析补充说明牛顿法基本定义... 查看详情

无约束梯度算法

梯度方向梯度方向的定义为什么选梯度方向沿梯度方向存在的问题注:用一句话来说就是“沿梯度方向,函数不能再有限步达到最优!”梯度算法梯度算法的定义梯度算法例题最优梯度最优梯度的定义最优梯度的例题最优梯度的... 查看详情

matlab从入门到精通-最速下降算法牛顿算法bfgs拟牛顿算法共轭梯度算法无约束极值问题(代码片段)

前言 以下是我为大家准备的几个精品专栏,喜欢的小伙伴可自行订阅,你的支持就是我不断更新的动力哟!MATLAB-30天带你从入门到精通MATLAB深入理解高级教程(附源码)tableau可视化数据分析高级教程python快速学习实战应用... 查看详情

matlab从入门到精通-最速下降算法牛顿算法bfgs拟牛顿算法共轭梯度算法无约束极值问题(代码片段)

前言 以下是我为大家准备的几个精品专栏,喜欢的小伙伴可自行订阅,你的支持就是我不断更新的动力哟!MATLAB-30天带你从入门到精通MATLAB深入理解高级教程(附源码)tableau可视化数据分析高级教程python快速学习实战应用... 查看详情

最优化算法

1、无约束最优化问题求解此问题的方法方法分为两大类:最优条件法和迭代法。2、最优条件法我们常常就是通过这个必要条件去求取可能的极小值点,再验证这些点是否真的是极小值点。当上式方程可以求解的时候,无约束最... 查看详情

优化算法—梯度下降(代码片段)

...blogs.com/shixiangwan/p/7532858.html梯度下降法,是当今最流行的优化(optimization)算法,亦是至今最常用的优化神经网络的方法。本文旨在让你对不同的优化梯度下降法的算法有一个直观认识,以帮助你使用这些算法。我们首先会考察... 查看详情

scipy优化算法--scipy.optimize.fmin_tnc()/minimize()(代码片段)

...如BFGS,Nelder-Mead单纯形,牛顿共轭梯度,COBYLA或SLSQP)的无约束和约束最小化多元标量函数(minimize())全局(蛮力)优化程序(例如,anneal() 查看详情

优化算法梯度优化算法(gbo)含matlab源码1464期(代码片段)

...此代码。获取代码方式3:完整代码已上传我的资源:【优化算法】梯度优化算法(GBO)【含Matlab源码1464期】备注:开通CSDN会员,仅只能免费获得1份代码(有效期为开通日起,三天内有效);订阅紫极神光博客付费专栏, 查看详情

优化算法梯度优化算法(gbo)含matlab源码1464期(代码片段)

...此代码。获取代码方式3:完整代码已上传我的资源:【优化算法】梯度优化算法(GBO)【含Matlab源码1464期】备注:开通CSDN会员,仅只能免费获得1份代码(有效期为开通日起,三天内有效);订阅紫极神光博客付费专栏, 查看详情

拉格朗日乘数法(代码片段)

拉格朗日乘数法等式约束作为一种优化算法,拉格朗日乘子法主要用于解决约束优化问题,它的基本思想就是通过引入拉格朗日乘子来将含有n个变量和k个约束条件的约束优化问题转化为含有(n+k)个变量的无约束优化问题。拉... 查看详情

梯度寻优与logistic算法(代码片段)

一、一些基本概念  最优化:在给定约束之下如何寻求某些因素(的量),以使某一(或某些)指标达到最优。高中学过的线性规划就是一类典型的最优化问题。  凸集:在集合空间中,凸集就是一个向四周凸起的图形。用数学... 查看详情

最优化理论与算法第二版陈宝林课后习题答案

...敏度分析、运输问题、内点算法、非线性规划KOT条件、无约束方法、约束化方法、整数规划和动态规划等内容。《优化理论与算法(第2版)》含有大量经典的和新近的算法,有比较系统的理论分析,实用性比较强;定理的证明... 查看详情

第二节算法中的公平——队列(代码片段)

...下一班了。这对大多数人而言,都是相对公平的方式。在算法中,也有类似的公平——队列(queue)。队列遵循先进先出(FirstInFirstOut,简写FIFO)的规则,同栈的实现一样,队列的实现也有数组实现和链表实现两种方式。数组实... 查看详情

神经网络基础部件-优化算法详解(代码片段)

前言所谓深度神经网络的优化算法,即用来更新神经网络参数,并使损失函数最小化的算法。优化算法对于深度学习非常重要,如果说网络参数初始化(模型迭代的初始点)能够决定模型是否收敛,那优化算法的性能则直接影响... 查看详情

数值算法:无约束优化之多维优化之共轭方向法

在效率上,共轭方向法位于最速下降法和牛顿法之间。它具有特性:对于n维二次型问题,能够在n步之内得到结果;共轭梯度法不需要计算海森矩阵;不需要求逆;共轭方向:Q为n阶实对称矩阵,对于方向d(0),d(1),...,d(m), 如果... 查看详情

06-梯度下降(sgdregressor)(机器学习)(代码片段)

...降求解的截距是:',sgd.intercept_)二 梯度下降1、无约束最优化问题  无约束最优化问题(unconstrainedoptimizationproblem)指的是从一个问题的所有可能的备选方案中,选择出依某种指标来说是最优的解决方案。从... 查看详情

梯度下降算法原理讲解(代码片段)

...SIGAI公众号作者倾力打造。书的购买链接书的勘误,优化,源代码资源导言最优化问题在机器学习中有非常重要的地位,很多机器学习算法最后都归结为求解最优化问题。在各种最优化算法中,梯度下降法是最简... 查看详情