梯度算法的Matlab實現


一、通過一個例子來看梯度下降法是怎么算的

函數,求解其最小值

  1.求解梯度函數 

 

 

   2.給定初始點,計算出該點的梯度,開始迭代

  3.計算初始點梯度模,判斷是否滿足終止條件,如果滿足,得到終點。如果不滿足,求得當前最優的學習率,然后迭代。

 

function [k ender]=steepest(f,x,e)
% 梯度下降法函數function [k ender]=steepest(f,x,e),需要三個參數f、x和e,其中
%     f為目標函數,x為初始點,e為終止誤差。輸出也為兩個參數,k表示迭代的次數,
%     ender表示找到的最低點。
%梯度下降法,f為目標函數(兩變量x1和x2),x為初始點,如[3;4]
syms x1 x2 m; %m為學習率
d=-[diff(f,x1);diff(f,x2)];  %分別求x1和x2的偏導數,即下降的方向
flag=1;  %循環標志
k=0; %迭代次數
while(flag)
    d_temp=subs(d,x1,x(1));      %將起始點代入,求得當次下降x1梯度值
    d_temp=subs(d_temp,x2,x(2)); %將起始點代入,求得當次下降x2梯度值
    nor=norm(d_temp); %范數
    if(nor>=e)
        x_temp=x+m*d_temp;            %改變初始點x的值
        f_temp=subs(f,x1,x_temp(1));  %將改變后的x1和x2代入目標函數
        f_temp=subs(f_temp,x2,x_temp(2));
        h=diff(f_temp,m);  %對m求導,找出最佳學習率
        m_temp=solve(h);   %求方程,得到當次m
        x=x+m_temp*d_temp; %更新起始點x
        k=k+1;
    else
        flag=0;
    end
end
ender=double(x);  %終點
end

  其中的初始點設為[3;3],誤差設為10^(-20);結果為迭代27次找到了[2;1]點為最值點。

 二、學習率怎么求

  學習率是通過損失函數求得到的。我在CSDN中看到一篇文章。有一個總結。

  針對原始的樣本(1,2)
  針對線性回歸的函數 y=kx
  對應的損失函數是 y=2kx^2,
  那我們的方向就是希望最小化這個損失函數,得到最終的k值,然后再代入到
  原始的線性函數中,那具體應該如何在最小化損失函數的時候得到對應的k值呢?
  方法一:對於損失函數求導,然后令導數等於0,得到對應的k值,有時候並不能直接解出來,並且這種方式可能是局部最優;
  方法二:采用梯度下降與學習率的方法去求得最后的k值,明確梯度下降中的梯度
  實際指的是損失函數的斜率,初始對於k設定一個值例如0.3,然后將k值與樣本中的x值代入到損失函數中,得到損失函數的y值就是差距值,如果這個差距值符合要求就可以,但是太大的話可能就需要不斷的去調節這個k值,那新的k值如何獲得呢,對應的公式如下:
                                k1=k+at,
  其中k1就是新的k值,k是初始設定的那個k值,而其中的a就是學習率,一般可以設定0.01,對於學習率的設定,如果設定的太小就會導致最終收斂太慢,而如果設定的太大的話,可能就會錯過最小值點,因此需要設定合適,而其中的t就是對應算是函數的斜率,得到的方式就是對損失函數進行求導,然后將樣本中的x值與初始k值代入到對應的其中得到斜率,得到新的k值,然后再將新的k值和x值代入到損失函數中,看下函數的差值是否在那個區間內。
  總結:梯度下降其實就是斜率不斷的下降,最終希望是斜率為0對應的就是在谷底的時候得到對應的k值,就是最好的k值。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM