梯度下降法,主要通過梯度方向與學習率兩個值,一步一步迭代求出最優值的過程。
1. 隨機產生開始迭代的初始值,包括x值,學習率;
2. 計算函數的導數,通過學習率與導數的乘積更新x,即
其中是學習率,是函數的導數。
3. 用更新的x,更新y,重複2與3,直到相鄰兩個y值相同,或者相鄰兩個y的差值小於某個值終止。
假設以爲例,則相關python代碼實現如下:
# 第一步:隨機生成一個數,區間在[-10,10]
x_begin = np.random.uniform(-10,10)
iter_time = 1
learning_rate = 0.3
x = x_begin
y_tmp = 0
# 第二步:根據梯度乘以時間做迭代,通過前後兩次的值的差小於某個值作爲迭代終止條件
while(True):
y = x**2
# 添加終止條件,當前後兩個y值一樣時終止
if np.abs(y-y_tmp)>1e-8:
# 更新x值
print('iter time: ',iter_time)
print('gradient*learning_rate: ',2*x*learning_rate,',the x is %f' % x,'and the y is %f' % y)
iter_time = iter_time + 1
x = x - 2*x*learning_rate
y_tmp = y
else:
break
運行的結果如下所示:
梯度下降法的特點:
不能保證被優化的函數達到全局最優解。
初始化值很大程度上影響求解最優解。
當函數爲凸函數時,梯度下降法能夠保證達到全局最優解。