梯度下降算法

梯度 & 梯度下降算法


先看下定義比較合適:
在向量微積分中,標量場的梯度是一個向量場。標量場中某一點上的梯度指向標量場增長最快的方向梯度的長度是這個最大的變化率。

    一個標量函數的梯度記爲:或者
    表示微分算子。
    在三維直角座標系中爲:
    
     在單變量的情況下,梯度只是個導數,對於一個線性函數,梯度就是個斜率。
    梯度下降算法是一個最優化算法,通常也稱爲最速下降法。顧名思義:沿着梯度下降的方向求解最小值,或者沿着梯度上升的方向求解最大值。

迭代的公式爲:

其中代表梯度負方向,表示梯度方向的搜索步長。

梯度方向可以通過對函數求導得到。
因爲一般情況下,梯度向量爲0的話說明是到了一個極值點,此時梯度的幅值也爲0,而採用梯度下降算法進行最優化求解時,算法迭代的終止條件是梯度向量的幅值接近0即可,可以設置個非常小的常數值。


話說到這裏,一般情況下就該舉個例子了。

———————————下邊是例子————————————————————-
求函數的最小值
利用梯度下降法解題步驟:
1. 求梯度,
2. 向梯度相反的方向移動,其中爲步長。如果步長足夠小,則可以保證每一次迭代都在減小,但可能導致收斂太慢,但是如果步長太大的話,則不能保證每一次迭代都減少,也不能保證收斂。
3. 循環迭代步驟2,知道的值變化到使得在兩次迭代之間的差值足夠小,比如0.000000001,也就是說,知道兩次迭代計算出來的基本沒有變化,則說明此時已經達到局部最小值。
4. 此時,輸出,這個就是使得函數最小時的取值。
MATLAB演示代碼如下:

%%梯度下降法
%設置步長爲0.1,f_change爲改變前後的y值的變化,僅設置了一個退出條件。
function tidu=tidu()
syms x;f=x^2;
step=0.1;x=2;k=0;%設置步長,初始值,迭代記錄數
f_change=x^2; %初始化差值
f_current=x^2 ; %計算當前函數值
ezplot(@(x,f)f-x^2);%畫出函數圖像
axis([-2,2,0,4]);  %固定座標值
hold on
while f_change>0.000000001
x=x-step*2*x;%-2x爲梯度反方向,step爲步長
f_change=f_current-x^2;%計算兩次函數值之差
f_current=x^2;%重新計算當前的函數值
plot(x,f_current,'ro','markersize',7)%標記當前位置
drawnow;pause(1.0);
k=k+1;
end
hold off
fprintf('在迭代%d次後找到函數最小值爲%e,對應的x值爲%e\n',k,x^2,x);
end  

運行效果如下:http://pan.baidu.com/s/1qYaLFq8

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章