用梯度下降算法求解函數(shù)最小值
梯度下降是求解神經(jīng)網(wǎng)絡(luò)的核心算法。神經(jīng)網(wǎng)絡(luò)的優(yōu)化算法也是在梯度下降算法那基礎(chǔ)上的局部改良與優(yōu)化。
梯度下降算法通過求解神經(jīng)網(wǎng)絡(luò)損失函數(shù)的梯度,實(shí)現(xiàn)對損失函數(shù)最小值的逼近,間接實(shí)現(xiàn)最優(yōu)網(wǎng)絡(luò)模型的求解和逼近。
下面舉一個(gè)列子,演示梯度下降算法求解函數(shù)最小值的過程。
首先頂一個(gè)函數(shù)J(w),表示損失函數(shù)。
def J(w):
??? return w ** 2 - 2 * w +1
?
函數(shù)的導(dǎo)數(shù)(梯度)計(jì)算:
def gradient(w):?? # 梯度函數(shù)(導(dǎo)數(shù))
??? return 2 * w – 2
?
# 跟蹤模擬梯度下降
w_list = []? # 記錄w的變化歷程
J_list = []? # 對應(yīng)的損失值變化過程
?
w = 9?? # 隨機(jī)給w一個(gè)初值
alpha = 0.1? # 學(xué)習(xí)率
?
# 開始梯度下降,向最優(yōu)解靠近
for i in range(50):? #下降50歩,這個(gè)數(shù)字可調(diào)整
??? w_list.append(w)? #保存當(dāng)前的w
??? J_list.append(J(w))? # 保存當(dāng)前的損失值
??? w = w - alpha * gradient(w)? # 梯度下降一步,迭代一次
?
#繪圖顯示梯度下降效果(過程)
import matplotlib.pyplot as plt
import numpy as np
#先畫原來的損失函數(shù)曲線
w = np.arange(-9,11,1)
J_w = J(w)
plt.figure(figsize=(12,6))
plt.plot(w, J_w)
plt.text(-7,80,'$J(w)=w^{2}-2w+1$',fontsize=15)
plt.xticks(range(-11,11,1));
#繪制剛才的梯度下降過程
plt.plot(w_list, J_list, 'ro--')
plt.show()
?
繪制的梯度下降過程如圖所示。

print(f'模型的最優(yōu)解是:{w_list[-1]},對應(yīng)的損失值是:{J_list[-1]}')
顯示結(jié)果如下:
模型的最優(yōu)解是:1.0001427247692707,對應(yīng)的損失值是:2.03703598433691e-08
很有意思的一個(gè)結(jié)果。調(diào)整梯度下降的相關(guān)參數(shù),可以觀察到更多有趣的結(jié)果。當(dāng)然,用梯度下降求解如此簡單的函數(shù),有點(diǎn)兒“大材小用了”。不過,梯度下降用于神經(jīng)網(wǎng)絡(luò)求解,則再好不過了。