李宏毅機器學習2020筆記(三)深度學習


一、深度學習

1、簡介

 

 

 

不同的連接方法

2、全連接前饋網絡

 1*1+(-1)*(-2)+1=4--->sigmoid--->0.98

 

相當於一個函數,輸入一個向量,輸出一個向量。如果w和b未知,神經網絡就是一個比較大的function set。

 全連接、前饋。輸入層只有data,輸出層是最后一層,中間都稱為隱藏層。

現在基於神經網絡的方法都是深度學習的方法。

 

 常常用矩陣運算來表示神經網絡的運算。

 

  一連串的向量乘以矩陣再加上向量,寫成這樣的好處是可以進行GPU加速(GPU做矩陣運算更快)

 

 輸出層是一個多分類器,將 很多次特征抽取后的比較好的feature 分類,最后一個layer也要加上softmax。

 

3、例子

 輸入256維,輸出10維。

 

多少層?每層幾個?經驗+直覺。

有了深度學習,不需要在影像辨識或是自然語言處理時來做特征抽取,但是麻煩變成了如何設計神經網絡。

不過對於影像辨識或是語音辨識問題,設計網絡結構可能比特征工程更容易,不如讓機器自己去找出好的特征。

 

 計算交叉熵損失,通過調整參數,使得交叉熵越小越好。所有training data的cross entropy相加就是損失函數L,找一組網絡參數最小化L。

 

同樣用梯度下降來優化參數。

  

為什么是deep而不是fat呢?

 

 4、反向傳播

 

 對於高維的vector,為了有效的計算梯度下降的微分,使用反向傳播。反向傳播實際就是使用鏈式法則:

  

 

 下面的推導只考慮一筆data來計算,最后求和即是total loss。

 

 根據鏈式法則,C對w求偏微分,可以拆成z對w和C對z。下面分別看這兩部分:

對於forward pass:w前面接的是什么,微分以后就是什么。

對於backward pass,同樣鏈式法則,sigmoid函數的部分可以直接算.

 

后一部分同樣使用鏈式法則,假設下一層只有兩個神經元,我們得到上圖這樣的式子。

 

 這個式子可以用上圖類似神經網絡的樣子畫出來,σ'(z)可以看做一個常數(直接乘上一個常數畫成三角形)。

 

① 最后剩下的兩項,如果是輸出層,可以直接算出結果,如上例中y1對z'的偏導是sigmoid函數的導數,C對y1的偏導是交叉熵求導。

② 如果不是輸出層,可以按照一模一樣的式子以此類推,直到輸出層。

 

 如上,如果要算backward pass,從z5,z6對C的偏微分開始求,即從輸出層開始計算,接下來可以算z3和z4,再算z1和z2。

 綜上,順推法和逆推法(建立一個反向的神經網絡)結合,這樣就可以更高效地計算出偏微分。

 

5、tips

先檢查training set performance,再檢查overfitting。

 

5.1、梯度消失、ReLU與Maxout

 

激活函數用的不好。sigmoid會造成梯度消失的問題。

使用sigmoid function會發現,deeper 不一定imply better,在訓練集上的結果會壞掉。

訓練集上層數越多反而結果越差,原因在於對於多層的網絡,

靠近輸入的地方對損失函數的微分很小,而靠近輸出的地方微分值很大,

當設定同樣的學習率時,靠近輸入的地方參數更新很慢而靠近輸出的地方參更新很快,

當靠近輸入的地方參數幾乎還是random的時候,output就已經converge(收斂)了。

假設將第一個layer的參數加上△w,會發現,每通過一次sigmoid function,w的變化就衰減一次(把很大的值都壓到0-1之間),

所以當網絡越深,變化的衰減越多,對output的影響很小,對cost的影響也很小,造成了靠近輸入的地方梯度小。

以前的做法是用RBM,一個一個layer來train。

計算比sigmoid更快;生物學原因;無窮多bias不一樣的sigmoid方法疊加;解決梯度消失問題;

 對output是0的neural來說,它們對整個網絡output沒有任何影響,就可以把它們拿掉,

剩下的就是一個很瘦長的linear network,變成了線性網絡以后,就不會出現激活函數遞減的問題了。

但是我們希望神經網絡的function是一個non-linear的,其實這個網絡整體上還是non-linear的,線性與否與input有關。

實做中對ReLU微分,就是0(input<0)或1(input>0),不考慮input=0。

如果在input小於0時,output是0,微分是0,就沒法update參數了。

我們會讓input小於0時,output會有一點點的值,設為0.01或者是個可學習的量。

進一步,可以自動學習激活函數,ReLU只是maxout network一個特例。

首先把value分組(事先決定的),同一個組中選最大值,作為output,。

maxout network也可以做出ReLU能做的事情。

可學習的激活函數:從兩個范圍內選擇大的。

分成的段數取決於一組value的個數。

 max不能微分,應該怎么train?

有些neural不會影響output,所以可以拿掉,得到的是比較細長的線性網絡的參數。

由於不同的input,得到的是不同的network,所以不必擔心有些neural會train不到。

 

5.2、調整學習率RMSProp

 

線性回歸中的優化方法是convex的形狀,而DeepLearning中可能是任何形狀。

RMSProp和adagrad類似,還是包含梯度的平方,但是前面乘上了可調的參數α,表示傾向於新的梯度的程度。

 

5.3、momentum

 

其實在error surface上是沒有太多local minima的,如果要是極小值,在每個維度都要是山谷的谷底,因為有非常多的維度,出現的幾率很低,所以一般的神經網絡沒有太多的極小值。

為了處理一下極小值的問題,可以利用物理上的慣性原理,momentum(沖力、勢頭)。

 

 前一個時間點移動的方向(綠色)和梯度的反方向(紅色)合起來,得到下一步走的方向。

 

 momentum也可以看做過去所有梯度的總和,也就是說,過去的梯度會對現在要走的方向有一定的影響力。

 

 Adam是RMSProp與Momentum的集合

 

5.4、early stop

用驗證集來模擬,找到停下來的位置。

 

5.5、正則化

 L2正則化。

 

化簡可以知道,每次更新參數前都要把參數先乘以(1-ηλ)。

因為是個小於1的數,乘完的結果會越來越靠近0,但是由於后面一項的存在,w不會變成0。

這種使用L2正則化,讓weight逐漸變小的方法,叫做weight decay。

如果有一些weight每次都不去update,就會變得越來越小,最后接近0。

L1每次減掉是一個固定的值,w是正的就減去正的ηλ,負的就加上。如果w有很大的值,下降的速度可能也會和很小的w值一樣。

L1 train出來的結果更sparse,有很多接近0的值也有很大的值。

L2每一次減掉的不同,學習的值平均都比較小,train出來結果會保留很多接近0的值。

 

5.6、dropout

 

train時每次update參數前,都對每個neural做sampling,決定這個neural要不要被丟掉,每個neural有p%的幾率會被丟掉,跟它相連的weight也會被丟掉。

然后再去train得到的比較瘦的network,每次得到的結果會是不一樣的。

在training上使用dropout,會導致結果變差,但這樣訓練出來的參數在testing的時候會更好。

在testing時不能做dropout,所有neural都要用到。

在training時dropout rate是p%,那么在testing時所有weight都要乘以(1-p%)。

 

關於dropout,直觀上的原因如上。以下從集成的角度來解釋:

 

有一個很大的訓練集(bias准,但variance大),每次只sample一部分的data出來,每個model甚至可以結構不同,把所有的到的結果平均。

 

 dropout等於是一個終極的ensemble方式,每次只用一個minibatch的data去train。

不同網絡的參數是共享的,所以不用擔心batch中的data太少train不到好的weight。

由於network太多,實際testing時無法計算每一個的output再平均,運算量太大,一般用圖右的方法。

示例:

 

 

6、why deeper is better?

 

 

類似於模塊化編程的原理,不把所有東西都放在main函數。

 

長發男生的data比較少,所以detect長發男生的classifier就比較weak。

最后的分類器會參考基本分類器的輸出,把第一層當做module,第一層的輸出當做它的輸入。

因此AI並不一定是建立在大數據的基礎上的,正是沒有足夠的bigdata,才需要去做DeepLearning。

 在圖像上往往會用到模塊化表現非常好。

人類語言的結構:一串phoneme(音素)組成的,phoneme是語言學家制定的人類發音的基本單位。

同樣的phoneme可能會有不太一樣的發音,因為人類發音器官的限制,phoneme的發音會受到前后的phone所影響(context有關),因此給同樣的phone不同的model,叫做tri-phone。

一個tri-phone可以拆成幾個state(自己訂),通常拆成3個。

 

在weight phone上取一個window,用acoustic feature描述這個window中的特性,最后得到一個sequence。

在語音辨識的第一階段,就是要決定每個acoustic feature屬於哪個state。

 

DNN火紅之前的做法,HMM-GMM的方式。傳統的方法使用GMM認為,每一個屬於某個state的acoustic feature的分布是靜態的,可以用一個GMM來描述。

由於state太多,一些state共用同樣的模型分布,叫做tied-state。

subspace GMM,先找一個高斯pool,每個state的信息就是一個key,每一個state從pool中挑一些gaussian,這樣有些state share一些gaussian,有些也不share,這種方法也有一些模塊化的意思。

音素之間不是完全無關的,如上圖中展示了人類語言所有母音,所有聲音只受到舌頭前后、上下、嘴型三件事的影響。

對GMM來說,每個state都需要一個高斯分布(很多很小的model),用到的參數與DNN差不多(一個很大的model)。

DNN中所有的state用同一個DNN,更加有效率。

 

DNN在隱藏層把輸入降到二維,用顏色表示五個不同的母音,發現分布和右上的圖幾乎一樣,我們可以得知低層在detect發聲的方法。

所有phone都share同一組detector,這樣就做到了模塊化,更有效地使用參數。

 

任何連續函數都可以用一層的神經網絡來完成,只要這一層夠寬,但是這樣是沒有效率的。

 

類比邏輯電路,設計多層的結構,需要使用更少的邏輯閘。同樣多層的神經網絡會需要比較少的參數,意味着不容易過擬合,並且需要比較少的data。

 

 

 

 類比剪窗花,隱藏層的特征轉換好像把原來的平面對折了一樣。

 

 

 

7、end-to-end learning

 

 

用深度學習的另一個好處是,可以做end-to-end learning。

一個復雜的function由很多簡單的function串連起來,中間的每個function做什么由它自己學習。

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM