本文始發於個人公眾號:TechFlow,原創不易,求個關注
上一篇文章我們復習了函數求導的定義和一些常見函數的導數,今天這篇文章我們回顧一下復雜函數的求導方法。先強調一下,今天的文章很重要,想要看懂機器學習各種公式推導,想要能夠自己推一推各種公式,函數求導是基礎中的基礎,在算法這個領域,它比積分要重要得多。
我們先來看第一種情況:多個函數進行四則運算的導數。
函數四則運算求導法則
我們假設\(u=u(x)\)和\(v=v(x)\)都在x點有導數,那么它們進行加減乘除四則運算之后的結果的導數有如下性質:
\[\begin{aligned} \left[u(x) \pm v(x)\right]'&= u'(x) \pm v'(x) \\ \left[u(x)v(x)\right]' &= u'(x)v(x) + u(x)v'(x) \\ \left[\frac{u(x)}{v(x)}\right] &= \frac{u'(x)v(x)-u(x)v'(x)}{v^2(x)} (v(x) \neq 0) \end{aligned} \]
我們來看一下證明過程,熟悉證明過程並不是炫技,除了能加深對公式的理解之外,更重要的是防止遺忘。即使以后真的不記得公式的細節了,也可以臨時推導一下,這是學算法和數學很重要的技巧。
我們先來看第一個,第一個很容易證明,我們直接套一下導數的公式即可:
\[\begin{aligned} \left[u(x) \pm v(x) \right]' &= \lim_{\Delta x \to 0} \frac{\left[u(x+\Delta x) \pm v(x + \Delta x) \right] - \left[u(x) \pm v(x) \right] }{\Delta x} \\ &= \lim_{\Delta x \to 0}\frac{u(x+\Delta x)}{\Delta x} \pm \lim_{\Delta x \to 0} \frac{v(x+\Delta x)}{\Delta x} \\ &= u'(x) \pm v'(x) \end{aligned} \]
第二個式子同樣套用公式:
\[\begin{aligned} \left[u(x)v(x)\right]' &= \lim_{\Delta x \to 0} \frac{u(x+\Delta x) v(x + \Delta x) - u(x) v(x)}{\Delta x} \\ &= \lim_{\Delta x \to 0} \frac{u(x+\Delta x) v(x + \Delta x) - u(x)v(x+ \Delta x) + u(x)v(x+\Delta x) - u(x) v(x)}{\Delta x} \\ &= \lim_{\Delta x \to 0} \frac{(u(x+\Delta x) - u(x))v(x+\Delta x) + u(x)(v(x+\Delta x) - v(x))}{\Delta x} \\ &= \lim_{\Delta x \to 0}v(x+\Delta x) \frac{u(x+\Delta x) - u(x)}{\Delta x} + \lim_{\Delta x \to 0}u(x)\frac{v(x+\Delta x) - v(x)}{\Delta x}\\ &=v(x+\Delta x)u'(x) + u(x)v'(x) \\ &=u(x)v'(x) + u'(x)v(x) \end{aligned} \]
最后是第三個式子的推導,也並不復雜:
\[\displaystyle \begin{aligned} \left[\frac{u(x)}{v(x)}\right] &= \lim_{\Delta x \to 0}\frac{\frac{u(x+\Delta x)}{v(x+\Delta x)} - \frac{u(x)}{v(x)}}{\Delta x} \\ &= \lim_{\Delta x \to 0}\frac{v(x)u(x+\Delta x)-v(x+\Delta x)u(x)}{v(x+\Delta x)v(x)\Delta x} \\ &=\lim_{\Delta x \to 0} \\ &= \lim_{\Delta x \to 0}\frac{v(x)u(x+\Delta x)-v(x)u(x)+v(x)u(x)-v(x+\Delta x)u(x)}{v(x+\Delta x)v(x)\Delta x} \\ &=\lim_{\Delta x \to 0} \frac{\frac{u(x+\Delta x)-u(x)}{\Delta x}v(x)-\frac{v(x+\Delta x)-v(x)}{\Delta x}u(x)}{v(x+\Delta x)v(x)}\\ &=\frac{u'(x)v(x)-u(x)v'(x)}{v^2(x)} \end{aligned} \]
反函數求導法則
推導完了四則運算的求導法則,我們再來看一下反函數的求導法則。
我們陷在了看結論,如果函數\(x=f(y)\)在區間\(I_y\)內單調、可導並且\(f'(x)!=0\),那么它的反函數\(y=f^{-1}(x)\)在區間\(I_x=\{x|x=f(y), y\in I_y\}\)內也可導,那么:
\[\left[f^{-1}(x)\right]'=\frac{1}{f'(y)} \]
關於這個結論的證明很簡單,因為\(x=f(y)\)在區間內單調、可導,所以它的反函數\(y=f^{-1}(x)\)存在,並且也單調且連續。
所以:
\[\begin{aligned} \Delta y=f^{-1}(x+\Delta x)-f^{-1}x \neq 0 \\ \frac{\Delta y}{\Delta x} = \frac{1}{\frac{\Delta x}{\Delta y}}=\frac{1}{f'(y)} \end{aligned} \]
由於\(y=f^{-1}(x)\)連續,\(\displaystyle\lim_{\Delta x \to 0}\Delta y=0\),所以上式成立。
我們來看一個例子:\(x=\sin y, y\in \left[-\frac{\pi}{2}, \frac{\pi}{2} \right]\),則\(y=\arcsin x\)是它的反函數,根據上面的公式,我們可以得到:
\[(\arcsin x)'=\frac{1}{(\sin y)'}=\frac{1}{\cos y} \]
由於\(\cos y= \sqrt{1-\sin^2 y} = \sqrt{1-x^2}\),代入上式可以得到:
\[(\arcsin x)'=\frac{1}{\sqrt{1-x^2}} \]
利用同樣的方法,我們還可以求出其他反三角函數的導數,由於這些並不太常用,所以我們就不多介紹了,感興趣的同學可以自己利用導數的定義推導一下,我想應該也不難。
復合函數求導
這是最后一個法則,也是本篇文章的重點,因為經常用到。我們現在已經搞定了一些常見的函數,還搞定了常見函數加減乘除之后求導的結果,但是對於一些看起來比較復雜的函數,我們並不能一下寫出它們的導數。
比如說:\(\sin (x^2+3x)\),比如\(\ln (3x -1)\)等等,這些函數基本上都可以確定是連續並且可導的,但是我們一下子並不能寫出它們的導數,而且要通過導數的定義推導也非常麻煩,對於這些導數就需要用到今天的重頭戲,也就是復合函數的求導法則了。
對於復合函數而言,擁有如下法則:如果函數\(u=g(x)\)在點x處可導,並且\(y=f(u)\)在點\(u=g(x)\)處也可導,那么復合函數\(y=f[g(x)]\)在x處可導,它的導數為:
\[\frac{dy}{dx}=f'(u)\cdot g'(x)=\frac{dy}{du}\cdot \frac{du}{dx} \]
如果復合函數的數量更多也是一樣的,我們按照順序依次相乘即可。由於公式的形式像是一根鏈條一樣依次所以,復合函數求導法則也叫鏈式求導法則。在舉例之前,我們先來證明一下。
由於\(y=f(u)\)在點u處可導,因此
\[\displaystyle\lim_{\Delta u \to 0}\frac{\Delta y}{\Delta u} = f'(u) \]
因為\(f'(u)\)存在,所以我們將它變形為:
\[\frac{\Delta y}{\Delta u} = f'(u) + a \]
其中a是\(\Delta u \to 0\)時的無窮小,我們對兩邊同時乘上\(\Delta u\),可以得到:
\[\Delta y = f'(u)\Delta u + a\cdot \Delta u \]
上式當中\(\Delta u\)和a都是無窮小,所以當\(\Delta u \to 0\)時,\(\Delta y=0\),我們對上式兩邊同時除以\(\Delta x\),得:
\[\displaystyle\frac{\Delta y}{\Delta x}=f'(u)\frac{\Delta u}{\Delta x} + a\cdot\frac{\Delta u}{\Delta x} \]
於是:
\[\displaystyle \lim_{\Delta x \to 0}\frac{\Delta y}{\Delta x}=\lim_{\Delta x \to 0}[f'(u)\frac{\Delta u}{\Delta x}+a\frac{\Delta u}{\Delta x}] \]
又根據\(u=g(x)\)在點x處可導,所以有:
\[\displaystyle \lim_{\Delta x \to 0}\frac{\Delta u}{\Delta x}=g'(x) \]
我們代入,就可以得到:
\[\displaystyle \lim_{\Delta x \to 0}\frac{\Delta y}{\Delta x}=f'(u)\cdot \frac{\Delta u}{\Delta x}=f'(u)\cdot g'(x) \]
其實我們都知道相比於公式的證明,公式的運用更加重要,下面我們就來看兩個例子,來鞏固一下這個鏈式求導法則:
\(y=\ln \sin 3x\),求\(\frac{dy}{dx}\)
我們令\(u=3x, g=\sin u\)
所以:
\[\begin{aligned} \frac{dy}{dx}&=\frac{dy}{dg}\cdot \frac{dg}{du}\cdot\frac{du}{dx}\\ &=\frac{1}{g}\cdot \cos u\cdot 3\\ &=3\frac{\cos 3x}{\sin 3x} \\ &=3 \cot 3x \end{aligned} \]
還記得我們之前推導線性回歸時候用到的均方差的公式嗎:
\[f(\theta) = \frac{1}{m}(\theta X-Y)^2 \]
我們來試着學以致用,求一下\(f(\theta)\)的導數,在機器學習當中,X和Y都是樣本都是已知的參數,要求的是\(\theta\),所以我們對\(\theta\)求導:
\[\begin{aligned} f'(\theta) &= \frac{1}{m}\cdot 2 \cdot (\theta X - Y)\cdot X \\ &=\frac{2}{m}X^T(\theta X - Y) \end{aligned} \]
這個結果其實就是之前我們說的梯度,梯度本來就是由導數計算得到的,所以理解了鏈式求導的公式,可以再回過頭看看之前線性回歸和梯度推導的公式,相信會有更深刻的體會。
今天的文章篇幅有些長,但是除去證明之后,剩下的內容並不多,重要的是它的應用范圍很廣,所以希望大家都能學會。
如果覺得有所收獲,請順手掃碼點個關注吧,你們的舉手之勞對我來說很重要。
