一、深度學習
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做什么由它自己學習。