在深度學習過程中,避免不了使用梯度下降演算法。但是對於「非凸問題」,訓練得到的結果往往可能陷入區域性極小值,而非全域性最優解。那麼這裡就以himmelblau 函式為例,**待優化引數的初始值對梯度下降方向的影響,從而得到不同的區域性極小值。
首先介紹一下himmelblau 函式:
下圖 為 himmelblau 函式的等高線,大致可以看出,它共有 4 個區域性極小值點,並且區域性極小值都是 0,所以這 4 個區域性極小值也是全域性最小值。我們可以通過解析的方法計算出區域性極小值座標,他們分別是(3,2), (−2 805,3 131), (−3 779,−3 283), (3 584,−1 848)。
在已經知道極小值解的情況下,我們現在來用梯度下降演算法來優化 himmelblau 函式的數值極小值解。
程式清單:
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
defhimmelblau
(x):
return
(x[0]**
2+ x[1]
-11)**
2+(x[0
]+ x[1]
**2-7
)**2x = np.arange(-6
,6,0.1
)y = np.arange(-6
,6,0.1
)print
('x,y range:'
, x.shape, y.shape)
x, y = np.meshgrid(x, y)
# 生成x-y平面網格點,方便視覺化
print
('x,y maps:'
, x.shape, y.shape)
z = himmelblau(
[x, y]
)# 呼叫函式,計算函式值
fig = plt.figure(
'himmelblau'
)ax = fig.gca(projection=
'3d'
)ax.plot_su***ce(x, y, z)
# 繪製3d圖形
ax.view_init(60,
-30)ax.set_xlabel(
'x')
ax.set_ylabel(
'y')
ax.set_ylabel(
'z')
plt.show(
)x = tf.constant([4
.,0.
])# 初始化引數(下面的實驗只需要改這一行的引數)
for step in
range
(200):
with tf.gradienttape(
)as tape:
# 梯度跟蹤
tape.watch(
[x])
# 加入梯度跟蹤列表
y = himmelblau(x)
# 向前傳播
grads = tape.gradient(y,
[x])[0
]# 梯度計算
x -=
0.01
*grads # 梯度下降
if step %
20==19:
print
('step{}: x,y={}; h(x,y)={}'
.format
(step, x.numpy(
), y.numpy())
)
在上面**中,我們只需要改初始化引數,來看看對最終結果的影響
(1)第一次,選取初始點為(4,0),經過200輪迭代訓練後,得到的極小值處為:(3.584,-1.848),極小值接近0。訓練結果如下:
(2)第二次,選取初始點(1,0),訓練結果如下:
(3)第三次,選取初始點(-4,0),訓練結果如下:
(4)第四次,選取初始點(-2,2),訓練結果如下:
統計上面的四次實驗得到的數值結果,與我們通過筆算得到的解析解進行比較,如下表:
可得出如下結論:
(1)通過梯度下降法訓練得到的數值最優解(極小值),幾乎等於解析解。
(2)當對待優化引數x初始化為不同的值時,最後對應的最優解(極小值)處也不相同。
這表明:通過梯度下降演算法迭代得到的最優解(區域性極小值)位置與待優化引數的初始值密切相關
深度學習(七)梯度下降法
應用機器學習演算法時,我們通常採用梯度下降法來對採用的演算法進行訓練。其實,常用的梯度下降法還具體包含有三種不同的形式,它們也各自有著不同的優缺點。總結如下 下面我們以線性回歸演算法來對三種梯度下降法進行比較。一般線性回歸函式的假設函式為 對應的能量函式 損失函式 形式為 下圖為乙個二維引數 0和 ...
機器學習演算法(四) 梯度下降法
在對模型優化時,希望通過梯度下降法使得模型的損失函式降低。目前主要的梯度下降法有sgd momentum adagrad rmsprop adam幾種,接下來將詳細討論這幾種方法以及他們的優缺點。隨機選取乙個樣本的損失來近似整體樣本的平均損失,sgd在進行引數更新時的計算方式為 t t 1 gt t...
機器學習(三) 梯度下降法
本部落格大部分參考了這篇博文 在微積分裡面,對多元函式的引數求 偏導數,把求得的各個引數的偏導數以向量的形式寫出來,就是梯度。比如函式f x,y 分別對x,y求偏導數,求得的梯度向量就是 f x f y 簡稱gr adf x,y 或者 f x,y 如果是3個引數的向量梯度,就是 f x f y,f ...