1. 程式人生 > >梯度下降法求函式最小值 基於matlab實現

梯度下降法求函式最小值 基於matlab實現

演算法原理

梯度下降法是一個最優化演算法,可以用來求一個函式的最小值,最大值等,也常用於人工神經網路中更新各個感知器之間的權值,求出cost function的最小值等,應用廣泛。
其原理簡單,就求函式的最小值這個應用而言,大致說來就是先求出該函式梯度,大家都知道梯度是一個函式在該點的最快上升率,那麼求個相反數就是最快下降率了。將每個自變數按下列公式更新:

xt+1=xt+Δx
其中
Δx=ηfx
η稱為學習速率,也稱為步長,指明瞭自變數朝向最快下降方向減少的速度,這個值的選定相當重要,太大了會導致震盪,無法收斂到最小值點,太小了會導致收斂速度過慢。
xt+1xt的差小於一個閥值時,就可以停止迴圈了。

Matlab實現

% 沒有加入衝量項的隨機梯度下降法實現
syms x y real
y(x) = x^2+2*x+10 ;
delta(x) = -diff(y(x)) ;
step = 0.1 ;
first_x = 10 ;
x_current = first_x ;
x_next = first_x ;
show_tmp = 0 ;
show = [] ;
counter = 0 ;
delta_last = 0 ;
while (true)
    delta_x = double(delta(x_current))*step ;
    if(abs(delta_x) < 0.0001)
        break
end x_next = x_current + delta_x ; x_current = x_next ; counter = counter + 1; show_tmp = x_next ; show = [show, show_tmp] ; if(counter > 200) break ; end end x_next counter figure(1) ezplot(y(x)) hold on plot([-100, 100],[double(y(x_next)), double(y(x_next))],'-r'
) double(y(x_next)) figure(2) plot(show) pause close all

待求解的函式曲線圖像如下所示,其中的紅線為梯度下降法算出來的最小值,可以看出來梯度下降法成功求出了該函式的最小值。
函式曲線,其中紅線為梯度下降法計算出來的最小值
自變數的變化曲線,可以看出當迴圈超過25次時,此時的x已經很接近最小值點了,收斂速度取決於步長step。
自變數的變化曲線

各位可以自行調整步長和初始值,觀察其收斂速度的變化,需要注意的是,這個步長如果太大將會導致震盪,無法收斂到最小值點,如果太小,將導致收斂速度太慢。
——————————————————————————————
另外,這個函式因為是二次函式,沒有多個極點,因此梯度下降法能夠在不陷入區域性最優的情況下找到最大值,如果是存在多個極點的複雜函式會怎麼樣呢?讓我們看下以下例子:

% 加入了衝量項,緩解陷入區域性最優的隨機梯度下降演算法
syms x y real
y(x) = x^2+4*x+sin(cos(2*x+x^2)) ;
delta(x) = -diff(y(x)) ;
step = 0.1 ;
first_x = 10 ;
x_current = first_x ;
x_next = first_x ;
show_tmp = 0 ;
show = [] ;
counter = 0 ;
delta_last = 0 ;
alpha = 0; % 衝量項比例係數,設為0相當於沒有加入衝量項
while (true)
    delta_x = double(delta(x_current))*step + delta_last*alpha;
    delta_last = delta_x ;
    if(abs(delta_x) < 0.0001)
        break
    end
    x_next = x_current + delta_x ;
    x_current = x_next ;
    counter = counter + 1;
    show_tmp = x_next ;
    show = [show, show_tmp] ;
    if(counter > 200)
        break ;
    end
end
x_next
counter
figure(1)
ezplot(y(x))
hold on 
plot([-100, 100],[double(y(x_next)), double(y(x_next))],'-r')
double(y(x_next))
figure(2)
plot(show)
pause
close all

可以看出來,最小值和剃度下降法算出來的最小值並沒有重合,此時演算法陷入了局部最優點,梯度下降法算出的最小值是y = -3.1586
函式曲線
自變數變化曲線如下:
自變數變化曲線
當把衝量項的係數alpha改為0.5時,得出:
衝量項
此時梯度下降法算出來的最小值為 y = -3.9611,從圖中也可以看出已經是達到了函式最低點了。
自變數變化曲線如下:
這裡寫圖片描述

總結上面的實驗,可以看出,加入衝量項可以緩解梯度下降法陷入區域性最優的風險。