梯度下降(Gradient Descent, GD)是目前機器學習、深度學習解決最優化問題的算法中,最核心、應用最廣的方法。它不是一個機器學習算法,而是一種基於搜索的最優化方法。其作用是用來對原始模型的損失函數進行優化,以便尋找到最優的參數,使得損失函數的值最小。也就是,用已知訓練集數據尋找最優得參數,從而找到最優得擬合模型。哪什麼是梯度下降呢?
一、概念
梯度是向量,和參數維度一樣。簡單地來說,多元函數的導數(derivative)就是梯度(gradient),分別對每個變量進行微分,然後用逗號分割開,梯度是用括號包括起來,說明梯度其實是一個向量。比如說線性迴歸損失函數L的梯度爲:。
二、計算過程
1、步驟:
①、對各參數向量求偏導,得出;
②、設置初始參數向量、學習率 η及閾值threshold ;
③、迭代計算參數向量下值,若值小於等於閾值threshold 停止,此時的參數向量爲局部最優解;否則,計算下一點參數向量,公式是上一個點參數向量-η*,進行下一步迭代。
2、一元方程式
一元函數:
第一步,求導數。
第二步,初始化、η、threshold。
第三步,計算,並和threshold對比。
第四步,迭代過程。如下表所示:
2.1 簡單代碼演示
首先,手工定義原函數和導函數。
def loss_function(x):
return 3*(x**2)+5*x
def det_function(x):
return 6*x+5
然後,定義梯度下降方法。
def get_GD(od_f=None,f=None,x_0=None,eta=0.001,threshold=0):
x_all=[]
od_f_all=[]
det_f_all=[]
count_n=0
while True:
count_n+=1
y=od_f(x_0)
#計算導數在x處的值
det_f=f(x_0)
od_f_all.append(y)
x_all.append(x_0)
det_f_all.append(det_f)
#計算下一個點的值
x_0=x_0-eta*det_f
#判斷是否到達目的地
if det_f<=threshold:
break
return x_all,od_f_all,det_f_all,count_n
最後,設置x_0=1,eta=0.1,threshold=0.0001。查看圖形。
參考文章:https://mp.weixin.qq.com/s/44p8anqiiQV6XYGqH5u-Ug
https://mp.weixin.qq.com/s/nI9IBa4ccfg0xqyn0tbRPA
https://mp.weixin.qq.com/s/8gStYSSBvkXeuaX6Pp9qiQ
https://mp.weixin.qq.com/s/OUslRwKGpS29gncsiyAPyg