0
雷鋒網按:本文作者 Kaiser,景略集智總經理,原文載于集智網專欄,雷鋒網已獲授權。
之前介紹了卷積提取邊緣特征的基本原理,但這還遠遠不足以從圖片中識別出奶罩,因為并不是所有奶罩都像柏木由紀的那么簡單樸實,而是存在很多種不同的款式,這不是單從邊緣就能識別出來的。


要提取如此復雜的特征,需要很多不同的卷積核。巧婦難為無米之炊,沒有足量的訓練樣本,再好的卷積也出不來。訓練樣本當然是越多越好,有道是“熟識奶罩三百款,不會解扣也會穿”。人工神經網絡雖然不具備真正的人格,但有一點卻是相通的,那就是“貪”。

但不管是訓練樣本的累積,還是計算能力的上限,資源總是有限的。所以我們始終只能從有限多個樣本中,提取一小撮特征,這是一個以有涯求無涯的過程。
訓練樣本不足就會產生一個問題,叫作“少見多怪”。比如我們看上面幾張圖里的奶罩,大多是有肩帶的,那么自然地,神經網絡會把“肩帶”當作一個特征。
如果一個物體沒有類似肩帶的結構,被認作奶罩的概率便會下降。

引入過多不必要的特征,導致模型泛化能力(Generalization)下降,這一問題叫作“過擬合”(Overfitting)。比如下圖,坐標上有10個點,藍色擬合曲線逐一穿過,看起來像一個完美的擬合,似乎我們已經看透了這一分布規律的本質。

但是如果有第11個點,它真的會繼續落在藍線上嗎?而且一旦沒有,那么擬合曲線就面臨嚴重的威脅,需要很大的調整才能滿足“穿過所有點”。如果有第12個點呢?
這種過擬合的預測對于新數據的作用有限,實際上一個比較穩妥的擬合是線性關系,我們有很大把握預測,第11個乃至以后的數據,都會落在藍色直線附近。

過擬合就好比背過了歷年的考試題(包括所有數字),但是一見到新題目(數字變了)就不會做了。以前有個傻子賣咸鴨蛋的小品,里面傻子說“五毛錢倆,一塊錢不賣”,這就是鉆進了“五毛錢倆”的牛角尖而產生的笑話。過擬合的神經網絡,就像一個認死理的人,實則是愚癡的。

所幸,人工智能還沒有發展出情態,否則恐怕就“貪、嗔、癡”三毒俱全了。我想,如果真的有那一天,機器人也會發展出宗教吧(遁入智瞳)。
反過來的情況叫“欠擬合”(Underfitting),就是沒有學習到真正的規律,聽風就是雨。比如下圖這個把眼罩當成奶罩的慘案,買家確實沒有把“肩帶”當作特征,“形狀”也確實有點類似,但是她把最基本的“大小”因素忽略了。

在實際應用當中,“過擬合”是更加常見的問題。
如何遏制過擬合?方法有很多,比如 L1、L2 正則化(Regularization)是在代價函數(Cost Function)上動手腳。
本文要介紹的方法,叫作Dropout。其原意是輟學,中文資料里基本也都保留了原詞,“脫掉”是我自己想的翻譯。你問我怎么想的,我也不知道,只是管不住我這手。
Dropout不修改代價函數,而是直接調整神經網絡的結構,是一種更加徹底的革命。
人工神經元都是與特征相關的,而有的特征(比如肩帶)會造成過擬合。那么只要脫掉肩帶所對應的的神經元,不就可以避免了嗎?
理是這么個理,但是我們并不知道,具體哪些神經元對應哪些特征。如果我們都知道的話,也就不用訓練了,直接求解就行了。
考慮下面這個簡單的神經網絡,其隱藏層(中間那層)有6個神經元。神經元與特征并非一一對應的,可能3個神經元共同表征1個特征,比如從上數第2、3、5個。假設我們拋掉了這三個神經元,用其余的網絡進行計算,就可以在一定程度上降低過擬合。
實際上這里的[2, 3, 5]只是猜測,我們要做的是,把所有能脫掉的3神經元組合,全都脫一遍,對剩余部分分別進行計算,最后再求平均。誠然,每一個經過Dropout的不完整神經網絡,還是有可能過擬合,但是各自的過擬合情況是不同的,通過求平均就可以抵消。

本質上,Dropout消解了神經網絡對某一部分神經元的依賴性。6個神經元dropout其中3個,此時dropout率即是 0.5。
實踐是檢驗罩杯的唯一標準,但是對于廣大新手而言,直接處理彩色圖片的難度還是偏高,而且本站的計算能力暫時還很有限。所以這里改用手寫數字識別項目作為案例,搭建簡單的卷積神經網絡,并且對比Dropout的效果。
該項目是Kaggle的入門級比賽,且用到了著名的MNIST手寫數字數據集。MNIST可謂是深度學習界的Hello World。
首先導入依賴庫和數據集,并進行預處理,以便神經網絡模型使用。
此為靜態代碼展示,在線編輯->運行Python代碼,搭建神經網絡,請訪問:鏈接。

然后構建、訓練模型。這里采用一個最簡單的卷積神經網絡結構:
卷積層(8個5x5卷積核,ReLU激活函數)
池化層(2x2最大池化)
全連接層(16個神經元,ReLU激活函數)
輸出層(10個神經元,SoftMax激活函數)
為節省計算開銷和減少等待時間,訓練的迭代次數已設為1,所以得到的各項結果參數當然偏低,這并非所用的方法有問題。

無Dropout,驗證精度為: 0.6090
作為對比,我們搭建另外一個架構類似、但包含Dropout層的神經網絡。Dropout的位置是最大池化層之后、全連接層之前。
此處代碼留空,請訪問鏈接, 完成在線練習。

如果正確地添加了Dropout,則得到的驗證精度(val_acc)應為0.7390。而其他的指數,如訓練精度(acc)卻大致相等。可見,Dropout的作用是消解過擬合,提高模型泛化能力。
PS. 如果要給本文配一個BGM,我希望是杜德偉的《脫掉》。
雷鋒網相關閱讀:
TensorFlow & 神經網絡算法高級應用班” 要開課啦!
從初級到高級,理論 + 實戰,一站式深度了解 TensorFlow!
本課程面向深度學習開發者,講授如何利用 TensorFlow 解決圖像識別、文本分析等具體問題。課程跨度為 10 周,將從 TensorFlow 的原理與基礎實戰技巧開始,一步步教授學員如何在 TensorFlow 上搭建 CNN、自編碼、RNN、GAN 等模型,并最終掌握一整套基于 TensorFlow 做深度學習開發的專業技能。
兩名授課老師佟達、白發川身為 ThoughtWorks 的資深技術專家,具有豐富的大數據平臺搭建、深度學習系統開發項目經驗。
時間:每周二、四晚 20:00-21:00
開課時長:總學時 20 小時,分 10 周完成,每周 2 次,每次 1 小時
線上授課地址:http://www.mooc.ai/
雷鋒網相關閱讀:
雷峰網版權文章,未經授權禁止轉載。詳情見轉載須知。