數學不行還學AI - 第5話 - 神經網路平話演義(下)

(接上回 -> 數學不行還學AI - 第5話 - 神經網路平話演義(上) - 集智專欄)

含在線運行環境版本 -> 數學不行還學AI - 第5話 - 神經網路平話演義(下) - 集智專欄

權重

之前我們簡單提過權重,這裡深入探討探討。

權重就是神經元之間的連接強度。

在打哪農曆,我們有許多的生物神經元,通過電/化學信號傳遞相連接。但這些連接並非一成不變,隨著時間推移,有的增強,有的減弱。

兩個神經元之間的電-化學信號傳遞越多,連接就越強。本質上,每當你獲得了新的經驗,大腦就會立即重寫自己,通過加強某些神經元之間的連接,對你的記憶、感受、想法進行編碼。

計算機神經網路也是受此啟發而來,我們稱之為人工神經網路(Artificial Neural Network, ANN),常說的「神經網路」其實就是指人工神經網路。ANN並非準確地用方程去描述生物神經,所以不要把ANN看成是對大腦的模擬,非也。生物神經網路(BNN)里,一個神經元並不是與其他所有神經元相連的,而人工神經網路中,一層里的每個神經元通常與下一層的所有神經元相連接。

儘管多有差異,但BNN和ANN還是具有很強可比性的。就像腦中的神經元互聯有強有弱,人工神經網路里的權重定義了神經元之間的連接強度,每個神經元都只是了解一丁點世界,但是組合起來就擁有了綜合的理解。強度高的連接意味著對解決問題有著更高的重要性。

一些TensorFlow神經元可視化可以幫助我們加深理解。

第一個簡單的網路系統共有六層,網路試圖區分右圖裡的藍點和橙點,為此尋找獲得最高區分精度的模式。我還沒有開始訓練這個系統,因此我們看到所有神經元的權重都是一樣的。連線越粗筆哦啊是權重越大,網路經過隨機權重值初始化。

再看80個"epochs"訓練過後的神經網路:

注意最右的圖片,現在已經把中部藍點用藍色區域包圍了,餘下的歸為橙點,可見這個分類是很成功的。也請注意有些神經元之間的權重有著更粗的藍色虛線,說明隨著權重的增長,系統被訓練得可以認識世界了。

訓練我們的網路並進行優化

現在讓我們用模型來搞點動靜,為此需要編譯並設置優化函數。

(完整代碼輸出,及在線開發環境,詳見 -> 數學不行還學AI - 第5話 - 神經網路平話演義(下) - 集智專欄)

我花了很長時間來理解優化函數,因為我發現絕大多數的解釋都重在「是什麼」而忽略了「為什麼」。為什麼我需要優化器?

神經網路有目標預測y,經過訓練之後還會產生一個新的預測y",系統將這新預測與測試集中隨機抽樣進行比較,並衡量驗證準確度。一個系統可能在訓練數據上能達到99%的準確度,但是對測試圖片卻只有70%,所以準確度並不是關鍵,關鍵是驗證準確度。

優化器計算誤差函數對模型權重的梯度(數學上叫偏微分)。

這又是幾個意思?想想一個分布在3D曲面(如下圖)上的權重,也叫「誤差曲面」,其「經緯度」就代表了某種權重的值,而「海拔」對應的是不同權重下的誤差/代價。

優化器就是為為這一重要函數服務的,它指出了如何調整權重以減小誤差,具體原理就是微積分。什麼是微積分?當然從課本上能找到很多沒用的機械解釋,導數啊,微分啊,但這些概念又表示了什麼呢?

我曾經也不知道,直到我讀了Kalid Azad的Calculus Better Explained。以下是所有人都能懂的解釋:

微積分就做兩件事:

  • 化大為小,比如從圓到環
  • 計算變化率

比如我把一個圓分解成環:

再把環都拉直來做一點簡單的計算:

我們做了很多的測試,調整網路的權重,但是我們究竟有沒有更加接近問題的優選方案呢?優化器就是回答這個問題的!

你可以在這裡或者斯坦福課程深入了解梯度下降法,但是你會發現這些材料雖然在細節上面面俱到,卻在「為什麼」的核心問題上一筆帶過。

本質上你要做的就是減少誤差,這就像在霧霾里開車。在本文的早期版本中,我把梯度下降比作是尋找最佳答案的方法,但實際上,「最佳」答案是不是存在都不一定。如果已知其存在,那就可以直接奔著過去了。所以我們只能慢慢地尋找「更佳」,有點類似進化,我們找到了一點更有利於生存的因素,但這可不意味著我們把愛因斯坦給造出來了!

想像自己是個玩「馬可波羅」的孩子,去感受梯度下降。你閉上了眼睛,朋友在為在一個池子外面。你喊「馬可」,其他小孩兒回答「波羅」,你聽聲辨位來判斷自己是靠近還是遠離了他們。如果是遠離了就調整方向,如果接近了就保持前進。這就是調整權重以幫助神經網路認識世界的方式。

我們選擇了這篇文章所述的「亞當」優化器,最終我通過暴力調參獲得了不錯的結果,這就是數據科學的藝術,並沒有統一的演算法知道。如果我更改了網路架構,那麼最好的優化器可能就是另一種了。

這裡是Keras中的優化器。

因為訓練集極小,所以訓練結果跟沒訓練幾乎沒什麼兩樣。而完整數據集上訓練100個epochs之後,可以獲得79%的準確度。

(此為完整數據集訓練結果)100個epochs之後,我們獲得了79%的準確度,相對於這麼少的代碼量來說還算不錯了。或許你不滿足於79%,但是要知道這已經超過2011年ImageNet上的最佳表現了,就這也是經過了整整十年才達到的。而我們所做的只是Keras Github里的實例代碼和略微的調整。!

遲至2012年,新的思路才開始發威。由AI研究者Alex Krizhevsky, Ilya Suskever和Geoffrey Hinton研發的AlexNet,是圖上的第一個橙點,這標誌了當前的深度學習復興。下一年幾乎所有人都在用深度學習了,2014年最優的深度學習架構已經在圖像識別上超越了人類。

即便如此,這些架構也通常只是針對某類問題。今天最火的幾種架構,像[ResNet](raghakot/keras-resnet)和Google的[Inception V3](tensorflow/models)對於小小的CIFAR10圖像也只有88%的準確率,在更大CIFAR100數據集上表現就更差了。

目前業界標杆是DenseNet,2016年贏得了ImageNet競賽,用250層和1530萬個連接,在CIFAR10上獲得了殺手級的94.81%準確率,絕對是當之無愧的怪物。如果使用單個Nvidia GTX1080顯卡,只是運行這個93%準確率的40X12模型就需要一個月!

建議讀者深入了解這些模型,在比較中學習。我做了一些實驗,並且成功的用暴力實驗方法和Keras內置層達到了81.40%的準確率,項目詳情可見於原作者的Github。

可以通過TensorBoard可視化來監控訓練過程:

可見我們的網路很快經過35個epochs達到79%準確率,餘下的時間都用來攀升到81.40%,並且在75個pochs之後很容易過擬合。

所以如何能改進這個模型呢?以下幾個策略可供參考:

  • 加入自己設計的層
  • 進行圖像增強
  • 更深神經網路
  • 調整層級參數
  • 閱讀優秀的架構論文,自己的搭建類似的架構

真正的數據科學藝術,是用自己的大腦去理解數據,在讓模型理解的更好。或許你深入鑽研了CIFAR10然後意識到提高圖像對比度能使特徵更佳明顯,那就去嘗試!

大膽地用Photoshop打開圖片,套幾個濾鏡上去看看有沒有變得更清晰、更犀利,再思考能否用Keras的圖像處理函數完成同樣的工作。深度學習不是魔術彈,需要耐心和沉思才能獲得走上正軌。雖然能力強大,但你可能經常會盯著工作站上的數字直到半夜兩點,然後啥都沒算出來。

但這是獲得突破的必經之路!

這跟神經網路的「試-錯」循環有些相似,做一些嘗試,離答案更進一步;再嘗試點別的,又偏離了答案。我現在正在研究如何用通用模型讓神經網路自動進化,這一前沿領域已經有了很多進展但還遠遠不夠!

終有一天,神經網路的結構會變得越來越簡單易用,只要導入幾個庫和預訓練權重文件就能可以開工了,不過對於IT公司還有很多年的路要走。人工智慧這一領域仍在飛速發展,每天都誕生新的想法,好消息是你已經近水樓台了,所以放心大膽的玩自己的模型吧。

Study. Experiment. Learn.

不會錯的。

(全文完)

推薦閱讀:

深度卷積網路的 BUG 一例:「絕藝」最近被人類棋手找到了一個有趣的缺陷
關於AI的胡說八道
2017 ? AI晶元元年
【教程】專知-PyTorch手把手深度學習教程系列完整版
人工智慧(AI)能幫助市場營銷做什麼,看了這篇行業白皮書你就知道了

TAG:Python | 深度学习DeepLearning | 人工智能 |