梯度函数python 梯度函数怎么求python( 二 )


??(1)可求梯度的条件
??从上面的叙述知道,一个变量有5个属性,要求这个变量可以求梯度,需要满足2个属性为真 , requires_grad=True,is_leaf=True 。在声明变量的时候声明requires_grad=True就可以了 。在实践过程中如果发现梯度没法计算,要查一下这两个属性 。
??(2)回传结果类型
??大部分情况是对标量求梯度,也是在中,是标量的情况,如果向量或矩阵,也可以求梯度,此时本质上也是按分量一个一个来,因此要给backward()加个参数 , 一般情况下该参数的形状和一样,每一个位置的值指示每个分量的梯度权重,多数情况就是全部设置为1 。
??(3)一般过程
??仍然假设求的关于的梯度,首先设置声明tensor类型变量,声明的时候需要设置参数requires_grad=True梯度函数python;接下来计算出,这里的是用来表示函数运算过程,最后使用,如果非标量,就加个参数 , 假设为,的形状与相同,此时使用的是,要的梯度值可以通过获得 。
??单独写个注意事项,计算变量的梯度时,的属性有可能会变化,比如需要对进行迭代,假设为 , 那么的requires_grad和is_leaf属性会变化,变得不可求梯度,那怎么办呢,其实程序迭代时只需要改变值就好了,使用就可以了 。
[1]
[2]
[3]
Python怎么做最优化一、概观scipy中的optimize子包中提供了常用的最优化算法函数实现 。我们可以直接调用这些函数完成我们的优化问题 。optimize中函数最典型的特点就是能够从函数名称上看出是使用了什么算法 。下面optimize包中函数的概览:1.非线性最优化fmin--简单Nelder-Mead算法fmin_powell --改进型Powell法fmin_bfgs--拟Newton法fmin_cg -- 非线性共轭梯度法fmin_ncg--线性搜索Newton共轭梯度法leastsq-- 最小二乘2.有约束的多元函数问题fmin_l_bfgs_b ---使用L-BFGS-B算法fmin_tnc---梯度信息fmin_cobyla ---线性逼近fmin_slsqp ---序列最小二乘法nnls ---解|| Ax - b ||_2 for x=03.全局优化anneal---模拟退火算法brute--强力法4.标量函数fminboundbrentgoldenbracket5.拟合curve_fit-- 使用非线性最小二乘法拟合6.标量函数求根brentq ---classic Brent (1973)brenth ---A variation on the classic Brent(1980)ridder ---Ridder是提出这个算法的人名bisect ---二分法newton ---牛顿法fixed_point7.多维函数求根fsolve ---通用broyden1 ---Broyden’s first Jacobian approximation.broyden2 ---Broyden’s second Jacobian approximationnewton_krylov ---Krylov approximation for inverse Jacobiananderson ---extended Anderson mixingexcitingmixing ---tuned diagonal Jacobian approximationlinearmixing ---scalar Jacobian approximationdiagbroyden ---diagonal Broyden Jacobian approximation8.实用函数line_search ---找到满足强Wolfe的alpha值check_grad ---通过和前向有限差分逼近比较检查梯度函数的正确性二、实战非线性最优化fmin完整的调用形式是:fmin(func, x0, args=(), xtol=0.0001, ftol=0.0001, maxiter=None, maxfun=None, full_output=0, disp=1, retall=0, callback=None)不过我们最常使用的就是前两个参数 。一个描述优化问题的函数以及初值 。后面的那些参数我们也很容易理解 。如果您能用到,请自己研究 。下面研究一个最简单的问题,来感受这个函数的使用方法:f(x)=x**2-4*x+8,我们知道,这个函数的最小值是4,在x=2的时候取到 。from scipy.optimize import fmin#引入优化包def myfunc(x):return x**2-4*x+8#定义函数x0 = [1.3]#猜一个初值xopt = fmin(myfunc, x0)#求解print xopt#打印结果运行之后,给出的结果是:Optimization terminated successfully.Current function value: 4.000000Iterations: 16Function evaluations: 32[ 2.00001953]程序准确的计算得出了最小值,不过最小值点并不是严格的2,这应该是由二进制机器编码误差造成的 。除了fmin_ncg必须提供梯度信息外 , 其他几个函数的调用大同小异,完全类似 。我们不妨做一个对比:from scipy.optimize import fmin,fmin_powell,fmin_bfgs,fmin_cgdef myfunc(x):return x**2-4*x+8x0 = [1.3]xopt1 = fmin(myfunc, x0)print xopt1printxopt2 = fmin_powell(myfunc, x0)print xopt2printxopt3 = fmin_bfgs(myfunc, x0)print xopt3printxopt4 = fmin_cg(myfunc,x0)print xopt4给出的结果是:Optimization terminated successfully.Current function value: 4.000000Iterations: 16Function evaluations: 32[ 2.00001953]Optimization terminated successfully.Current function value: 4.000000Iterations: 2Function evaluations: 531.99999999997Optimization terminated successfully.Current function value: 4.000000Iterations: 2Function evaluations: 12Gradient evaluations: 4[ 2.00000001]Optimization terminated successfully.Current function value: 4.000000Iterations: 2Function evaluations: 15Gradient evaluations: 5[ 2.]我们可以根据给出的消息直观的判断算法的执行情况 。每一种算法数学上的问题 , 请自己看书学习 。个人感觉 , 如果不是纯研究数学的工作 , 没必要搞清楚那些推导以及定理云云 。不过,必须了解每一种算法的优劣以及能力所及 。在使用的时候,不妨多种算法都使用一下,看看效果分别如何,同时,还可以互相印证算法失效的问题 。在from scipy.optimize import fmin之后,就可以使用help(fmin)来查看fmin的帮助信息了 。帮助信息中没有例子,但是给出了每一个参数的含义说明 , 这是调用函数时候的最有价值参考 。有源码研究癖好的 , 或者当你需要改进这些已经实现的算法的时候,可能需要查看optimize中的每种算法的源代码 。在这里:https:/ / github. com/scipy/scipy/blob/master/scipy/optimize/optimize.py聪明的你肯定发现了,顺着这个链接往上一级、再往上一级,你会找到scipy的几乎所有源码!

推荐阅读