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