本文始發於個人公衆號:TechFlow,原創不易,求個關注
上一篇文章我們複習了函數求導的定義和一些常見函數的導數,今天這篇文章我們回顧一下複雜函數的求導方法。先強調一下,今天的文章很重要,想要看懂機器學習各種公式推導,想要能夠自己推一推各種公式,函數求導是基礎中的基礎,在算法這個領域,它比積分要重要得多。
我們先來看第一種情況:多個函數進行四則運算的導數。
函數四則運算求導法則
我們假設u=u(x)和v=v(x)都在x點有導數,那麼它們進行加減乘除四則運算之後的結果的導數有如下性質:
[u(x)±v(x)]′[u(x)v(x)]′[v(x)u(x)]=u′(x)±v′(x)=u′(x)v(x)+u(x)v′(x)=v2(x)u′(x)v(x)−u(x)v′(x)(v(x)=0)
我們來看一下證明過程,熟悉證明過程並不是炫技,除了能加深對公式的理解之外,更重要的是防止遺忘。即使以後真的不記得公式的細節了,也可以臨時推導一下,這是學算法和數學很重要的技巧。
我們先來看第一個,第一個很容易證明,我們直接套一下導數的公式即可:
[u(x)±v(x)]′=Δx→0limΔx[u(x+Δx)±v(x+Δx)]−[u(x)±v(x)]=Δx→0limΔxu(x+Δx)±Δx→0limΔxv(x+Δx)=u′(x)±v′(x)
第二個式子同樣套用公式:
[u(x)v(x)]′=Δx→0limΔxu(x+Δx)v(x+Δx)−u(x)v(x)=Δx→0limΔxu(x+Δx)v(x+Δx)−u(x)v(x+Δx)+u(x)v(x+Δx)−u(x)v(x)=Δx→0limΔx(u(x+Δx)−u(x))v(x+Δx)+u(x)(v(x+Δx)−v(x))=Δx→0limv(x+Δx)Δxu(x+Δx)−u(x)+Δx→0limu(x)Δxv(x+Δx)−v(x)=v(x+Δx)u′(x)+u(x)v′(x)=u(x)v′(x)+u′(x)v(x)
最後是第三個式子的推導,也並不複雜:
[v(x)u(x)]=Δx→0limΔxv(x+Δx)u(x+Δx)−v(x)u(x)=Δx→0limv(x+Δx)v(x)Δxv(x)u(x+Δx)−v(x+Δx)u(x)=Δx→0lim=Δx→0limv(x+Δx)v(x)Δxv(x)u(x+Δx)−v(x)u(x)+v(x)u(x)−v(x+Δx)u(x)=Δx→0limv(x+Δx)v(x)Δxu(x+Δx)−u(x)v(x)−Δxv(x+Δx)−v(x)u(x)=v2(x)u′(x)v(x)−u(x)v′(x)
反函數求導法則
推導完了四則運算的求導法則,我們再來看一下反函數的求導法則。
我們陷在了看結論,如果函數x=f(y)在區間Iy內單調、可導並且f′(x)!=0,那麼它的反函數y=f−1(x)在區間Ix={x∣x=f(y),y∈Iy}內也可導,那麼:
[f−1(x)]′=f′(y)1
關於這個結論的證明很簡單,因爲x=f(y)在區間內單調、可導,所以它的反函數y=f−1(x)存在,並且也單調且連續。
所以:
Δy=f−1(x+Δx)−f−1x=0ΔxΔy=ΔyΔx1=f′(y)1
由於y=f−1(x)連續,Δx→0limΔy=0,所以上式成立。
我們來看一個例子:x=siny,y∈[−2π,2π],則y=arcsinx是它的反函數,根據上面的公式,我們可以得到:
(arcsinx)′=(siny)′1=cosy1
由於cosy=1−sin2y=1−x2,代入上式可以得到:
(arcsinx)′=1−x21
利用同樣的方法,我們還可以求出其他反三角函數的導數,由於這些並不太常用,所以我們就不多介紹了,感興趣的同學可以自己利用導數的定義推導一下,我想應該也不難。
複合函數求導
這是最後一個法則,也是本篇文章的重點,因爲經常用到。我們現在已經搞定了一些常見的函數,還搞定了常見函數加減乘除之後求導的結果,但是對於一些看起來比較複雜的函數,我們並不能一下寫出它們的導數。
比如說:sin(x2+3x),比如ln(3x−1)等等,這些函數基本上都可以確定是連續並且可導的,但是我們一下子並不能寫出它們的導數,而且要通過導數的定義推導也非常麻煩,對於這些導數就需要用到今天的重頭戲,也就是複合函數的求導法則了。
對於複合函數而言,擁有如下法則:如果函數u=g(x)在點x處可導,並且y=f(u)在點u=g(x)處也可導,那麼複合函數y=f[g(x)]在x處可導,它的導數爲:
dxdy=f′(u)⋅g′(x)=dudy⋅dxdu
如果複合函數的數量更多也是一樣的,我們按照順序依次相乘即可。由於公式的形式像是一根鏈條一樣依次所以,複合函數求導法則也叫鏈式求導法則。在舉例之前,我們先來證明一下。
由於y=f(u)在點u處可導,因此
Δu→0limΔuΔy=f′(u)
因爲f′(u)存在,所以我們將它變形爲:
ΔuΔy=f′(u)+a
其中a是Δu→0時的無窮小,我們對兩邊同時乘上Δu,可以得到:
Δy=f′(u)Δu+a⋅Δu
上式當中Δu和a都是無窮小,所以當Δu→0時,Δy=0,我們對上式兩邊同時除以Δx,得:
ΔxΔy=f′(u)ΔxΔu+a⋅ΔxΔu
於是:
Δx→0limΔxΔy=Δx→0lim[f′(u)ΔxΔu+aΔxΔu]
又根據u=g(x)在點x處可導,所以有:
Δx→0limΔxΔu=g′(x)
我們代入,就可以得到:
Δx→0limΔxΔy=f′(u)⋅ΔxΔu=f′(u)⋅g′(x)
其實我們都知道相比於公式的證明,公式的運用更加重要,下面我們就來看兩個例子,來鞏固一下這個鏈式求導法則:
y=lnsin3x,求dxdy
我們令u=3x,g=sinu
所以:
dxdy=dgdy⋅dudg⋅dxdu=g1⋅cosu⋅3=3sin3xcos3x=3cot3x
還記得我們之前推導線性迴歸時候用到的均方差的公式嗎:
f(θ)=m1(θX−Y)2
我們來試着學以致用,求一下f(θ)的導數,在機器學習當中,X和Y都是樣本都是已知的參數,要求的是θ,所以我們對θ求導:
f′(θ)=m1⋅2⋅(θX−Y)⋅X=m2XT(θX−Y)
這個結果其實就是之前我們說的梯度,梯度本來就是由導數計算得到的,所以理解了鏈式求導的公式,可以再回過頭看看之前線性迴歸和梯度推導的公式,相信會有更深刻的體會。
今天的文章篇幅有些長,但是除去證明之後,剩下的內容並不多,重要的是它的應用範圍很廣,所以希望大家都能學會。
如果覺得有所收穫,請順手掃碼點個關注吧,你們的舉手之勞對我來說很重要。