在尋找極大極小值的過程當中,有一個經典的算法叫作Newton's method,在學習Newton's method的過程當中,會引入兩個矩陣,使得理解的難度增大,下面就對這個問題進行描述。算法
1, Jacobian矩陣矩陣數組
對於一個向量函數F:$R_{n}$ -> $R{m}$是一個從歐式n維到歐式m維空間的函數(好像有點難理解,請看下面),這個函數由m個實函數組成,每個函數的輸入自變量是n維的向量,即$(y_{1}(x_{1},\cdots,x_{n}), \cdots,y_{m}(x_{1},\cdots,x_{n}))^\mathrm{T}$,這些函數的偏導數(若是存在)將組成一個 m × n 的矩陣,稱這個矩陣爲 Jacobian矩陣函數
$J_{F}(x_{1},\cdots,x_{n}) = \left[ \begin{matrix}
\frac{∂y_{1}}{∂x_{1}}&\cdots&\frac{∂y_{1}}{∂x_{n}}\\
\vdots&\cdots&\vdots\\
\frac{∂y_{m}}{∂x_{1}}&\cdots&\frac{∂y_{m}}{∂x_{n}}
\end{matrix}\right]$學習
Jacobian矩陣的形式比較好理解;優化
首先咱們已經有了 m × 1 的函數向量spa
$\left[ \begin{matrix}
y_{1}\\
\vdots\\
y_{m}
\end{matrix}\right]$xml
具體到每個函數而言, 函數值y是標量, 對函數的每個自變量 $x_{1},\cdots,x_{n}$求偏導,並將求偏導的結果橫向放成一排,由於有 m 個函數,一共有 m 排:blog
$\left[ \begin{matrix}
\frac{∂y_{1}}{∂x_{1}}&\cdots&\frac{∂y_{1}}{∂x_{n}}\\
\vdots&\cdots&\vdots\\
\frac{∂y_{m}}{∂x_{1}}&\cdots&\frac{∂y_{m}}{∂x_{n}}
\end{matrix}\right]$class
下面來討論一下這個矩陣的幾何意義: 首先看Jacobian的每一行:基礎
每一行的節點值是函數在對應參數下的偏導,以向量的角度能夠理解爲梯度,梯度指向方向導數最大的方向,該最大值即爲梯度向量的模
設 $\vec{u}$ 是梯度向量, $\vec{v} = x - p$,$\vec{t}$是 $\vec{v} $上的單位向量
如今已知梯度u,已知方向v,還定義了方向上的單位向量,根據方向導數的性質:
$\frac{∂f}{∂l} = \left\Vert u \right\Vert\left\Vert t \right\Vert cosθ$
再將單位向量延拓成v:
則$ <u, v> = \left\Vert u\right\Vert\left\Vert v\right\Vert cosθ = \frac{∂f}{∂l} \left\Vert v\right\Vert $
其中 $\frac{∂f}{∂l}$ 是方向導數,對應的幾何意義就是切線的斜率k, $\left\Vert v \right\Vert$ 是梯度方向上的遞增向量,對應 $\Delta x$,最後乘積的結果就是 $\Delta y$
一般,在點p的一個很小的範圍內,咱們認爲函數y是線性的,能夠用一個線性函數 y‘ 近似替代函數 y,而這個 y’ 的解析表達式就是:
$y' ≈ y_{p} + k\Delta x = y_{p} + <u, v>$
而後把 m 個函數都放在一塊兒考慮, 用矩陣乘法代替 <u, v>能夠獲得:
$F(x) ≈ F(p) + J_{F}(p) (x - x_{p})$
2, Hessian矩陣
定義:Hessian矩陣是一個自變量爲向量的實值函數的二階偏導數組成的方塊矩陣,此函數以下:
$f(x_{1}, x{2}, \cdots, x_{n})$
則Hessian矩陣爲:
$H(f) = \left[\begin{matrix}
\frac{∂f^{2}}{∂x_{1}∂x_{1}}&\cdots&\frac{∂f^{2}}{∂x_{1}∂x_{n}}\\
\vdots&\cdots&\vdots\\
\frac{∂f^{2}}{∂x_{n}∂x_{1}}&\cdots&\frac{∂f^{2}}{∂x_{n}∂x_{n}}\\
\end{matrix}\right]$
那麼Hessian矩陣是怎麼來的呢?從定義出發:
首先 f 是一個自變量爲向量的函數,函數值是一個標量(這個跟Jacobian矩陣的出發點就不同)
對於標量函數 f, 對其求一階偏導數,並將求導的結果按列排列
$\left[\begin{matrix}
\frac{∂f}{∂x_{1}}\\
\frac{∂f}{∂x_{2}}\\
\vdots\\
\frac{∂f}{∂x_{n}}\\
\end{matrix}\right]$
在一階導數的基礎上,對每一個節點求二階導數,並將求導的結果以列進行排列:
$\left[\begin{matrix}
\frac{∂f^{2}}{∂x_{1}∂x_{1}}&\cdots&\frac{∂f^{2}}{∂x_{1}∂x_{n}}\\
\vdots&\cdots&\vdots\\
\frac{∂f^{2}}{∂x_{n}∂x_{1}}&\cdots&\frac{∂f^{2}}{∂x_{n}∂x_{n}}\\
\end{matrix}\right]$
3, 泰勒級數
在講解牛頓法以前,咱們先來說一下泰勒級數,考慮以下物理模型:
有一個物體,它以某種方式運動(如今還不知道究竟是什麼方式),如今可以觀測到的是它在一段時間內的運動軌跡 s(t),而且有一把神器的尺子,能夠測量指定點的任意階導數(若是存在的話):
如今咱們假設物體是勻速運動,v = const
而且 速度 v = 初始時刻的速度 = s'(t) (位移的導數是速度)
按照咱們的假設,物體的運動軌跡應該就是這樣:
虛線是物體實際的運動軌跡,實現是擬合出來的軌跡。能夠看到,在 $t = t_{0}$附近,實際軌跡與擬合軌跡比較接近,一點時間$\Delta t$後,差距就出來了:物體實際運動到了位置C,咱們擬合的位置還在B
問題在哪裏?由於咱們假定物體是勻速運動,而且假定0點以後的速度一直等於0點的速度,可是很明顯,物體實際是加速運動。
如今咱們來修改咱們的假設模型,物體是加速運動,並假定加速度 a = const
而且 加速度 a = 初始時刻的加速度 = s‘’(t) (位移的二階導數是加速度)
採用加速運動模型更能反映物體的實際運動狀態,但仍是達不到咱們的要求
很顯然,物體比咱們擬合的運動仍是要快一些,以咱們目前的加速度還跟不上物體的速度
讓咱們再來修改一下假設模型,物體是加速運動,而且加速度不是恆定的,加速度的加速度 w 纔是恆定的
而且 加速度的加速度 w = 初始時刻加速度的加速度 s'''(有點繞口令的感受)
離咱們的目標更進了一步,理論上,只要 n 階導數存在,咱們能夠按照這種思想,不斷加速加速,最終讓B -> C
爲了描述方便,我故意將初始狀態設爲 t = 0, s = 0, 其實咱們也不必定非得侷限於此,初始狀態設爲 $t = t_{0}, s = s_{0}$也是能夠的
最後,咱們來作一下變量替換,就成咱們的泰勒級數了
$f(x) = f(x_{0}) + f'(x_{0})(x - x_{0}) + \frac{1}{2}f''(x_{0})(x - x_{0})^{2} + \frac{1}{3!}f'''(x_{0})(x-x_{0})^{3} + \cdots + \frac{1}{n!}f^{(n)}(x-x_{0})^{n} + \cdots $
泰勒級數向咱們展現了一種思想:函數上的任一點的值,均可以用函數上某點的值$f(x_{0})$與第n(n >= 1)階導數 = 常數 這個模型去逼近
4, Newton‘s method
但對於非線性優化問題,牛頓法提供了一種求解的辦法. 假設任務是優化一個目標函數 f , 求函數 f 的極大極小問題。直接求解 f 的極小值比較困難,常將這種問題轉換爲求 f’ = 0的問題。
首先咱們來看一下牛頓法怎麼來找 f(x) = 0的點
爲了求解 f(x) = 0,常將f(x)在 $x = x_{n}$處用泰勒級數展開:
$f(x) = f(x_{n}) + f'(x_{n})(x - x_{n}) + o(x - x_{n})^{2}$
這個公式的意思是:我知道函數上某一點 $f(x_{n})$的值是不爲0的,我如今就用 $y = f(x_{n})$ + $f'(x)(x - x_{n}) $這個模型來逼近函數 f(x)(固然也能夠用高階導數,可是高階導數徒增計算的困難外沒有任何好處)
很明顯,我用線性方程擬合出來的函數衰減比較快,線性函數與實際函數都是從P出發, 線性函數會提早到達 y = 0的位置,這個時候它會回過頭取查看實際函數的位置,發現它還在點 S, 因而他又退回到S, 並用S處的導數從新擬合出新的線性函數,而後.....
從圖形的變化趨勢能夠看出,算法收斂到 f(x) = 0 的點
整個過程就比如:A、B從同一塊兒點以一樣的速度向0點賽跑,A的速度是恆定的,B的耐力很差,速度越跑越慢,因而A先到達了終點,A到達以後,以爲沒意思,回過頭去找B(穿越過去),而且參考B當前的速度,再次在同一塊兒跑線採用相同的速度一塊兒向終點進發,來回折騰了幾回以後,A和B終於一塊兒手牽手走向了終點(0點)。
概括後的算法思想爲:
$x_{n+1} := x_{n} - \frac{f(x_{n})}{f'(x_{n})}$
從幾何上很容易理解,不須要過多的說明。
牛頓法求 f(x) = 0 通常是有效的,不過咱們如今的問題是求 f(x)的極大值或極小值,即 f'(x) = 0 的位置,因此牛頓法正確的使用方式是:
$x_{n+1} := x_{n} - \frac{f'(x_{n})}{f''(x_{n})}$
上面咱們討論的都是單變量問題,若是輸入參數 x 是一個向量,牛頓法就演變成:
$X_{n+1} := X_{n} - \frac{J_{f}(X_{n})}{H(X_{n})} = X_{n} - H^{-1}(X_{n})J_{f}(X_{n})$
$J_{f}(X_{n})$是咱們前面介紹過的 Jacobian 矩陣,對應標量方程組的一階導數
$H(X_{n})$ 是Hessian矩陣,對應標量方程的二階導數