武功再高,也怕菜刀。
當我們的模型主體結(jié)構(gòu)確定了之后,或者說我們由于數(shù)據(jù)量等現(xiàn)實問題已經(jīng)無法再提已有模型的能力,我們可以使用很多簡單的優(yōu)化算法,把我們現(xiàn)在的數(shù)據(jù)模型的能力大幅提高。這一部分我們會分別介紹多層網(wǎng)絡,激活函數(shù),損失函數(shù),梯度下降,反向傳播,動態(tài)學習率以及具體的實現(xiàn)
多層網(wǎng)絡
首先我們在第一章就討論了深度學習的驚人效果,所以首先我們要做的就是要把上一張的模型變成神經(jīng)網(wǎng)絡結(jié)構(gòu),即在輸入層和輸出層之間加入隱藏層。

隱藏層可以包含很多層,上一層的處理結(jié)果又是下一次的輸入值,經(jīng)過每一層的處理最終得到輸出結(jié)果??梢岳斫鉃槊恳粚游覀兺ㄟ^參數(shù)的設置,把上一層的處理結(jié)果抽象成更高級的特征。
層數(shù)越深越好?
隨著隱藏層的層數(shù)越來越多,我們最終結(jié)果的準確率也會提升。然而隨著深度越來越深,我們發(fā)現(xiàn)了這些問題:
1. 過擬合(Overfitting) 原因是隨著層數(shù)的增多,對正確結(jié)果有影響的“噪音”也和真正所需的特征一起被放大,抽象。這就導致了我們所訓練的模型對于訓練集數(shù)據(jù)可以高度的匹配,但是不具備普遍實用性,所以這樣的模型會在測試集上表現(xiàn)不盡人意。

如圖所示,第一種是擬合不足,導致模型在訓練集和測試集上都沒有好的表現(xiàn);恰當?shù)臄M合如圖二,則會在訓練集和測試集上都有比較好的結(jié)果;圖三則是過擬合,它在訓練集上過度的擬合,雖然可以在訓練集上取得很高的準確率,卻會在測試集上獲得較低的訓練集。
對于如何在深度網(wǎng)絡中解決過擬合的問題,我們會專門開一章講解,有很多有趣的想法。
2. 梯度消失(Gradient Vanishing Problem)
梯度消失是指在神經(jīng)網(wǎng)絡訓練過程中,權重更新的梯度消失,也就是權重參數(shù)無法再通過訓練更新?,F(xiàn)在對于梯度的修正方法也很多了,我們會在后面的講解中帶出。其中一個簡單實用的就是使用非線性激活函數(shù)。
3. 梯度爆炸(Gradient Exploding Problem)
和梯度消失相反,梯度爆炸是指在神經(jīng)網(wǎng)絡訓練過程中,權重更新的梯度變大,使得權重多次以大于1的倍數(shù)迭代更新。我們也會在后面的講解中提出解決方案。
激活函數(shù)
簡單概括,激活函數(shù)是用來實現(xiàn)函數(shù)的去線性化。想象一下你用一堆直線想要畫出一個圓,就必須用無數(shù)的直線一點點修正。但是如果你可以話曲線就可以一次性解決問題。如果沒有激活函數(shù),所有的輸入和輸出其實都是線性關系,這就像用直線畫圓一樣,同樣的訓練成本下只能實現(xiàn)粗糙的效果。

sigmoid是最為普遍的激活函數(shù),但是現(xiàn)在在我們的實際應用中已經(jīng)很少使用了,一個重要的原因就是它在深層網(wǎng)絡中容易引起梯度消失,所以我們一般在隱藏層中使用ReLU作為激活函數(shù)。但是使用ReLU我們一樣有需要注意的是學習率的設定,因為從它的特征我們也能發(fā)現(xiàn),它很容易造成死神經(jīng)元,也就是所有神經(jīng)元的輸入經(jīng)過激活后變成了0。所以我們也可以使用Leaky ReLU替代。
具體使用什么樣的激活函數(shù)其實和我們所訓練的數(shù)據(jù)以及模型有關,大家在實踐中發(fā)現(xiàn)模型有問題發(fā)生在激活函數(shù)前后時,可以嘗試其他的激活函數(shù)。
損失函數(shù)
我們訓練神經(jīng)網(wǎng)絡的最終目的就是最小化我們的損失函數(shù),所以損失函數(shù)即我們用來衡量模型好壞的標準。正如我們前面提到的,不同的模型有著目的所以一般有著不一樣的損失函數(shù)。但是我們也有著一些通用的評判方法,比如交叉熵函數(shù)(Cross Entropy)。p表示真實標記的分布,q則為訓練后的模型的預測標記分布,交叉熵損失函數(shù)可以衡量p與q的相似性。

自定義損失函數(shù)
我們當然可以根據(jù)實際需要自定義損失函數(shù)。比如我是一個銷售商,我進貨時需要考慮我能賣多少。假如一件商品的成本是1,利潤是2,那么我多進貨一個,損失是1,但是少進一個就會損失2,所以我的損失函數(shù)就會變成
loss = sum(f(x, y))
f(x, y) = 1 * (x - y) 如果x > y
f(x, y) = 2 * (y - x) 如果y > x
這些都是我們在實際應用中必然會使用的方法,每一項都可以展開說很多內(nèi)容,我們在這里先進行簡單介紹,等我們在操作中遇到時會繼續(xù)展開。有興趣的同學們可以自己去搜索一下相關知識。
另外歡迎大家關注留言,我們的更新可以及時推送,一起學習吧騷年們~