長(zhǎng)春網(wǎng)站品牌seo培訓(xùn)咨詢
🏆作者簡(jiǎn)介,普修羅雙戰(zhàn)士,一直追求不斷學(xué)習(xí)和成長(zhǎng),在技術(shù)的道路上持續(xù)探索和實(shí)踐。
🏆多年互聯(lián)網(wǎng)行業(yè)從業(yè)經(jīng)驗(yàn),歷任核心研發(fā)工程師,項(xiàng)目技術(shù)負(fù)責(zé)人。
🎉歡迎 👍點(diǎn)贊?評(píng)論?收藏
文章目錄
- 🏆人工智能(邏輯回歸算法)
- 🔎 一、邏輯回歸算法知識(shí)
- 🍁🍁 01. 梯度下降法(Gradient Descent)
- 🍁 1.1 什么是梯度下降法?
- 🍁 1.2 梯度下降法的具體步驟和算法公式?
- 🍁 1.3 梯度下降法的算法公式實(shí)現(xiàn)?
- 🍁🍁 02. 牛頓法(Newton's Method)和擬牛頓法(Quasi-Newton Methods)
- 🍁 2.1 什么是牛頓法和擬牛頓法?
- 🍁 2.2 牛頓法和擬牛頓法的具體步驟和算法公式?
- 🍁 2.3 牛頓法和擬牛頓法的算法公式實(shí)現(xiàn)?
- 🍁🍁 03. 共軛梯度法(Conjugate Gradient)
- 🍁 3.1 什么是共軛梯度法?
- 🍁 3.2 共軛梯度法的具體步驟和算法公式?
- 🍁 3.3 共軛梯度法的算法公式實(shí)現(xiàn)?
- 🍁🍁 04. 改進(jìn)的隨機(jī)梯度下降法(Improved Stochastic Gradient Descent)
- 🍁 4.1 什么是改進(jìn)的隨機(jī)梯度下降法?
- 🍁🍁 05. Adagrad(自適應(yīng)梯度算法)
- 🍁 5.1 什么是 Adagrad?
- 🍁 5.2 RMSprop(均方根傳播)的具體步驟和算法公式?
- 🍁 5.3 RMSprop(均方根傳播)的算法公式實(shí)現(xiàn)?
- 🍁🍁 06. RMSprop(均方根傳播)
- 🍁 6.1 什么是RMSprop?
- 🍁 6.2 Adam(自適應(yīng)矩估計(jì))的具體步驟和算法公式?
- 🍁 6.3 Adam(自適應(yīng)矩估計(jì))的算法公式實(shí)現(xiàn)?
- 🍁🍁 07. Adam(自適應(yīng)矩估計(jì))
- 🍁 7.1 什么是 Adam?
- 🍁 7.2 Adam的具體步驟和算法公式?
- 🍁 7.3 Adam的算法公式實(shí)現(xiàn)?
- 🍁🍁 08. LBFGS(Limited-memory Broyden-Fletcher-Goldfarb-Shanno)
- 🍁 8.1 什么是 LBFGS?
- 🍁 8.2 LBFGS(Limited-memory Broyden-Fletcher-Goldfarb-Shanno)的具體步驟和算法公式?
- 🍁 8.3 LBFGS(Limited-memory Broyden-Fletcher-Goldfarb-Shanno)的算法公式實(shí)現(xiàn)?
- 🍁🍁 09. Adamax
- 🍁 9.1 什么是 Adamax ?
- 🍁 9.2 Adamax的具體步驟和算法公式?
- 🍁 9.3 Nadam的算法公式實(shí)現(xiàn)?
- 🍁🍁 10. Nadam
- 🍁 10.1 什么是**Nadam ?
- 🍁 10.2 Nadam的具體步驟和算法公式?
- 🍁 10.3 Nadam的算法公式實(shí)現(xiàn)?
🏆人工智能(邏輯回歸算法)
🔎 一、邏輯回歸算法知識(shí)
🍁🍁 01. 梯度下降法(Gradient Descent)
🍁 1.1 什么是梯度下降法?
梯度下降法是最常用的優(yōu)化算法之一。它通過迭代更新模型參數(shù),沿著損失函數(shù)梯度的反方向逐步進(jìn)行參數(shù)調(diào)整。包括批量梯度下降(Batch Gradient Descent)、隨機(jī)梯度下降(Stochastic Gradient Descent)和小批量梯度下降(Mini-batch Gradient Descent)等變種。
🍁 1.2 梯度下降法的具體步驟和算法公式?
梯度下降法是一種常用的優(yōu)化算法,用于最小化一個(gè)函數(shù)的值。該算法通常用于機(jī)器學(xué)習(xí)中的模型訓(xùn)練過程,例如邏輯回歸、線性回歸等。下面是梯度下降法的具體步驟和算法公式:
算法輸入:學(xué)習(xí)率(learning rate) α \alpha α、迭代次數(shù) T T T、損失函數(shù) J ( θ ) J(\theta) J(θ)
-
初始化參數(shù) θ = [ θ 1 , θ 2 , . . . , θ n ] \theta = [\theta_1, \theta_2, ..., \theta_n] θ=[θ1?,θ2?,...,θn?],其中 n n n 表示模型參數(shù)的個(gè)數(shù)。
-
將迭代次數(shù)設(shè)置為 t = 0 t = 0 t=0。
-
如果 t > T t > T t>T,則停止迭代,否則繼續(xù)下面的步驟。
-
計(jì)算損失函數(shù) J ( θ ) J(\theta) J(θ) 對(duì)參數(shù) θ \theta θ 的梯度 ? θ J ( θ ) \nabla_\theta J(\theta) ?θ?J(θ)。
-
根據(jù)學(xué)習(xí)率 α \alpha α,更新參數(shù) θ \theta θ:
-
將迭代次數(shù) t t t 加 1。
-
返回步驟 3。
🍁 1.3 梯度下降法的算法公式實(shí)現(xiàn)?
梯度下降法的算法公式可以很簡(jiǎn)單地實(shí)現(xiàn)。下面是一個(gè)基本的梯度下降算法的偽代碼:
輸入: 學(xué)習(xí)率 α \alpha α,迭代次數(shù) T T T,初始參數(shù) θ \theta θ
Repeat T T T 次: 計(jì)算損失函數(shù) J ( θ ) J(\theta) J(θ) 對(duì)參數(shù) θ \theta θ 的梯度 ? θ J ( θ ) \nabla_\theta J(\theta) ?θ?J(θ) 更新參數(shù) θ = θ ? α ? θ J ( θ ) \theta = \theta - \alpha \nabla_\theta J(\theta) θ=θ?α?θ?J(θ)
返回參數(shù) θ \theta θ
以下是一個(gè)簡(jiǎn)化的 Python 實(shí)現(xiàn)代碼示例:
def gradient_descent(X, y, learning_rate, iterations):# 初始化參數(shù)theta = np.zeros(X.shape[1])m = len(y)for i in range(iterations):# 計(jì)算模型預(yù)測(cè)值h = np.dot(X, theta)# 計(jì)算損失函數(shù)對(duì)參數(shù)的偏導(dǎo)數(shù)gradient = (1 / m) * np.dot(X.T, (h - y))# 更新參數(shù)theta = theta - learning_rate * gradientreturn theta
在這個(gè)代碼中,X 是特征矩陣,y 是目標(biāo)向量,learning_rate 是學(xué)習(xí)率,iterations 是迭代次數(shù)。通過計(jì)算參數(shù)梯度和更新參數(shù),最終返回訓(xùn)練得到的參數(shù) θ \theta θ。
請(qǐng)注意,該代碼示例假設(shè)使用線性回歸進(jìn)行梯度下降,因此對(duì)應(yīng)的損失函數(shù)為均方誤差。對(duì)于不同的模型和損失函數(shù),需要根據(jù)具體情況進(jìn)行相應(yīng)的修改。
🍁🍁 02. 牛頓法(Newton’s Method)和擬牛頓法(Quasi-Newton Methods)
🍁 2.1 什么是牛頓法和擬牛頓法?
牛頓法和擬牛頓法是一類基于二階導(dǎo)數(shù)信息的優(yōu)化算法。牛頓法使用二階導(dǎo)數(shù)(海森矩陣)來更新參數(shù),可以更快地收斂,但計(jì)算代價(jià)較高。擬牛頓法通過近似海森矩陣來降低計(jì)算復(fù)雜度,并在一定程度上保持收斂性能。
🍁 2.2 牛頓法和擬牛頓法的具體步驟和算法公式?
牛頓法(Newton’s Method)和擬牛頓法(Quasi-Newton Method)都是一種迭代優(yōu)化算法,用于求解無約束優(yōu)化問題。它們通過逐步逼近目標(biāo)函數(shù)的最小值點(diǎn),并更新參數(shù)的方法不同。下面分別介紹牛頓法和擬牛頓法的具體步驟和算法公式:
-
牛頓法: 牛頓法利用目標(biāo)函數(shù)的二階導(dǎo)數(shù)(海森矩陣)來逼近目標(biāo)函數(shù)的局部形狀,并通過更新參數(shù)來逼近最小值點(diǎn)。
輸入:目標(biāo)函數(shù) f ( x ) f(x) f(x), 初始點(diǎn) x 0 x_0 x0?,迭代停止準(zhǔn)則(例如,梯度大小或迭代次數(shù))
- 初始化 x = x 0 x = x_0 x=x0?,設(shè)置迭代次數(shù) k = 0 k = 0 k=0。
- 計(jì)算目標(biāo)函數(shù)的一階導(dǎo)數(shù)(梯度)和二階導(dǎo)數(shù)(海森矩陣): g k = ? f ( x k ) g_k = \nabla f(x_k) gk?=?f(xk?), H k = ? 2 f ( x k ) H_k = \nabla^2 f(x_k) Hk?=?2f(xk?)。
- 求解方程 H k Δ x = ? g k H_k \Delta x = -g_k Hk?Δx=?gk?,得到搜索方向 Δ x \Delta x Δx。
- 選擇合適的步長(zhǎng) α \alpha α,更新參數(shù): x k + 1 = x k + α Δ x x_{k+1} = x_k + \alpha \Delta x xk+1?=xk?+αΔx。
- 若滿足停止準(zhǔn)則(如梯度的大小是否小于某個(gè)閾值),則停止迭代;否則,令 k = k + 1 k = k + 1 k=k+1,返回步驟 2。
在每次迭代中,牛頓法使用搜索方向和步長(zhǎng)來更新參數(shù),并在每一步中計(jì)算目標(biāo)函數(shù)的一階和二階導(dǎo)數(shù)。相比于梯度下降法,牛頓法可以更快地收斂到最小值附近。
-
擬牛頓法: 擬牛頓法是對(duì)牛頓法的改進(jìn),因?yàn)橛?jì)算精確的海森矩陣較為困難,擬牛頓法使用近似的方法來構(gòu)造參數(shù)更新規(guī)則。
輸入:目標(biāo)函數(shù) f ( x ) f(x) f(x),初始點(diǎn) x 0 x_0 x0?,迭代停止準(zhǔn)則,初始的近似海森矩陣 B 0 B_0 B0?。
- 初始化 x = x 0 x = x_0 x=x0?,設(shè)置迭代次數(shù) k = 0 k = 0 k=0。
- 計(jì)算目標(biāo)函數(shù)的一階導(dǎo)數(shù)(梯度): g k = ? f ( x k ) g_k = \nabla f(x_k) gk?=?f(xk?)。
- 求解方程 B k Δ x = ? g k B_k \Delta x = -g_k Bk?Δx=?gk?,得到搜索方向 Δ x \Delta x Δx。
- 選擇合適的步長(zhǎng) α \alpha α,更新參數(shù): x k + 1 = x k + α Δ x x_{k+1} = x_k + \alpha \Delta x xk+1?=xk?+αΔx。
- 計(jì)算新迭代點(diǎn)的梯度 g k + 1 = ? f ( x k + 1 ) g_{k+1} = \nabla f(x_{k+1}) gk+1?=?f(xk+1?)。
- 使用近似的方法更新近似海森矩陣 B k B_k Bk?。
- 若滿足停止準(zhǔn)則(如梯度的大小是否小于某個(gè)閾值),則停止迭代;否則,令 k = k + 1 k = k + 1 k=k+1,返回步驟 3。
擬牛頓法中,迭代過程中的海森矩陣 B k B_k Bk? 是通過歷史的一階導(dǎo)數(shù)和參數(shù)更新值來逼近目標(biāo)函數(shù)的海森矩陣。常用的擬牛頓法包括DFP(Davidon-Fletcher-Powell)方法和BFGS(Broyden-Fletcher-Goldfarb-Shanno)方法等。
🍁 2.3 牛頓法和擬牛頓法的算法公式實(shí)現(xiàn)?
牛頓法和擬牛頓法的具體算法公式可以通過數(shù)學(xué)推導(dǎo)得到,下面是它們的算法公式實(shí)現(xiàn):
-
牛頓法的算法公式:
輸入: 目標(biāo)函數(shù) f ( x ) f(x) f(x),梯度函數(shù) g ( x ) g(x) g(x),海森矩陣函數(shù) H ( x ) H(x) H(x),初始點(diǎn) x 0 x_0 x0?,迭代停止準(zhǔn)則(如梯度大小或迭代次數(shù))
Repeat 直到滿足停止準(zhǔn)則:
- 計(jì)算梯度: g k = g ( x k ) g_k = g(x_k) gk?=g(xk?)
- 計(jì)算海森矩陣: H k = H ( x k ) H_k = H(x_k) Hk?=H(xk?)
- 求解線性方程組: H k Δ x = ? g k H_k \Delta x = -g_k Hk?Δx=?gk?,找到搜索方向 Δ x \Delta x Δx
- 選擇合適的步長(zhǎng) α \alpha α,更新參數(shù): x k + 1 = x k + α Δ x x_{k+1} = x_k + \alpha \Delta x xk+1?=xk?+αΔx
返回參數(shù) x ? x^* x?
在實(shí)現(xiàn)中需要注意,解線性方程組的方法可以選擇使用直接求解方法(如LU分解、Cholesky分解)或迭代方法(如共軛梯度法)。
-
擬牛頓法的算法公式:
輸入: 目標(biāo)函數(shù) f ( x ) f(x) f(x),梯度函數(shù) g ( x ) g(x) g(x),初始點(diǎn) x 0 x_0 x0?,迭代停止準(zhǔn)則,初始的近似海森矩陣 B 0 B_0 B0?
Repeat 直到滿足停止準(zhǔn)則:
- 計(jì)算梯度: g k = g ( x k ) g_k = g(x_k) gk?=g(xk?)
- 求解線性方程組: B k Δ x = ? g k B_k \Delta x = -g_k Bk?Δx=?gk?,找到搜索方向 Δ x \Delta x Δx
- 選擇合適的步長(zhǎng) α \alpha α,更新參數(shù): x k + 1 = x k + α Δ x x_{k+1} = x_k + \alpha \Delta x xk+1?=xk?+αΔx
- 計(jì)算新迭代點(diǎn)的梯度: g k + 1 = g ( x k + 1 ) g_{k+1} = g(x_{k+1}) gk+1?=g(xk+1?)
- 更新近似海森矩陣 B k B_k Bk? 的方法(如DFP、BFGS等)
返回參數(shù) x ? x^* x?
在實(shí)現(xiàn)擬牛頓法時(shí),需要選擇合適的近似海森矩陣更新方法,常用的方法有DFP、BFGS、SR1(Symmetric Rank-One)等。
下面是使用Python實(shí)現(xiàn)牛頓法和擬牛頓法的示例代碼:
-
牛頓法的Python實(shí)現(xiàn):
import numpy as npdef newton_method(f, df, d2f, x0, epsilon=1e-6, max_iter=100):x = x0for _ in range(max_iter):g = df(x)H = d2f(x)dx = -np.linalg.solve(H, g)x += dxif np.linalg.norm(dx) < epsilon:breakreturn x# 示例函數(shù) def f(x):return x**2 + 2*x + 1# 示例函數(shù)的一階導(dǎo)數(shù) def df(x):return 2*x + 2# 示例函數(shù)的二階導(dǎo)數(shù) def d2f(x):return 2# 使用牛頓法求解最小值點(diǎn) x0 = 0 # 初始點(diǎn) x_min = newton_method(f, df, d2f, x0) print("最小值點(diǎn):", x_min) print("最小值:", f(x_min))
-
擬牛頓法的Python實(shí)現(xiàn)(以BFGS方法為例):
import numpy as npdef bfgs_method(f, df, x0, epsilon=1e-6, max_iter=100):n = x0.shape[0]B = np.eye(n) # 初始的近似海森矩陣x = x0for _ in range(max_iter):g = df(x)dx = -np.linalg.solve(B, g) # 求解搜索方向alpha = line_search(f, df, x, dx) # 步長(zhǎng)選擇方法(這里假設(shè)有個(gè)line_search函數(shù))x_new = x + alpha*dxg_new = df(x_new)s = x_new - xy = g_new - grho = 1 / np.dot(y, s)B = (np.eye(n) - rho * np.outer(s, y)) @ B @ (np.eye(n) - rho * np.outer(y, s)) + rho*np.outer(s, s)x = x_newif np.linalg.norm(alpha*dx) < epsilon:breakreturn x# 示例函數(shù)和一階導(dǎo)函數(shù)同上# 使用BFGS擬牛頓法求解最小值點(diǎn) x0 = np.array([0, 0]) # 初始點(diǎn) x_min = bfgs_method(f, df, x0) print("最小值點(diǎn):", x_min) print("最小值:", f(x_min))
這兩個(gè)示例代碼是簡(jiǎn)化的實(shí)現(xiàn),僅適用于特定的目標(biāo)函數(shù)和問題。在實(shí)際應(yīng)用中,需要根據(jù)具體問題進(jìn)行調(diào)整和改進(jìn),例如適當(dāng)修改迭代停止準(zhǔn)則、步長(zhǎng)選擇方法等。同時(shí),可以使用更高效的數(shù)值計(jì)算庫(kù)(如NumPy)和線性方程組求解方法(如SciPy庫(kù)的scipy.linalg.solve
)來提高計(jì)算效率。
🍁🍁 03. 共軛梯度法(Conjugate Gradient)
🍁 3.1 什么是共軛梯度法?
共軛梯度法是一種迭代方法,它可以更快地收斂于二次型損失函數(shù)。如果邏輯回歸的損失函數(shù)是二次型,共軛梯度法是一種高效且可行的優(yōu)化算法。
🍁 3.2 共軛梯度法的具體步驟和算法公式?
共軛梯度法(Conjugate Gradient Method)是一種用于解決線性方程組的迭代方法,它也可以被用于求解無約束最優(yōu)化問題。這里給出共軛梯度法在求解無約束最優(yōu)化問題時(shí)的步驟和算法公式:
假設(shè)我們要求解無約束最優(yōu)化問題 min ? f ( x ) \min \, f(x) minf(x),其中 f ( x ) f(x) f(x) 是目標(biāo)函數(shù)。令 x ? x^* x? 是最小值點(diǎn)。
-
初始化:選擇初始點(diǎn) x 0 x_0 x0?,計(jì)算梯度 g 0 = ? f ( x 0 ) g_0 = \nabla f(x_0) g0?=?f(x0?),初始化搜索方向 d 0 = ? g 0 d_0 = -g_0 d0?=?g0?,迭代初始點(diǎn)索引 k = 0 k = 0 k=0。
-
搜索步長(zhǎng):選擇一個(gè)合適的步長(zhǎng) α k \alpha_k αk?,例如通過線搜索方法(比如Armijo線搜索、Wolfe線搜索等)。
-
更新參數(shù):更新參數(shù) x k + 1 = x k + α k d k x_{k+1} = x_k + \alpha_k d_k xk+1?=xk?+αk?dk?。
-
計(jì)算梯度:計(jì)算新的梯度 g k + 1 = ? f ( x k + 1 ) g_{k+1} = \nabla f(x_{k+1}) gk+1?=?f(xk+1?)。
-
檢查終止準(zhǔn)則:如果滿足終止準(zhǔn)則(如梯度大小小于給定的閾值或達(dá)到最大迭代次數(shù)),則終止迭代,返回最小值點(diǎn) x ? x^* x?。否則,繼續(xù)下面的步驟。
-
計(jì)算步長(zhǎng)系數(shù) β k \beta_k βk?: β k = ∥ g k + 1 ∥ 2 ∥ g k ∥ 2 \beta_k = \frac{{\|g_{k+1}\|^2}}{{\|g_{k}\|^2}} βk?=∥gk?∥2∥gk+1?∥2?。
-
更新搜索方向:更新搜索方向 d k + 1 = ? g k + 1 + β k d k d_{k+1} = -g_{k+1} + \beta_k d_k dk+1?=?gk+1?+βk?dk?。
-
增加迭代次數(shù): k = k + 1 k = k + 1 k=k+1。
-
轉(zhuǎn)到步驟 2。
在每次迭代中,共軛梯度法利用之前的搜索方向的信息,以更高效地搜索最小值點(diǎn)。在第 k k k 步迭代中, d k d_k dk? 是在 k k k-1 步迭代后找到的收斂共軛搜索方向。
需要注意的是,共軛梯度法通常用于求解大規(guī)模線性方程組或凸二次規(guī)劃問題,其中線性方程組的系數(shù)矩陣是對(duì)稱正定的。對(duì)于一般的非線性最優(yōu)化問題,可以采用共軛梯度法的變種(如共軛梯度法和擬牛頓法的結(jié)合)來加速收斂。
請(qǐng)注意,共軛梯度法的具體實(shí)現(xiàn)可能會(huì)因應(yīng)用和問題的不同而有所調(diào)整和改進(jìn),例如使用合適的線搜索方法和收斂準(zhǔn)則。同時(shí),可以使用高效的數(shù)值計(jì)算庫(kù)(如NumPy)和線性方程組求解方法(如SciPy庫(kù)的scipy.linalg.solve
)來提高計(jì)算效率。
🍁 3.3 共軛梯度法的算法公式實(shí)現(xiàn)?
以下是共軛梯度法的算法公式實(shí)現(xiàn),以求解線性方程組為例:
輸入: 對(duì)稱正定矩陣 A A A,向量 b b b 輸出: 近似解 x x x
-
初始化:選擇初始點(diǎn) x 0 x_0 x0?,計(jì)算初始?xì)埐? r 0 = b ? A x 0 r_0 = b - A x_0 r0?=b?Ax0?,初始化搜索方向 d 0 = r 0 d_0 = r_0 d0?=r0?,設(shè)定迭代初始點(diǎn)索引 k = 0 k = 0 k=0。
-
迭代更新:對(duì)于 k = 0 , 1 , 2 , … k = 0, 1, 2, \dots k=0,1,2,…,執(zhí)行以下步驟:
2.1. 計(jì)算步長(zhǎng): α k = r k T r k d k T A d k \alpha_k = \frac{{r_k^T r_k}}{{d_k^T A d_k}} αk?=dkT?Adk?rkT?rk??。
2.2. 更新參數(shù): x k + 1 = x k + α k d k x_{k+1} = x_k + \alpha_k d_k xk+1?=xk?+αk?dk?。
2.3. 計(jì)算殘差: r k + 1 = b ? A x k + 1 r_{k+1} = b - A x_{k+1} rk+1?=b?Axk+1?。
2.4. 檢查終止準(zhǔn)則:若滿足終止準(zhǔn)則(如殘差大小小于給定的閾值或達(dá)到最大迭代次數(shù)),則終止迭代,返回近似解 x x x。
2.5. 計(jì)算步長(zhǎng)系數(shù): β k = r k + 1 T r k + 1 r k T r k \beta_k = \frac{{r_{k+1}^T r_{k+1}}}{{r_k^T r_k}} βk?=rkT?rk?rk+1T?rk+1??。
2.6. 更新搜索方向: d k + 1 = r k + 1 + β k d k d_{k+1} = r_{k+1} + \beta_k d_k dk+1?=rk+1?+βk?dk?。
2.7. 增加迭代次數(shù): k = k + 1 k = k + 1 k=k+1。
2.8. 轉(zhuǎn)到步驟 2.1。
在每次迭代中,共軛梯度法利用了之前的搜索方向的信息,以更高效地搜索最小值點(diǎn)。在第 k k k 步迭代中, d k d_k dk? 是在 k k k-1 步迭代后找到的收斂共軛搜索方向。
需要注意的是,共軛梯度法的實(shí)現(xiàn)還需要考慮一些細(xì)節(jié),例如選擇合適的初始點(diǎn)、終止準(zhǔn)則的選擇、計(jì)算過程中的數(shù)值穩(wěn)定性等。此外,在實(shí)際應(yīng)用中,通常會(huì)使用數(shù)值計(jì)算庫(kù)提供的高效線性方程組求解方法(如Cholesky分解、共軛梯度法等)來加速計(jì)算過程。
以上提供的是共軛梯度法的基本算法公式實(shí)現(xiàn),具體的實(shí)現(xiàn)方式可以根據(jù)不同的編程語(yǔ)言和數(shù)值計(jì)算庫(kù)進(jìn)行相應(yīng)的調(diào)整和優(yōu)化。
下面是使用 Python 實(shí)現(xiàn)共軛梯度法求解線性方程組的示例代碼:
import numpy as npdef conjugate_gradient(A, b, x0, max_iter=1000, tol=1e-6):"""使用共軛梯度法求解線性方程組 Ax = b,其中 A 是對(duì)稱正定矩陣。:param A: 對(duì)稱正定矩陣:param b: 右側(cè)向量:param x0: 初始點(diǎn):param max_iter: 最大迭代次數(shù):param tol: 迭代終止的殘差閾值:return: 近似解 x"""x = x0r = b - np.dot(A, x)d = rdelta = np.dot(r, r)for i in range(max_iter):q = np.dot(A, d)alpha = delta / np.dot(d, q)x = x + alpha * dr_new = r - alpha * qdelta_new = np.dot(r_new, r_new)if np.sqrt(delta_new) < tol:breakbeta = delta_new / deltad = r_new + beta * dr = r_newdelta = delta_newreturn x
其中,輸入?yún)?shù) A 和 b 分別為線性方程組的系數(shù)矩陣和右側(cè)向量,x0 為初始點(diǎn),max_iter 為最大迭代次數(shù),tol 為迭代終止的殘差閾值。對(duì)于大規(guī)模的線性方程組,可以采用稀疏矩陣進(jìn)行存儲(chǔ)和計(jì)算,以提高計(jì)算效率。
下面給出一個(gè)示例用例:
# 構(gòu)造一個(gè)對(duì)稱正定矩陣 A 和右側(cè)向量 b
n = 100
A = np.random.randn(n, n)
A = np.dot(A.T, A)
b = np.random.randn(n)# 使用初始化為零的向量作為初始點(diǎn)
x0 = np.zeros(n)# 調(diào)用共軛梯度法函數(shù)求解線性方程組 Ax = b
x = conjugate_gradient(A, b, x0)# 輸出近似解 x
print("近似解 x =", x)
注意,對(duì)于一般的非線性最優(yōu)化問題,需要結(jié)合共軛梯度法和其他優(yōu)化方法,例如牛頓法、擬牛頓法、共軛梯度法和擬牛頓法的結(jié)合等。此外,在實(shí)際應(yīng)用中需要對(duì)算法進(jìn)行調(diào)整和優(yōu)化,例如選擇合適的終止條件、計(jì)算過程中的數(shù)值穩(wěn)定性等。
🍁🍁 04. 改進(jìn)的隨機(jī)梯度下降法(Improved Stochastic Gradient Descent)
🍁 4.1 什么是改進(jìn)的隨機(jī)梯度下降法?
針對(duì)隨機(jī)梯度下降法的一些缺點(diǎn),如收斂速度較慢、參數(shù)更新不穩(wěn)定等問題,已經(jīng)提出了很多改進(jìn)的隨機(jī)梯度下降算法。例如,AdaGrad、RMSprop、Adam等算法可以自適應(yīng)地調(diào)整學(xué)習(xí)率。
🍁🍁 05. Adagrad(自適應(yīng)梯度算法)
🍁 5.1 什么是 Adagrad?
Adagrad是一種自適應(yīng)學(xué)習(xí)率算法,它根據(jù)參數(shù)的歷史梯度進(jìn)行自適應(yīng)的學(xué)習(xí)率調(diào)整。它對(duì)于稀疏特征的處理效果較好,能夠有效地進(jìn)行模型訓(xùn)練。
🍁 5.2 RMSprop(均方根傳播)的具體步驟和算法公式?
RMSProp(均方根傳播)是一種基于梯度的自適應(yīng)學(xué)習(xí)率算法,它可以根據(jù)每個(gè)參數(shù)的歷史梯度大小來自適應(yīng)地調(diào)整學(xué)習(xí)率。以下是RMSProp算法的具體步驟和算法公式:
輸入:學(xué)習(xí)率 α \alpha α,初始參數(shù) w w w,目標(biāo)函數(shù)的梯度函數(shù) ? f ( w ) \nabla f(w) ?f(w),衰減因子 ρ \rho ρ,常數(shù) ? \epsilon ?。 輸出:參數(shù)的最優(yōu)解 w ? w^\star w?。
-
初始化:初始參數(shù) w w w,初始平方梯度和 r = 0 r = 0 r=0,迭代次數(shù) t = 0 t = 0 t=0。
-
迭代更新:對(duì)于每個(gè)迭代 t t t,執(zhí)行以下步驟:
2.1. 計(jì)算當(dāng)前迭代的梯度 ? t = ? f ( w t ) \nabla_t = \nabla f(w_t) ?t?=?f(wt?)。
2.2. 計(jì)算平方梯度和的衰減平均: r = ρ r + ( 1 ? ρ ) ? t ⊙ ? t r = \rho r + (1 - \rho) \nabla_t \odot \nabla_t r=ρr+(1?ρ)?t?⊙?t? ( ⊙ \odot ⊙ 表示按元素相乘)。
2.3. 調(diào)整學(xué)習(xí)率: η t = α r + ? \eta_t = \frac{\alpha}{\sqrt{r + \epsilon}} ηt?=r+??α?。
2.4. 更新參數(shù): w t + 1 = w t ? η t ⊙ ? t w_{t+1} = w_t - \eta_t \odot \nabla_t wt+1?=wt??ηt?⊙?t?。
2.5. 增加迭代次數(shù): t = t + 1 t = t + 1 t=t+1。
-
終止準(zhǔn)則:根據(jù)預(yù)設(shè)的終止準(zhǔn)則(如達(dá)到最大迭代次數(shù)或梯度變化小于閾值)決定是否停止迭代。若終止迭代,則輸出最優(yōu)解 w ? w^\star w?;否則,返回步驟 2。
RMSProp算法與Adagrad算法都是自適應(yīng)學(xué)習(xí)率算法,但是RMSProp算法引入了衰減平均的概念,可以緩解學(xué)習(xí)率急劇下降的問題。在RMSProp算法中,參數(shù)的梯度平方和會(huì)通過衰減平均進(jìn)行平滑,以消除梯度信息的噪聲影響,同時(shí)計(jì)算出的學(xué)習(xí)率也會(huì)相應(yīng)地變得更加平滑和穩(wěn)定,提高了優(yōu)化的性能。
需要注意的是,RMSProp算法和Adagrad算法類似,都需要對(duì)目標(biāo)函數(shù)進(jìn)行偏導(dǎo)數(shù)求解,并根據(jù)求解結(jié)果生成梯度函數(shù)。在實(shí)踐應(yīng)用中,還需要對(duì)RMSProp算法進(jìn)行調(diào)參和優(yōu)化,例如選擇合適的學(xué)習(xí)率和衰減因子,常數(shù) ? \epsilon ? 的取值,初始參數(shù),終止條件等,以提高算法的效率和魯棒性。
🍁 5.3 RMSprop(均方根傳播)的算法公式實(shí)現(xiàn)?
下面是使用 Python 實(shí)現(xiàn) RMSProp 算法的示例代碼:
import numpy as npdef rmsprop(grad_func, init_theta, alpha=0.01, rho=0.9, eps=1e-8, max_iters=1000, tol=1e-6):"""使用 RMSProp 算法求解無約束優(yōu)化問題:min f(theta),其中 grad_func 是目標(biāo)函數(shù)的梯度函數(shù)。:param grad_func: 目標(biāo)函數(shù)的梯度函數(shù):param init_theta: 參數(shù)的初始值:param alpha: 初始學(xué)習(xí)率:param rho: 平方梯度和的衰減因子:param eps: 避免除零錯(cuò)誤的小常數(shù):param max_iters: 最大迭代次數(shù):param tol: 最小收斂差:return: 近似最優(yōu)解 theta"""theta = init_thetagrad_squared_sum = np.zeros_like(init_theta)for i in range(max_iters):grad = grad_func(theta)grad_squared_sum = rho * grad_squared_sum + (1 - rho) * grad ** 2learning_rate = alpha / (np.sqrt(grad_squared_sum) + eps)theta_new = theta - learning_rate * gradif np.linalg.norm(theta_new - theta) < tol:breaktheta = theta_newreturn theta
其中,輸入?yún)?shù) grad_func 是目標(biāo)函數(shù)的梯度函數(shù)(形如 grad_func(theta),返回 theta 點(diǎn)處的梯度),init_theta 是參數(shù)的初始值,alpha 是初始學(xué)習(xí)率,rho 是平方梯度和的衰減因子,eps 是避免除零錯(cuò)誤的小常數(shù),max_iters 是最大迭代次數(shù),tol 是最小收斂差。輸出參數(shù)為近似最優(yōu)解 theta。
需要注意的是,目標(biāo)函數(shù)的梯度函數(shù)應(yīng)滿足一定的可導(dǎo)性和連續(xù)性條件,否則求解過程可能出現(xiàn)問題。此外,在實(shí)踐應(yīng)用中,需要對(duì) RMSProp 算法進(jìn)行調(diào)參和優(yōu)化,例如選擇合適的學(xué)習(xí)率、衰減因子、常數(shù) ? \epsilon ? 的取值、初始參數(shù)、終止條件等,以提高算法的表現(xiàn)和效率。
🍁🍁 06. RMSprop(均方根傳播)
🍁 6.1 什么是RMSprop?
RMSprop是一種自適應(yīng)學(xué)習(xí)率算法,它通過利用參數(shù)梯度的移動(dòng)平均值來調(diào)整學(xué)習(xí)率。它可以自動(dòng)調(diào)整學(xué)習(xí)率的大小,從而在不同特征上進(jìn)行合理的更新。
🍁 6.2 Adam(自適應(yīng)矩估計(jì))的具體步驟和算法公式?
Adam(自適應(yīng)矩估計(jì))是一種基于梯度的自適應(yīng)學(xué)習(xí)率算法,它采用梯度的一階矩估計(jì)和二階矩估計(jì)自適應(yīng)地調(diào)整學(xué)習(xí)率。以下是Adam算法的具體步驟和算法公式:
輸入:學(xué)習(xí)率 α \alpha α,初始參數(shù) w w w,目標(biāo)函數(shù)的梯度函數(shù) ? f ( w ) \nabla f(w) ?f(w),一階矩估計(jì)的衰減因子 β 1 \beta_1 β1?,二階矩估計(jì)的衰減因子 β 2 \beta_2 β2?,常數(shù) ? \epsilon ?。 輸出:參數(shù)的最優(yōu)解 w ? w^\star w?。
-
初始化:初始參數(shù) w w w,一階矩估計(jì) m 0 = 0 \mathbf{m}_0 = 0 m0?=0,二階矩估計(jì) v 0 = 0 \mathbf{v}_0 = 0 v0?=0,迭代次數(shù) t = 0 t = 0 t=0。
-
迭代更新:對(duì)于每個(gè)迭代 t t t,執(zhí)行以下步驟:
2.1. 計(jì)算當(dāng)前迭代的梯度 ? t = ? f ( w t ) \nabla_t = \nabla f(w_t) ?t?=?f(wt?)。
2.2. 更新一階矩估計(jì): m t = β 1 m t ? 1 + ( 1 ? β 1 ) ? t \mathbf{m}_t = \beta_1 \mathbf{m}_{t-1} + (1 - \beta_1) \nabla_t mt?=β1?mt?1?+(1?β1?)?t?。
2.3. 更新二階矩估計(jì): v t = β 2 v t ? 1 + ( 1 ? β 2 ) ? t 2 \mathbf{v}_t = \beta_2 \mathbf{v}_{t-1} + (1 - \beta_2) \nabla_t^2 vt?=β2?vt?1?+(1?β2?)?t2?。
2.4. 校正一階矩估計(jì)的偏差: m ^ t = m t 1 ? β 1 t \hat{\mathbf{m}}_t = \frac{\mathbf{m}_t}{1 - \beta_1^t} m^t?=1?β1t?mt??。
2.5. 校正二階矩估計(jì)的偏差: v ^ t = v t 1 ? β 2 t \hat{\mathbf{v}}_t = \frac{\mathbf{v}_t}{1 - \beta_2^t} v^t?=1?β2t?vt??。
2.6. 計(jì)算學(xué)習(xí)率調(diào)整量: Δ w t = α m ^ t v ^ t + ? \Delta w_t = \frac{\alpha \hat{\mathbf{m}}_t}{\sqrt{\hat{\mathbf{v}}_t} + \epsilon} Δwt?=v^t??+?αm^t??。
2.7. 更新參數(shù): w t + 1 = w t ? Δ w t w_{t+1} = w_t - \Delta w_t wt+1?=wt??Δwt?。
2.8. 增加迭代次數(shù): t = t + 1 t = t + 1 t=t+1。
-
終止準(zhǔn)則:根據(jù)預(yù)設(shè)的終止準(zhǔn)則(如達(dá)到最大迭代次數(shù)或梯度變化小于閾值)決定是否停止迭代。若終止迭代,則輸出最優(yōu)解 w ? w^\star w?;否則,返回步驟 2。
Adam算法的核心思想在于利用梯度的一階矩估計(jì)和二階矩估計(jì)對(duì)學(xué)習(xí)率進(jìn)行自適應(yīng)調(diào)整,同時(shí)通過校正偏差來提高精度。具體來說,Adam算法使用一階矩估計(jì) m t \mathbf{m}_t mt? 來估計(jì)梯度的均值,用二階矩估計(jì) v t \mathbf{v}_t vt? 來估計(jì)梯度的方差(即均方差) ,然后結(jié)合這兩個(gè)估計(jì)量來自適應(yīng)地調(diào)整學(xué)習(xí)率。在實(shí)踐應(yīng)用中,還需要對(duì)Adam算法進(jìn)行調(diào)參和優(yōu)化,例如選擇合適的衰減因子 β 1 \beta_1 β1? 和 β 2 \beta_2 β2?,常數(shù) ? \epsilon ? 的取值,初始參數(shù),終止條件等,以提高算法的效率和魯棒性。
需要注意的是,和RMSProp算法、Adagrad算法一樣,Adam算法都需要對(duì)目標(biāo)函數(shù)進(jìn)行偏導(dǎo)數(shù)求解,并根據(jù)求解
🍁 6.3 Adam(自適應(yīng)矩估計(jì))的算法公式實(shí)現(xiàn)?
下面是Adam算法的具體實(shí)現(xiàn),包括算法公式和偽代碼:
算法公式:
偽代碼:
輸入:學(xué)習(xí)率 alpha, 初始參數(shù) w, 目標(biāo)函數(shù)的梯度函數(shù) grad_f(w), 一階矩估計(jì)的衰減因子 beta1, 二階矩估計(jì)的衰減因子 beta2, 常數(shù) epsilon
輸出:參數(shù)的最優(yōu)解 w_star初始化:初始參數(shù) w, 一階矩估計(jì) m_0 = 0, 二階矩估計(jì) v_0 = 0, 迭代次數(shù) t = 0while 沒有達(dá)到終止準(zhǔn)則 dot = t + 1當(dāng)前迭代的梯度 grad_t = grad_f(w)更新一階矩估計(jì):m_t = beta1 * m_{t-1} + (1 - beta1) * grad_t更新二階矩估計(jì):v_t = beta2 * v_{t-1} + (1 - beta2) * grad_t^2校正一階矩估計(jì)的偏差:m_hat_t = m_t / (1 - beta1^t)校正二階矩估計(jì)的偏差:v_hat_t = v_t / (1 - beta2^t)計(jì)算學(xué)習(xí)率調(diào)整量:delta_w_t = alpha * m_hat_t / (sqrt(v_hat_t) + epsilon)更新參數(shù):w = w - delta_w_t返回參數(shù)的最優(yōu)解 w_star
希望這個(gè)實(shí)現(xiàn)可以幫助到你!請(qǐng)注意,這只是一個(gè)粗略的偽代碼示例,具體的實(shí)現(xiàn)可能會(huì)因編程語(yǔ)言和應(yīng)用環(huán)境而有所不同。在實(shí)際使用Adam算法時(shí),還需要進(jìn)行一些調(diào)參和優(yōu)化來提高算法的性能和收斂速度。
🍁🍁 07. Adam(自適應(yīng)矩估計(jì))
🍁 7.1 什么是 Adam?
Adam是一種融合了Momentum和RMSprop的自適應(yīng)學(xué)習(xí)率算法。Adam算法具有較好的適應(yīng)性和魯棒性,能夠在訓(xùn)練過程中自動(dòng)調(diào)整學(xué)習(xí)率和動(dòng)量。
🍁 7.2 Adam的具體步驟和算法公式?
Adam是一種自適應(yīng)學(xué)習(xí)率方法,可以用于優(yōu)化神經(jīng)網(wǎng)絡(luò)的權(quán)重,在深度學(xué)習(xí)領(lǐng)域被廣泛使用。它結(jié)合了RMSProp和Momentum的優(yōu)點(diǎn),能夠在不同維度自適應(yīng)地調(diào)整學(xué)習(xí)率,并對(duì)梯度的歷史信息進(jìn)行加權(quán)平均,從而更加準(zhǔn)確地更新模型參數(shù)。Adam是一種基于梯度的優(yōu)化算法,可以通過計(jì)算梯度的一階矩和二階矩估計(jì)來更新模型的參數(shù),其具體步驟如下:
- 初始化參數(shù):學(xué)習(xí)率 α \alpha α,動(dòng)量參數(shù) β 1 \beta_1 β1?,二階動(dòng)量衰減率 β 2 \beta_2 β2?,初始一階矩和二階矩 m 0 m_0 m0? 和 v 0 v_0 v0?,一般情況下, m 0 m_0 m0?, v 0 v_0 v0? 初始化為0。
- 在每次迭代中,通過反向傳播計(jì)算損失函數(shù)的梯度 g t g_t gt?。
- 計(jì)算梯度的一階矩 m t m_t mt? 和二階矩 v t v_t vt?:
m t = β 1 m t ? 1 + ( 1 ? β 1 ) g t m_t = \beta_1 m_{t-1} + (1-\beta_1)g_t mt?=β1?mt?1?+(1?β1?)gt?
v t = β 2 v t ? 1 + ( 1 ? β 2 ) g t 2 v_t = \beta_2 v_{t-1} + (1-\beta_2)g_t^2 vt?=β2?vt?1?+(1?β2?)gt2? - 對(duì)一階和二階矩進(jìn)行偏差修正,從而減輕因初始化而引入的偏差:
m ^ t = m t 1 ? β 1 t \hat{m}_t = \frac{m_t}{1-\beta_1^t} m^t?=1?β1t?mt??
v ^ t = v t 1 ? β 2 t \hat{v}_t = \frac{v_t}{1-\beta_2^t} v^t?=1?β2t?vt?? - 使用修正后的 m t m_t mt? 和 v t v_t vt?,以及超參數(shù) α \alpha α 和 ? \epsilon ? 更新參數(shù):
Δ θ t = ? α v ^ t + ? m ^ t \Delta\theta_t = -\frac{\alpha}{\sqrt{\hat{v}_t}+\epsilon} \hat{m}_t Δθt?=?v^t??+?α?m^t?
θ t = θ t ? 1 + Δ θ t \theta_t = \theta_{t-1} + \Delta\theta_t θt?=θt?1?+Δθt?
其中, t t t 表示迭代的次數(shù), θ \theta θ 是需要進(jìn)行優(yōu)化的參數(shù), α \alpha α 是學(xué)習(xí)率, β 1 \beta_1 β1? 和 β 2 \beta_2 β2? 是動(dòng)量系數(shù), ? \epsilon ? 是一個(gè)很小的數(shù),以防分母過小。
需要注意的是,Adam算法的偏差校正非常重要,可以提高算法的性能和收斂速度。在Adam算法中, m ^ t \hat{m}_t m^t? 和 v ^ t \hat{v}_t v^t? 是在更新權(quán)重時(shí)對(duì)動(dòng)量和縮放系數(shù)進(jìn)行校正的項(xiàng)。
上述公式中 Δ θ \Delta\theta Δθ 表示需要更新的參數(shù)變化量,即實(shí)現(xiàn)時(shí)需要將 θ \theta θ 增加 Δ θ \Delta\theta Δθ 才能更新參數(shù)。
下面是Adam算法的數(shù)學(xué)公式表示:
-
初始化:
m 0 = 0 m_0 = 0 m0?=0
v 0 = 0 v_0 = 0 v0?=0
β 1 = 0.9 \beta_1 = 0.9 β1?=0.9
β 2 = 0.999 \beta_2 = 0.999 β2?=0.999
α = 0.001 \alpha = 0.001 α=0.001
? = 1 0 ? 8 \epsilon = 10^{-8} ?=10?8 -
對(duì)于 t = 1, 2, …,執(zhí)行以下更新:
計(jì)算損失函數(shù)關(guān)于模型參數(shù)的梯度: g t = ? θ J ( θ t ? 1 ) g_t = \nabla_{\theta} J(\theta_{t-1}) gt?=?θ?J(θt?1?)
更新梯度一階矩估計(jì): m t = β 1 m t ? 1 + ( 1 ? β 1 ) g t m_t = \beta_1 m_{t-1} + (1-\beta_1)g_t mt?=β1?mt?1?+(1?β1?)gt?
更新梯度二階矩估計(jì): v t = β 2 v t ? 1 + ( 1 ? β 2 ) g t 2 v_t = \beta_2 v_{t-1} + (1-\beta_2)g_t^2 vt?=β2?vt?1?+(1?β2?)gt2?
偏差校正后的一階矩估計(jì): m ^ t = m t 1 ? β 1 t \hat{m}_t = \frac{m_t}{1-\beta_1^t} m^t?=1?β1t?mt??
偏差校正后的二階矩估計(jì)
🍁 7.3 Adam的算法公式實(shí)現(xiàn)?
以下是使用Python實(shí)現(xiàn)Adam算法的代碼示例:
import numpy as npdef adam_optimizer(grad, m, v, beta1, beta2, alpha, epsilon, t):# 更新梯度一階矩估計(jì)m = beta1 * m + (1 - beta1) * grad# 更新梯度二階矩估計(jì)v = beta2 * v + (1 - beta2) * (grad ** 2)# 偏差校正后的一階矩估計(jì)m_hat = m / (1 - beta1**t)# 偏差校正后的二階矩估計(jì)v_hat = v / (1 - beta2**t)# 更新參數(shù)param = - alpha * m_hat / (np.sqrt(v_hat) + epsilon)return param, m, v# 初始化參數(shù)
alpha = 0.001 # 學(xué)習(xí)率
beta1 = 0.9 # 一階矩估計(jì)衰減率
beta2 = 0.999 # 二階矩估計(jì)衰減率
epsilon = 1e-8 # 平滑項(xiàng)
t = 0 # 迭代次數(shù)
m = np.zeros_like(params) # 梯度一階矩估計(jì)
v = np.zeros_like(params) # 梯度二階矩估計(jì)# 在每個(gè)迭代步驟中使用Adam算法更新參數(shù)
while stopping_criteria:t += 1# 計(jì)算損失函數(shù)關(guān)于模型參數(shù)的梯度grad = compute_gradient(params)# 更新參數(shù)param_update, m, v = adam_optimizer(grad, m, v, beta1, beta2, alpha, epsilon, t)params += param_update
上述代碼中,grad
表示損失函數(shù)對(duì)模型參數(shù)的梯度,m
表示梯度一階矩估計(jì),v
表示梯度二階矩估計(jì),beta1
表示一階矩估計(jì)衰減率,beta2
表示二階矩估計(jì)衰減率,alpha
表示學(xué)習(xí)率,epsilon
表示平滑項(xiàng),t
表示當(dāng)前的迭代次數(shù),param
表示更新后的模型參數(shù)。
需要注意的是,根據(jù)具體的優(yōu)化問題,可能需要根據(jù)經(jīng)驗(yàn)來調(diào)整學(xué)習(xí)率和各個(gè)衰減率的取值,以獲得更好的優(yōu)化性能。
🍁🍁 08. LBFGS(Limited-memory Broyden-Fletcher-Goldfarb-Shanno)
🍁 8.1 什么是 LBFGS?
LBFGS是一種擬牛頓法的變種,它使用有限內(nèi)存來近似計(jì)算海森矩陣的逆。LBFGS方法在邏輯回歸中通常用于處理大規(guī)模數(shù)據(jù)集。
🍁 8.2 LBFGS(Limited-memory Broyden-Fletcher-Goldfarb-Shanno)的具體步驟和算法公式?
LBFGS(Limited-memory Broyden-Fletcher-Goldfarb-Shanno)是一種常用的無約束優(yōu)化算法,包含近似Hessian矩陣的求解過程。下面是LBFGS的具體步驟和算法公式:
步驟:
-
初始化參數(shù):選擇初始參數(shù) x 0 x_0 x0?、初始Hessian估計(jì) H 0 H_0 H0?、初始步長(zhǎng) α 0 \alpha_0 α0?,設(shè)定迭代次數(shù)上限等。
-
進(jìn)入迭代循環(huán):
-
計(jì)算梯度:計(jì)算當(dāng)前參數(shù)點(diǎn)處的梯度 g k = ? f ( x k ) g_k = \nabla f(x_k) gk?=?f(xk?)。
-
更新搜索方向:根據(jù)BFGS公式更新搜索方向 d k = ? H k ? g k d_k = -H_k \cdot g_k dk?=?Hk??gk?。
-
線搜索:在搜索方向上尋找合適的步長(zhǎng) α k \alpha_k αk?,滿足強(qiáng)Wolfe條件或Armijo條件。
-
更新參數(shù)和梯度差:計(jì)算參數(shù)的更新量 δ x k = α k ? d k \delta x_k = \alpha_k \cdot d_k δxk?=αk??dk?,更新參數(shù) x k + 1 = x k + δ x k x_{k+1} = x_k + \delta x_k xk+1?=xk?+δxk?。
-
計(jì)算梯度差:計(jì)算參數(shù)的梯度差 δ g k = ? f ( x k + 1 ) ? ? f ( x k ) \delta g_k = \nabla f(x_{k+1}) - \nabla f(x_k) δgk?=?f(xk+1?)??f(xk?)。
-
更新Hessian估計(jì):根據(jù)LBFGS公式更新Hessian估計(jì) H k + 1 = H k + δ x k δ x k ? δ x k ? δ g k ? H k δ g k δ g k ? H k δ g k ? H k δ g k H_{k+1} = H_k + \frac{\delta x_k \delta x_k^\top}{\delta x_k^\top \delta g_k} - \frac{H_k \delta g_k \delta g_k^\top H_k}{\delta g_k^\top H_k \delta g_k} Hk+1?=Hk?+δxk??δgk?δxk?δxk????δgk??Hk?δgk?Hk?δgk?δgk??Hk??。
-
如果滿足終止準(zhǔn)則(如梯度收斂),則停止迭代。否則,返回第二步。
-
算法公式:
LBFGS算法通過維護(hù)Hessian矩陣的近似來實(shí)現(xiàn)無約束優(yōu)化的迭代過程,并利用近似Hessian矩陣來計(jì)算搜索方向。這種方法在大規(guī)模優(yōu)化問題中非常高效,因?yàn)樗恍枰@式地存儲(chǔ)和計(jì)算完整的Hessian矩陣。同時(shí),LBFGS算法還具有全局收斂性和幾何收斂速度等優(yōu)點(diǎn)。
🍁 8.3 LBFGS(Limited-memory Broyden-Fletcher-Goldfarb-Shanno)的算法公式實(shí)現(xiàn)?
LBFGS算法的具體實(shí)現(xiàn)依賴于編程語(yǔ)言和庫(kù)的實(shí)現(xiàn),下面是一份Python實(shí)現(xiàn)的參考代碼。這里假設(shè)優(yōu)化目標(biāo)是凸函數(shù),并使用Wolfe準(zhǔn)則進(jìn)行線搜索。
import numpy as np
from scipy.optimize import line_searchdef lbfgs(fun, grad, x0, max_iter=500, m=10, eps=1e-5):# 初始化參數(shù)x = x0f, g = fun(x), grad(x)H = np.eye(len(x))s_list = []y_list = []alpha_list = []g_norm = np.linalg.norm(g)for k in range(max_iter):# 終止準(zhǔn)則:如果梯度小于閾值,終止迭代if g_norm < eps:print(f'LBFGS converges in {k} iterations')break# 計(jì)算搜索方向d = -np.linalg.solve(H, g)# 線搜索alpha = line_search(fun, grad, x, d, g, f, c1=1e-4, c2=0.9)alpha_list.append(alpha[0])x = x + alpha[0] * d# 計(jì)算參數(shù)和梯度差f_new, g_new = fun(x), grad(x)s, y = x - s_list[-m], g_new - y_list[-m]rho = 1 / (y @ s)s_list.append(x)y_list.append(g_new)alpha_list.append(alpha[0])# 更新Hessian估計(jì)H_s = H @ s.reshape(-1, 1)H = H - rho * H_s @ y.reshape(1, -1) + rho * (s @ H_s) * np.outer(y, y)g = g_newg_norm = np.linalg.norm(g)# 保持s和y列表長(zhǎng)度為mif len(s_list) > m:s_list.pop(0)y_list.pop(0)return x, f_new
值得注意的是,這份代碼使用了以下幾個(gè)重要的優(yōu)化技巧:
- 利用線性代數(shù)庫(kù)Numpy中的
np.linalg.solve()
函數(shù)求解線性方程組,而不是通過矩陣求逆和矩陣乘法的方式計(jì)算搜索方向; - 使用Wolfe準(zhǔn)則進(jìn)行線搜索,確保每次搜索都朝著下降的方向;
- 維護(hù)s、y和alpha列表的長(zhǎng)度為m,避免列表過長(zhǎng)導(dǎo)致內(nèi)存消耗過大。
當(dāng)然,LBFGS算法的實(shí)現(xiàn)還可以進(jìn)一步優(yōu)化,比如實(shí)現(xiàn)各種不同的線搜索準(zhǔn)則、動(dòng)態(tài)調(diào)整m等方法來提升求解的速度和精度。
🍁🍁 09. Adamax
🍁 9.1 什么是 Adamax ?
這是Adam算法的一種變體,它使用L∞范數(shù)替代了Adam中的L2范數(shù),在一些具有稀疏梯度的問題上,Adamax的表現(xiàn)比Adam更好。
🍁 9.2 Adamax的具體步驟和算法公式?
Adamax是一種用于優(yōu)化神經(jīng)網(wǎng)絡(luò)的自適應(yīng)學(xué)習(xí)率算法,它在Adam算法的基礎(chǔ)上,將二階動(dòng)量指數(shù)衰減率 β2替換為無窮范數(shù)動(dòng)量指數(shù)衰減率,即使得 v 變?yōu)?L2 范數(shù)的衰減率 β2 和 L∞ 范數(shù)的衰減率 β∞ 之間的最大值。它不僅克服了Adam在高維優(yōu)化中的性能下降問題,還可以顯著提高高維優(yōu)化的性能。
Adamax算法的具體步驟如下:
- 初始化學(xué)習(xí)率α、一階動(dòng)量指數(shù)衰減率β1、β∞和一個(gè)很小的數(shù)ε來增強(qiáng)數(shù)值的穩(wěn)定性。初始化一階矩估計(jì) m 和 v。
- 在每個(gè)迭代中,計(jì)算梯度g,然后使用如下公式更新m和v:
m = β1 * m + (1 - β1) * g
v = max(β∞ * v, abs(g)) - 在更新m后對(duì)其進(jìn)行偏差糾正和清零,并計(jì)算出校正后的m和v:
mt = m / (1 - β1^t)
vt = v - 使用Adamax更新參數(shù)θ:
θ = θ - (α / (1 - β1^t)) * mt / (vt + ε)
公式中,t是迭代次數(shù),Θ是模型參數(shù)。
下面是Adamax算法的數(shù)學(xué)公式表示:
-
初始化:
m_0 = 0 # 初始化一階矩估計(jì)為0
v_0 = 0 # 初始化v為0
β1 = 0.9 # 一階動(dòng)量指數(shù)衰減率
β∞ = 0.999 # 無窮范數(shù)動(dòng)量指數(shù)衰減率
α = 0.001 # 初始學(xué)習(xí)率
ε = 10e-8 # 用于數(shù)值穩(wěn)定性,通常設(shè)置為很小的值 -
對(duì)于 t = 1, 2, …,執(zhí)行以下更新:
計(jì)算梯度:g_t = ▽_θ L(Θ_t)
更新一階矩估計(jì):m_t = β1 * m_t-1 + (1 - β1) * g_t
更新二階動(dòng)量估計(jì):v_t = max(β∞ * v_t-1, |g_t|)
根據(jù)偏差校正計(jì)算校正后的一階矩估計(jì):m_hat_t = m_t / (1 - β1^t)
計(jì)算更新參數(shù):Θ_t+1 = Θ_t - α / (1 - β1^t) * m_hat_t / (v_t + ε)
Adamax算法與Adam算法非常相似,但將二階動(dòng)量 v 替換為無窮范數(shù)動(dòng)量 v∞,并不需要其偏差校正。公式中,|g|表示給定梯度g的所有元素的絕對(duì)值的向量。
🍁 9.3 Nadam的算法公式實(shí)現(xiàn)?
以下是使用Python實(shí)現(xiàn)Adamax算法的代碼示例:
import numpy as npdef adamax_optimizer(grad, m, v, beta1, beta_inf, alpha, epsilon, t):# 更新梯度一階矩估計(jì)m = beta1 * m + (1 - beta1) * grad# 更新梯度二階動(dòng)量指數(shù)v = np.maximum(beta_inf * v, np.abs(grad))# 偏差校正后的一階矩估計(jì)m_hat = m / (1 - beta1**t)# 更新參數(shù)param = - alpha * m_hat / (v + epsilon)return param, m, v# 初始化參數(shù)
alpha = 0.001 # 學(xué)習(xí)率
beta1 = 0.9 # 一階動(dòng)量指數(shù)衰減率
beta_inf = 0.999 # 無窮范數(shù)動(dòng)量指數(shù)衰減率
epsilon = 1e-8 # 平滑項(xiàng)
t = 0 # 迭代次數(shù)
m = np.zeros_like(params) # 梯度一階矩估計(jì)
v = np.zeros_like(params) # 無窮范數(shù)動(dòng)量指數(shù)# 在每個(gè)迭代步驟中使用Adamax算法更新參數(shù)
while stopping_criteria:t += 1# 計(jì)算損失函數(shù)關(guān)于模型參數(shù)的梯度grad = compute_gradient(params)# 更新參數(shù)param_update, m, v = adamax_optimizer(grad, m, v, beta1, beta_inf, alpha, epsilon, t)params += param_update
上述代碼中,grad
表示損失函數(shù)對(duì)模型參數(shù)的梯度,m
表示梯度一階矩估計(jì),v
表示無窮范數(shù)動(dòng)量指數(shù),beta1
表示一階動(dòng)量指數(shù)衰減率,beta_inf
表示無窮范數(shù)動(dòng)量指數(shù)衰減率,alpha
表示學(xué)習(xí)率,epsilon
表示平滑項(xiàng),t
表示當(dāng)前的迭代次數(shù),param
表示更新后的模型參數(shù)。
需要注意的是,根據(jù)具體的優(yōu)化問題,可能需要根據(jù)經(jīng)驗(yàn)來調(diào)整學(xué)習(xí)率和各個(gè)衰減率的取值,以獲得更好的優(yōu)化性能。
🍁🍁 10. Nadam
🍁 10.1 什么是**Nadam ?
這是一種帶無約束方法的Nesterov動(dòng)量Adam算法,可以非常有效地控制"m"-方向和"v"-方向的耦合,并且通??梢蕴岣逜dam的收斂速度。
🍁 10.2 Nadam的具體步驟和算法公式?
Nadam是一種結(jié)合了Nesterov動(dòng)量和Adam優(yōu)化算法特性的優(yōu)化算法。下面是Nadam的具體步驟和算法公式:
-
初始化參數(shù):
- 學(xué)習(xí)率 α
- 手動(dòng)動(dòng)量參數(shù) β1(建議為0.9)
- 二階動(dòng)量指數(shù)衰減率 β2(建議為0.999)
- 平滑項(xiàng) ε(用于數(shù)值穩(wěn)定性,通常設(shè)置為很小的值,比如1e-8)
-
初始化變量:
- 梯度的一階矩估計(jì) m (初始化為0向量)
- 梯度的二階矩估計(jì) v (初始化為0向量)
- 過去動(dòng)量方向的指數(shù)衰減平均 mt (初始化為0向量)
- 過去二階動(dòng)量方向的指數(shù)衰減平均 vt (初始化為0向量)
-
在每次迭代中,執(zhí)行以下步驟:
- 計(jì)算梯度 g,根據(jù)當(dāng)前參數(shù)計(jì)算損失函數(shù)的導(dǎo)數(shù)
- 更新一階矩估計(jì):m = β1 * m + (1 - β1) * g
- 更新二階矩估計(jì):v = β2 * v + (1 - β2) * g2
- 偏差校正:m_hat = m / (1 - β1^t),v_hat = v / (1 - β2^t)
- 計(jì)算過去動(dòng)量方向和過去二階動(dòng)量方向的指數(shù)加權(quán)平均: mt = β1 * mt + (1 - β1) * g vt = β2 * vt + (1 - β2) * g2
- 計(jì)算校正項(xiàng):delta = (1 - β1^t) * mt / ((1 - β1^t) * vt + ε)
- 根據(jù)Nesterov動(dòng)量公式,更新參數(shù): θ = θ - α * (β1 * delta + (1 - β1) * g) / sqrt((1 - β2^t) * v + ε)
其中,t表示當(dāng)前的迭代次數(shù),θ表示模型參數(shù)。
通過結(jié)合Nesterov動(dòng)量和Adam算法的思想,Nadam相對(duì)于傳統(tǒng)的Adam算法可以更好地控制"m"-方向和"v"-方向的耦合,從而提高收斂速度和優(yōu)化性能。
🍁 10.3 Nadam的算法公式實(shí)現(xiàn)?
Nadam算法的具體實(shí)現(xiàn)公式如下:
首先,初始化參數(shù):
- 學(xué)習(xí)率 α
- 手動(dòng)動(dòng)量參數(shù) β1(建議為0.9)
- 二階動(dòng)量指數(shù)衰減率 β2(建議為0.999)
- 平滑項(xiàng) ε(用于數(shù)值穩(wěn)定性,通常設(shè)置為很小的值,比如1e-8)
然后,初始化變量:
- 梯度的一階矩估計(jì) m (初始化為0向量)
- 梯度的二階矩估計(jì) v (初始化為0向量)
- 過去動(dòng)量方向的指數(shù)衰減平均 mt (初始化為0向量)
- 過去二階動(dòng)量方向的指數(shù)衰減平均 vt (初始化為0向量)
在每次迭代中,執(zhí)行以下步驟:
- 計(jì)算梯度 g,根據(jù)當(dāng)前參數(shù)計(jì)算損失函數(shù)的導(dǎo)數(shù)
- 更新一階矩估計(jì):m = β1 * m + (1 - β1) * g
- 更新二階矩估計(jì):v = β2 * v + (1 - β2) * g2
- 偏差校正:m_hat = m / (1 - β1^t),v_hat = v / (1 - β2^t)
- 計(jì)算過去動(dòng)量方向和過去二階動(dòng)量方向的指數(shù)加權(quán)平均: mt = β1 * mt + (1 - β1) * g vt = β2 * vt + (1 - β2) * g2
- 計(jì)算校正項(xiàng):delta = (1 - β1^t) * mt / sqrt((1 - β2^t) * v + ε)
- 根據(jù)Nesterov動(dòng)量公式,更新參數(shù): θ = θ - α * (β1 * delta + (1 - β1) * g) / (sqrt(v_hat) + ε)
其中,t表示當(dāng)前的迭代次數(shù),θ表示模型參數(shù)。
這些步驟按照順序執(zhí)行,直到達(dá)到預(yù)定的迭代次數(shù)或達(dá)到其他停止條件。通過這種方式,Nadam算法在優(yōu)化過程中會(huì)自適應(yīng)地調(diào)整學(xué)習(xí)率和動(dòng)量,并結(jié)合Nesterov動(dòng)量的思想來加速收斂并獲得更好的優(yōu)化性能。
以下是用Python實(shí)現(xiàn)Nadam算法的代碼示例:
import numpy as npdef nadam_optimizer(grad, m, v, mt, vt, alpha, beta1, beta2, epsilon, t):# 更新梯度一階矩估計(jì)m = beta1 * m + (1 - beta1) * grad# 更新梯度二階矩估計(jì)v = beta2 * v + (1 - beta2) * grad**2# 計(jì)算偏差校正后的一階和二階矩估計(jì)m_hat = m / (1 - beta1**t)v_hat = v / (1 - beta2**t)# 更新過去動(dòng)量方向和過去二階動(dòng)量方向的指數(shù)加權(quán)平均mt = beta1 * mt + (1 - beta1) * gradvt = beta2 * vt + (1 - beta2) * grad**2# 計(jì)算校正項(xiàng)deltadelta = (1 - beta1**t) * mt / (np.sqrt((1 - beta2**t) * v_hat) + epsilon)# 計(jì)算更新后的參數(shù)param = - alpha * (beta1 * delta + (1 - beta1) * grad) / (np.sqrt(v_hat) + epsilon)return param, m, v, mt, vt
其中,grad
表示損失函數(shù)對(duì)模型參數(shù)的梯度,m
和v
是梯度一階和二階矩估計(jì),mt
和vt
是過去動(dòng)量方向和過去二階動(dòng)量方向的指數(shù)加權(quán)平均,alpha
是學(xué)習(xí)率,beta1
和beta2
是手動(dòng)動(dòng)量參數(shù)和二階動(dòng)量指數(shù)衰減率,epsilon
是平滑項(xiàng),t
表示當(dāng)前的迭代次數(shù),param
表示更新后的模型參數(shù)。這個(gè)函數(shù)將計(jì)算和返回Nadam算法中的參數(shù)更新公式。
使用上述代碼源自的Nadam函數(shù),只需要首先初始化所需的變量,然后按照迭代次數(shù)循環(huán)調(diào)用Nadam函數(shù)即可。
# 初始化參數(shù)
alpha = 0.001
beta1 = 0.9
beta2 = 0.999
epsilon = 1e-8
t = 0
m = np.zeros_like(params)
v = np.zeros_like(params)
mt = np.zeros_like(params)
vt = np.zeros_like(params)# 在每個(gè)迭代步驟中使用Nadam算法更新參數(shù)
while stopping_criteria:t += 1# 計(jì)算損失函數(shù)關(guān)于模型參數(shù)的梯度grad = compute_gradient(params)# 更新參數(shù)param_update, m, v, mt, vt = nadam_optimizer(grad, m, v, mt, vt, alpha, beta1, beta2, epsilon, t)params += param_update
在使用Nadam的神經(jīng)網(wǎng)絡(luò)優(yōu)化過程中,我們要根據(jù)網(wǎng)絡(luò)的具體情況來具體設(shè)置這些參數(shù)的值,以充分發(fā)揮Nadam算法的特性。