梯度下降法淺思

2021-09-12 19:01:19 字數 2198 閱讀 3349

梯度下降法:

已一元二次為例,保證該函式是凸函式(凸函式即區域性最優點一定是全域性最優點)

這樣乙個函式 f(x),我們想求得 f(x)=0 的解。

給定乙個初值

但實際上我們求得的梯度是有大小的,很容易走的步子太大或太小,為了便於控制,我們將梯度單位化,只保留方向。

step.這時候每次走的長度就可以控制了。

演算法過程:

給定初值 x,誤差err, 步長

如果norm(grad)

用梯度下降法求函式f(x)=0

f(x)是乙個函式的話,那麼找到解,這個解的梯度應當為0,可是我用梯度小於誤差err作為迴圈終止條件時,卻總得不到 正確結果,想了想,可能總是得到了區域性最優解了。

例子:f(x)=x*e^(x),q求f(x)=0;

clear all;clc;

x=[5]';err=0.000005;learn=0.0004;

grad=g(x);

%while(f(x)>err)

while(norm(grad)>err)

x=x-learn*(grad/norm(grad))

grad=g(x);

endfunction[gx]=g(x)

n=length(x);

dt=1e-8;

i=eye(n);

fx=f(x);

for i=1:n

gx(i)=(f(x+dt*i(:,i))-fx)/dt;

endgx=gx(:);

endfunction[fx]=f(x)

fx=x*exp(x)-1;

end

得到的結果:

很明顯不對,畫圖看看。可以看到在x=-1是梯度的確趨於0,但是真正的解卻在0.5左右。

我們再用 f(x)>err作為終止條件

此時得到乙個近似解,與圖中相符合。

而當 f(x)=x1+x2^2-7時,整個程式更是停不下來,原因是有乙個梯度始終為 1,所以我覺得終止條件還是 f(x)>err好一點

但是如果誤差設定的小而最小值卻高於誤差,那麼程式便不會終止。

所以梯度下降法使用的函式一定要是凸函式,便可以用 where(norm(grad)>err)了。

附上完善的**:

clear all;clc;

x=[1,1]';%初始化x

err=input('誤差,err=');%所要求的誤差

step=input('步長,step=');%步長

cnt=0;

grad=g(x);%g(x)是在點x處的梯度

while(norm(grad)>err)

x=x-step*(grad/norm(grad));

grad=g(x);

cnt=cnt+1;

enddisp('解');x

disp('迭代次數');cnt

function[gx]=g(x)%g(x)函式求在x處的梯度

n=length(x);% x變數的個數

dt=1e-8;

i=eye(n);

fx=f(x);

for i=1:n

gx(i)=(f(x+dt*i(:,i))-fx)/dt;

endgx=gx(:);

endfunction[fx]=f(x)%f(x)函式

fx=x(1)-x(2)+2*x(1)*x(1)+2*x(1)*x(2)+x(2)*x(2);

end

梯度下降法和隨機梯度下降法

批量梯度下降法 batch gradient descent 在更新引數時使用所有的樣本來進行更新 隨機梯度下降法 stochastic gradient descent 求梯度時沒有用所有的m個樣本的資料,而是僅僅選取乙個樣本j來求梯度。小批量梯度下降法 mini batch gradient d...

梯度下降法

梯度下降法 是乙個一階 最優化演算法 通常也稱為 最速下降法 我之前也沒有關注過這類演算法。最近,聽史丹福大學的機器學習課程時,碰到了用梯度下降演算法求解線性回歸問題,於是看了看這類演算法的思想。今天只寫了一些入門級的知識。我們知道,函式的曲線如下 程式設計實現 c code cpp view pl...

梯度下降法

回歸 regression 梯度下降 gradient descent 發表於332 天前 技術,科研 被圍觀 1152 次 前言 這個系列主要想能夠用數學去描述機器學習,想要學好機器學習,首先得去理解其中的數學意義,不一定要到能夠輕鬆自如的推導中間的公式,不過至少得認識這些 式子吧,不然看一些相關...