對于函數\(y=f(x)\),導數可記做\(f'(x_0)\)、\(y'|x=x_0\)或\(\frac{dy}{dx}|x=x_0 \)。定義如下: \[f'(x_0) = \lim_{\Delta x \to 0}\frac{\Delta y}{\Delta x} = \lim_{\Delta x \to 0}\frac{f(x_0+\Delta x) - f(x)}{\Delta x}\]
一階導數也是一個函數,這個函數的導數稱為二階導數,可以依此遞歸定義。
\[f^{(n)}(x) = [f^{(n-1)}(x)]'\]
一般的,假設 \(f\) 是\(\mathbb{R}^n\)到\(\mathbb{R}\)的映射,記做 \(y = f(\boldsymbol{x})\),其中 \(\boldsymbol{x}\) 是 \(n\) 維向量。若 \(n \geqslant 2\),則稱 \(f\) 是多元函數。一個簡單的例子是\(z=x^2+y^2 + 2xy\)。
以二階導數\(z=f(x,y)\)為例,說明偏導數的概念。
如果
\[\lim_{\Delta x \to 0}\frac{f(x_0+\Delta x,y_0) - f(x_0,y_0)}{\Delta x}\]
存在,則稱此極限為函數在點 \((x_0,y_0)\) 處對 \(x\) 的偏導數,記做\(\frac{\partial f}{\partial x}|_{x=x_0,y=y_0}\)。
偏導數也是自變量 \(x,y\) 的函數,稱為偏導函數,記做\(\frac{\partial f}{\partial x}\),也是一個二進制函數。
類似高階導數,也有高階偏導數,由于變量比較多,導緻形式比較複雜。比如二階函數的二階偏導數就有四種:
\[\frac{\partial}{\partial x}(\frac{\partial f}{\partial x}) = \frac{\partial^{2} f}{\partial x^2}\]
\[\frac{\partial}{\partial y}(\frac{\partial f}{\partial x}) = \frac{\partial^{2} f}{\partial x \partial y}\]
\[\frac{\partial}{\partial x}(\frac{\partial f}{\partial y}) = \frac{\partial^{2} f}{\partial y \partial x}\]
\[\frac{\partial}{\partial y}(\frac{\partial f}{\partial y}) = \frac{\partial^{2} f}{\partial y^2}\]
其中第二、三項稱為混合偏導數。對于二進制函數來說,兩個混合偏導數是相等的。
從一進制函數出發,設 \(x\) 是實數,\(f\) 和 \(g\) 是從實數映射到實數的函數。假設 \(y = g(x)\),且 \(z = f(g(x)) = f(y)\),即 \(z\) 是 \(x\) 的符合函數。鍊式法則是指
\[\frac{dz}{dx} = \frac{dz}{dy}\frac{dy}{dx}\]
可以通過泰勒展開式來證明。下面是通過鍊式法則計算導數的一個例子。


從标量可以推廣到向量。假設 \(\boldsymbol{x} \in \mathbb{R}^m, \boldsymbol{y} \in \mathbb{R}^n\),\(g\) 是從 \(\mathbb{R}^m\) 到 \(\mathbb{R}^n\) 的映射, \(f\) 是從 \(\mathbb{R}^n\) 到\(\mathbb{R}\) 的映射。假設 \(\boldsymbol{y} = f(\boldsymbol{x})\)并且 \(z = f(\boldsymbol{y})\),則
\[\frac{\partial z}{\partial x_i} = \sum_{j}\frac{\partial z}{\partial y_j}\frac{\partial y_j}{\partial x_i} \]
用向量表示,即
\[\nabla_{\boldsymbol{x}}z = (\frac{\partial \boldsymbol{y}}{\partial \boldsymbol{x}})^T\nabla_{\boldsymbol{y}}z \]
也可以用多元函數的泰勒展開來證明。其中 \(\frac{\partial \boldsymbol{y}}{\partial \boldsymbol{x}}\) 是雅克比矩陣
\[\begin{bmatrix}\frac{\partial y_1}{\partial x_1} & \frac{\partial y_1}{\partial x_2} & \cdots & \frac{\partial y_1}{\partial x_m}\\ \frac{\partial y_2}{\partial x_1} & \frac{\partial y_2}{\partial x_2} & \cdots & \frac{\partial y_2}{\partial x_m}\\ \vdots & \vdots & \ddots &\vdots\\ \frac{\partial y_n}{\partial x_1} & \frac{\partial y_n}{\partial x_2} & \cdots & \frac{\partial y_n}{\partial x_m}\end{bmatrix}\]
特别的,如果 \(\boldsymbol{y} = \boldsymbol{Wx}\),則 \(\frac{\partial \boldsymbol{y}}{\partial \boldsymbol{x}} = \boldsymbol{W}\)
\(\nabla\) 是哈密頓算子,對于二進制函數,\(\nabla = \frac{\partial}{\partial x}\vec{i}+\frac{\partial}{\partial y}\vec{j}\) 。
推廣到多元函數,可以得到
\[\nabla_{\boldsymbol{x}} = (\frac{\partial}{\partial x_1},\frac{\partial}{\partial x_1},\cdots ,\frac{\partial}{\partial x_n})^T\]
那麼 \[\nabla_{\boldsymbol{x}}z = (\frac{\partial z}{\partial x_1},\frac{\partial z}{\partial x_1},\cdots ,\frac{\partial z}{\partial x_n})^T\]
是一個 \(n\) 維列向量。同理 \(\nabla_{\boldsymbol{y}} z\) 是一個 \(m\) 維列向量。
還是從一進制函數入手,設 \(y = f(x)\),我們要找一個\(x^*\),使得 \( f(x^*)\)是函數的極小值。
如果有一個序列\(x^0,x^1,x^2,\cdots\),滿足\(f(x^{t+1})<f(t)\),那麼不斷執行這一過程,可能會收斂到局部極小點。
那麼問題就是如何構造這麼一個序列。根據泰勒展示,有
\[f(x+\Delta x) \simeq f(x) + \Delta x f'(x)\]
那麼取\(\Delta x = -\gamma f'(x)\),即變化量和導數的符号相反。其中步長 \(\gamma\) 是一個小常數,這是因為上面的泰勒展開式的高階項隻有在比較小的鄰域才可以忽略。“步子太大容易扯着蛋”。
那麼,小常數究竟有多小呢?根據數學知識可以證明,若函數滿足 L-Lipschitz 條件,把步長設定為 \(1/(2L)\) 即可確定收斂到局部極值點。
對于多元函數 \(y = f(\boldsymbol{x})\),我們也想通過類似的方法來求得極小值點 \(\boldsymbol{x^*}\)。
\(n\) 維空間中兩個點的內插補點是一個向量,方向可能有無數多個。如果要盡快收斂到極小值點,那麼應該沿着函數值下降最快的方向前進。
假設沿着方向\(\boldsymbol{l}\) 前進,\(\boldsymbol{l}\) 的機關向量\(\boldsymbol{l_0}\)在各個方向的投影分别是\((cos\alpha_1,cos\alpha_2,\cdots,cos\alpha_n)\),那麼從\(\boldsymbol{x_0}\)沿着方向\(\boldsymbol{l}\) 前進 \(t\) 的值記為 \(g(t)= f(\boldsymbol{x_0} + \boldsymbol{l_0}t)\),那麼根據鍊式法則, \(g(t)\) 在 \(t=0\) 的導數,即函數\(f(\boldsymbol{x})\) 在方向 \(\boldsymbol{l}\) 上的方向導數為
\[(\frac{\partial f}{\partial \boldsymbol{x}}|\boldsymbol{x=x_0})^T(\frac{\partial \boldsymbol{x_0} + \boldsymbol{l_0}t}{\partial t}) = \nabla_{\boldsymbol{x}} f \centerdot \boldsymbol{l_0}\]
顯然\(\boldsymbol{l_0}\) 和 \(\nabla_{\boldsymbol{x}} f\) 方向一緻時,方向導數最大。這個方向即是函數的梯度方向,函數沿着這個方向的變化最快,變化率最大。
而我們的目标是沿着函數值下降最快的方向前進,即應該沿着負梯度的方向前進,即取
\[\Delta \boldsymbol{x} = - \gamma \nabla f(\boldsymbol{x})\]
隻要 \(\gamma\) 足夠小,且函數滿足 L-Lipschitz 條件,這樣子選取一系列的點一定可以收斂到局部極小點。這個方法被稱為梯度下降法。
上面是一個神經網絡的例子,輸入節點有 \(d\) 個,輸出節點有 \(l\) 個,隐藏節點有 \(q\)個。輸出層第 \(j\) 個節點的門檻值用 \(\theta _j\) 表示,隐層的第 \(h\) 個神經元用 \(\gamma _h\)表示。
從輸入 \(\boldsymbol{x}\) 到輸出 \(\boldsymbol{y}\) 的過程如下。
擷取隐層的輸入:
\[\boldsymbol{\alpha}=\boldsymbol{Vx}\]
其中\(\boldsymbol{V}\) 是 \(q\times d\) 的矩陣,\(\boldsymbol{\alpha}\) 是 \(q\) 維向量。
擷取隐層的輸出:
\[\boldsymbol{b} = f(\boldsymbol{\alpha + \gamma})\]
擷取輸出層的輸入:
\[\boldsymbol{\beta } = \boldsymbol{Wh}\]
其中\(\boldsymbol{W}\) 是 \(l\times q\) 的矩陣。
擷取輸出層的輸出:
\[\boldsymbol{y} = f(\boldsymbol{\beta + \theta})\]
綜合起來,可以認為是
\[\boldsymbol{y} = \boldsymbol{F(x,V,\gamma,W,\theta)}\]
我們的目标是确定\(\boldsymbol{V, \gamma, W, \theta}\),使得下面式子最小
\[\boldsymbol{J(V,\gamma,W,\theta)}=\sum_{\boldsymbol{x}\in\mathbb{X}}(\boldsymbol{y}^* - \boldsymbol{F(x,V,\gamma,W,\theta)})^2\]
其中 \(\mathbb{X}\)是訓練集資料,\(\boldsymbol{y}^*\) 是标注。
我們嘗試使用梯度下降法來得到一個極小值點,那麼需要求得函數 \(\boldsymbol{J}\) 對與 \(\boldsymbol{V, \gamma, W, \theta}\) 的梯度。隻需獲得函數 \(\boldsymbol{F}\),即網絡的輸出\(\boldsymbol{y}\) 對應的梯度即可。
首先,求關于\(\boldsymbol{\theta}\) 的梯度。
根據鍊式法則,
\[\frac{\partial F}{\partial \boldsymbol{\theta}} = (\frac{\partial (\boldsymbol{\theta + \beta})}{\partial \boldsymbol{\theta}})^T\frac{\partial F}{\partial (\boldsymbol{\theta + \beta})} = \frac{\partial F}{\partial (\boldsymbol{\theta + \beta})}\]
求關于\(\boldsymbol{W}\) 的梯度
\[\frac{\partial F}{\partial \boldsymbol{W}} = (\frac{\partial \boldsymbol{ \beta}}{\partial \boldsymbol{W}})^T\frac{\partial F}{\partial \boldsymbol{ \beta}}\]
其中 \[\frac{\partial \boldsymbol{ \beta}}{\partial \boldsymbol{W}} = \begin{bmatrix}\frac{\partial \boldsymbol{ \beta}}{\partial w_{11}} & \frac{\partial \boldsymbol{ \beta}}{\partial w_{21}} &\cdots &\frac{\partial \boldsymbol{ \beta}}{\partial w_{l1}}\\ \frac{\partial \boldsymbol{ \beta}}{\partial w_{12}} & \frac{\partial \boldsymbol{ \beta}}{\partial w_{22}} &\cdots &\frac{\partial \boldsymbol{ \beta}}{\partial w_{l2}}\\ \vdots & \vdots & \ddots & \vdots\\ \frac{\partial \boldsymbol{ \beta}}{\partial w_{1q}} & \frac{\partial \boldsymbol{ \beta}}{\partial w_{2q}} &\cdots &\frac{\partial \boldsymbol{ \beta}}{\partial w_{lq}}\end{bmatrix}\]
每一個元素都是一個向量。帶入得到
\[\frac{\partial F}{\partial w_{ij}} = (\frac{\partial \boldsymbol{\beta}}{\partial w_{ij}})^{T} (\frac{\partial \boldsymbol{F}}{\partial \boldsymbol{\beta}})\]
\(\frac{\partial \boldsymbol{F}}{\partial \boldsymbol{\beta}}\)可類似\(\frac{\partial F}{\partial \boldsymbol{\theta}}\) 求出
求關于 \(\boldsymbol{\gamma}\) 的梯度
\[\frac{\partial F}{\partial \boldsymbol{\gamma}} = (\frac{\partial \boldsymbol{b}}{\partial \boldsymbol{\gamma}})^T(\frac{\partial F}{\partial \boldsymbol{b}})\]
其中\(\frac{\partial \boldsymbol{b}}{\partial \boldsymbol{\gamma}}\)可以很容易求出。 \[\frac{\partial F}{\partial \boldsymbol{b}} = (\frac{\partial \boldsymbol{\beta}}{\partial \boldsymbol{b}})^T(\frac{\partial F}{\partial \boldsymbol{\beta}})\\ \frac{\partial \boldsymbol{\beta}}{\partial \boldsymbol{b}} = \boldsymbol{W}\]
求關于 \(\boldsymbol{V}\)的梯度
\[\frac{\partial F}{\partial \boldsymbol{V}} = (\frac{\partial \boldsymbol{ \alpha}}{\partial \boldsymbol{V}})^T\frac{\partial F}{\partial \boldsymbol{ \alpha}}\]
同樣根據鍊式法則,有
\[\frac{\partial F}{\partial \boldsymbol{ \alpha}} = (\frac{\partial \boldsymbol{b}}{\partial \boldsymbol{\alpha}})^T(\frac{\partial \boldsymbol{F}}{\partial \boldsymbol{b}})\]
如果有更多的隐含層,可以繼續通過鍊式法則來求得每一層的梯度,然後根據梯度下降法來求得極小值點。如果網絡的結構比較複雜,比如 RNN,同樣可以通過鍊式法則求得關于參數的梯度,不過需要更多的 trick。
值得注意的是,反向傳播,或者說 BP 算法,隻是計算梯度的方法。求得梯度以後,可以有很多種方法來求極小值,比如随機梯度下降。
Matrix calculus
周志華. 機器學習[M]. 清華大學出版社, 2016.
Goodfellow I, Bengio Y, Courville A. Deep Learning[M]. The MIT Press, 2016.