答張盛東──關於 Hessian 矩陣與多變量函數的泰勒展開式

網友張盛東留言:

老師,其實能否將 Hessian 矩陣看作 gradient 算子與自身的外積 (outer product)[1] 再乘以函數 f?如果可以,是否可能將多變數函數的 Taylor 展開式前兩項之後的項都像這樣表示成 gradient 算子與自身的外積?

 
答曰:

我們先重溫幾個重要的矩陣導數 (詳見“矩陣導數”)。令 f:\mathbb{R}^n\to\mathbb{R} 為一個多變量可導函數。純量函數 f 在點 \mathbf{x}=(x_1,\ldots,x_n)^T 的梯度 (gradient) 定義為一階偏導數 \frac{\partial f}{\partial x_1},\frac{\partial f}{\partial x_2},\ldots,\frac{\partial f}{\partial x_n} 組合成的 n 維向量

\displaystyle  \nabla f=\begin{bmatrix}  \frac{\partial f}{\partial x_1}\\[0.5em]  \frac{\partial f}{\partial x_2}\\[0.5em]  \vdots\\[0.5em]  \frac{\partial f}{\partial x_n}  \end{bmatrix}

請特別注意:梯度算子 \nabla 只能吃純量函數 f(\mathbf{x})。在這個前提下,如何將純量函數的梯度推廣至向量函數?令 \mathbf{f}:\mathbb{R}^n\to\mathbb{R}^m 為一個向量函數。設

\displaystyle  \mathbf{f}(\mathbf{x})=\begin{bmatrix}  f_1(x_1,\ldots,x_n)\\  f_2(x_1,\ldots,x_n)\\  \vdots\\  f_m(x_1,\ldots,x_n)  \end{bmatrix}

分別計算每一純量函數 f_i 的梯度 \nabla f_i,合併可得底下的 m\times n 階矩陣:

\displaystyle  J(\mathbf{f})=\begin{bmatrix}  (\nabla f_1)^T\\  (\nabla f_2)^T\\  \vdots\\  (\nabla f_m)^T  \end{bmatrix}=\begin{bmatrix}  \frac{\partial f_1}{\partial x_1}&\frac{\partial f_1}{\partial x_2}&\cdots&\frac{\partial f_1}{\partial x_n}\\[0.3em]  \frac{\partial f_2}{\partial x_1}&\frac{\partial f_2}{\partial x_2}&\cdots&\frac{\partial f_2}{\partial x_n}\\[0.3em]  \vdots\\[0.3em]  \frac{\partial f_m}{\partial x_1}&\frac{\partial f_m}{\partial x_2}&\cdots&\frac{\partial f_m}{\partial x_n}  \end{bmatrix}

稱為向量函數 \mathbf{f} 的 Jacobian (見“Jacobian 矩陣與行列式”)。因為梯度 \nabla f:\mathbb{R}^n\to\mathbb{R}^n 是一個向量函數,我們可以計算 \nabla f 的 Jacobian,稱為 f 的 Hessian,如下:

\displaystyle\begin{aligned}  H(f)&=J(\nabla f)=\begin{bmatrix}  \left(\nabla\frac{\partial f}{\partial x_1}\right)^T\\[0.3em]  \left(\nabla\frac{\partial f}{\partial x_2}\right)^T\\[0.3em]  \vdots\\[0.3em]  \left(\nabla\frac{\partial f}{\partial x_n}\right)^T  \end{bmatrix}\\  &=\begin{bmatrix}  \frac{\partial}{\partial x_1}\left(\frac{\partial f}{\partial x_1}\right)&\frac{\partial}{\partial x_2}\left(\frac{\partial f}{\partial x_1}\right)&\cdots&\frac{\partial}{\partial x_n}\left(\frac{\partial f}{\partial x_1}\right)\\[1em]  \frac{\partial}{\partial x_1}\left(\frac{\partial f}{\partial x_2}\right)&\frac{\partial}{\partial x_2}\left(\frac{\partial f}{\partial x_2}\right)&\cdots&\frac{\partial}{\partial x_n}\left(\frac{\partial f}{\partial x_2}\right)\\  \vdots&\vdots&\ddots&\vdots\\  \frac{\partial}{\partial x_1}\left(\frac{\partial f}{\partial x_n}\right)&\frac{\partial}{\partial x_2}\left(\frac{\partial f}{\partial x_n}\right)&\cdots&\frac{\partial}{\partial x_n}\left(\frac{\partial f}{\partial x_n}\right)  \end{bmatrix}\\  &=\begin{bmatrix}  \frac{\partial^2f}{\partial x_1\partial x_1}&\frac{\partial^2f}{\partial x_1\partial x_2}&\cdots&\frac{\partial^2f}{\partial x_1\partial x_n}\\[1em]  \frac{\partial^2 f}{\partial x_2\partial x_1}&\frac{\partial^2 f}{\partial x_2\partial x_2}&\cdots&\frac{\partial^2 f}{\partial x_2\partial x_n}\\  \vdots&\vdots&\ddots&\vdots\\  \frac{\partial^2 f}{\partial x_n\partial x_1}&\frac{\partial^2f}{\partial x_n\partial x_2}&\cdots&\frac{\partial^2 f}{\partial x_n\partial x_n}  \end{bmatrix}.\end{aligned}

上面最末一個等式使用了導數性質

\displaystyle  \frac{\partial^2f}{\partial x_i\partial x_j}=\frac{\partial}{\partial x_i}\left(\frac{\partial f}{\partial x_j}\right)=\frac{\partial}{\partial x_j}\left(\frac{\partial f}{\partial x_i}\right)=\frac{\partial^2f}{\partial x_j\partial x_i}

故知 Hessian 是一個 n\times n 階對稱矩陣。類似梯度算子 \nabla,Hessian H(\cdot) 也只能吃純量函數 f(\mathbf{x})

 
概念上,我們常將梯度和 Hessian 分別視為多變量函數的一階導函數和二階導函數,但單變量函數的導函數表達形式未必適用於多變量函數。對於單變量函數 f(x),二階導函數等於一階導函數的導數,即

\displaystyle  \frac{\partial^2f}{\partial x^2}=\frac{\partial}{\partial x}\frac{\partial f}{\partial x}

根據定義,H(f) 是對稱矩陣,因此可用行向量表示為

\displaystyle  H(f)=\begin{bmatrix}  \nabla\frac{\partial f}{\partial x_1}&\nabla\frac{\partial f}{\partial x_2}&\cdots&\nabla\frac{\partial f}{\partial x_n}  \end{bmatrix}

那麼,H(f) 能否看作 \nabla 與自身的外積再乘以函數 f?也就是說,提出 H(f) 的梯度算子 \nabla 和純量函數 f,如下:

\displaystyle  H(f)=\begin{bmatrix}  \frac{\partial}{\partial x_1}\\[0.5em]  \frac{\partial}{\partial x_2}\\[0.5em]  \vdots\\[0.5em]  \frac{\partial}{\partial x_n}  \end{bmatrix}\begin{bmatrix}  \frac{\partial f}{\partial x_1}&\frac{\partial f}{\partial x_2}&\cdots&\frac{\partial f}{\partial x_n}  \end{bmatrix}=\nabla\nabla^T f

這個想法的確相當誘人,然而,將 Hessian 記為 \nabla\nabla^T f 即便有形式上的意義,其實是一個錯誤的表達式。我們知道線性算子服從結合律,\nabla 是一線性算子 (微分是線性算子),因此 (\nabla\nabla^T)f=\nabla(\nabla^T f) 理當成立。不過,Hessian 的真實意義是 (\nabla\nabla^T)f,而不是未定義的「梯度轉置的梯度」 \nabla(\nabla^T f)=\nabla(\nabla f)^T。提醒讀者,\nabla f 是一向量函數,但梯度算子 \nabla 僅定義於純量函數上。除了這個謬誤,文末還會提供另一個拒絕 \nabla\nabla^Tf 的理由。

 
下面我說明如何利用梯度算子 \nabla 表達多變量函數的泰勒展開式 (Taylor series,或稱泰勒級數)。單變量函數 f(y) 在固定點 x 的泰勒展開式為

\displaystyle  f(y)=f(x)+f'(x)(y-x)+\frac{f''(x)}{2!}(y-x)^2+\frac{f'''(x)}{3!}(y-x)^3+\cdots

a=y-x。將 y=x+a 代入上式可得另一種表達式:

\displaystyle  f(x+a)=f(x)+f'(x)a+\frac{f''(x)}{2!}a^2+\frac{f'''(x)}{3!}a^3+\cdots

這裡 a 通常為一微小量。運用一些代數技巧可將單變量函數的泰勒展開式擴充為多變量函數的泰勒展開式。考慮多變量函數 f(\mathbf{x})。設 \phi(t)=f(\mathbf{x}+t\mathbf{a}),寫出 \phi(t)0 的泰勒展開式

\displaystyle  \phi(t)=\sum_{k=0}^\infty \frac{\phi^{(k)}(0)}{k!}t^k

其中 \phi^{(k)}(t) 代表 \phi(t)k 階導函數。利用變數變換,令 \mathbf{y}=\mathbf{x}+t\mathbf{a},則 \phi(t)=f(\mathbf{y})。設想固定 \mathbf{x},計算 \phi(t) 的導數,如下:

\displaystyle  \phi'=\sum_i\frac{\partial f}{\partial y_i}\frac{\partial y_i}{\partial t}=\sum_i\frac{\partial f}{\partial y_i}a_i  =\left(\sum_ia_i\frac{\partial}{\partial y_i}\right)f=\left(\mathbf{a}^T\nabla_\mathbf{y}\right)f

再對一階導函數 \phi'(t) 求導,

\displaystyle\begin{aligned}  \phi''&=\sum_{j}\frac{\partial\phi'}{\partial y_j}\frac{\partial y_j}{\partial t}=\sum_{j}\frac{\partial}{\partial y_j}\left(\sum_{i}\frac{\partial f}{\partial y_i}a_i\right)a_j\\  &=\sum_i\sum_j\frac{\partial^2f}{\partial y_i\partial y_j}a_ia_j=\left(\sum_i\sum_ja_ia_j\frac{\partial^2}{\partial y_i\partial y_j}\right)f\\  &=\left(\sum_ia_i\frac{\partial}{\partial y_i}\right)\left(\sum_ja_j\frac{\partial}{\partial y_j}\right)f=\left(\mathbf{a}^T\nabla_{\mathbf{y}}\right)^2f  .\end{aligned}

重複相同程序可推得 k 階導函數 \displaystyle  \phi^{(k)}(t)=\left(\mathbf{a}^T\nabla_{\mathbf{y}}\right)^kf(\mathbf{y})k\ge 1,並定義 \phi^{(0)}(t)\equiv\phi(t)。設 t=0,這時 \mathbf{y}=\mathbf{x},即得 \displaystyle  \phi^{(k)}(0)=\left(\mathbf{a}^T\nabla_{\mathbf{x}}\right)^kf(\mathbf{x})。欲求出 f(\mathbf{x}+\mathbf{a}) 的展開式,使用 \phi(t) 的泰勒展開式,代入 t=1,可得簡潔的多變量泰勒級數公式:

\displaystyle  f(\mathbf{x}+\mathbf{a})=\phi(1)=\sum_{k=0}^\infty\frac{1}{k!}\phi^{(k)}(0)=\sum_{k=0}^{\infty}\frac{1}{k!}\left(\mathbf{a}^T\nabla\right)^kf(\mathbf{x})

或明確地寫為

\displaystyle  f(\mathbf{x}+\mathbf{a})=f(\mathbf{x})+\sum_ia_i\frac{\partial f}{\partial x_i}+\frac{1}{2!}\sum_{i,j}a_{i}a_{j}\frac{\partial^2f}{\partial x_i\partial x_j}+\frac{1}{3!}\sum_{i,j,k}a_ia_ja_k\frac{\partial^3f}{\partial x_i\partial x_j\partial x_k}+\cdots

 
在許多應用領域中,我們常以 Hessian 矩陣的二次型來表示 f(\mathbf{x}+\mathbf{a}) 的泰勒展開式的二階項 (其他更高階項無法以矩陣運算表示):

\displaystyle  f(\mathbf{x}+\mathbf{a})=f(\mathbf{x})+\mathbf{a}^T\nabla f+\frac{1}{2!}\mathbf{a}^TH(f)\mathbf{a}+\cdots

欲證明 \mathbf{a}^TH(f)\mathbf{a}=(\mathbf{a}^T\nabla)^2f,乘開比較即得

\displaystyle  \begin{bmatrix}  a_1 &\cdots&a_n  \end{bmatrix}\begin{bmatrix}  \frac{\partial^2f}{\partial x_1\partial x_1}&\cdots&\frac{\partial^2f}{\partial x_1\partial x_n}\\[0.5em]  \vdots&\ddots&\vdots\\[0.5em]  \frac{\partial^2f}{\partial x_n\partial x_1}&\cdots&\frac{\partial^2f}{\partial x_n\partial x_n}  \end{bmatrix}\begin{bmatrix}  a_1\\  \vdots\\  a_n  \end{bmatrix}=\sum_{i=1}^n\sum_{j=1}^na_ia_j\frac{\partial^2f}{\partial x_i\partial x_j}=\left(\sum_{i=1}^na_i\frac{\partial}{\partial x_i}\right)^2f

另外亦可使用 H(f) 的行向量表達式推導,過程如下:

\displaystyle\begin{aligned}  \mathbf{a}^TH(f)\mathbf{a}&=\mathbf{a}^T\begin{bmatrix}  \nabla\frac{\partial f}{\partial x_1}&\cdots&\nabla\frac{\partial f}{\partial x_n}  \end{bmatrix}\mathbf{a}\\  &=\begin{bmatrix}  \mathbf{a}^T\nabla\frac{\partial f}{\partial x_1}&\cdots&\mathbf{a}^T\nabla\frac{\partial f}{\partial x_n}  \end{bmatrix}\begin{bmatrix}  a_1\\  \vdots\\  a_n  \end{bmatrix}\\  &=\sum_{i=1}^n\mathbf{a}^T\nabla\frac{\partial f}{\partial x_i}a_i=\mathbf{a}^T\nabla\sum_{i=1}^na_i\frac{\partial f}{\partial x_i}\\  &=(\mathbf{a}^T\nabla)(\mathbf{a}^T\nabla)f=(\mathbf{a}^T\nabla)^2f.\end{aligned}

上面的每一個推導步驟中,梯度算子 \nabla 都遵守只吃純量函數的規則。繼續推演最末的式子,

\displaystyle  (\mathbf{a}^T\nabla)(\mathbf{a}^T\nabla)f=(\mathbf{a}^T\nabla)(\nabla^T\mathbf{a})f=\mathbf{a}^T\nabla\nabla^T\mathbf{a}f

也說明了將 Hessian 寫成 \nabla\nabla^Tf 是缺乏根據的表述,因為不存在任何運算法則使得 \mathbf{a}^T\nabla\nabla^T\mathbf{a}f 等同 \mathbf{a}^T\nabla\nabla^Tf\mathbf{a}

 
註解:
[1] 本文所稱的外積是指 outer product,而非兩個三維向量的 cross product (也稱外積或向量積)。對於 n 維行向量 (column vector) \mathbf{x}\mathbf{y},外積定義為 n\times n 階矩陣 \mathbf{x}\mathbf{y}^T

Advertisements
本篇發表於 特別主題, 答讀者問 並標籤為 , , , 。將永久鏈結加入書籤。

1 則回應給 答張盛東──關於 Hessian 矩陣與多變量函數的泰勒展開式

  1. 張盛東 說道:

    多謝老師指點。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s