看了這么多天基礎(chǔ)知識,是時候?qū)懸黄偨Y(jié)了绍载,加深一下印象诡宗,順便讓沒有接觸過的朋友們了解一下。
在開始之前击儡,我們需要明確一個問題塔沃,就是什么是機(jī)器學(xué)習(xí)?機(jī)器學(xué)習(xí)的算法與普通程序的算法有什么區(qū)別呢阳谍?
在《DEEP LEARNING》一書提到蛀柴,Mitchell(1997)給機(jī)器學(xué)習(xí)提供了一個簡潔的定義:對于某類任務(wù)T 和性能度量P,一個計算機(jī)程序被認(rèn)為可以從經(jīng)驗(yàn)E 中學(xué)習(xí)是指矫夯,通過經(jīng)驗(yàn)E 改進(jìn)后鸽疾,它在任務(wù)T 上由性能度量P 衡量的性能有所提升。
也就是說训貌,機(jī)器學(xué)習(xí)算法隨著不斷地訓(xùn)練或應(yīng)用制肮,能夠?qū)τ谝粋€任務(wù)能完成地更好,而一般意義上的程序只是嚴(yán)格按照人們預(yù)先設(shè)立的指令進(jìn)行執(zhí)行递沪,沒有反饋的過程豺鼻,不能自動地優(yōu)化。
根據(jù)以上的定義款慨,機(jī)器學(xué)習(xí)并不一定是很復(fù)雜的儒飒,相反我們可以考慮很簡單的模型,只要它能在訓(xùn)練中可以不斷優(yōu)化問題處理的效果樱调,這個模型就可以稱為機(jī)器學(xué)習(xí)模型
抽象地講约素,就是建立一個模型:
可以通過輸入值優(yōu)化
輸入、輸出笆凌、參數(shù)都可以是任意張量
比如圣猎,我們可以考慮最簡單的情況:加入我們的輸入和輸出
都是標(biāo)量,且假設(shè)
與
滿足線性關(guān)系:
我們現(xiàn)在有一些樣本值和對應(yīng)的輸出值
,我們就可以通過這些值訓(xùn)練出合適的參數(shù)
和
乞而,這就可以稱為機(jī)器學(xué)習(xí)送悔。
我們應(yīng)該訓(xùn)練什么?
在訓(xùn)練之前爪模,我們需要定義一個描述當(dāng)前的參數(shù)工作好或壞的量欠啤,這樣我們訓(xùn)練才能有目標(biāo)。我們一般采用的是使用我們當(dāng)前的參數(shù)得出的預(yù)測值與實(shí)際值的偏差屋灌,稱為損失值(loss)洁段,是預(yù)測值和實(shí)際值
的函數(shù),即
稱為損失函數(shù)(loss function)或代價函數(shù)(cost function)共郭。現(xiàn)在我們就有了訓(xùn)練的目標(biāo):盡可能地減小損失值祠丝,這樣在我們定義的損失函數(shù)意義下疾呻,我們的模型和真實(shí)情況是盡可能一致的。
損失函數(shù)的形式根據(jù)問題的不同而不同写半。對于上述的線性模型的問題岸蜗,我們可以采用均方誤差:
其中,
分別表示第
個輸入
對應(yīng)的輸出的真實(shí)值與使用當(dāng)前的參數(shù)得到的預(yù)測值
如何開始訓(xùn)練呢叠蝇?
在這個模型中我們有兩個參數(shù)需要進(jìn)行訓(xùn)練:k和b璃岳。
由于我們已經(jīng)有了訓(xùn)練的明確目標(biāo),就是盡可能的最小化一個函數(shù)(損失函數(shù))的值悔捶,相信在高中的時候經(jīng)常遇到這樣的問題铃慷,一個解決辦法就是損失函數(shù)對我們的參數(shù)求導(dǎo)數(shù),令它的導(dǎo)數(shù)等于零蜕该,得到的就是損失函數(shù)取極值的時候參數(shù)的值枚冗,而這種模型特別簡單,以至于我們并不需要一步一步地更新參數(shù)k與b的值蛇损,我們只需要帶入求解導(dǎo)數(shù)等于零的方程,就可以將參數(shù)解出來坛怪。實(shí)際上淤齐,這是就是著名的線性回歸模型。
這里我偷個懶直接搬運(yùn)網(wǎng)上的答案:這里的b是斜率(也就是上面的k)袜匿,a是截距(上面的b)
以上模型中我們看出更啄,如果我們的訓(xùn)練集增大,獲得更多樣本居灯,其中的求和能得到更多的數(shù)據(jù)祭务,當(dāng)有新的數(shù)據(jù)加入時,我們的參數(shù)就會隨之改變怪嫌,對于新的輸入我們的預(yù)測輸出就有可能做地更好义锥。這就符合了上面我們對機(jī)器學(xué)習(xí)的定義。線性回歸也是一種機(jī)器學(xué)習(xí)算法岩灭。在接下來的討論中我們將看到拌倍,實(shí)際上所謂的神經(jīng)網(wǎng)絡(luò)的基本原理和線性回歸也差不多,都是通過某一種方法更新參數(shù)以降低損失值噪径,只不過神經(jīng)網(wǎng)絡(luò)的參數(shù)更多柱恤,且加入了非線性因素,不可能用直接求導(dǎo)數(shù)的方法求解找爱,需要另想其他辦法梗顺。
上面的模型可以推廣到多維的情況,即不局限于標(biāo)量车摄,輸入和輸出都可以是向量寺谤。這樣仑鸥,我們的參數(shù)和偏置量會變成向量和矩陣:
以后的討論中我們默認(rèn)小寫字母是向量,帶下標(biāo)的是向量對應(yīng)的標(biāo)量矗漾,而大寫字母則為矩陣
在上面的問題中锈候,我們有一條假設(shè),就是我們的輸入和輸出是滿足線性關(guān)系的敞贡,但是現(xiàn)實(shí)中的大多數(shù)關(guān)系并不是這樣的泵琳。根據(jù)線性代數(shù)的知識派阱,多個線性關(guān)系的組合仍然是線性關(guān)系偎巢。要想描述非線性關(guān)系爽茴,類似于
這樣的模型是行不通的咆霜,我們必須加入一個非線性函數(shù)才能描述這些關(guān)系怠硼。實(shí)際上狐树,如果我們把非線性的函數(shù)關(guān)系加到里面的那一層中:
這個非線性的變換又經(jīng)過了一次線性變換才得到了輸出涮母,這樣挟冠,這個非線性變換即使非常簡單(比如之后講到的ReLU)鹏漆,但是通過線性變換巩梢,這個模型就能夠表示非常復(fù)雜的關(guān)系了。這個層間的非線性函數(shù)被稱為激活函數(shù)(Activation Function)艺玲,事實(shí)上括蝠,只要有任意的非線性激活函數(shù)和足夠長的內(nèi)層(一般稱作隱藏層,即上面的)的向量饭聚,這個兩層的模型可以表示任何關(guān)系忌警,這個定理稱為萬能近似定理,至于這個定理的證明感興趣的同學(xué)可以百度一下
這就是具有一層隱藏層的簡單的深度神經(jīng)網(wǎng)絡(luò)(DNN)或多層感知機(jī)(MLP)秒梳,盡管上面的例子中只有一層法绵,但是實(shí)際上我們可以有很多層隱藏層進(jìn)行疊加,多層疊加意味著參數(shù)的增加酪碘,這會增加模型的復(fù)雜性和訓(xùn)練的復(fù)雜度朋譬,但不一定能增強(qiáng)效果,因?yàn)榇嬖谶^擬合的情況婆跑。有關(guān)過擬合的嚴(yán)格定義這里不再贅述此熬,簡單地講就是由于參數(shù)過多,對于訓(xùn)練用的數(shù)據(jù)誤差可以非常小滑进,但是對于新的測試數(shù)據(jù)誤差可能很大犀忱,因?yàn)槟P驮谶^多的參數(shù)影響下過于拘泥于訓(xùn)練數(shù)據(jù)了。
前面講到激活函數(shù)并不需要非常復(fù)雜扶关,事實(shí)上阴汇,對于DNN,最簡單且效果最佳的激活函數(shù)是線性整流單元(ReLU):
這個非線性函數(shù)是不是簡單到和線性函數(shù)幾乎沒有區(qū)別节槐?事實(shí)上對于一些簡單的問題這是完全足夠的搀庶,并且它能工作地相當(dāng)好拐纱。
激活函數(shù)還有很多種,比較常見的有ReLU哥倔、Softmax秸架、Sigmoid、Tanh等咆蒿,各有優(yōu)劣东抹,并且對于激活函數(shù)的選取目前還在研究當(dāng)中。
那么如何訓(xùn)練DNN中的參數(shù)呢沃测?前面講過缭黔,DNN的參數(shù)比線性的情況多,中間層可能有很多層蒂破,每層的維度也可能很高馏谨,并且引入了非線性因素,這就使得通過求每個參數(shù)的導(dǎo)數(shù)求精確的極值點(diǎn)的方法是行不通的附迷,只能通過別的方法近似求解惧互。
回顧一下一元函數(shù)導(dǎo)數(shù)的意義,導(dǎo)數(shù)的斜率是一個函數(shù)在該點(diǎn)切線的斜率喇伯,因此導(dǎo)數(shù)指引了函數(shù)的變化壹哺。在多維的情況下,多元函數(shù)對多個參數(shù)的偏導(dǎo)數(shù)組成的向量稱為梯度艘刚。根據(jù)高等數(shù)學(xué)中的定理,函數(shù)在梯度方向上上升最快截珍。這就給我們優(yōu)化參數(shù)提供了思路攀甚,我們總是假設(shè)我們剛開始隨機(jī)出來的初始參數(shù)是處于損失函數(shù)的較高點(diǎn)的,我們每次都使每一個參數(shù)沿著梯度的反方向走一定步長岗喉,這個步長稱為學(xué)習(xí)率(learning rate)秋度,這樣loss就會到達(dá)不同的位置,再次逐一計算钱床,反復(fù)這樣訓(xùn)練荚斯,直到到達(dá)一個比較令人滿意的值為止。