為了使大家對機(jī)器學(xué)習(xí)有一個基本的認(rèn)識,在這篇文章中,我們將對以下四個主題做簡要的介紹:
什么是機(jī)器學(xué)習(xí)?
機(jī)器學(xué)習(xí)模型的訓(xùn)練。
模型參數(shù)的優(yōu)化。
神經(jīng)網(wǎng)絡(luò)。
即使你不是機(jī)器學(xué)習(xí)方面的專家也不必?fù)?dān)心,因為你只需具備高中數(shù)學(xué)的基本知識就能讀懂本篇文章。
▌什么是機(jī)器學(xué)習(xí)?
牛津詞典對“機(jī)器學(xué)習(xí)”的定義如下:
計算機(jī)從經(jīng)驗中學(xué)習(xí)的能力。
機(jī)器學(xué)習(xí)的目標(biāo)是找到一種或多種算法,在現(xiàn)有示例數(shù)據(jù)的基礎(chǔ)上學(xué)習(xí)執(zhí)行某項任務(wù)。
例如,假設(shè)現(xiàn)在我們想要編寫一個能夠玩Go這款游戲的程序。我們可以為這款程序添加某些游戲規(guī)則,或者也可以為其制定一些開放性策略和決策規(guī)則。
但此處存在一個問題。一方面,在編寫新規(guī)則的同時,程序會變得越來越復(fù)雜;另一方面,程序員所能提出的策略也是有限的,程序最終會受到限制。解決這個問題最好的辦法就是建立機(jī)器學(xué)習(xí)算法。人類能夠根據(jù)某些案例和實際的經(jīng)驗去學(xué)習(xí)如何玩圍棋游戲,同樣機(jī)器學(xué)習(xí)也可以。這就是DeepMind公司用他們的阿爾法圍棋(AlphaGo)程序所做的事情,阿爾法圍棋(AlphaGo)程序是一種基于深度學(xué)習(xí)的機(jī)器算法。
▌機(jī)器學(xué)習(xí)模型的訓(xùn)練
機(jī)器學(xué)習(xí)算法是根據(jù)帶標(biāo)簽的數(shù)據(jù)實例來訓(xùn)練模型的,通常情況下它會定義一個具有可調(diào)參數(shù)和優(yōu)化算法的模型,如下圖所示。首先該模型以數(shù)據(jù)(x)的形式進(jìn)行輸入,然后根據(jù)輸入的數(shù)據(jù)及模型參數(shù)生成輸出(y)。優(yōu)化算法會設(shè)法找到最佳的參數(shù)組合,也就是說,在給定輸入數(shù)據(jù)x的情況下,使得模型輸出的y盡可能接近期望輸出。經(jīng)過訓(xùn)練的模型將生成特定的函數(shù)f,即在輸入x時輸出y。因此,函數(shù)方程式為y = f (x)。
訓(xùn)練機(jī)器學(xué)習(xí)模型的途徑
圖片翻譯:
labeled data——標(biāo)記數(shù)據(jù),
model with tunable parameters——具有可調(diào)參數(shù)的模型
optimisation algorithm——優(yōu)化算法
Trained model——訓(xùn)練模型y = f (x))
▌優(yōu)化算法
有許多方法可以找到參數(shù)的最佳組合,它們都能在輸入x的情況下使得模型f的輸出y盡可能的接近期望輸出。其中一種方法是嘗試所有可能的參數(shù)組合,并選擇能夠提供最佳結(jié)果的組合。如果模型中的參數(shù)組合數(shù)量有限,那么這種方法可能會起作用,但是對于具有數(shù)千甚至數(shù)百萬個參數(shù)的典型機(jī)器學(xué)習(xí)模型來說,這種方法可以說是完全不切實際。幸運的是,目前我們有一種更好的方法可以為某些類型的模型找到最佳解決方案,這種方法得益于17世紀(jì)的數(shù)學(xué)家牛頓。
牛頓和萊布尼茨- https://xkcd.com/626/
圖片翻譯:
牛頓,1666年,I have invented calculus——我發(fā)明了微積分
萊布尼茨,1674年,I have invented calculus——我發(fā)明了微積分
Really?sounds a little bit——真的嗎?聽起來有點……
Derivative——導(dǎo)數(shù)
牛頓發(fā)明了導(dǎo)數(shù)(也被稱為梯度)。函數(shù)的導(dǎo)數(shù)表示該函數(shù)伴隨其中某一參數(shù)的變化而變化的趨勢,它能夠表示函數(shù)的增減方向。如果我們有一個函數(shù)f,該函數(shù)有一個參數(shù)p,那么參數(shù)p的變化就可以表示為dp,函數(shù)f相對于dp的變化就可以表示為df,其方程式為df(p)/ dp。

Derivative (gradient) df(p)/dp of f(p) = psin(p^2) for different values of p.
那么,我們?nèi)绾卫脤?dǎo)數(shù)來提高模型的優(yōu)化效率呢? 假設(shè)我們有一些數(shù)據(jù)(x,t),在輸入x時對應(yīng)于輸出t,并且這些數(shù)據(jù)在圖表中的表示如下:
標(biāo)簽數(shù)據(jù)(x,t)
如果我們現(xiàn)在想要創(chuàng)建一個模型,在該模型中對于所有給定的示例數(shù)據(jù),在輸入x時都能輸出最接近期的t,那么我們就可以嘗試擬合出一條通過原點的直線(這也被稱為線性回歸)。這條直線可以用y=f(x)和f(x)=p·x的函數(shù)來表示,其中p是該模型的唯一參數(shù)(注意:p表示該直線的斜率)。這個模型可以用下圖來表示:
表示我們的模型y = f(x)
為了找到參數(shù)p,使函數(shù)y=x·p的值在所有給定的示例(x,t)中都接近期望輸出t,我們必須用數(shù)學(xué)方法定義一種能夠衡量“親密度”的度量方法,即“成本函數(shù)”。在此,我們有一個解決該問題的典型成本函數(shù),即將所有的示例(x,t)的期望輸出t和模型輸出y之差的絕對值的平方值(也就是|t-y|2)求和。最終,成本函數(shù)的形式為Σ| t - (xp)| 2,其中Σ(sigma)表示求和。由于這個例子非常簡單,對于所有的參數(shù)p,我們很容易便能看到整個的成本函數(shù)。
例子中的成本函數(shù)
為了找到最好的參數(shù)p,我們需要最小化成本函數(shù)。請記住,我們的模型中存在一個參數(shù)p,并且在輸入x時生成輸出y。因此我們可以把這個模型寫成y = xp。由于成本函數(shù)的表達(dá)式是Σ| t-y | 2,我們可以用xp代替y,并將成本函數(shù)寫成Σ | t -(xp)| 2的形式。如果我們想要最小化這個函數(shù),并使輸出y盡可能接近期望輸出t, 我們可以讓每個輸入樣本(x,t)嘗試所有可能的p值,并最終選擇其中一個p值,該p值能夠使所有輸入樣本的成本之和最低。
當(dāng)模型中只有一個參數(shù)時,嘗試所有可能的p值是可能的,但是很快當(dāng)模型中存在多個參數(shù)時嘗試所有p值的方法就會變得不可行。這也就是導(dǎo)數(shù)能夠發(fā)揮作用的時候。利用導(dǎo)數(shù),我們可以簡單地為p選擇一個隨機(jī)起始參數(shù)值,然后開始在相反的方向上求導(dǎo),最終找到成本函數(shù)的最低點。導(dǎo)數(shù)(梯度)下降的過程也被稱為梯度下降。
這個過程如下圖所示,我們從p=0.3開始,然后沿著梯度進(jìn)行12個次漸變,同時改善模型與數(shù)據(jù)的擬合的情況(右圖所示的線)。當(dāng)成本函數(shù)不再大幅度下降時,我們停止對模型進(jìn)行擬合,此時最終的參數(shù)p的值為1.94,成本函數(shù)的值為0.451。我們注意到,相比最初的線性回歸函數(shù),最終的線性回歸函數(shù)與數(shù)據(jù)(x,t)的匹配程度更高,而且高很多。
梯度下降優(yōu)化
▌神經(jīng)網(wǎng)絡(luò)
以上就是我們在訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型時實實在在發(fā)生的事情。然而,更典型的神經(jīng)網(wǎng)絡(luò)模型是由比y=xp模型復(fù)雜得多的函數(shù)組成的。我們有各種各樣的神經(jīng)網(wǎng)絡(luò)模型,但通常它們都是可以區(qū)分的,并且可以用在上文介紹的梯度下降法進(jìn)行優(yōu)化。
例如,在計算機(jī)視覺中使用的典型神經(jīng)網(wǎng)絡(luò)由多個層組成,每一層都對應(yīng)成百上千個參數(shù)以及一個非線性函數(shù)。正是由于在神經(jīng)網(wǎng)絡(luò)中存在許多個層,所以才有了“深度學(xué)習(xí)”這一術(shù)語。在模型中使用多個層的好處是,每個層都可以利用上一層提取的信息來建立更為復(fù)雜的數(shù)據(jù)表示。正因為如此,神經(jīng)網(wǎng)絡(luò)才會非常強(qiáng)大,經(jīng)過訓(xùn)練后不僅可以從視頻中識別出貓,還能識別語音,甚至也能玩Atari視頻游戲。
如果你想嘗試一些小型的神經(jīng)網(wǎng)絡(luò),可以試試谷歌的Tensorflow;如果你想嘗試一些更具技術(shù)含量的神經(jīng)網(wǎng)絡(luò),想要學(xué)習(xí)更多的東西,你可以嘗試查閱我的教程“如何實現(xiàn)神經(jīng)網(wǎng)絡(luò)”(how to implement networks),并且在它的幫助下嘗試建立自己的模型。
gradient descent
https://en.wikipedia.org/wiki/Gradient_descent
how to implement networks
http://peterroelants.github.io/posts/neural_network_implementation_part01/
原文地址
https://medium.com/onfido-tech/machine-learning-101-be2e0a86c96a
【來源】本文經(jīng)“AI100(ID:rgznai100)”授權(quán)