目錄梯度下降是乙個很常見的通過迭代求解函式極值的方法,當函式非常複雜,通過求導尋找極值很困難時可以通過梯度下降法求解。梯度下降法流程如下:
上圖中,用大寫字母表示向量,用小寫字母表示標量。
假設某人想入坑,他站在某點,他每移動一小步,都朝著他所在點的梯度的負方向移動,這樣能保證他盡快入坑,因為某個點的梯度方向是最陡峭的方向(實際上,梯度下降法有時候不是最快的下降方向,比如我們下山時,可能前方遇到乙個梁,跨過去是最快的下山方式,而不是繞開,如果是梯度下降法,肯定會繞開。),如下圖所示,此圖畫的不太能表達這個觀點,但是懶得盜圖了,意會吧:
以下舉兩個例子,兩個例子中的被求函式都很簡單,其實直接求導算極值更好,此處僅用來說明梯度下降法的步驟。
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
def descent(p, original_x = 50, steplength = 0.01):
''' gradient descent, return min y '''
deriv = p.deriv(m = 1) # 多項式p的導函式
y = # 儲存每次迭代後的y值,方便繪圖
count = 0 # 迭代次數
x = original_x # 設定x初始值
d = deriv(x) # x位置的導數
threshold = 0.001 # 閾值,當梯度小於此值時停止迭代
while np.abs(d) > threshold:
x = x - d * steplength
y = p(x)
count += 1
d = deriv(x)
plt.plot(np.arange(1, count + 1), y)
plt.show()
return y
if __name__ == "__main__":
p = np.poly1d([2, -4, 1])
min_y = descent(p)
print(min_y)
把迭代數和對應的函式值繪製出來以檢視迭代效果:
以下**中,把一組x和y當成乙個向量處理,即\(z = x^tx + 5\),其中\(x=[x\ y]^t\)
import numpy as np
import matplotlib.pyplot as plt
def deriv(xy):
dxy = 2 * xy
return dxy
def descent(xy, steplength = 0.01):
''' gradient descent, return min y '''
d = deriv(xy) # x^2 + y^2 + 5的梯度
y = # 儲存每次迭代後的y值,方便繪圖
count = 0 # 迭代次數
threshold = 0.001 # 閾值,當梯度的模小於此值時停止迭代
while np.linalg.norm(d) > threshold:
xy = xy - d * steplength
y = np.dot(xy, xy) + 5
count += 1
d = deriv(xy)
plt.plot(np.arange(1, count + 1), y)
plt.show()
return y[-1]
if __name__ == "__main__":
y = descent(np.array([50, 50]))
print(y)
把迭代數和對應的函式值繪製出來以檢視迭代效果:
q:無法收斂到某個足夠小的函式值,最後報錯: overflow ...
a:步長設定太大,步子大了,容易跨過最低點,導致函式值在最低點上下**或發散,如圖:
可以人為設定迭代次數(而不是通過閾值控制是否繼續迭代),然後觀察函式值是否收斂:
q:如何選擇合適的步長
a:步長太大會導致函式值不收斂,步長太小又浪費效能,可以通過繪製如上面的迭代次數和函式值關係圖,剛才結果後調整步長,盡量選擇滿足需求的最大步長。達爺在他的網課中給出的建議是:按照這樣的序列試驗步長:..., 0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1, ...。通過演算法自動**步長十分複雜,非大叔所能為。
q:何時停止迭代?
a:可設定乙個閾值,當梯度的模長小於這個閾值時停止迭代(當函式接近極值時,梯度接近0)。也可以人為通過剛才迭代次數和函式值影象設定迭代次數。
q:是否還有其他迭代法?
a:還有牛頓法和擬牛頓法,和梯度下降法的區別是牛頓法不是沿著梯度負方向下降的,而是另一套演算法得出的方向,下降速度更快。
q:迭代法是否一定會找到函式值域內的最小值?
a:不是,如果函式不是乙個凸函式,那麼迭代法可能會找到乙個區域性最小值或鞍點值。
q:函式最大值怎麼找
a:給函式取個負號然後找最小值,或者沿著梯度方向前進而不是負梯度方向前進
機器學習一(梯度下降法)
最近偶觸python,感ctrl c和ctrl v無比順暢,故越發膨脹。怒拾起python資料分析一pdf讀之,不到百頁,內心惶恐,嘆 臥槽,這都tm是啥,甚是迷茫。遂感基礎知識薄弱,隨意搜了機器學習教程,小看一翻。此文給出課件中幾個演算法,自己都不知道對不對,感覺還可以吧。本文以線性回歸為例,在給...
最優化演算法(一) 梯度下降法
梯度下降法的目標是 此時輸入 目標函式f x 梯度函式g x 精度e 輸出 f x 的極小點 1 取初始值 2 計算 3 計算梯度值更新,k k 1。注意 一般當目標函式為凸函式時,梯度下降法為全域性最優解,對於複雜函式並不一定。對於梯度下降有兩種實現方法 批量梯度下降 每次遍歷所有的樣本取最小化所...
動手學深度學習 7 2 梯度下降和隨機梯度下降
在本節中,我們將介紹梯度下降 gradient descent 的工作原理。雖然梯度下降在深度學習中很少被直接使用,但理解梯度的意義以及沿著梯度反方向更新自變數可能降低目標函式值的原因是學習後續優化演算法的基礎。隨後,我們將引出隨機梯度下降 stochastic gradient descent 我...