1. 程式人生 > 其它 >MSSQL·FOR XML PATH語法轉義尖括號解決方案

MSSQL·FOR XML PATH語法轉義尖括號解決方案

特別感謝一下兩名作者的連結:矩陣求導的本質與分子佈局、分母佈局的本質(矩陣求導——本質篇)

機器學習中的矩陣向量求導(一) 求導定義與求導佈局 - 劉建平Pinard

本文對上述兩篇文章做一個小小的總結,當然主要還是借鑑甚至是複製前人的思想,在此再次表達我的感激,感謝兩位作者無私的分享。

再貼上大神的GitHub連結ljpzzz/machinelearning: My blogs and code for machine learning.

注意,本文若無特殊說明,向量均為列向量表示,如\(\pmb{x}=[x_1,x_2,\cdots,x_n]^T\)

一、函式與標量、向量、矩陣

考慮一個函式

\[function(input) \]

針對 \(function\) 的型別、\(input\) 的型別,我們可以將這個函式 \(function\) 分為不同的種類。

function \ input 標量變元 向量變元 矩陣變元
實值標量函式 \(f(x)\) \(f(\pmb{x})\) \(f(\pmb X)\)
實向量函式 \(\pmb{f}(x)\) \(\pmb{f}(\pmb x)\) \(\pmb{f}(\pmb X)\)
實矩陣函式 \(\pmb{F}(x)\) \(\pmb{F}(\pmb x)\) \(\pmb{F}(\pmb X)\)

1、\(function\)是一個標量

我們稱 \(function\) 是一個實值標量函式。用細體小寫字母 \(f\) 表示。

1.1 \(input\)是一個標量

我們稱 \(function\)變元標量。用細體小寫字母 \(x\) 表示。這就是我們之前主要接觸的,所以也就沒有什麼特別要講的~

例1:

\[f(x)=x+2 \tag{e.g.1} \]

1.2 \(input\) 是一個向量

我們稱 \(function\)變元向量。用粗體小寫字母 \(\pmb{x}\) 表示。對於這種情況,我們其實可以理解為輸入為多元變數。這種情況其實比較重要,因為在機器學習裡往往根據Loss函式計算損失,輸入是向量,而輸出的則是標量。

例2:設 \(\pmb{x}=[x_1,x_2,x_n]^T\)

\[f(\pmb{x})=a_1x_1^2+a_2x_2^2+a_3x_3^2+a_4x_1x_2 \tag{e.g.2} \]

1.3 \(input\) 是一個矩陣

我們稱 \(function\)變元矩陣。用粗體大寫字母 \(\pmb{X}\) 表示。

例3:設 \(\pmb{X}_{3\times 2}=(x_{ij})_{i=1,j=1}^{3,2}\)

\[f(\pmb{X})=a_1x_{11}^2+a_2x_{12}^2+a_3x_{21}^2+a_4x_{22}^2+a_5x_{31}^2+a_6x_{32}^2 \tag{e.g.3} \]

2、\(function\) 是一個向量

我們稱 \(function\) 是一個實向量函式 。用粗體小寫字母 \(\pmb{f}\) 表示。

含義\(\pmb{f}\) 是由若干個 \(f\) 組成的一個向量

同樣地,變元分三種:標量、向量、矩陣。這裡的符號仍與上面相同。向量函式與標量函式稍微有所不同,我們可以將其理解為多個標量函式按照一定格式組織在了一起即可。

2.1 標量變元

例4:

\[\pmb{f}_{3\times1}(x)= \left[ \matrix{ f_1(x)\\ f_2(x)\\ f_3(x)\\ } \right] = \left[ \matrix{ x+1\\ 2x+1\\ 3x^2+1 } \right] \tag{e.g.4} \]

2.2 向量變元

例5:設\(\pmb{x}=[x_1,x_2,x_n]^T\)

\[\pmb{f}_{3\times1}(\pmb{x})= \left[ \matrix{ f_1(\pmb{x})\\ f_2(\pmb{x})\\ f_3(\pmb{x})\\ } \right] = \left[ \matrix{ x_{1}+x_{2}+x_{3}\\ x_{1}^2+2x_{2}+2x_{3}\\ x_{1}x_{2}+x_{2}+x_{3} } \right] \tag{e.g.5} \]

2.3 矩陣變元

例6:設\(\pmb{X}_{3\times 2}=(x_{ij})_{i=1,j=1}^{3,2}\)

\[\pmb{f}_{3\times1}(\pmb{X})= \left[ \matrix{ f_1(\pmb{X})\\ f_2(\pmb{X})\\ f_3(\pmb{X})\\ } \right] = \left[ \matrix{ x_{11}+x_{12}+x_{21}+x_{22}+x_{31}+x_{32}\\ x_{11}+x_{12}+x_{21}+x_{22}+x_{31}+x_{32}+x_{11}x_{12}\\ 2x_{11}+x_{12}+x_{21}+x_{22}+x_{31}+x_{32}+x_{11}x_{12} } \right] \tag{e.g.6} \]

3、\(function\) 是一個矩陣

我們稱 \(functionfunction\) 是一個實矩陣函式。用粗體大寫字母 \(\pmb{F}\) 表示。

含義\(\pmb{F}\) 是由若干個 \(f\) 組成的一個矩陣

同樣地,變元分三種:標量、向量、矩陣。這裡的符號仍與上面相同。

3.1 標量變元

例7:

\[\pmb{F}_{3\times2}(x)= \left[ \matrix{ f_{11}(x) & f_{12}(x)\\ f_{21}(x) & f_{22}(x)\\ f_{31}(x) & f_{32}(x)\\ } \right] = \left[ \matrix{ x+1 & 2x+2\\ x^2+1 & 2x^2+1\\ x^3+1 & 2x^3+1 } \right] \tag{e.g.7} \]

3.2 變數變元

例8:設\(\pmb{x}=[x_1,x_2,x_n]^T\)

\[\pmb{F}_{3\times2}(\pmb{x})= \left[ \matrix{ f_{11}(\pmb{x}) & f_{12}(\pmb{x})\\ f_{21}(\pmb{x}) & f_{22}(\pmb{x})\\ f_{31}(\pmb{x}) & f_{32}(\pmb{x})\\ } \right] = \left[ \matrix{ 2x_{1}+x_{2}+x_{3} & 2x_{1}+2x_{2}+x_{3} \\ 2x_{1}+2x_{2}+x_{3} & x_{1}+2x_{2}+x_{3} & \\ 2x_{1}+x_{2}+2x_{3} & x_{1}+2x_{2}+2x_{3} & } \right] \tag{e.g.8} \]

3.3 矩陣變元

例9:設\(\pmb{X}_{3\times 2}=(x_{ij})_{i=1,j=1}^{3,2}\)

\[\begin{align*} \pmb{F}_{3\times2}(\pmb{X})&= \left[ \matrix{ f_{11}(\pmb{X}) & f_{12}(\pmb{X})\\ f_{21}(\pmb{X}) & f_{22}(\pmb{X})\\ f_{31}(\pmb{X}) & f_{32}(\pmb{X})\\ } \right]\\\\ &= \left[ \matrix{ x_{11}+x_{12}+x_{21}+x_{22}+x_{31}+x_{32} & 2x_{11}+x_{12}+x_{21}+x_{22}+x_{31}+x_{32}\\ 3x_{11}+x_{12}+x_{21}+x_{22}+x_{31}+x_{32} & 4x_{11}+x_{12}+x_{21}+x_{22}+x_{31}+x_{32}\\ 5x_{11}+x_{12}+x_{21}+x_{22}+x_{31}+x_{32} & 6x_{11}+x_{12}+x_{21}+x_{22}+x_{31}+x_{32} } \right] \end{align*} \tag{e.g.9} \]

二、矩陣求導的本質

本質: \(function\) 中的每個 \(f\) 分別都對變元中的每個元素逐個求偏導,只不過寫成了向量、矩陣形式而已。

例10:定義法求解導數問題

\[f(x_1,x_2,x_3)=x_1^2+x_1x_2+x_2x_3 \tag{e.g.10} \]

我們可以將 \(f\)\(x_1, x_2, x_3\)偏導分別求出來,即:

\[\left\{ \begin{align*} \frac{\partial f}{\partial x_1} & = 2x_1+x_2 \\ \frac{\partial f}{\partial x_2} & = x_1+x_3 \\ \frac{\partial f}{\partial x_3} & = x_2 \end{align*} \right. \]

我們可以把得出的結果寫成列向量形式:

\[\frac{\partial f(\pmb{x})}{\partial \pmb{x}_{3\times1}}= \left[ \matrix{ \frac{\partial f}{\partial x_1}\\ \frac{\partial f}{\partial x_2}\\ \frac{\partial f}{\partial x_3}\\ } \right] = \left[ \matrix{ 2x_1+x_2\\ x_1+x_3\\ x_2 } \right] \tag{1} \]

一個矩陣求導以列向量形式展開的雛形就出現了。

當然我們也可以以行向量形式展開:

\[\frac{\partial f(\pmb{x})}{\partial \pmb{x}_{3\times1}^T}= \left[ \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \frac{\partial f}{\partial x_3} \right] = \left[ 2x_1+x_2, x_1+x_3, x_2 \right] \tag{2} \]

矩陣求導的結果的形式是以列向量還是行向量其實這個無所謂,主要是確定好一個佈局之後,按照這個規範就可以方便地進行統一的運算

至於這 \(m \times n\) 個結果的佈局,是寫成行向量,還是列向量,還是寫成矩陣,就是接下來的佈局問題了。

三、矩陣求導結果的佈局

分子佈局,求導結果維數以分子為主。

分母佈局,求導結果維數以分母為主。

對於分子佈局和分母佈局的結果來說,兩者相差一個轉置。

這樣,對於標量對向量或者矩陣求導,向量或者矩陣對標量求導這4種情況,對應的分子佈局和分母佈局的排列方式已經確定了。


稍微麻煩的就是向量對向量求導:

前提:m維列向量 \(\mathbf{y}\),n維列向量 \(\mathbf{x}\)

對於上述它的求導結果在分子佈局和分母佈局各是什麼呢???

對於這兩個向量求導,一共有mn個標量對標量的求導。求導的結果一般排列為一個矩陣。

分子佈局

如果是分子佈局,則矩陣的第一個維度以分子為準,即結果是一個 \(m \times n\) 的矩陣,如下:

\[\frac{\partial \mathbf{y}}{\partial \mathbf{x}} = \left( \begin{array}{ccc} \frac{\partial y_1}{\partial x_1}& \frac{\partial y_1}{\partial x_2}& \ldots & \frac{\partial y_1}{\partial x_n}\\ \frac{\partial y_2}{\partial x_1}& \frac{\partial y_2}{\partial x_2} & \ldots & \frac{\partial y_2}{\partial x_n}\\ \vdots& \vdots & \ddots & \vdots \\ \frac{\partial y_m}{\partial x_1}& \frac{\partial y_m}{\partial x_2} & \ldots & \frac{\partial y_m}{\partial x_n} \end{array} \right) \]

上邊這個按分子佈局的向量對向量求導的結果矩陣,我們一般叫做雅克比 (Jacobian)矩陣。有的資料上會使用 \(\frac{\partial\mathbf{y}}{\partial{\mathbf{x}^T}}\) 來定義雅克比矩陣,意義是一樣的。如下,分子是列向量形式,分母是行向量形式,結果就是 \(2 \times 3\) 的矩陣了:

\[\frac{\partial \pmb{f}_{2\times1}(\pmb{x})}{\partial \pmb{x}^T_{3\times1}}= \left[ \matrix{ \frac{\partial f_1}{\partial x_1}& \frac{\partial f_1}{\partial x_2}& \frac{\partial f_1}{\partial x_3}\\ \frac{\partial f_2}{\partial x_1}& \frac{\partial f_2}{\partial x_2}& \frac{\partial f_2}{\partial x_3}} \right]_{2\times 3} \tag{3} \]

分母佈局

如果是分母佈局,則矩陣的第一個維度以分母為準,即結果是一個 \(n \times m\) 的矩陣,如下:

\[\frac{\partial \mathbf{y}}{\partial \mathbf{x}} = \left( \begin{array}{ccc} \frac{\partial y_1}{\partial x_1}& \frac{\partial y_2}{\partial x_1}& \ldots & \frac{\partial y_m}{\partial x_1}\\ \frac{\partial y_1}{\partial x_2}& \frac{\partial y_2}{\partial x_2} & \ldots & \frac{\partial y_m}{\partial x_2}\\ \vdots& \vdots & \ddots & \vdots \\ \frac{\partial y_1}{\partial x_n}& \frac{\partial y_2}{\partial x_n} & \ldots & \frac{\partial y_m}{\partial x_n} \end{array} \right) \]

上邊這個按分母佈局的向量對向量求導的結果矩陣,我們一般叫做梯度矩陣。有的資料上會使用 \(\frac{\partial\mathbf{y}^T}{\partial{\mathbf{x}}}\) 來定義梯度矩陣,意義是一樣的。如下,分母是列向量形式,分子是行向量形式,結果就是 \(3 \times 2\) 的矩陣了:

\[\frac{\partial \pmb{f}^T_{2\times1}(\pmb{x})}{\partial \pmb{x}_{3\times1}}= \left[ \matrix{ \frac{\partial f_1}{\partial x_1}& \frac{\partial f_2}{\partial x_1} \\ \frac{\partial f_1}{\partial x_2}& \frac{\partial f_2}{\partial x_2} \\ \frac{\partial f_1}{\partial x_3}& \frac{\partial f_2}{\partial x_3} } \right]_{3\times 2} \tag{4} \]

有了佈局的概念,我們對於上面5種求導型別,可以各選擇一種佈局來求導。但是對於某一種求導型別,不能同時使用分子佈局和分母佈局求導

但是在機器學習演算法原理的資料推導裡,我們並沒有看到說正在使用什麼佈局,也就是說佈局被隱含了,這就需要自己去推演,比較麻煩。但是一般來說我們會使用一種叫混合佈局的思路,即如果是向量或者矩陣對標量求導,則使用分子佈局為準,如果是標量對向量或者矩陣求導,則以分母佈局為準。

總結如下:

自變數\因變數 標量y 列向量\(\mathbf y\) 矩陣\(\mathbf Y\)
標量x / \(\frac{\partial\mathbf{y}}{\partial{x}}\)
分子佈局:m維列向量(預設佈局)
分母佈局:m維行向量
\(\frac{\partial\mathbf{Y}}{\partial{{x}}}\)
分子佈局:\(m\times n\) 矩陣(預設佈局)
分母佈局:\(n\times m\) 矩陣
列向量 \(\mathbf x\) \(\frac{\partial{y}}{\partial{\mathbf x}}\)
分子佈局:n維行向量
分母佈局:n維列向量(預設佈局)
\(\frac{\partial\mathbf{y}}{\partial{\mathbf{x}}}\)
分子佈局:\(m\times n\)雅克比矩陣(預設佈局)
分母佈局:\(n\times m\)梯度矩陣
/
矩陣 \(\frac{\partial y}{\partial{\mathbf{X}}}\)
分子佈局:\(n\times m\) 矩陣
分母佈局:\(m\times n\) 矩陣(預設佈局)
/ /

涉及矩陣的求導

如上,我們只討論了五種情況,對於標量對標量求導下面不做講解,只補充向量與矩陣之間的求導及矩陣對矩陣的求導。

首先介紹一個符號 \(vec(\mathbf X)\) ,作用是將矩陣 \(\mathbf X\) 按列堆疊來向量化。

解釋: vec即將矩陣的每一列取出來然後組成一個列向量,如下:

\[\text{vec}({\pmb{X})}= \left[ x_{11},x_{21},\cdots,x_{m1},x_{12},x_{22},\cdots,x_{m2},\cdots,x_{1n},x_{2n},\cdots,x_{mn} \right]^T \]

因此,不僅解決了原本的問題,還引入了新的標量與矩陣之間求導方法,如下所示:

1、標量函式對矩陣求導

1.1 行向量偏導形式(又稱行偏導向量形式)(分子佈局)

即先把矩陣變元 \(\mathbf{X}\)\(vec\) 向量化,轉換成向量變元,然後按分子佈局求導

\[\begin{align*} \text{D}_{\text{vec}\pmb{X}}f(\pmb{X})&= \frac{\partial f(\pmb{X})}{\partial \text{vec}^T(\pmb{X})} \\\\ &= \left[ \frac{\partial f}{\partial x_{11}},\frac{\partial f}{\partial x_{21}},\cdots,\frac{\partial f}{\partial x_{m1}},\frac{\partial f}{\partial x_{12}},\frac{\partial f}{\partial x_{22}},\cdots,\frac{\partial f}{\partial x_{m2}},\cdots,\frac{\partial f} {\partial x_{1n}},\frac{\partial f}{\partial x_{2n}},\cdots,\frac{\partial f}{\partial x_{mn}} \right] \end{align*} \]

1.2 \(Jacobian\) 矩陣形式(分子佈局)

\[\begin{align*} \text{D}_{\pmb{X}}f(\pmb{X})&= \frac{\partial f(\pmb{X})}{\partial \pmb{X}^T_{m\times n}} \\\\ &= \left[ \matrix{ \frac{\partial f}{\partial x_{11}}&\frac{\partial f}{\partial x_{21}}&\cdots&\frac{\partial f}{\partial x_{m1}} \\ \frac{\partial f}{\partial x_{12}}&\frac{\partial f}{\partial x_{22}}& \cdots & \frac{\partial f}{\partial x_{m2}}\\ \vdots&\vdots&\vdots&\vdots\\ \frac{\partial f} {\partial x_{1n}}&\frac{\partial f}{\partial x_{2n}}&\cdots&\frac{\partial f}{\partial x_{mn}} } \right]_{n\times m} \end{align*} \]

1.3 梯度向量形式(又稱列向量偏導形式、列偏導向量形式)(分母佈局)

即先把矩陣變元 \(\mathbf{X}\)\(vec\) 向量化,轉換成向量變元,然後按分母佈局求導

\[\begin{align*} \nabla_{\text{vec}\pmb{X}}f(\pmb{X})&= \frac{\partial f(\pmb{X})}{\partial \text{vec}\pmb{X}} \\\\ &= \left[ \frac{\partial f}{\partial x_{11}},\frac{\partial f}{\partial x_{21}},\cdots,\frac{\partial f}{\partial x_{m1}},\frac{\partial f}{\partial x_{12}},\frac{\partial f}{\partial x_{22}},\cdots,\frac{\partial f}{\partial x_{m2}},\cdots,\frac{\partial f} {\partial x_{1n}},\frac{\partial f}{\partial x_{2n}},\cdots,\frac{\partial f}{\partial x_{mn}} \right]^T \end{align*} \]

1.4 梯度矩陣形式(分母佈局)

直接對原矩陣變元每個位置逐個求偏導,結果佈局和原矩陣佈局一樣

\[\begin{align*} \nabla_{\pmb{X}}f(\pmb{X})&= \frac{\partial f(\pmb{X})}{\partial \pmb{X}_{m\times n}} \\\\ &= \left[ \matrix{ \frac{\partial f}{\partial x_{11}}&\frac{\partial f}{\partial x_{12}}&\cdots&\frac{\partial f}{\partial x_{1n}} \\ \frac{\partial f}{\partial x_{21}}&\frac{\partial f}{\partial x_{22}}& \cdots & \frac{\partial f}{\partial x_{2n}}\\ \vdots&\vdots&\vdots&\vdots\\ \frac{\partial f} {\partial x_{m1}}&\frac{\partial f}{\partial x_{m2}}&\cdots&\frac{\partial f}{\partial x_{mn}} } \right]_{m\times n} \end{align*} \]

2、矩陣函式對矩陣變元求導

矩陣變元\(\pmb{X}_{m\times n}=(x_{ij})_{i=1,j=1}^{m,n}\),實矩陣函式\(\mathbf F(\mathbf X)\)\(\pmb{F}_{p\times q}=(f_{ij})_{i=1,j=1}^{p,q}\)

2.1 \(Jacobian\) 矩陣形式(分子佈局)

即先把矩陣變元 \(\mathbf X\)\(vec\) 向量化,轉化為變數變元:

\[\text{vec}({\pmb{X})}= \left[ x_{11},x_{21},\cdots,x_{m1},x_{12},x_{22},\cdots,x_{m2},\cdots,x_{1n},x_{2n},\cdots,x_{mn} \right]^T \]

即先把實矩陣函式 \(\mathbf F\)\(vec\) 向量化,轉化為實向量函式:

\[\text{vec}({\pmb{F}(\pmb{X}))}\\= \left[ f_{11}(\pmb{X}),f_{21}(\pmb{X}),\cdots,f_{p1}(\pmb{X}),f_{12}(\pmb{X}),f_{22}(\pmb{X}),\cdots,f_{p2}(\pmb{X}),\cdots,f_{1q}(\pmb{X}),f_{2q}(\pmb{X}),\cdots,f_{pq}(\pmb{X}) \right]^T \]

這樣,我們就轉化為了向量對向量求導,照之前講過的我們最後即可得到一個 \(pq \times mn\) 的矩陣。

2.2 梯度矩陣形式(分母佈局)

與2.1基本相同,先轉化為向量求導的形式,然後以分母佈局為準即可得到 \(mn \times pq\) 的矩陣。

四、舉例求解偏導

一般我們可以通過查閱《The matrix cookbook》得到最終結果,也就是說用那本工具書套用即可,但基本的一些求導我們也要能夠理解。

下面舉出三個根據定義法[1]求解的例子:

1.求解 \(\frac{\partial \mathbf{a}^T\mathbf{x}}{\partial \mathbf{x}}\)

根據定義,我們先對 \(\mathbf x\) 的第i個分量進行求導,這是一個標量對標量的求導,如下:

\[\frac{\partial \mathbf{a}^T\mathbf{x}}{\partial x_i} = \frac{\partial \sum\limits_{j=1}^n a_jx_j}{\partial x_i} = \frac{\partial a_ix_i}{\partial x_i} =a_i \]

可見,對向量的第i個分量的求導結果就等於向量 \(\mathbf a\) 的第i個分量。由於我們是分母佈局,最後所有求導結果的分量組成的是一個n維向量。那麼其實就是向量 \(\mathbf a\)。也就是說:

\[\frac{\partial \mathbf{a}^T\mathbf{x}}{\partial \mathbf{x}} = \mathbf{a} \]

同樣的思路,我們也可以直接得到:

\[\frac{\partial \mathbf{x}^T\mathbf{a}}{\partial \mathbf{x}} = \mathbf{a} \]

2.求解出 \(\frac{\partial \mathbf{x}^T\mathbf{x}}{\partial \mathbf{x}} =2\mathbf{x}\)

\[\frac{\partial \mathbf{x}^T\mathbf{a}}{\partial \mathbf{x}} = \frac{\partial \sum_{i=1}^{n}x_ix_i}{\partial \mathbf{x}} = \frac{\partial x_i^2}{\partial \mathbf{x}}=\sum_{i=1}^{n}2x_i=2\sum_{i=1}^{n}x_i=2\mathbf x \]

3.求解出 \(\frac{\partial \mathbf{x}^T\mathbf{A}\mathbf{x}}{\partial \mathbf{x}} = \mathbf{A}^T\mathbf{x} + \mathbf{A}\mathbf{x}\)

簡單的應用例項:最小二乘法


  1. 本質: \(function\) 中的每個 \(f\) 分別都對變元中的每個元素逐個求偏導 ↩︎