李宏毅机器学习总结
人工智能與機(jī)器學(xué)習(xí)與深度學(xué)習(xí)之間的關(guān)系
機(jī)器學(xué)習(xí)的三類任務(wù)
第一類是無(wú)監(jiān)督學(xué)習(xí),指的是從信息出發(fā)自動(dòng)尋找規(guī)律,并將其分成各種類別,有時(shí)也稱"聚類問題"。
第二類是監(jiān)督學(xué)習(xí),監(jiān)督學(xué)習(xí)指的是給歷史一個(gè)標(biāo)簽,運(yùn)用模型預(yù)測(cè)結(jié)果。如有一個(gè)水果,我們根據(jù)水果的形狀和顏色去判斷到底是香蕉還是蘋果,這就是一個(gè)監(jiān)督學(xué)習(xí)的例子。
最后一類為強(qiáng)化學(xué)習(xí),是指可以用來支持人們?nèi)プ鰶Q策和規(guī)劃的一個(gè)學(xué)習(xí)方式,它是對(duì)人的一些動(dòng)作、行為產(chǎn)生獎(jiǎng)勵(lì)的回饋機(jī)制,通過這個(gè)回饋機(jī)制促進(jìn)學(xué)習(xí),這與人類的學(xué)習(xí)相似,所以強(qiáng)化學(xué)習(xí)是目前研究的重要方向之一。
機(jī)器學(xué)習(xí)相關(guān)技術(shù)
誤差
誤差 = 方差 + 偏差 + 噪音 組成,一般來說,隨著模型復(fù)雜度的增加,方差會(huì)逐漸增大,偏差會(huì)逐漸減小
偏差(Bias)
偏差(bias):偏差衡量了模型的預(yù)測(cè)值與實(shí)際值之間的偏離關(guān)系。通常在深度學(xué)習(xí)中,我們每一次訓(xùn)練迭代出來的新模型,都會(huì)拿訓(xùn)練數(shù)據(jù)進(jìn)行預(yù)測(cè),偏差就反應(yīng)在預(yù)測(cè)值與實(shí)際值匹配度上,比如通常在keras運(yùn)行中看到的準(zhǔn)確度為96%,則說明是低偏差;反之,如果準(zhǔn)確度只有70%,則說明是高偏差。
方差(Variance)
方差(variance):方差描述的是訓(xùn)練數(shù)據(jù)在不同迭代階段的訓(xùn)練模型中,預(yù)測(cè)值的變化波動(dòng)情況(或稱之為離散情況)。從數(shù)學(xué)角度看,可以理解為每個(gè)預(yù)測(cè)值與預(yù)測(cè)均值差的平方和的再求平均數(shù)。通常在深度學(xué)習(xí)訓(xùn)練中,初始階段模型復(fù)雜度不高,為低方差;隨著訓(xùn)練量加大,模型逐步擬合訓(xùn)練數(shù)據(jù),復(fù)雜度開始變高,此時(shí)方差會(huì)逐漸變高。
噪聲(Noise)
噪聲的存在是學(xué)習(xí)算法所無(wú)法解決的問題,數(shù)據(jù)的質(zhì)量決定了學(xué)習(xí)的上限。假設(shè)在數(shù)據(jù)已經(jīng)給定的情況下,此時(shí)上限已定,我們要做的就是盡可能的接近這個(gè)上限。
過擬合、欠擬合、恰好
方差的數(shù)學(xué)公式為:E [(h(x) - h(x))2] ,也就是說為每個(gè)預(yù)測(cè)值與預(yù)測(cè)均值差的平方和再求平均數(shù),可以表現(xiàn)為一種波動(dòng)變化,低方差意味低變化,高方差意味高變化。那我們可以通過訓(xùn)練的不同階段來直觀感受方差的變化。
上圖為訓(xùn)練初始階段,我們的模型(藍(lán)線)對(duì)訓(xùn)練數(shù)據(jù)(紅點(diǎn))擬合度很差,是高偏差,但藍(lán)線近似線性組合,其波動(dòng)變化小,套用數(shù)學(xué)公式也可知數(shù)值較小,故為低方差,這個(gè)階段也稱之為欠擬合(underfitting),需要加大訓(xùn)練迭代數(shù)。
上圖為訓(xùn)練的后期階段,可明顯看出模型的擬合度很好,是低偏差,但藍(lán)線的波動(dòng)性非常大,為高方差,這個(gè)階段稱之為過擬合(overfitting),問題很明顯,藍(lán)線模型很適合這套訓(xùn)練數(shù)據(jù),但如果用測(cè)試數(shù)據(jù)來檢驗(yàn)?zāi)P?#xff0c;就會(huì)發(fā)現(xiàn)泛化能力差,準(zhǔn)確度下降。
上圖這個(gè)藍(lán)色模型可認(rèn)為是“恰好”的一個(gè)模型,既能跟訓(xùn)練數(shù)據(jù)擬合,又離完美擬合保持一定距離,模型更具通用性,用測(cè)試數(shù)據(jù)驗(yàn)證會(huì)發(fā)現(xiàn)準(zhǔn)確度也不錯(cuò)。
如何做到恰好
- 加大數(shù)據(jù)量,數(shù)據(jù)越多,自然其泛化能力也越強(qiáng)。但現(xiàn)實(shí)情況我們不能像大公司那樣擁有很多資源,那怎么辦?一種可行的辦法就是根據(jù)已有的數(shù)據(jù)做數(shù)據(jù)增強(qiáng),比如旋轉(zhuǎn)、反轉(zhuǎn)、白增強(qiáng)等操作造出很多數(shù)據(jù);
- 正則化(regularization),通常來說有dropout、L2、L1等正則化手段;
- 提早結(jié)束訓(xùn)練,防止訓(xùn)練過擬合化。
梯度下降(Gradient Descent)
首先來看看梯度下降的一個(gè)直觀的解釋。比如我們?cè)谝蛔笊缴系哪程幬恢?#xff0c;由于我們不知道怎么下山,于是決定走一步算一步,也就是在每走到一個(gè)位置的時(shí)候,求解當(dāng)前位置的梯度,沿著梯度的負(fù)方向,也就是當(dāng)前最陡峭的位置向下走一步,然后繼續(xù)求解當(dāng)前位置梯度,向這一步所在位置沿著最陡峭最易下山的位置走一步。這樣一步步的走下去,一直走到覺得我們已經(jīng)到了山腳。當(dāng)然這樣走下去,有可能我們不能走到山腳,而是到了某一個(gè)局部的山峰低處。
從上面的解釋可以看出,梯度下降不一定能夠找到全局的最優(yōu)解,有可能是一個(gè)局部最優(yōu)解。當(dāng)然,如果損失函數(shù)是凸函數(shù),梯度下降法得到的解就一定是全局最優(yōu)解。
邏輯回歸
Logistic Regression邏輯回歸
Logistic Regression 雖然被稱為回歸,但其實(shí)際上是分類模型,并常用于二分類。Logistic Regression 因其簡(jiǎn)單、可并行化、可解釋強(qiáng)深受工業(yè)界喜愛。
Logistic 回歸的本質(zhì)是:假設(shè)數(shù)據(jù)服從這個(gè)分布,然后使用極大似然估計(jì)做參數(shù)的估計(jì)。
Logistic 分布是一種連續(xù)型的概率分布,其分布函數(shù)和密度函數(shù)分別為:
Logistic 分布是由其位置和尺度參數(shù)定義的連續(xù)分布。Logistic 分布的形狀與正態(tài)分布的形狀相似,但是 Logistic 分布的尾部更長(zhǎng),所以我們可以使用 Logistic 分布來建模比正態(tài)分布具有更長(zhǎng)尾部和更高波峰的數(shù)據(jù)分布。在深度學(xué)習(xí)中常用到的 Sigmoid 函數(shù)就是 Logistic 的分布函數(shù)在
的特殊形式。
深度學(xué)習(xí)的三大步驟
- Step1:神經(jīng)網(wǎng)絡(luò)(Neural network)
- Step2:模型評(píng)估(Goodness of function)
- Step3:選擇最優(yōu)函數(shù)(Pick best function)
深度的理解
Deep = Many hidden layer
反向傳播
反向傳播是為了減小誤差,使得誤差最小的權(quán)重矩陣的值便是神經(jīng)網(wǎng)絡(luò)最終的權(quán)重矩陣。對(duì)于誤差的描述可以采用代價(jià)(誤差)函數(shù)來描述,比如高中學(xué)的:
,其中y(x)是神經(jīng)網(wǎng)絡(luò)的預(yù)測(cè)值,label(x)是x對(duì)應(yīng)的真實(shí)值,可以看出loss是關(guān)于權(quán)重矩陣的多元函數(shù),當(dāng)loss最小時(shí)W的取值,便是神經(jīng)網(wǎng)絡(luò)權(quán)重矩陣最終值。反向傳播的核心算法是梯度下降算法,既然反向傳播是為了使loss最小,使得loss收斂的最快。根據(jù)場(chǎng)論的知識(shí),梯度的方向是函數(shù)值增長(zhǎng)最快的方向,那么梯度的反方向便是函數(shù)值減少最快的方向。基于這一理論,便有了梯度下降法。
1.計(jì)算總誤差
總誤差:(square error)
2.隱含層---->輸出層的權(quán)值更新:即前面的
深度學(xué)習(xí)技巧
Cross Entropy 交叉熵?fù)p失函數(shù)+Sigmoid激活函數(shù)
二分類時(shí)每個(gè)樣本的交叉熵?fù)p失函數(shù)的形式:
輸出層δL的梯度情況:
可以看出,使用交叉熵,得到的的δl梯度表達(dá)式?jīng)]有了σ′(z),梯度為預(yù)測(cè)值和真實(shí)值的差距,這樣求得的Wl,bl的地圖也不包含σ′(z),因此避免了反向傳播收斂速度慢的問題。通常情況下,如果我們使用了sigmoid激活函數(shù),交叉熵?fù)p失函數(shù)肯定比均方差損失函數(shù)好用。
梯度爆炸梯度消失與ReLU激活函數(shù)
在反向傳播的算法過程中,由于我們使用了是矩陣求導(dǎo)的鏈?zhǔn)椒▌t,有一大串連乘,如果連乘的數(shù)字在每層都是小于1的,則梯度越往前乘越小,導(dǎo)致梯度消失,而如果連乘的數(shù)字在每層都是大于1的,則梯度越往前乘越大,導(dǎo)致梯度爆炸。隨著反向傳播算法的進(jìn)行,我們的梯度值隨著層數(shù)越來越小,甚至接近越0,導(dǎo)致梯度幾乎消失,進(jìn)而導(dǎo)致前面的隱藏層的W,b參數(shù)隨著迭代的進(jìn)行,幾乎沒有大的改變,更談不上收斂了。
對(duì)于梯度爆炸,則一般可以通過調(diào)整我們DNN模型中的初始化參數(shù)得以解決。
對(duì)于無(wú)法完美解決的梯度消失問題,目前有很多研究,一個(gè)可能部分解決梯度消失問題的辦法是使用ReLU(Rectified Linear Unit)激活函數(shù),ReLU在卷積神經(jīng)網(wǎng)絡(luò)CNN中得到了廣泛的應(yīng)用,在CNN中梯度消失似乎不再是問題。表達(dá)式為:
也就是說大于等于0則不變,小于0則激活后為0。
tanh
tanh:這個(gè)是sigmoid的變種,表達(dá)式為:
tanh激活函數(shù)和sigmoid激活函數(shù)的關(guān)系為:
tanh和sigmoid對(duì)比主要的特點(diǎn)是它的輸出落在了[-1,1],這樣輸出可以進(jìn)行標(biāo)準(zhǔn)化。同時(shí)tanh的曲線在較大時(shí)變得平坦的幅度沒有sigmoid那么大,這樣求梯度變化值有一些優(yōu)勢(shì)。當(dāng)然,要說tanh一定比sigmoid好倒不一定,還是要具體問題具體分析。
損失函數(shù)與激活函數(shù)總結(jié)
1)如果使用sigmoid激活函數(shù),則交叉熵?fù)p失函數(shù)一般肯定比均方差損失函數(shù)好。
2)如果是DNN用于分類,則一般在輸出層使用softmax激活函數(shù)和對(duì)數(shù)似然損失函數(shù)。
3)ReLU激活函數(shù)對(duì)梯度消失問題有一定程度的解決,尤其是在CNN模型中。
Regularization(正則化)
假如我們的每個(gè)樣本的損失函數(shù)是均方差損失函數(shù),則所有的m個(gè)樣本的損失函數(shù)為:
則加上了L2正則化后的損失函數(shù)是:
其中,λ即我們的正則化超參數(shù),實(shí)際使用時(shí)需要調(diào)參。而w為所有權(quán)重矩陣W的所有列向量。
如果使用上式的損失函數(shù),進(jìn)行反向傳播算法時(shí),流程和沒有正則化的反向傳播算法完全一樣,區(qū)別僅僅在于進(jìn)行梯度下降法時(shí),W的更新公式。
不加正則化W的梯度下降更新公式為:
加入L2正則化以后,迭代更新公式變成:
注意到上式中的梯度計(jì)算中1/m忽略了,因?yàn)棣潦浅?shù),而除以m也是常數(shù),所以等同于用了新常數(shù)α來代替α/m。進(jìn)而簡(jiǎn)化表達(dá)式,但是不影響損失算法。
集成學(xué)習(xí)(ensemble)正則化
常用的機(jī)器學(xué)習(xí)Bagging算法中,隨機(jī)森林是最流行的。它 通過隨機(jī)采樣構(gòu)建若干個(gè)相互獨(dú)立的弱決策樹學(xué)習(xí)器,最后采用加權(quán)平均法或者投票法決定集成的輸出。在DNN中,我們一樣使用Bagging的思路。不過和隨機(jī)森林不同的是,我們這里不是若干個(gè)決策樹,而是若干個(gè)DNN的網(wǎng)絡(luò)。
首先我們要對(duì)原始的m個(gè)訓(xùn)練樣本進(jìn)行有放回隨機(jī)采樣,構(gòu)建N組m個(gè)樣本的數(shù)據(jù)集,然后分別用這N組數(shù)據(jù)集去訓(xùn)練我們的DNN。即采用我們的前向傳播算法和反向傳播算法得到N個(gè)DNN模型的W,bW,b參數(shù)組合,最后對(duì)N個(gè)DNN模型的輸出用加權(quán)平均法或者投票法決定最終輸出。
不過用集成學(xué)習(xí)Bagging的方法有一個(gè)問題,就是我們的DNN模型本來就比較復(fù)雜,參數(shù)很多。現(xiàn)在又變成了N個(gè)DNN模型,這樣參數(shù)又增加了N倍,從而導(dǎo)致訓(xùn)練這樣的網(wǎng)絡(luò)要花更加多的時(shí)間和空間。因此一般N的個(gè)數(shù)不能太多,比如5-10個(gè)就可以了。
Dropout正則化(特殊的集成學(xué)習(xí))
Dropout指的是在用前向傳播算法和反向傳播算法訓(xùn)練DNN模型時(shí),一批數(shù)據(jù)迭代時(shí),隨機(jī)的從全連接DNN網(wǎng)絡(luò)中去掉一部分隱藏層的神經(jīng)元。在對(duì)訓(xùn)練集中的一批數(shù)據(jù)進(jìn)行訓(xùn)練時(shí),我們隨機(jī)去掉一部分隱藏層的神經(jīng)元,并用去掉隱藏層的神經(jīng)元的網(wǎng)絡(luò)來擬合我們的一批訓(xùn)練數(shù)據(jù)。然后用這個(gè)去掉隱藏層的神經(jīng)元的網(wǎng)絡(luò)來進(jìn)行一輪迭代,更新所有的W,b。這就是所謂的dropout。
當(dāng)然,dropout并不意味著這些神經(jīng)元永遠(yuǎn)的消失了。在下一批數(shù)據(jù)迭代前,我們會(huì)把DNN模型恢復(fù)成最初的全連接模型,然后再用隨機(jī)的方法去掉部分隱藏層的神經(jīng)元,接著去迭代更新W,b。當(dāng)然,這次用隨機(jī)的方法去掉部分隱藏層后的殘缺DNN網(wǎng)絡(luò)和上次的殘缺DNN網(wǎng)絡(luò)并不相同。
總結(jié)下dropout的方法: 每輪梯度下降迭代時(shí),它需要將訓(xùn)練數(shù)據(jù)分成若干批,然后分批進(jìn)行迭代,每批數(shù)據(jù)迭代時(shí),需要將原始的DNN模型隨機(jī)去掉部分隱藏層的神經(jīng)元,用殘缺的DNN模型來迭代更新W,b。每批數(shù)據(jù)迭代更新完畢后,要將殘缺的DNN模型恢復(fù)成原始的DNN模型。
使用基于dropout的正則化比基于bagging的正則化簡(jiǎn)單,這顯而易見,由于dropout會(huì)將原始數(shù)據(jù)分批迭代,因此原始數(shù)據(jù)集最好較大,否則模型可能會(huì)欠擬合。
增強(qiáng)數(shù)據(jù)集正則化
對(duì)于我們傳統(tǒng)的機(jī)器學(xué)習(xí)分類回歸方法,增強(qiáng)數(shù)據(jù)集還是很難的。你無(wú)中生有出一組特征輸入,卻很難知道對(duì)應(yīng)的特征輸出是什么。但是對(duì)于DNN擅長(zhǎng)的領(lǐng)域,比如圖像識(shí)別,語(yǔ)音識(shí)別等則是有辦法的。以圖像識(shí)別領(lǐng)域?yàn)槔?#xff0c;對(duì)于原始的數(shù)據(jù)集中的圖像,我們可以將原始圖像稍微的平移或者旋轉(zhuǎn)一點(diǎn)點(diǎn),則得到了一個(gè)新的圖像。雖然這是一個(gè)新的圖像,即樣本的特征是新的,但是我們知道對(duì)應(yīng)的特征輸出和之前未平移旋轉(zhuǎn)的圖像是一樣的。
我們現(xiàn)在得到了一個(gè)新的訓(xùn)練樣本,輸入特征和之前的訓(xùn)練樣本不同,但是特征輸出是一樣的,用類似的思路,我們可以對(duì)原始的數(shù)據(jù)集進(jìn)行增強(qiáng),進(jìn)而得到增強(qiáng)DNN模型的泛化能力的目的。
CNN的基本結(jié)構(gòu)
圖中是一個(gè)圖形識(shí)別的CNN模型。可以看出最左邊的船的圖像就是我們的輸入層,計(jì)算機(jī)理解為輸入若干個(gè)矩陣,這點(diǎn)和DNN基本相同。
接著是卷積層(Convolution Layer),這個(gè)是CNN特有的。卷積層的激活函數(shù)使用的是ReLU。我們?cè)贒NN中介紹過ReLU的激活函數(shù),它其實(shí)很簡(jiǎn)單,就是ReLU(x)=max(0,x)。在卷積層后面是池化層(Pooling layer),這個(gè)也是CNN特有的,我們后面也會(huì)專門來講。需要注意的是,池化層沒有激活函數(shù)。
卷積層+池化層的組合可以在隱藏層出現(xiàn)很多次,上圖中出現(xiàn)兩次。而實(shí)際上這個(gè)次數(shù)是根據(jù)模型的需要而來的。當(dāng)然我們也可以靈活使用使用卷積層+卷積層,或者卷積層+卷積層+池化層的組合,這些在構(gòu)建模型的時(shí)候沒有限制。但是最常見的CNN都是若干卷積層+池化層的組合,如上圖中的CNN結(jié)構(gòu)。
在若干卷積層+池化層后面是全連接層(Fully Connected Layer, 簡(jiǎn)稱FC),全連接層其實(shí)就是我們前面講的DNN結(jié)構(gòu),只是輸出層使用了Softmax激活函數(shù)來做圖像識(shí)別的分類,這點(diǎn)我們?cè)贒NN中也有講述。
從上面CNN的模型描述可以看出,CNN相對(duì)于DNN,比較特殊的是卷積層和池化層,如果我們熟悉DNN,只要把卷積層和池化層的原理搞清楚了,那么搞清楚CNN就容易很多了。
CNN中的卷積層
對(duì)圖像卷積其實(shí)就是對(duì)輸入的圖像的不同局部的矩陣和卷積核矩陣各個(gè)位置的元素相乘,然后相加得到。
舉個(gè)例子如下,圖中的輸入是一個(gè)二維的3x4的矩陣,而卷積核是一個(gè)2x2的矩陣。這里我們假設(shè)卷積是一次移動(dòng)一個(gè)像素來卷積的,那么首先我們對(duì)輸入的左上角2x2局部和卷積核卷積,即各個(gè)位置的元素相乘再相加,得到的輸出矩陣S的S00的元素,值為aw+bx+ey+fz。接著我們將輸入的局部向右平移一個(gè)像素,現(xiàn)在是(b,c,f,g)四個(gè)元素構(gòu)成的矩陣和卷積核來卷積,這樣我們得到了輸出矩陣S的S01的元素,同樣的方法,我們可以得到輸出矩陣S的S02,S10,S11,S12的元素。
最終我們得到卷積輸出的矩陣為一個(gè)2x3的矩陣S。
CNN中的池化層
相比卷積層的復(fù)雜,池化層則要簡(jiǎn)單的多,所謂的池化,個(gè)人理解就是對(duì)輸入張量的各個(gè)子矩陣進(jìn)行壓縮。假如是2x2的池化,那么就將子矩陣的每2x2個(gè)元素變成一個(gè)元素,如果是3x3的池化,那么就將子矩陣的每3x3個(gè)元素變成一個(gè)元素,這樣輸入矩陣的維度就變小了。要想將輸入子矩陣的每nxn個(gè)元素變成一個(gè)元素,那么需要一個(gè)池化標(biāo)準(zhǔn)。常見的池化標(biāo)準(zhǔn)有2個(gè),MAX或者是Average。即取對(duì)應(yīng)區(qū)域的最大值或者平均值作為池化后的元素值。
下面這個(gè)例子采用取最大值的池化方法。同時(shí)采用的是2x2的池化,步幅為2,首先對(duì)紅色2x2區(qū)域進(jìn)行池化,由于此2x2區(qū)域的最大值為6.那么對(duì)應(yīng)的池化輸出位置的值為6,由于步幅為2,此時(shí)移動(dòng)到綠色的位置去進(jìn)行池化,輸出的最大值為8.同樣的方法,可以得到黃色區(qū)域和藍(lán)色區(qū)域的輸出值。最終,我們的輸入4x4的矩陣在池化后變成了2x2的矩陣。進(jìn)行了壓縮。
總結(jié)
- 上一篇: 李宏毅机器学习Regression
- 下一篇: autoCAD编辑图案填充