梯度下降法本質上是由微分公式推導而來的,即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
ηtgtηt
=ηt+
1\eta^=\frac}
ηt=t+1
ησt=
1t+1
∑i=0
t(gi
)2\sigma^=\sqrt \sum_^(g^)^2}
σt=t+1
1i=
0∑t
(gi)
2w 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
ηtg
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 次 前言 這個系列主要想能夠用數學去描述機器學習,想要學好機器學習,首先得去理解其中的數學意義,不一定要到能夠輕鬆自如的推導中間的公式,不過至少得認識這些 式子吧,不然看一些相關...