程序員學(xué)習(xí)人工智能,繞不開的第一道坎就是數(shù)學(xué)慨仿。
人工智能(機(jī)器學(xué)習(xí))是一個非常大的領(lǐng)域所坯,那就代表每個人在其中的分工各不相同:有人負(fù)責(zé)開發(fā)模型做優(yōu)化解恰,那自然對數(shù)學(xué)要求較高;有人負(fù)責(zé)產(chǎn)品落地浙于,更多的時間都在處理數(shù)據(jù)及調(diào)用現(xiàn)成的API护盈。
不要把自己埋到無邊無際的數(shù)學(xué)海洋里面去,人生苦短羞酗。
本文不打算全面系統(tǒng)地介紹機(jī)器學(xué)習(xí)中的數(shù)學(xué)知識和概念腐宋。只介紹最少的,能夠支持機(jī)器學(xué)習(xí)入門的數(shù)學(xué)知識和概念檀轨,更多的數(shù)學(xué)請在入門后自行惡補(bǔ)胸竞。
1. 線性代數(shù)
機(jī)器學(xué)習(xí)中大量的用到線性代數(shù),如向量参萄、矩陣計算等卫枝。
1.1 標(biāo)量
一個標(biāo)量就是一個單獨的數(shù),一般用小寫的的變量名稱表示讹挎。
1.2 向量
一個向量就是一列數(shù)校赤,這些數(shù)是有序排列的。通過序列中的索引淤袜,我們可以確定每個單獨的數(shù)痒谴。通常會賦予向量粗體的小寫名稱。當(dāng)我們需要明確表示向量中的元素時铡羡,我們會將元素排列成一個方括號包圍的縱柱积蔚。我們可以把向量看作空間中的點,每個元素是不同的坐標(biāo)軸上的坐標(biāo)烦周。
1.3 矩陣
矩陣是二維數(shù)組尽爆,其中的每一個元素被兩個索引而非一個所確定。我們通常會賦予矩陣粗體的大寫變量名稱读慎,比如A漱贱。
矩陣這東西在機(jī)器學(xué)習(xí)中實在是太重要了!實際上夭委,如果我們現(xiàn)在有N個用戶的數(shù)據(jù)幅狮,每條數(shù)據(jù)含有M個特征,那其實它對應(yīng)的就是一個N*M的矩陣株灸;再比如崇摄,一張圖由16*16(256個)的像素點組成,那這就是一個16*16的矩陣了慌烧。
N個用戶M個特征逐抑,也可以說是一張有N行M列的數(shù)據(jù)庫(用戶)表。
1.4 張量
線性代數(shù)中定義的張量是基于向量和矩陣的推廣屹蚊,通俗一點理解的話厕氨,我們可以將標(biāo)量視為零階張量进每,矢量視為一階張量,那么矩陣就是二階張量命斧。
例如田晚,可以將任意一張彩色圖片表示成一個三階張量,三個維度分別是圖片的高度国葬、寬度和色彩數(shù)據(jù)肉瓦。將這張圖用張量表示出來,就是最下方的那張表格:
其中表的橫軸表示圖片的寬度值胃惜,這里只截取0~319;表的縱軸表示圖片的高度值哪雕,這里只截取0~4船殉;表格中每個方格代表一個像素點,比如第一行第一列的表格數(shù)據(jù)為[1.0,1.0,1.0]斯嚎,代表的就是RGB三原色在圖片的這個位置的取值情況(即R=1.0利虫,G=1.0,B=1.0)堡僻。
當(dāng)然我們還可以將這一定義繼續(xù)擴(kuò)展糠惫,即:我們可以用四階張量表示一個包含多張圖片的數(shù)據(jù)集,這四個維度分別是:圖片在數(shù)據(jù)集中的編號钉疫,圖片高度硼讽、寬度,以及色彩數(shù)據(jù)牲阁。
張量在深度學(xué)習(xí)中是一個很重要的概念固阁,因為它是一個深度學(xué)習(xí)框架中的一個核心組件,TensorFlow的所有運算和優(yōu)化算法幾乎都是基于張量進(jìn)行的城菊。
2. 微積分
微積分在機(jī)器學(xué)習(xí)中也是無處不在的备燃。
2.1 導(dǎo)數(shù)
導(dǎo)數(shù)(Derivative)是微積分中的重要基礎(chǔ)概念。當(dāng)函數(shù)y=f(x)的自變量x在一點x0上產(chǎn)生一個增量Δx時凌唬,函數(shù)輸出值的增量Δy與自變量增量Δx的比值在Δx趨于0時的極限a如果存在并齐,a即為在x0處的導(dǎo)數(shù),記作f'(x0)或df(x0)/dx客税。
導(dǎo)數(shù)簡單點說况褪,就是函數(shù)的斜率。比如說y=x這個函數(shù)霎挟,圖像你應(yīng)該很清楚吧窝剖,雖然y是隨著x的正加而增大的,但是其變化率也就是斜率是一直不變的酥夭。那么你能猜出來y=x的導(dǎo)數(shù)是多少么赐纱?
y=x的導(dǎo)數(shù)y'=1脊奋,同理y=2x時,則y'=2疙描,這是最簡單的诚隙。
當(dāng)函數(shù)是2次函數(shù)的時候,其斜率會忽大忽小起胰,甚至忽正忽負(fù)久又,這時y'不再是一個固定的數(shù),而是一個根據(jù)x值變化的數(shù)(說白了也是一個函數(shù))效五。
不確切的說地消,導(dǎo)數(shù)是變化率、是切線的斜率畏妖、是速度脉执、是加速度。
2.2 梯度
在一元函數(shù)中戒劫,導(dǎo)數(shù)就是函數(shù)隨自變量的變化率半夷。一般一元函數(shù)的自變量使用字母x,那么函數(shù)f(x)的導(dǎo)數(shù)其實就是它在x軸上的變化率迅细。
在微積分里面巫橄,對多元函數(shù)的參數(shù)求?偏導(dǎo)數(shù),把求得的各個參數(shù)的偏導(dǎo)數(shù)以向量的形式寫出來茵典,就是梯度湘换。
在多元函數(shù)中,自變量是多個標(biāo)量敬尺,或者理解成一個多維的向量枚尼。那么,函數(shù)隨自變量的變化怎么刻畫呢砂吞?一個方法署恍,就是衡量函數(shù)在給定方向上的變化率,這就是方向?qū)?shù)蜻直。方向?qū)?shù)的特例盯质,就是函數(shù)隨各個自變量(標(biāo)量)的變化率,即函數(shù)的偏導(dǎo)數(shù)概而,也就是函數(shù)沿各個坐標(biāo)軸正方向的方向?qū)?shù)呼巷。
假如一個多元函數(shù)是可微的,它在各個方向上都有方向?qū)?shù)赎瑰。那么王悍,函數(shù)可能在一些方向上增長的快(方向?qū)?shù)的值比較大),一些方向上增長的慢餐曼。所有這些方向中压储,會有一個增長最快的鲜漩。梯度就是一個向量,其模為這個增長最快的速率(方向?qū)?shù)值)集惋,其方向為這個最快增長方向孕似。
3. 損失函數(shù)
損失函數(shù)(loss function)是用來估量你模型的預(yù)測值f(x)與真實值Y的不一致程度,它是一個非負(fù)實值函數(shù)刮刑,通常使用L(Y, f(x))來表示喉祭,損失函數(shù)越小,模型的效果就越好雷绢。
例如泛烙,線性回歸算法用到的平方損失函數(shù)。
4. 凸函數(shù)
凸函數(shù)就是一個定義域在某個向量空間的凸子集C上的實值函數(shù)翘紊。
如果一個函數(shù)是凸函數(shù)胶惰,則其局部最優(yōu)點就是它的全局最優(yōu)點。這個性質(zhì)在機(jī)器學(xué)習(xí)算法優(yōu)化中有很重要的應(yīng)用霞溪,因為機(jī)器學(xué)習(xí)模型最后就是在求某個函數(shù)的全局最優(yōu)點,一旦證明該函數(shù)(機(jī)器學(xué)習(xí)里面叫“損失函數(shù)”)是凸函數(shù)中捆,那相當(dāng)于我們只用求它的局部最優(yōu)點了鸯匹。
5. 凸優(yōu)化
機(jī)器學(xué)習(xí)中的大多數(shù)問題可以歸結(jié)為最優(yōu)化問題。
人在面臨選擇的時候重視希望自己能夠做出“最好”的選擇泄伪,如果把它抽象成一個數(shù)學(xué)問題殴蓬,那么“最好的選擇”就是這個問題的最優(yōu)解。優(yōu)化問題蟋滴,就是把你考慮的各個因素表示成為一組函數(shù)(代價函數(shù))染厅,解決這個問題就是在一集備選解中選擇最好的解。
那么津函,為什么我們要討論凸優(yōu)化而不是一般的優(yōu)化問題呢肖粮?那時因為凸優(yōu)化問題具有很好的性質(zhì)——局部最優(yōu)就是全局最優(yōu),這一特性讓我們能夠迅速有效的求解問題尔苦。
在求解機(jī)器學(xué)習(xí)算法的模型參數(shù)涩馆,即無約束優(yōu)化問題時,梯度下降(Gradient Descent)是最常采用的方法之一允坚,另一種常用的方法是最小二乘法魂那。
另外還有牛頓法和擬牛頓法。
5.1 梯度下降
首先來看看梯度下降的一個直觀的解釋稠项。比如我們在一座大山上的某處位置涯雅,由于我們不知道怎么下山,于是決定走一步算一步展运,也就是在每走到一個位置的時候活逆,求解當(dāng)前位置的梯度精刷,沿著梯度的負(fù)方向,也就是當(dāng)前最陡峭的位置向下走一步划乖,然后繼續(xù)求解當(dāng)前位置梯度贬养,向這一步所在位置沿著最陡峭最易下山的位置走一步。這樣一步步的走下去琴庵,一直走到覺得我們已經(jīng)到了山腳误算。當(dāng)然這樣走下去,有可能我們不能走到山腳迷殿,而是到了某一個局部的山峰低處儿礼。
本文不對梯度下降做進(jìn)一步的講解。
5.2 最小二乘法
最小二乘法庆寺,又稱最小平方法蚊夫,是一種數(shù)學(xué)優(yōu)化技術(shù)。
它通過最小化誤差的平方和尋找數(shù)據(jù)的最佳函數(shù)匹配懦尝。利用最小二乘法可以簡便地求得未知的數(shù)據(jù)知纷,并使得這些求得的數(shù)據(jù)與實際數(shù)據(jù)之間誤差的平方和為最小。
所有實際值與預(yù)測值(擬合曲線上的點)差的平方求和陵霉,越小越好琅轧。
5.3 牛頓法
牛頓法的基本思想是利用迭代點處的一階導(dǎo)數(shù)(梯度)和二階導(dǎo)數(shù)(Hessen矩陣)對目標(biāo)函數(shù)進(jìn)行二次函數(shù)近似,然后把二次模型的極小點作為新的迭代點踊挠,并不斷重復(fù)這一過程乍桂,直至求得滿足精度的近似極小值。
牛頓法的速度相當(dāng)快效床,而且能高度逼近最優(yōu)值睹酌。
牛頓法分為基本的牛頓法和全局牛頓法。
5.3.1 基本牛頓法
基本牛頓法是一種是用導(dǎo)數(shù)的算法剩檀,它每一步的迭代方向都是沿著當(dāng)前點函數(shù)值下降的方向憋沿。
5.3.2 全局牛頓法
牛頓法最突出的優(yōu)點是收斂速度快,具有局部二階收斂性沪猴,但是卤妒,基本牛頓法初始點需要足夠“靠近”極小點,否則字币,有可能導(dǎo)致算法不收斂则披。這樣就引入了全局牛頓法。
5.4 擬牛頓法
擬牛頓法的本質(zhì)思想是改善牛頓法每次需要求解復(fù)雜的Hessian矩陣的逆矩陣的缺陷洗出,它使用正定矩陣來近似Hessian矩陣的逆士复,從而簡化了運算的復(fù)雜度。擬牛頓法和最速下降法一樣只要求每一步迭代時知道目標(biāo)函數(shù)的梯度。通過測量梯度的變化阱洪,構(gòu)造一個目標(biāo)函數(shù)的模型使之足以產(chǎn)生超線性收斂性便贵。這類方法大大優(yōu)于最速下降法,尤其對于困難的問題冗荸。另外承璃,因為擬牛頓法不需要二階導(dǎo)數(shù)的信息,所以有時比牛頓法更為有效蚌本。如今盔粹,優(yōu)化軟件中包含了大量的擬牛頓算法用來解決無約束,約束程癌,和大規(guī)模的優(yōu)化問題舷嗡。
5.5 凸優(yōu)化小結(jié)
從本質(zhì)上去看,牛頓法是二階收斂嵌莉,梯度下降是一階收斂进萄,所以牛頓法就更快。如果更通俗地說的話锐峭,比如你想找一條最短的路徑走到一個盆地的最底部中鼠,梯度下降法每次只從你當(dāng)前所處位置選一個坡度最大的方向走一步,牛頓法在選擇方向時沿癞,不僅會考慮坡度是否夠大兜蠕,還會考慮你走了一步之后绊袋,坡度是否會變得更大军熏。所以项滑,可以說牛頓法比梯度下降法看得更遠(yuǎn)一點,能更快地走到最底部盗舰。(牛頓法目光更加長遠(yuǎn),所以少走彎路桂躏;相對而言钻趋,梯度下降法只考慮了局部的最優(yōu),沒有全局思想剂习。)
從幾何上說蛮位,牛頓法就是用一個二次曲面去擬合你當(dāng)前所處位置的局部曲面,而梯度下降法是用一個平面去擬合當(dāng)前的局部曲面鳞绕,通常情況下失仁,二次曲面的擬合會比平面更好,所以牛頓法選擇的下降路徑會更符合真實的最優(yōu)下降路徑们何。
6. 繼續(xù)前行
初步認(rèn)識上面的概念后萄焦,就可以開始機(jī)器學(xué)習(xí)的學(xué)習(xí)了。
調(diào)包俠:現(xiàn)有機(jī)器學(xué)習(xí)算法已經(jīng)有大量的實現(xiàn),在工作中拂封,普通程序員只需要在理解概念的情況下調(diào)用其提供的API茬射,俗稱調(diào)包俠。
在后續(xù)的學(xué)習(xí)和工作中冒签,對數(shù)學(xué)會越來越有感覺在抛,就可以再進(jìn)一步的根據(jù)需要深入學(xué)習(xí),以加深對機(jī)器學(xué)習(xí)的理解萧恕。
Kevin刚梭,2018年4月24日,成都廊鸥。