日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UA MATH575B 数值分析下I 梯度下降

發(fā)布時間:2025/4/14 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UA MATH575B 数值分析下I 梯度下降 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

UA MATH575B 數(shù)值分析下I 梯度下降

  • 梯度下降
    • 最速下降
  • 下降算法實現(xiàn)舉例
    • 梯度下降的應(yīng)用

對于凸優(yōu)化問題min?xf(x)\min_x f(x)minx?f(x),最主流的數(shù)值計算方法是下降算法(Descent Method)。下降算法遞推方程的一般形式是
xk+1=xk?αkSk?f(xk)x_{k+1} = x_{k} - \alpha_k S_k \nabla f(x_k) xk+1?=xk??αk?Sk??f(xk?)
其中αk\alpha_kαk?是常數(shù),SkS_kSk?是正定矩陣(或半正定)。因為
?f(xk)T(xk+1?xk)=?αk?f(xk)TSk?f(xk)<0(or≤0)\nabla f(x_k)^T(x_{k+1}-x_k) = -\alpha_k \nabla f(x_k)^T S_k \nabla f(x_k) <0(or \le 0) ?f(xk?)T(xk+1??xk?)=?αk??f(xk?)TSk??f(xk?)<0(or0)
所以每一次迭代后函數(shù)值會下降,因而叫下降算法。如果SkS_kSk?是單位陣,對應(yīng)的下降算法又叫梯度下降;如果SkS_kSk?等于Hessian的逆,對應(yīng)的下降算法又叫Newton法。本講介紹梯度下降,下一講介紹牛頓法。

梯度下降

梯度下降的遞推方程是
xk+1=xk?αk?f(xk)x_{k+1} = x_{k} - \alpha_k \nabla f(x_k) xk+1?=xk??αk??f(xk?)
給定初始值和停止準則根據(jù)遞推方程進行迭代就可以了,唯一需要注意的是??f(xk)-\nabla f(x_k)??f(xk?)給出的是第一次下降的方向,αk\alpha_kαk?給出每一次下降的步長,下降方向的確定最好是能算出梯度的解析式然后根據(jù)解析式計算,下降的步長可以用Line search來確定。具體有兩種操作,第一種是exact line search:
αk=arg?min?tf(xk?t?f(xk))\alpha_k = \argmin_t f(x_k - t\nabla f(x_k)) αk?=targmin?f(xk??t?f(xk?))
第二種是backtracking line search:選定一個不算小的ttt作為初始值,判斷
f(xk?t?f(xk))<f(xk)?αt?f(xk)??f(xk)f(x_k - t\nabla f(x_k)) < f(x_k) - \alpha t \nabla f(x_k) \cdot \nabla f(x_k) f(xk??t?f(xk?))<f(xk?)?αt?f(xk?)??f(xk?)
是否成立,如果成立接受現(xiàn)在的ttt值,如果不成立則減小ttt的值,再做判斷,重復(fù)這個操作直到上式成立,然后把ttt的值給αk\alpha_kαk?。其中α\alphaα是一個松弛參數(shù),選擇小一點的α\alphaα可以在下降方向比較合適的時候讓下降的步長更大一點。

最速下降

最速下降和梯度下降類似,但選擇下降方向與步長的時候考慮的是最小化函數(shù)值的更新值:
Δxk=arg?min?∣∣Δxk∣∣=1?f(xk)Δxk\Delta x_k = \argmin_{||\Delta x_k||=1} \nabla f(x_k) \Delta x_k Δxk?=Δxk?=1argmin??f(xk?)Δxk?
因為
f(xk+1)≈f(xk)+?f(xk)Δxkf(x_{k+1}) \approx f(x_k) + \nabla f(x_k) \Delta x_k f(xk+1?)f(xk?)+?f(xk?)Δxk?
所以根據(jù)最小化函數(shù)值的更新值選擇的步長和方向可以讓函數(shù)值下降得最快,因此這個方法叫最速下降。最速下降的范數(shù)可以選擇權(quán)重范數(shù),可以選擇L2L_2L2?范數(shù)等。假設(shè)權(quán)重為www,權(quán)重范數(shù)指的是
∣∣Δxk∣∣w=∣∣Δxk⊙w∣∣L2||\Delta x_k||_w = ||\Delta x_k \odot w||_{L_2} Δxk?w?=Δxk?wL2??
在這個范數(shù)下做最速下降等價于在In⊙wI_n \odot wIn?w仿射坐標下做梯度下降。

下降算法實現(xiàn)舉例

梯度下降的應(yīng)用

給定初始值(?50,40)(-50,40)(?50,40),最小化函數(shù)
H2(x,y)=50g(y2?x2)+(x?10)2+y2H_2(x,y) = 50\sqrt{g(y^2-x^2)} + (x-10)^2 + y^2 H2?(x,y)=50g(y2?x2)?+(x?10)2+y2
其中g(x)=x+x2+1g(x) = x+ \sqrt{x^2 + 1}g(x)=x+x2+1?。這個函數(shù)的等值曲線可以先畫一下

x = -100:.1:100; y = -100:.1:100; [X,Y] = meshgrid(x,y); Z = H2(X,Y); contour(X,Y,Z,'ShowText','on'); hold on; plot(Record1(3,:),Record1(4,:),'rx');


紅色的x形的點是下降的路徑,計算的時候存下來貼在等值線上可以看出下降的規(guī)律。從圖中可以看出梯度下降是沿著西北方向那條山谷下降的,基本符合直覺。下面的函數(shù)用來做梯度下降:

function [k,x,Record]=Grad_Descent_H2(x0) k = 0;% count for # of iterations F = 6000; F_old = 0; dt = .005; x = x0; Record = [F; dt; x(1); x(2)]; while(abs(F-F_old)>1e-10)x_old = x;F_old = F;d_temp = [dH2_x(x(1),x(2));dH2_y(x(1),x(2))];x = x - dt*d_temp;dt = 1.1*dt;F = H2(x(1),x(2));if F > F_oldx = x_old;F = F_old;F_old = F_old + 1; % or abs(F-F_old)=0, loop will be closeddt = .5*dt;endk = k + 1;Record = [Record [F; dt; x(1); x(2)]]; end end

這個函數(shù)有幾點需要注意,首先是初值

F = 6000;

這個值盡量比下降軌跡上的函數(shù)值都大一點,不然在line search的時候會死循環(huán)。

dt = .005;

這個就是做backtracking line search的時候給定的步長的初始值,這個值與停止準則、梯度的大小等有一定聯(lián)動性;如果梯度都比較大,停止準則又比較嚴格,較大的步長初始值會導(dǎo)致在做line search的時候會死循環(huán)。所以調(diào)參的時候一般是調(diào)這個初始步長和停止準則保證函數(shù)能給出返回值,然后再繼續(xù)調(diào)參收斂到更好的最小值。

abs(F-F_old)>1e-10

這個是停止準則,梯度比較大時一般用不那么嚴格的停止準則。

if F > F_oldx = x_old;F = F_old;F_old = F_old + 1; % or abs(F-F_old)=0, loop will be closeddt = .5*dt;end

這一步是line search,放棄使用了松弛參數(shù),但在前面定義了

dt = 1.1*dt;

這能使下降方向調(diào)整不大的時候逐漸放大下降的步長,起到類似松弛的作用。

總結(jié)

以上是生活随笔為你收集整理的UA MATH575B 数值分析下I 梯度下降的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。