算法中的微積分:5大函數(shù)求導公式讓你在面試中脫穎而出
本文轉(zhuǎn)載自公眾號“讀芯術(shù)”(ID:AI_Discovery)。
就業(yè)市場上,機器學習工程師總是受到質(zhì)疑,人們不相信他們數(shù)學功底深厚。事實上,所有機器學習算法的本質(zhì)都是數(shù)學問題,無論是支持向量機、主成分分析還是神經(jīng)網(wǎng)絡(luò)最終都歸結(jié)為對偶優(yōu)化、譜分解篩選和連續(xù)非線性函數(shù)組合等數(shù)學問題。只有徹底理解數(shù)學,才能正真掌握這些機器學習算法。
Python中的各種數(shù)據(jù)庫能幫助人們利用高級算法來完成一些簡單步驟。例如包含了K近鄰算法、K均值、決策樹等算法的機器學習算法庫Scikit-learn,或者Keras,都可以幫助人們構(gòu)建神經(jīng)網(wǎng)絡(luò)架構(gòu),而不必了解卷積神經(jīng)網(wǎng)絡(luò)CNNs或是循環(huán)神經(jīng)網(wǎng)絡(luò)RNNs背后的細節(jié)。
然而,想要成為一名優(yōu)秀的機器學習工程師需要的遠不止這些。在面試時,面試官通常會問及如何從零開始實現(xiàn)K近鄰算法、決策樹,又或者如何導出線性回歸、softmax反向傳播方程的矩陣閉式解等問題。
本文將回顧一些微積分的基本概念助你準備面試,如一元和多元函數(shù)的導數(shù)、梯度、雅可比矩陣和黑塞矩陣。同時,本文還能為你深入研究機器學習、尤其是神經(jīng)網(wǎng)絡(luò)背后的數(shù)學運算打下良好的基礎(chǔ)。這些概念將通過5個導數(shù)公式來展示,絕對是面試必備干貨。

導數(shù)1:復(fù)合指數(shù)函數(shù)

指數(shù)函數(shù)非常基礎(chǔ)常見,而且非常有用。它是一個標準正函數(shù)。在實數(shù)ℝ中eˣ > 0,同時指數(shù)函數(shù)還有一個重要的性質(zhì),即e⁰ = 1。
另外,指數(shù)函數(shù)與對數(shù)函數(shù)互為反函數(shù)。指數(shù)函數(shù)也是最容易求導的函數(shù)之一,因為指數(shù)函數(shù)的導數(shù)就是其本身,即(eˣ)’ = eˣ。當指數(shù)與另一個函數(shù)組合形成一個復(fù)合函數(shù)時,復(fù)合函數(shù)的導數(shù)就變得更為復(fù)雜了。在這種情況下,應(yīng)遵循鏈式法則來求導,f(g(x))的導數(shù)等于f’(g(x))⋅g’(x),即:

運用鏈式法則可以計算出f(x)= eˣ²的導數(shù)。先求g(x)=x²的導數(shù):g(x)’=2x。而指數(shù)函數(shù)的導數(shù)為其本身:(eˣ)’=eˣ。將這兩個導數(shù)相乘,就可以得到復(fù)合函數(shù)f(x)= eˣ²的導數(shù):

這是個非常簡單的例子,乍一看可能無關(guān)緊要,但它經(jīng)常在面試開始前被面試官用來試探面試者的能力。如果你已經(jīng)很久沒有溫習過導數(shù)了,那么很難確保自己能夠迅速應(yīng)對這些簡單問題。雖然它不一定會讓你得到這份工作,但如果你連這么一個基本問題都回答不上,那你肯定會失去這份工作。
導數(shù)2:底數(shù)為變量的復(fù)變指數(shù)

復(fù)變指數(shù)函數(shù)是一個經(jīng)典面試問題,尤其是在計量金融領(lǐng)域,它比科技公司招聘機器學習職位更為看重數(shù)學技能。復(fù)變指數(shù)函數(shù)迫使面試者走出舒適區(qū)。但實際上,這個問題最難的部分是如何找準正確的方向。
當函數(shù)逼近一個指數(shù)函數(shù)時,首先最重要的是要意識到指數(shù)函數(shù)與對數(shù)函數(shù)互為反函數(shù),其次,每個指數(shù)函數(shù)都可以轉(zhuǎn)化為自然指數(shù)函數(shù)的形式:

在對復(fù)變指數(shù)函數(shù)f(x) = xˣ求導前,要先用一個簡單的指數(shù)函數(shù)f(x) = 2ˣ來證明復(fù)變函數(shù)的一種性質(zhì)。先用上述方程將2ˣ 轉(zhuǎn)化為exp(xln(2)),再用鏈式法則求導。

現(xiàn)在回到原來的函數(shù)f(x)=xˣ,只要把它轉(zhuǎn)化為f(x)=exp(x ln x),求導就變得相對簡單,可能唯一困難的部分是鏈式法則求導這一步。

注意這里是用乘積法則(uv)’=u’v+uv’來求指數(shù)xln(x)的導數(shù)。
通常情況下,面試官提問這個函數(shù)時不會告訴你函數(shù)定義域。如果面試官沒有給定函數(shù)定義域,他可能是想測試一下你的數(shù)學敏銳度。這便是這個問題具有欺騙性的地方。沒有限定定義域,xˣ既可以為正也可以為負。當x為負時,如(-0.9)^(-0.9),結(jié)果為復(fù)數(shù)-1.05–0.34i。
一種解決方法是將該函數(shù)的定義域限定為ℤ⁻ ∪ ℝ⁺ \0,但對于負數(shù)來說,函數(shù)依然不可微。因此,為了正確推導出復(fù)變指數(shù)函數(shù)xˣ的導數(shù),只需要把該函數(shù)的定義域嚴格限定為正數(shù)即可。排除0是因為此時導數(shù)也為0,左右導數(shù)需相等,但在這種情況下,此條件是不成立的。因為左極限是沒有定義的,函數(shù)在0處不可微,因此函數(shù)的定義域只能限定為正數(shù)。

在繼續(xù)以下內(nèi)容之前,先考考你,這里有一個比復(fù)變指數(shù)函數(shù)f(x) = xˣ更高級的函數(shù)f(x) = xˣ²。如果你理解了第一個例子背后的邏輯和步驟,再加一個指數(shù)應(yīng)該毫無難度,可以推導出以下結(jié)果:

導數(shù)3:多元輸入函數(shù)的梯度

到目前為止,前面討論的函數(shù)導數(shù)都是從ℝ映射到ℝ的函數(shù),即函數(shù)的定義域和值域都是實數(shù)。但機器學習本質(zhì)上是矢量的,函數(shù)也是多元的。
下面這個例子最能闡釋這種多元性:當神經(jīng)網(wǎng)絡(luò)的輸入層大小為m和輸出層大小為k時,即f(x) = g(Wᵀx + b),此函數(shù)是線性映射Wᵀx(權(quán)陣W和輸入向量x)和非線性映射g(激活函數(shù))按元素組成的。一般情況下,該函數(shù)也可視作是從ℝᵐ到ℝᵏ的映射。
我們把k=1時的導數(shù)稱為梯度?,F(xiàn)在來計算以下從ℝ³映射到ℝ的三元函數(shù):

可以把f看作是一個函數(shù),它從大小為3的向量映射到大小為1的向量。
圖源:unsplash
多元輸入函數(shù)的導數(shù)被稱為梯度,用倒三角符號∇(英文為nabla)表示。從ℝⁿ映射到ℝ的函數(shù)g的梯度是n個偏導數(shù)的集合,每個偏導數(shù)都是一個n元函數(shù)。因此,如果g是一個從ℝⁿ到ℝ的映射,其梯度∇g是一個從ℝⁿ到ℝⁿ的映射。
要推導出函數(shù)f(x,y,z) = 2ˣʸ + zcos(x)的梯度,需要構(gòu)造一個矢量的偏導數(shù):∂f/∂x,∂f/∂y和∂f/∂z,結(jié)果如下:

需要注意,此處也需要利用公式進行等值轉(zhuǎn)化,即2ˣʸ=exp(xy ln(2))。
總之,對于一個從ℝ³映射到 ℝ的三元函數(shù)f,其導數(shù)是一個從ℝ³映射到ℝ³的梯度∇ f。從ℝᵐ映射到ℝᵏ(k > 1)的一般式中,一個從ℝᵐ映射到ℝᵏ的多元函數(shù)的導數(shù)是一個雅可比矩陣,而非一個梯度向量。
導數(shù)4:多元輸入輸出函數(shù)的雅可比矩陣

上一節(jié)中已經(jīng)提到從ℝᵐ映射到ℝ的函數(shù)的導數(shù),是一個從ℝᵐ映射到ℝᵐ的梯度。但如果輸出域也是多元的,即從ℝᵐ映射到ℝᵏ(k > 1),那又當如何?
這種情況下,導數(shù)為雅可比矩陣。可以把梯度簡單視為一個m x 1的特殊雅可比矩陣,此時m與變量個數(shù)相等。雅可比矩陣J(g)是一個從ℝᵐ到ℝᵏ*ᵐ的映射,其中函數(shù)g從ℝᵐ映射到ℝᵏ。這也就是說輸出域的維數(shù)是k x m,即為一個k x m矩陣。換言之,在雅可比矩陣J(g)中,第i行表示函數(shù)gᵢ的梯度∇ gᵢ。
假設(shè)上述函數(shù)f(x, y) = [2x², x √y]從ℝ²映射到ℝ²,通過推導該函數(shù)的導數(shù)可以發(fā)現(xiàn)函數(shù)的輸入和輸出域都是多元的。在這種情況下,由于平方根函數(shù)在負數(shù)上沒有定義,需要把y的定義域限定為ℝ⁺。輸出雅可比矩陣的第一行就是函數(shù)1的導數(shù),即∇ 2x²;第二行為函數(shù)2的導數(shù),即∇ x √y。

雅可比矩陣在深度學習中的可解釋性領(lǐng)域中有一個有趣用例,目的是為了理解神經(jīng)網(wǎng)絡(luò)的行為,并分析神經(jīng)網(wǎng)絡(luò)的輸出層對輸入的靈敏度。
雅可比矩陣有助于研究輸入空間的變化對輸出的影響,還可以用于理解神經(jīng)網(wǎng)絡(luò)中間層的概念??傊枰涀√荻仁菢肆繉ο蛄康膶?shù),雅可比矩陣是一個向量對另一個向量的導數(shù)。
導數(shù)5:多元輸入函數(shù)的黑塞矩陣

目前僅討論了一階導數(shù)求導,但在神經(jīng)網(wǎng)絡(luò)中,會經(jīng)常討論多元函數(shù)的高階導數(shù)。其中一種特殊情況就是二階導數(shù),也被稱為黑塞矩陣,用H(f)或∇ ²(微分算符的平方)表示。從ℝⁿ映射到ℝ的函數(shù)g的黑塞矩陣是從ℝⁿ到ℝⁿ*ⁿ的映射H(g)。
現(xiàn)在分析一下我們是如何將輸出域從ℝ轉(zhuǎn)化為ℝⁿ*ⁿ。一階導數(shù),即梯度∇g,是一個從ℝⁿ到ℝⁿ的映射,其導數(shù)是一個雅可比矩陣。因此,每一個子函數(shù)的導數(shù)∇gᵢ都由n個從ℝⁿ映射到ℝⁿ的函數(shù)組成。可以這樣想,就好比是對展開成一個向量的梯度向量的每個元素都求導,從而變成向量中的向量,即為一個矩陣。
要計算黑塞矩陣,需要計算交叉導數(shù),即先對x求導,再對y求導,反過來也可以。求交叉導數(shù)的順序會不會影響結(jié)果,換句話說,黑塞矩陣是否對稱。在這種情況下,函數(shù)f為二次連續(xù)可微函數(shù)(用符號²表示),施瓦茲定理表明交叉導數(shù)是相等的,因此黑塞矩陣是對稱的。一些不連續(xù)但可微的函數(shù),不滿足交叉導數(shù)等式。
構(gòu)造函數(shù)的黑塞矩陣就相當于求一個標量函數(shù)的二階偏導數(shù)。以f(x,y) = x²y³為例,計算結(jié)果如下:

可以看到交叉導數(shù)6xy²實際上是相等的。先對x求導得到關(guān)于x的偏導數(shù)2xy³,再對y求導得到關(guān)于y的偏導數(shù)6xy²。對于x或y的每個一元子函數(shù),對角元素都為fᵢ。
此類函數(shù)的拓展部分將討論從ℝᵐ映射到ℝᵏ的多元函數(shù)的二階導數(shù)的情況,可以將其視為一個二階雅可比矩陣。這是一個從ℝᵐ到ℝᵏ*ᵐ*ᵐ的映射,即一個三維張量。與黑塞矩陣相似,為了求出雅可比矩陣的梯度(求二階微分),要對k x m矩陣的每一個元素微分,得到一個向量矩陣,即為一個張量。雖然不太可能要求面試者進行手動計算,但了解多元函數(shù)的高階導數(shù)相當重要。
本文回顧了機器學習背后重要的微積分基礎(chǔ)知識,列舉了幾個一元和多元函數(shù)的例子,討論了梯度、雅可比矩陣和黑塞矩陣,全面梳理了機器學習面試中可能出現(xiàn)的概念和涉及的微積分知識,希望你能面試順利!