梯度下降法

2021-09-13 11:25:09 字數 3628 閱讀 9056

梯度下降法本質上是由微分公式推導而來的,即dy=

f′(x

)dxdy=f ^(x)dx

dy=f′(

x)dx

。由公式可知,如果x沿著導數f′(

x)f^(x)

f′(x

)的方向行進,就會使得y增加。反之,如果沿著導數的方向行進,就會使得y減少。當函式為凸函式的時候,我們就可以通過梯度下降法得到它的最小值

要注意的是,微分公式要成立的前提是什麼呢?右側的dx必須足夠小,只有在它足夠小的前提下,此公式才成立。這也就引出了學習率這一重要概念。所以梯度下降法就是要沿著導數的反方向小步幅不斷的行進,直至導數為0停止。

我們以乙個開口朝上的拋物線方程為例,目標是求出它的最小值。**和影象如下所示:

我們用j(θ

)來表示

目標函式

j()來表示目標函式

j(θ)來表

示目標函

數,用djd

θ\frac

dθdj

​表示目標函式的導函式。用**表示如下所示:

def j(theta):

return (theta - 2.5) ** 2 - 1.0

def dj(theta):

return 2*(theta - 2.5)

在本次任務中,假設the

ta=0

theta = 0

theta=

0為起始點,假設學習率η

=0.0001

\eta =0.0001

η=0.00

01為起始值。**實現如下所示:

theta = 0

eta = 0.0001

epsilon=1e-8

times = 0

while true:

gradient = dj(theta)

if abs(gradient) < epsilon:

break

theta = theta - eta * gradient

times += 1

print("theta is {}, times is {}".format(theta, times))

結果為theta is 2.4999999950004193, times is 100141。10w多的迭代次數有些多。那我們不妨把學習率修改大一些。將學習率設定成0.001、0.01、0.1、1,結果繪製到一張**如下所示:

學習率theta

迴圈次數

0.0001

2.5100141

0.001

2.510006

0.01

2.5992

0.12.5901

—----

注:當學習率為1的時候,死迴圈無結果。

又上圖可知,學習率是和迴圈次數線性減少的,這大概是由於dj(theta)是一次函式的緣故吧。問題:是否存在優化的演算法,比如對學習率進行動態的調整呢?

eta_list = [0.0001, 0.001, 0.01, 0.1, 1]

epsilon = 1e-8

for eta in eta_list:

theta = 0

times = 0

while true:

gradient = dj(theta)

if abs(gradient) < epsilon:

break

theta = theta - eta * gradient

times += 1

print("eta is {}, theta is {}, times is {}".format(eta, theta, times))

最原始的梯度下降法存在著乙個問題,即學習率是恆定不變的。但學習應該是先快後慢會更好,即ηt=

η/t+

1\eta^=\eta/ \sqrt

ηt=η/t

+1​。這裡的+1是平滑項,目的是防止分母為0。

將學習率設定成0.01、0.1、1,結果繪製到**如下所示:

學習率theta

迴圈次數

0.01

2.5251420

0.12.5

253714

from math import sqrt

eta_list = [0.01, 0.1, 1]

epsilon = 1e-8

for eta in eta_list:

theta = 0

times = 0

while true:

gradient = dj(theta)

if abs(gradient) < epsilon:

break

theta = theta - eta * gradient / sqrt(times + 1)

times += 1

print("eta is {}, theta is {}, times is {}".format(eta, theta, times))

w t+

1=wt

−ηtσ

tgtw^ = w^ - \frac}}g^

wt+1=w

t−σt

ηt​gtηt

=ηt+

1\eta^=\frac}

ηt=t+1

​η​σt=

1t+1

∑i=0

t(gi

)2\sigma^=\sqrt \sum_^(g^)^2}

σt=t+1

1​i=

0∑t​

(gi)

2​w t+

1=wt

−ηtσ

tgt=

wt−η

∑i=0

t(gi

)2gt

w^ = w^ - \frac}}g^=w^-\frac^(g^)^2}}g^

wt+1=w

t−σt

ηt​g

t=wt

−∑i=

0t​(

gi)2

​η​g

t

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

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

梯度下降法

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

梯度下降法

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