高等數學:牛頓迭代發解方程

現在高數也要介紹牛頓法了,一般都是從幾何上直接以“切線法”直接引入的。這種引入方式的確很簡單,但如果脫離深入一點的分析就不大容易解釋后面的事情。所以就在想怎么更直接地從分析的角度來一條線貫穿,把整個過程說一說。

文章目錄

  • 一、牛頓迭代解非線性方程
  • 二、牛頓迭代解極值問題

直接開始:

一、牛頓迭代解非線性方程

考慮一個非線性方程:
f ( x ) = 0 (*) f(x)=0 \tag{*} f(x)=0(*)
這個方程沒有公式可以直接解,于是考慮迭代法。其思想就是構造一個迭代公式:
x k + 1 = φ ( x k ) (1) x_{k+1}=\varphi(x_k) \tag{1} xk+1?=φ(xk?)(1)
如果 k → ∞ 時 x k + 1 → x ? k\to \infty 時 x_{k+1}\to x^* kxk+1?x?,那么就可以不斷地利用這個公式以 x k + 1 x_{k+1} xk+1?去逼近方程的根 x ? x^* x?

一般來說更常見的迭代格式是:
x k + 1 = x k ? Δ ( x k ) (2) x_{k+1}=x_k-\Delta(x_k) \tag{2} xk+1?=xk??Δ(xk?)(2)
比如梯度下降就是這種格式。

那么問題就很自然了:如何構造這個迭代公式 Δ ( x k ) \Delta(x_k) Δ(xk?)

先從最簡單的方向考慮:如果 x k x_k xk? 已經十分接近 x ? x^* x? 時,那么這個迭代的長度 Δ ( x k ) \Delta(x_k) Δ(xk?)應該是多少?

這時候問題就簡單得多了,因為當 x k x_k xk? 已經十分接近 x ? x^* x?時我們可以認為再移動 Δ ( x k ) \Delta(x_k) Δ(xk?) 就可以使得
f ( x k + 1 ) = f ( x k ? Δ ( x k ) ) = 0 (3) f(x_{k+1})=f(x_k-\Delta(x_k))=0 \tag{3} f(xk+1?)=f(xk??Δ(xk?))=0(3)
這下問題就可以轉化為:如何通過(3)式和(2)式得到 Δ ( x k ) \Delta(x_k) Δ(xk?)

那么很自然地,如果能通過(2)(3)式導出一個關于 Δ ( x k ) \Delta(x_k) Δ(xk?)的迭代式就行了。從(3)式很容易想到如果把第二個式子展開,就可以得到一個 \Delta(x_k) 的解析式,從而就能得到它的顯式表達。這樣很容易想到 Taylor 展開(一階逼近):
f ( x k ? Δ ( x k ) ) ≈ f ( x k ) + f ′ ( x k ) ? ( ? Δ ( x k ) ) (4) f\left( x_{k}-\Delta \left( x_{k}\right) \right) \approx f\left( x_{k}\right) +f'\left( x_{k}\right) \cdot \left( -\Delta \left( x_{k}\right) \right) \tag{4} f(xk??Δ(xk?))f(xk?)+f(xk?)?(?Δ(xk?))(4)
把(4)式代回(3)式就可以得到牛頓迭代的完整表達式:
Δ ( x k ) = f ( x k ) f ′ ( x k ) \Delta \left( x_{k}\right) =\dfrac{f\left( x_{k}\right) }{f'\left( x_{k}\right) } \\ Δ(xk?)=f(xk?)f(xk?)?
于是得到牛頓迭代的完整格式:

當然這里是基于如果 x k x_k xk?已經十分接近 x ? x^* x? 時的情況推導,直接利用上面的分析還不太容易解釋從何意一個可行的點(根的附近)出發,(5)式一定能讓 x k x_k xk? 不斷地接近 x ? x^* x?

那么這時結合幾何來簡單看看就好說了:

結合上圖的標記就很容易知道,無論如何這個迭代公式總會使 x k x_k xk? 不斷接近 x ? x^* x?

這里再記幾筆:
1、如果不是上述的單調情況,那么牛頓迭代是不會收斂到圖中所示的 x^* 的。這從局部收斂性的描述很容易理解。
2、嚴格的證明可以借助另一個定理。在理論篇再來討論。

二、牛頓迭代解極值問題

解方程是牛頓法的第一種情況,而這種情況其實可以很容易地推廣到極值問題。因為極值的必要條件是:
f ′ ( x ) = 0 (**) f'\left( x\right) =0 \tag{**} f(x)=0(**)
這里最簡單的一種思路就是直接令
g ( x ) = f ′ ( x ) g(x)=f'\left( x\right) \\ g(x)=f(x)
那么自然就有它的迭代公式:

這種理解十分便于記憶,所以還是十分推薦的。

但另外一種思路更適合于推廣,再來介紹一下。

基本的思考方式和上面解非線性方程一樣,我們仍然考慮 x k x_k xk? 在極值點 x ? ? x^{**} x?? 附近,那么問題就變成了:

給多長的增量 Δ ( x k ) \Delta \left( x_{k}\right) Δ(xk?),能使得點 x k + 1 = x k ? Δ ( x k ) x_{k+1}=x_{k}-\Delta \left( x_{k}\right) xk+1?=xk??Δ(xk?) 為極值點(或者近似的極值點),換言之希望此時 f ( x k + 1 ) ≈ 0 f(x_{k+1})\approx 0 f(xk+1?)0
類似地,我們仍然考慮它的 T a y l o r Taylor Taylor 展開,不過此時展開到二階:
f ( x k + 1 ) ≈ f ( x k ) + f ′ ( x k ) ? ( ? Δ ( x k ) ) + 1 2 f ′ ′ ( x k ) ? ( ? Δ ( x k ) ) 2 f\left( x_{k+1}\right) \approx f\left( x_{k}\right) +f'\left( x_{k}\right) \cdot \left( -\Delta \left( x_{k}\right)\right) +\frac{1}{2}f''\left( x_{k}\right) \cdot \left( -\Delta \left( x_{k}\right) \right) ^{2} \\ f(xk+1?)f(xk?)+f(xk?)?(?Δ(xk?))+21?f′′(xk?)?(?Δ(xk?))2
為了方便描述我們記 x k + 1 = x k + z x_{k+1}=x_{k}+z xk+1?=xk?+z,這樣二階展開就可以寫成:
f ( x k + 1 ) ≈ f ( x k ) + f ′ ( x k ) ? z + 1 2 f ′ ′ ( x k ) ? z 2 = g ( z ) (7) f\left( x_{k+1}\right) \approx f\left( x_{k}\right) +f'\left( x_{k}\right) \cdot z +\frac{1}{2}f''\left( x_{k}\right) \cdot z^2=g(z) \tag{7} f(xk+1?)f(xk?)+f(xk?)?z+21?f′′(xk?)?z2=g(z)(7)
繼續考慮 g ( z ) g(z) g(z) 的極值:
d g ( z ) d z = f ′ ( x x ) + f ′ ′ ( x k ) ? z = 0 \dfrac{dg\left( z\right) }{dz}=f'\left( x_{x}\right) + f''\left( x_{k}\right) \cdot z=0 \\ dzdg(z)?=f(xx?)+f′′(xk?)?z=0
可以解出:

\bbox[pink]{z=-\dfrac{f’\left( x_{x}\right) }{f’'\left( x_{k}\right) }} \

這和(6)式中的迭代長度是一樣的。

注 1:這里有個很有意思的事情,如果我們只考慮一階逼近

f\left( x_{k+1}\right) \approx f\left( x_{k}\right) +f’\left( x_{k}\right)\cdot z \

那么讓它對 z 求導來求極值就直接得到: f’\left( x_{k}\right)=0

很顯然這種做法就不太可取了。由此也可以看出一階逼近的粗糙,以至于在討論極值問題時就不適合直接使用了。

注 2: 有同學可能也會問,為什么不直接考慮該函數任意值在 x_k 附近的展開?

也就是說考慮:

f\left( x\right) \approx f\left( x_{k}\right) +f’\left( x_{k}\right) \left( x-x_{k}\right) +\dfrac{1}{2}f’'\left( x_{k}\right) \left( x-x_{k}\right) ^{2} \

此時直接考慮 f’(x)=0,那么容易得到:

f’\left( x_{k}\right) +f’'\left( x_{k}\right) \left( x-x_{k}\right) \approx 0 \

于是:

x \bbox[red]{\approx} x_{k}-\dfrac{f’\left( x_{k}\right) }{f’'\left( x_{k}\right) } \tag{8}

這就有意思了,前面的牛頓迭代式這里都是嚴格的等號。而上式卻是不等號。這里就可以再借題發揮一下:

上面的討論中(7)式是直接令逼近式嚴格等于g(z),因此得到的迭代步長就是嚴格等于。
而(8)式是直接令 f’(x)=0,那么將二階近似代回計算時自然就要變成約等號。那么得到的值就自然是約等于。不過借助(8)式也方便說明一些問題。比如:此時得到的 x 實際上就是極值點,那么如果 x_k 本身就離極值點很近,這個式子就更加精確;相反,如果 x_k 離極值本身還很遠,那么這個式子就十分粗糙。
注 3: 上面的(7)式也是非常有意思的,在極值問題中這個式子的幾何意義就十分明確了。先簡單移項:

f\left( x_{k+1}\right)- f\left( x_{k}\right) \approx f’\left( x_{k}\right) \cdot z +\frac{1}{2}f’'\left( x_{k}\right) \cdot z^2 \

這時右端的導數也是 \dfrac{dg\left( z\right) }{dz},那么此時令 \dfrac{dg\left( z\right) }{dz}=0 從幾何上講意思就是:取改 z 為多少能使得下一步迭代時 f\left( x_{k+1}\right) 相對上一步迭代時 f\left( x_{k}\right) 的改變最大?

這里就能很明顯體會到,用上述思路其實就是在整體尋優的過程中構造了一個局部尋優的問題。

接下來討論多元函數的零點問題

三、多元函數的零點問題
多元的情形自然復雜,要完全寫對需要非常仔細。但過于仔細又容易影響總體思路,所以先不管式子是否正確,直接對照一元情形憑感覺把推導寫完再說:

另外我們這里考慮的是普通微積分里討論的多元函數,也就是說 f:R^n\to R。
(1)標量函數
回顧一元的情形,我們仍然是考慮在零點附近的一個 \mathbf{x}k ,給它一個增量 \mathbf{z},使得 \mathbf{x}{k+1}=\mathbf{x}_k+\mathbf{z} 接近零點 \mathbf{x}^{**}。類似一元的情形,考慮函數的一階逼近:

\bbox[yellow]{f(\mathbf{x}_k+\mathbf{z}) \approx f(\mathbf{x}_k)+\nabla f(\mathbf{x}_k)\cdot\mathbf{z}} \

同樣地,考慮逼近式等于 0,于是有:

f(\mathbf{x}_k)+\nabla f(\mathbf{x}_k)\cdot\mathbf{z} = 0 \

到這里就要注意一下了:

f(\mathbf{x}_k) 是標量
\nabla f(\mathbf{x}_k)\cdot\mathbf{z} 也必須是標量
但 \mathbf{z} 是向量,所以 \nabla f(\mathbf{x}_k) 也是向量
那么我們先把寫法再規范一下:

f(\mathbf{x}_k)+ \left[ \nabla f(\mathbf{x}_k) \right ]^T \mathbf{z} = 0 \

這樣寫也明確了 \nabla f(\mathbf{x}_k) 是列向量。
于是要解出 \mathbf{z} 就可以使用線性代數的工具了:

\left[ \nabla f(\mathbf{x}_k) \right ]^T \mathbf{z}=-f(\mathbf{x}_k) \

此時上式就是一個線性方程組。而且仔細看會發現非常有意思:它其實只有一個方程。對這種方程我們可以考慮使用廣義逆矩陣:

\nabla f(\mathbf{x}_k)\left[ \nabla f(\mathbf{x}_k) \right ]^T \mathbf{z}=-\nabla f(\mathbf{x}_k)f(\mathbf{x}_k) \

此時 \nabla f(\mathbf{x}_k)\left[ \nabla f(\mathbf{x}_k) \right ]^T 就是一個方陣了,于是左右乘以它的逆:

\mathbf{z}= - \left { \nabla f(\mathbf{x}_k)\left[ \nabla D f(\mathbf{x}_k) \right ]^T \right }^{-1} \left [ \nabla f(\mathbf{x}_k) \right ] f(\mathbf{x}_k) \

這樣一來,多元函數求根的迭代式就可以得到了:

\bbox[pink]{\mathbf{x}_{k+1}=\mathbf{x}_k-\left { \nabla f(\mathbf{x}_k)\left[ \nabla f(\mathbf{x}_k) \right ]^T \right }^{-1} \left [\nabla f(\mathbf{x}_k) \right ] f(\mathbf{x}_k) \tag{M-1}}

這時簡單回顧一下向量導數:

\nabla f\left( \mathbf{x}k\right) = \dfrac{\partial f}{\partial \mathbf{x}}\Big| {\mathbf{x}=\mathbf{x}{k}}= \left[ \dfrac{\partial f}{\partial x{1}},\dfrac{\partial f}{\partial x_{2}},\ldots ,\dfrac{\partial f}{\partial x_{n}}\right] ^{T}\Big|{\mathbf{x}=\mathbf{x}{k}} \

不過查了一圈資料似乎很少看到這種迭代格式。
一來可能是這種多元函數的求根問題相對討論得少,更多肯定還是討論的多元函數的極值問題。
二來從分析過程也可以看到,關鍵的一步推導中增量向量僅由一個方程確定,這顯然是會導致極大的不確定性。當然這一點也容易理解,比如一個二元函數 f(\mathbf{x})=x_12+x_22-2=0,它的解實際上是一個圓。而如果用數值方法來求解,最好的情況也只能是收斂到一個點,自然也就用處不大了。而在實際應用中理應是增加各種限制條件來使它的解唯一或者有限。
(2)向量值函數
很神奇地是對于向量函數這個問題反而變得更自然。考慮一個向量函數:

\mathbf{f}:R^n \to R^m \\mathbf{f}(\mathbf{x})=\left[f_1(\mathbf{x}),f_2(\mathbf{x}),\cdots,f_m(\mathbf{x})\right]^T \

也就是說,該函數的值是一個向量,它的每個分量都是一個多元函數。它的零點問題就變成:

\mathbf{f}(\mathbf{x}) = \mathbf{0} \

有了上面的經驗,再次考慮一階逼近:

\mathbf{f}(\mathbf{x}_k+\mathbf{z}) \approx \mathbf{f}(\mathbf{x}_k)+ \left ( \dfrac{\partial \mathbf{f}(\mathbf{x})}{\partial \mathbf{x}}\Big| _{\mathbf{x}=\mathbf{x}_k} \right ) \mathbf{z} \

這里故意寫成 \dfrac{\partial \mathbf{f}(\mathbf{x})}{\partial \mathbf{x}} 是因為可以很好地對應矩陣導數:

\dfrac{\partial \mathbf{f}(\mathbf{x})}{\partial \mathbf{x}}=\begin{pmatrix} \dfrac{\partial \mathbf{f}\left( \mathbf{x}\right) }{\partial x_{1}} \ \dfrac{\partial \mathbf{f}\left( \mathbf{x}\right) }{\partial x_{2}} \ \vdots \ \dfrac{\partial \mathbf{f}\left( \mathbf{x}\right) }{\partial x_{n}} \end{pmatrix} = \begin{pmatrix} \dfrac{\partial f_{1}\left( \mathbf{x}\right) }{\partial x_{1}} & \dfrac{\partial f_{1}\left( \mathbf{x}\right) }{\partial x_{2}}&\ldots & \dfrac{\partial f_{1}\left( \mathbf{x}\right) }{\partial x_{n}} \ \dfrac{\partial f_{2}\left( \mathbf{x}\right) }{\partial x_{1}} & \dfrac{\partial f_{2}\left( \mathbf{x}\right) }{\partial x_{2}}&\ldots & \dfrac{\partial f_{2}\left( \mathbf{x}\right) }{\partial x_{n}} \ \vdots & \vdots& \ddots & \vdots \ \dfrac{\partial f_{m}\left( \mathbf{x}\right) }{\partial x_{1}} & \dfrac{\partial f_{m}\left( \mathbf{x}\right) }{\partial x_{2}}&\ldots & \dfrac{\partial f_{m}\left( \mathbf{x}\right) }{\partial x_{n}} \end{pmatrix} \tag{J}

這下子就好辦了,它就是一個 Jacobian 矩陣,也可以簡記為:

\mathbf{J}k=\mathbf{J}{\mathbf{f}}(\mathbf{x}k)= \begin{pmatrix} \dfrac{\partial f{1}\left( \mathbf{x}\right) }{\partial x_{1}} & \dfrac{\partial f_{1}\left( \mathbf{x}\right) }{\partial x_{2}}&\ldots & \dfrac{\partial f_{1}\left( \mathbf{x}\right) }{\partial x_{n}} \ \dfrac{\partial f_{2}\left( \mathbf{x}\right) }{\partial x_{1}} & \dfrac{\partial f_{2}\left( \mathbf{x}\right) }{\partial x_{2}}&\ldots & \dfrac{\partial f_{2}\left( \mathbf{x}\right) }{\partial x_{n}} \ \vdots & \vdots& \ddots & \vdots \ \dfrac{\partial f_{m}\left( \mathbf{x}\right) }{\partial x_{1}} & \dfrac{\partial f_{m}\left( \mathbf{x}\right) }{\partial x_{2}}&\ldots & \dfrac{\partial f_{m}\left( \mathbf{x}\right) }{\partial x_{n}} \end{pmatrix} \

于是令一階逼近式為 \mathbf{0},得到

\mathbf{J}_k \mathbf{z}=-\mathbf{f}(\mathbf{x}_k) \

注意到這個線性方程組的系數矩陣也不一定是方陣,因此仍然要使用廣義逆:

\mathbf{z}=-\left ( \mathbf{J}_k^T\mathbf{J}_k \right )^{-1} \mathbf{J}_k^T\mathbf{f}(\mathbf{x}_k) \

于是完整迭代式可以寫出來:

\bbox[pink]{\mathbf{x}{k+1}=\mathbf{x}{k}-\left ( \mathbf{J}_k^T\mathbf{J}_k \right )^{-1} \mathbf{J}_k^T\mathbf{f}(\mathbf{x}_k) \tag{M-2}}

這個式子看起來就比較眼熟了。

當然如果 Jacobian 矩陣是方陣且可逆的話自然就可以直接求逆:

\mathbf{x}{k+1}=\mathbf{x}{k}-\mathbf{J}_k^{-1} \mathbf{f}(\mathbf{x}_k) \

不過這個情況,顯然也就不具有一般性了。

四、多元函數的極值問題
多元函數的極值可能是我們討論最多的問題了。尤其現在的機器學習訓練問題本質上就是一個多元函數的極值問題。這里我們只討論標量函數的情況。

類似第二小節,最簡單的思路是先求出一階導,再令一階導為 0。這里再明確一下:標量對向量的導數是向量。 于是寫出一階導的完整形式:

\mathbf{g}(\mathbf{x})=\nabla f(\mathbf{x})=\dfrac{\partial f(\mathbf{x})}{\partial \mathbf{x}}=\begin{pmatrix} \dfrac{\partial f\left( \mathbf{x}\right) }{\partial x_{1}} \ \dfrac{\partial f\left( \mathbf{x}\right) }{\partial x_{2}} \ \vdots \ \dfrac{\partial f\left( \mathbf{x}\right) }{\partial x_{n}} \end{pmatrix} \

仍然考慮一階導的一階逼近:

\mathbf{g}(\mathbf{x}_k+\mathbf{z}) \approx \mathbf{g}(\mathbf{x}_k)+ \left ( \dfrac{\partial \mathbf{g}(\mathbf{x})}{\partial \mathbf{x}}\Big| _{\mathbf{x}=\mathbf{x}_k} \right ) \mathbf{z} \

那么此時就可以令這個逼近式等于 \mathbf{0},得到:

\left ( \dfrac{\partial \mathbf{g}(\mathbf{x})}{\partial \mathbf{x}}\Big| _{\mathbf{x}=\mathbf{x}_k} \right ) \mathbf{z}=-\mathbf{g}(\mathbf{x}_k) \

接下來就很自然了:

\mathbf{z}=-\left ( \dfrac{\partial \mathbf{g}(\mathbf{x})}{\partial \mathbf{x}}\Big| _{\mathbf{x}=\mathbf{x}_k} \right )^{-1}\mathbf{g}(\mathbf{x}_k) \

那么這時候有意思的就來了,一階導對向量 \mathbf{x} 的導數又變成了矩 Jacobian 陣:

\mathbf{J}{\mathbf{g}}(\mathbf{x})=\begin{pmatrix} \dfrac{\partial g{1}\left( \mathbf{x}\right) }{\partial x_{1}} & \dfrac{\partial g_{1}\left( \mathbf{x}\right) }{\partial x_{2}}&\ldots & \dfrac{\partial g_{1}\left( \mathbf{x}\right) }{\partial x_{n}} \ \dfrac{\partial g_{2}\left( \mathbf{x}\right) }{\partial x_{1}} & \dfrac{\partial g_{2}\left( \mathbf{x}\right) }{\partial x_{2}}&\ldots & \dfrac{\partial g_{2}\left( \mathbf{x}\right) }{\partial x_{n}} \ \vdots & \vdots& \ddots & \vdots \ \dfrac{\partial g_{n}\left( \mathbf{x}\right) }{\partial x_{1}} & \dfrac{\partial g_{n}\left( \mathbf{x}\right) }{\partial x_{2}}&\ldots & \dfrac{\partial g_{n}\left( \mathbf{x}\right) }{\partial x_{n}} \end{pmatrix} \

而對于函數 f (\mathbf{x} ) 又最做 Hessian 矩陣

\nabla^2 f(\mathbf{x})=\mathbf{H}_f (\mathbf{x} ) = \begin{bmatrix} \frac{\partial^2 f}{\partial^2 x_1} & \frac{\partial^2 f}{\partial x_1\partial x_2} & \ldots & \frac{\partial^2 f}{\partial x_1\partial x_n} \ \frac{\partial^2 f}{\partial x_2 \partial x_1} & & & \frac{\partial^2 f}{\partial x_2 \partial x_n} \ \vdots &&&\vdots \ \frac{\partial^2 f}{\partial x_n \partial x_1} & \ldots & \ldots & \frac{\partial^2 f}{\partial^2 x_n} \end{bmatrix}. \

這個形式很顯然看起來就比較討厭了。
同樣地,由這兩個記號就可以寫出多元標量函數極值問題的牛頓迭代格式了:

\bbox[pink]{\mathbf{x}{k+1}=\mathbf{x}{k}-\mathbf{H}f ^{-1} (\mathbf{x}{k} ) \mathbf{g}(\mathbf{x}k)=\mathbf{x}{k}-\mathbf{H}f ^{-1} (\mathbf{x}{k} ) \nabla f(\mathbf{x}_k) \tag{M-3}}

這里就注意到一個很有意思的事情,Hessian 矩陣一定是方陣,所以可以直接考慮它的逆。當然如果不可逆時也會考慮一些技術處理。而此時廣義逆就不一定有用了,更多的情況是在其對角線加一個正數,這種方法稱為正則化。

\bbox[pink]{\mathbf{x}{k+1}=\mathbf{x}{k}-\left ( \mathbf{H}f ^{-1} (\mathbf{x}{k}) +\mu \mathbf{I} \right ) \nabla f(\mathbf{x}_k) \tag{M-4}}

到這還沒完,比著一元函數的牛頓迭代我們還有一種思路就是直接考慮二階逼近。而上面這些鋪墊其實已經把二階展開里要用的麻煩符號定義完了,所以直接寫:

f(\mathbf{x}_k+\mathbf{z})\approx f(\mathbf{x}k)+\left ( \dfrac{\partial f(\mathbf{x})}{\partial \mathbf{x}}\Big|{\mathbf{x}=\mathbf{x}k} \right )^T \mathbf{z} +\mathbf{z}^T\left ( \dfrac{\partial^2 f(\mathbf{x})}{\partial \mathbf{x}^2 }\Big|{\mathbf{x}=\mathbf{x}_k} \right ) \mathbf{z} \

可以寫成:

\bbox[pink]{f(\mathbf{x}_k+\mathbf{z})\approx f(\mathbf{x}_k)+\left ( \nabla f(\mathbf{x}_k) \right )^T \mathbf{z} +\frac{1}{2}\mathbf{z}^T\left ( \nabla^2 f(\mathbf{x}_k) \right ) \mathbf{z} \tag{M-5}}

那么如果直接對(M-5)式求導,就可以直接得到其迭代式(M-3)。

剛剛為了盡快進入牛頓迭代格式就直接跳過了另外一條線。事實上,上面在令其二階逼近的導數為零時,求其迭代格式的本質已經轉化成了一個線性方程組,我們簡單記成這樣:

\bbox[pink]{\mathbf{H}_k \mathbf{z}=-\mathbf{g}_k \tag{M-6}}

其實質就是如何快速求出 \mathbf{z} 的值。那么這樣一來,各種快速的求解方法就可以用了。對于較大的矩陣最常用的方法就是 CG 梯度,在《Matrix Computation》一書中就有介紹。不過在一些常見的數值計算工具中(比如 Matlab),似乎對于不太大的矩陣直接用 LU 分解還快一些。

五、最后說兩種簡化版
要說簡化,自然是要把最討厭的東西給簡化掉。上面已經說了,Hessian 矩陣 \mathbf{H} 最討厭。在一些特殊的問題中它是可以被簡化的。這種問題就是

(1) 非線性最小二乘問題
\ell(\mathbf{w}) = \frac{1}{2}| f(\mathbf{X};\mathbf{w})-\mathbf{Y} |^2= \frac{1}{2}\mathbf{e}^2 \

這里簡單作一下說明,用符號 \ell 對應現在流行的說法“損失函數”,同時根據其物理意義也可以叫 “最小平方誤差函數”,由于要求導所以乘以 \frac{1}{2} 后面討論起來比較方便。\mathbf{X} 是輸入變量組成的矩陣,\mathbf{Y} 是輸出變量組成的矩陣,\mathbf{w} 是全體參數組成的向量,\mathbf{e} 是誤差值組成的向量。 那么這時就直接套用一下二階展開(M-5)式:

\ell(\mathbf{w}_k+\mathbf{z})\approx \ell(\mathbf{w}_k)+\left ( \nabla \ell(\mathbf{w}_k) \right )^T \mathbf{z} +\frac{1}{2}\mathbf{z}^T\left ( \nabla^2 \ell(\mathbf{w}_k) \right ) \mathbf{z} \

由于這個最小平方誤差函數的定義比較特殊,因此它的二階展開里的兩個偏導可以寫得比較簡單:

\nabla \ell(\mathbf{w})=\dfrac{\partial \left ( \frac{1}{2}\mathbf{e}^2 \right ) }{\partial \mathbf{w}} = \left ( \dfrac{\partial \mathbf{e} }{\partial \mathbf{w}} \right )^T\mathbf{e} =\mathbf{J}^T_{\mathbf{e}}(\mathbf{w})\mathbf{e} \

這個 Jacobian 矩陣就是(J)式中的定義。這里注意下向量的形狀,始終保證最后的結果是列向量。

二階導自然就是對一階再求一次導:

\nabla^2 \ell(\mathbf{w})=\nabla \left ( \nabla\ell(\mathbf{w}) \right )= \frac{\partial\left ( \left ( \dfrac{\partial \mathbf{e} }{\partial \mathbf{w}} \right )^T\mathbf{e} \right ) }{\partial \mathbf{w}} \

這時很有意思的就來了,向量對向量求導的乘法法則(分配律)仍然成立:

\frac{\partial\left ( \left ( \dfrac{\partial \mathbf{e} }{\partial \mathbf{w}} \right )^T\mathbf{e} \right ) }{\partial \mathbf{w}} = \left ( \dfrac{\partial \mathbf{e} }{\partial \mathbf{w}} \right )^T \left ( \dfrac{\partial \mathbf{e} }{\partial \mathbf{w}} \right ) +\dfrac{\partial^2 \mathbf{e} }{\partial \mathbf{w}^2}\mathbf{e} \

于是它的二階導又可以寫成:

\nabla^2 \ell(\mathbf{w})= \mathbf{J}^T_{\mathbf{e}}(\mathbf{w})\mathbf{J}_{\mathbf{e}}(\mathbf{w}) +\dfrac{\partial^2 \mathbf{e} }{\partial \mathbf{w}^2}\mathbf{e} \

那么直接對應代回(M-3)式就有:

\bbox[pink]{\mathbf{w}{k+1}=\mathbf{w}{k}- \left ( (\mathbf{J}^T_{\mathbf{e}}(\mathbf{w})\mathbf{J}{\mathbf{e}}(\mathbf{w}) +\dfrac{\partial^2 \mathbf{e} }{\partial \mathbf{w}^2}\mathbf{e}) ^{-1} \mathbf{J}^T{\mathbf{e}}(\mathbf{w})\mathbf{e} \right ) \Big|_{\mathbf{w}=\mathbf{w}_k} \tag{LS-1}}

這玩意誰看誰煩!

(2)高斯-牛頓法
一位法國兒童可能也是懷著同樣的心情,于是發了一篇文章:Theoria motus corporum coelestium in sectionibus conicis solem ambientum (1809), pp. 179-180.

在這篇文章里,他大概提到:\nabla^2 \ell(\mathbf{w}) 中的二階項應該很小,所以直接省略,于是再對符號簡化一下,這個 Hessian 近似就可以寫成:

\nabla^2 \ell(\mathbf{w})= \mathbf{J}^T\mathbf{J} \

這下子就非常簡潔了:
KaTeX parse error: Undefined control sequence: \bbox at position 2: \?b?b?o?x?[pink]{\mathbf{…
這個式子就是著名的 Gauss-Newton 法的迭代公式。

(3)Levenberg-Marquardt
在討論一般的極值問題時就提到過一個問題,那個 Hessian 矩陣是不一定可逆的。用 Gauss-Newton 方法之后,其實這種不可逆可以在一定程度上得到緩解。因為不難證明對于形如 \mathbf{J}^T\mathbf{J} 的矩陣通常是半正定的。但在實際計算過程中也難免會有數值上的病態出現,于是就出現了各種的改進。

最簡單直接的思路就是在 J T J \mathbf{J}^T\mathbf{J} JTJ的對角線上加上一個正數:

而這個格式就是后來更常用的 Levenberg-Marquardt 算法。

剩下還有一些其它的加權方式基本都是在這個基礎上進行改進,不再多說了。

寫完了發現其實大部分時間還是在直接敲。主要還是手寫工具反應太慢了。初次寫復雜的式子的時候還有點用,如果改動的話還不如直接整代碼。加起來還是整了好幾個小時。
至于理論篇,再說吧。想想就覺得累。

關于牛頓迭代有個比較好的綜述,懶得翻譯了將就看看:

The name “Newton’s method” is derived from Isaac Newton’s description of a special case of the method in De analysi per aequationes numero terminorum infinitas (written in 1669, published in 1711 by William Jones) and in De metodis fluxionum et serierum infinitarum (written in 1671, translated and published as Method of Fluxions in 1736 by John Colson). However, his method differs substantially from the modern method given above. Newton applied the method only to polynomials, starting with an initial root estimate and extracting a sequence of error corrections. He used each correction to rewrite the polynomial in terms of the remaining error, and then solved for a new correction by neglecting higher-degree terms. He did not explicitly connect the method with derivatives or present a general formula. Newton applied this method to both numerical and algebraic problems, producing Taylor series in the latter case.
Newton may have derived his method from a similar but less precise method by Vieta. The essence of Vieta’s method can be found in the work of the Persian mathematician Sharaf al-Din al-Tusi, while his successor Jamshīd al-Kāshī used a form of Newton’s method to solve xP ? N = 0 to find roots of N (Ypma 1995). A special case of Newton’s method for calculating square roots was known since ancient times and is often called the Babylonian method.
Newton’s method was used by 17th-century Japanese mathematician Seki Kōwa to solve single-variable equations, though the connection with calculus was missing.[1]
Newton’s method was first published in 1685 in A Treatise of Algebra both Historical and Practical by John Wallis.[2] In 1690, Joseph Raphson published a simplified description in Analysis aequationum universalis.[3] Raphson also applied the method only to polynomials, but he avoided Newton’s tedious rewriting process by extracting each successive correction from the original polynomial. This allowed him to derive a reusable iterative expression for each problem. Finally, in 1740, Thomas Simpson described Newton’s method as an iterative method for solving general nonlinear equations using calculus, essentially giving the description above. In the same publication, Simpson also gives the generalization to systems of two equations and notes that Newton’s method can be used for solving optimization problems by setting the gradient to zero.
Arthur Cayley in 1879 in The Newton–Fourier imaginary problem was the first to notice the difficulties in generalizing Newton’s method to complex roots of polynomials with degree greater than 2 and complex initial values. This opened the way to the study of the theory of iterations of rational functions.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42170.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42170.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42170.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【深度學習】PyTorch快速入門

【深度學習】學習PyTorch基礎 介紹PyTorch 深度學習框架是一種軟件工具,旨在簡化和加速構建、訓練和部署深度學習模型的過程。深度學習框架提供了一系列的函數、類和工具,用于定義、優化和執行各種深度神經網絡模型。這些框架幫助研究人員和開發人員專注…

漏洞+常見漏洞修復建議

一、漏洞級別 高級別漏洞:大部分遠程和本地管理員權限漏洞 中級別漏洞:大部分普通用戶權限、權限提升、讀懂受限文件、遠程和本杜漏洞、拒絕服務漏洞 低級別漏洞:大部分遠程非授權文件存取、口令恢復、欺騙、信息泄露漏洞 二、漏洞掃描的…

Kotlin Lambda和高階函數

Lambda和高階函數 本文鏈接: 文章目錄 Lambda和高階函數 lambda輸出(返回類型)深入探究泛型 inline原理探究 高階函數集合、泛型自己實現Kotlin內置函數 擴展函數原理companion object 原理 > 靜態內部類函數式編程 lambda 1、lambda的由…

Flink流批一體計算(13):PyFlink Tabel API之SQL DDL

1. TableEnvironment 創建 TableEnvironment from pyflink.table import Environmentsettings, TableEnvironment# create a streaming TableEnvironmentenv_settings Environmentsettings.in_streaming_mode()table_env TableEnvironment.create(env_settings)# or create…

嵌入式Linux開發實操(九):CAN接口開發

前言: CAN網絡在汽車中的使用可以說相當廣泛。而CAN網絡需要的收發器最常用的就是NXP 的TJA1042: CAN網絡:

605. 種花問題

鏈接 假設有一個很長的花壇,一部分地塊種植了花,另一部分卻沒有。可是,花不能種植在相鄰的地塊上,它們會爭奪水源,兩者都會死去。給你一個整數數組 flowerbed 表示花壇,由若干 0 和 1 組成,其中…

8/16總結

WebSocket是雙向通信協議,模擬Socket協議,可以雙向發送或者接收信息 而Http是單向的 WebSocket是需要瀏覽器和服務器握手進行建立連接的 而http是瀏覽器發起向服務器的連接,服務器預先并不知道這個連接 WebSocket在建立握手時,數…

Python3內置函數大全

吐血整理 Python3內置函數大全 1.abs()函數2.all()函數3.any()函數4.ascii()函數5.bin()函數6.bool()函數7.bytes()函數8.challable()函數9.chr()函數10.classmethod()函數11.complex()函數12.complie()函數13.delattr()函數14.dict()函數15.dir()函數16.divmod()函數17.enumer…

注解@JsonInclude

注解JsonInclude 1. 注解由來 JsonInclude是一個用于Java類中字段或方法的注解,它來自于Jackson庫。Jackson庫是一個用于處理JSON數據的流行開源庫,在Java對象和JSON之間進行序列化和反序列化時經常被使用。 2. 注解示例 下面是JsonInclude注解的一個…

【kubernetes】Pod控制器

目錄 Pod控制器及其功用 pod控制器有多種類型 1、ReplicaSet ReplicaSet主要三個組件組成 2、Deployment 3、DaemonSet 4、StatefulSet 5、Job 6、Cronjob Pod與控制器之間的關系 1、Deployment 查看控制器配置 查看歷史版本 2、SatefulSet 為什么要有headless&…

2023-08-18力扣每日一題

鏈接: 1388. 3n 塊披薩 題意: 一個長度3n的環,選n次數字,每次選完以后相鄰的數字會消失,求選取結果最大值 解: 這波是~~(ctrl)CV工程師了~~ 核心思想是選取n個不相鄰的元素一定…

無涯教程-Perl - splice函數

描述 此函數從LENGTH元素的OFFSET元素中刪除ARRAY元素,如果指定,則用LIST替換刪除的元素。如果省略LENGTH,則從OFFSET開始刪除所有內容。 語法 以下是此函數的簡單語法- splice ARRAY, OFFSET, LENGTH, LISTsplice ARRAY, OFFSET, LENGTHsplice ARRAY, OFFSET返回值 該函數…

Vue 項目運行 npm install 時,卡在 sill idealTree buildDeps 沒有反應

解決方法:切換到淘寶鏡像。 以下是之前安裝的 xmzs 包,用于控制切換淘寶鏡像。 該截圖是之前其他項目切換淘寶鏡像的截圖。 切換鏡像后,順利執行 npm install 。

生成國密密鑰對

在線生成國密密鑰對 生成的密鑰對要妥善保管,丟失是無法找回的。

selinux

一、selinux的說明 二、selinux的工作原理 三、selinux的啟動、關閉與查看 Enforcing和permissive都是臨時的,重啟還是依據配置文件中,禁用selinux,修改配置文件: 之后重啟生效 四、selinux對linux服務的影響

SpringBoot 接口調用出現亂碼解決 中文亂碼

SpringBoot 接口調用出現亂碼解決 package com.cxjg.mvc.util;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springfra…

相同數字的積木游戲

題目描述 題目描述 小華和小薇一起通過玩積木游戲學習數學。 他們有很多積木,每個積木塊上都有一個數字,積木塊上的數字可能相同。 小華隨機拿一些積木挨著排成一排,請小薇找到這排積木中數字相同目所處位置最遠的2塊積木塊,計算…

【JAVA】我們該如何規避代碼中可能出現的錯誤?(一)

個人主頁:【😊個人主頁】 系列專欄:【??初識JAVA】 文章目錄 前言三種類型的異常異常處理JAVA內置異常類Exception 類的層次 前言 異常是程序中的一些錯誤,但并不是所有的錯誤都是異常,并且錯誤有時候是可以避免的&…

【BASH】回顧與知識點梳理(三十三)

【BASH】回顧與知識點梳理 三十三 三十三. 認識系統服務 (daemons)33.1 什么是 daemon 與服務 (service)早期 System V 的 init 管理行為中 daemon 的主要分類 (Optional)systemd 使用的 unit 分類systemd 的配置文件放置目錄systemd 的 unit 類型分類說明 33.2 透過 systemctl…

Grounding dino + segment anything + stable diffusion 實現圖片編輯

目錄 總體介紹總體流程 模塊介紹目標檢測: grounding dino目標分割:Segment Anything Model (SAM)整體思路模型結構:數據引擎 圖片繪制 集成樣例 其他問題附錄 總體介紹 總體流程 本方案用到了三個步驟,按順序依次為&#xff1a…