大良商城網(wǎng)站建設(shè)2023疫情最新消息今天
Adam是一種自適應(yīng)學(xué)習(xí)率的優(yōu)化算法,結(jié)合了動量和自適應(yīng)學(xué)習(xí)率的特性。
主要思想是根據(jù)參數(shù)的梯度來動態(tài)調(diào)整每個參數(shù)的學(xué)習(xí)率。
核心原理包括:
-
動量(Momentum):Adam算法引入了動量項(xiàng),以平滑梯度更新的方向。這有助于加速收斂并減少震蕩。
-
自適應(yīng)學(xué)習(xí)率:Adam算法計算每個參數(shù)的自適應(yīng)學(xué)習(xí)率,允許不同參數(shù)具有不同的學(xué)習(xí)速度。
-
偏差修正(Bias Correction):Adam算法在初期迭代中可能受到偏差的影響,因此它使用偏差修正來糾正這個問題。
Adam相關(guān)公式
初始化:
-
參數(shù):
-
學(xué)習(xí)率:
-
梯度估計的移動平均(一階矩):
-
梯度平方的移動平均(二階矩):
-
時間步數(shù):
每個迭代步驟:
-
計算梯度:
-
更新一階矩:
-
更新二階矩:
-
修正偏差(Bias Correction):?
和?
-
更新參數(shù):
,其中?
?是一個小的常數(shù),以防分母為零。
項(xiàng)目:基于Adam優(yōu)化算法的神經(jīng)網(wǎng)絡(luò)訓(xùn)練
在這個項(xiàng)目中,我們將使用Adam優(yōu)化算法來訓(xùn)練一個簡單的神經(jīng)網(wǎng)絡(luò),以解決二分類問題。我們將深入討論Adam算法的原理和公式,并展示如何在Python中實(shí)施它。最后,我們將繪制學(xué)習(xí)曲線,以可視化模型的訓(xùn)練進(jìn)展。
項(xiàng)目:基于Adam優(yōu)化算法的神經(jīng)網(wǎng)絡(luò)訓(xùn)練
在這個項(xiàng)目中,我們將使用Adam優(yōu)化算法來訓(xùn)練一個簡單的神經(jīng)網(wǎng)絡(luò),以解決二分類問題。我們將深入討論Adam算法的原理和公式,并展示如何在Python中實(shí)施它。最后,我們將繪制學(xué)習(xí)曲線,以可視化模型的訓(xùn)練進(jìn)展。
模型訓(xùn)練
使用Python代碼實(shí)現(xiàn)Adam算法來訓(xùn)練一個二分類的神經(jīng)網(wǎng)絡(luò)。
使用Python中的NumPy庫來進(jìn)行計算,并使用一個合成的數(shù)據(jù)集來演示。
import?numpy?as?np
import?matplotlib.pyplot?as?plt#?定義模型和數(shù)據(jù)
np.random.seed(42)
X?=?np.random.rand(100,?2)??#?特征數(shù)據(jù)
y?=?(X[:,?0]?+?X[:,?1]?>?1).astype(int)??#?二分類標(biāo)簽#?定義神經(jīng)網(wǎng)絡(luò)模型
def?sigmoid(x):return?1?/?(1?+?np.exp(-x))def?predict(X,?weights):return?sigmoid(np.dot(X,?weights))#?初始化參數(shù)和超參數(shù)
theta?=?np.random.rand(2)??#?參數(shù)初始化
alpha?=?0.1??#?學(xué)習(xí)率
beta1?=?0.9??#?一階矩衰減因子
beta2?=?0.999??#?二階矩衰減因子
epsilon?=?1e-8??#?用于防止分母為零#?初始化Adam算法所需的中間變量
m?=?np.zeros(2)
v?=?np.zeros(2)
t?=?0#?訓(xùn)練模型
num_epochs?=?100
for?epoch?in?range(num_epochs):for?i?in?range(len(X)):t?+=?1gradient?=?(predict(X[i],?theta)?-?y[i])?*?X[i]m?=?beta1?*?m?+?(1?-?beta1)?*?gradientv?=?beta2?*?v?+?(1?-?beta2)?*?gradient**2m_hat?=?m?/?(1?-?beta1**t)v_hat?=?v?/?(1?-?beta2**t)theta?-=?alpha?*?m_hat?/?(np.sqrt(v_hat)?+?epsilon)#?輸出訓(xùn)練后的參數(shù)
print("訓(xùn)練完成后的參數(shù):",?theta)#?定義損失函數(shù)
def?loss(X,?y,?weights):y_pred?=?predict(X,?weights)return?-np.mean(y?*?np.log(y_pred)?+?(1?-?y)?*?np.log(1?-?y_pred))#?記錄損失值
loss_history?=?[]
for?i?in?range(len(X)):loss_history.append(loss(X[i],?y[i],?theta))#?繪制損失函數(shù)曲線
plt.plot(range(len(X)),?loss_history)
plt.xlabel("Iteration")
plt.ylabel("Loss?Function?Value")
plt.title("Change?in?Loss?Function?Over?Time")
plt.show()
這個圖形將顯示損失函數(shù)值隨著迭代次數(shù)的減小而減小,這表明Adam優(yōu)化算法成功地訓(xùn)練了模型。
?
?
?