本書自出版以來收到眾多好評,因為是 Keras 作者寫的書,所以全書基本圍繞著 Keras 講深度學習的各種實現,從 CNN,RNN到GAN等等,總體偏入門,但也承載著很多作者對深度學習整體性的思考。值得一提的是作者推薦用GPU 跑書中的例子,這不是開玩笑, 用CPU 跑你會感到很絕望的~
本書代碼都放在作者的 [Github]上,基本與書中內容一致,當然很多內容的解釋在書中會更詳細一些。Keras 的文檔很全,對新手也比較友好,所以很多人覺得看文檔就行,沒必要看書,其實書和文檔各有優缺點。
書最大的優點是框架性,能提供一個“整體視角”,讓讀者在腦中建立一個完整的地圖,知道哪些常用哪些不常用,再據此針對性地查漏補缺就比較方便了,而如果直接查文檔面對海量的API往往會無所適從。然而書因為要照顧整體性,必然會拋棄一些與主旨無關的內容或細節,而這正是文檔的優點,可以把所有內容都囊括進來,不需要太考慮整體可讀性。而且查文檔有種探寶的意味,時常不經意間發現了一個神奇的功能居然被實現了。
全書分為兩大部分,第一部分是對于深度學習的全局介紹,包括其與人工智能、機器學習的關系,一些相關的基本概念如張量(tensor)、梯度下降、神經網絡、反向傳播算法等等。其中第三章舉了三個簡單的例子,分別對應的任務是二分類、多分類和回歸,讓讀者快速了解 Keras 的基本使用方法,熟悉使用深度學習處理數據問題的典型流程。
這里插一句,對于入門這個領域一直存在著兩種聲音: 一種是top-down式,從實踐入手,講究先沉浸在實際的項目中,再回到理論;另一種是bottom-up式,典型的學習方式是先學習各類書和課程,從理論和數學入手,再到實踐。本書作者 Fran?ois Chollet 是堅定的 top-down 派,記得之前網上看過一篇文章就是講作者和其他業界大佬撕逼哪種方式好。。。 作者在一個訪談中也提到:
對于那些在 MOOC(Udacity, Coursera, edx, MIT Opencourseware)或者書上自學機器學習/深度學習的人,你有什么建議?
Fran?ois Chollet:我認為學習機器學習的最好方法是:
首先,清楚地理解關鍵算法是怎樣起作用的,試著自己在 Numpy 中重新實現一個有趣的例子(Numpy 卷積網絡、Numpy 多層感知器, Numpy LSTM)。
熟悉實際應用,看看 Keras repo 提供的 Keras 實例。嘗試著修改它們,使得它們適應新的數據,并調整模型的結構直到你得到了在你的問題上所能得到的最好結果。
通過 Kaggle 競賽獲得一種做研究和在現實生活中應用數據科學的感覺。
最后,你可以開始閱讀理論書籍(例如 Goodfellow, Bengio 和 Courville 的深度學習書籍)和論文來深化對于你正在進行的工作的更加抽象和數學的理解。
可見作者很推崇在 kaggle 中實際應用所學到的東西,書中寫到:
The only real way to learn is through practice and actual coding—that’s the philosophy of this book, and Kaggle competitions are the natural continuation of this.
書的第二部分難度進一步增加,主要是關于深度學習在計算機視覺和自然語言處理中的實際應用,主角自然是經典的卷積神經網絡和循環神經網絡,另外第8章浮光掠影般講了 VAE 和 GAN,但限于篇幅其實有種意猶未盡的感覺。
接下來說一下每章中的主要內容和一些比較有意思的點。
第一章主要說的就是“什么是深度學習?”。 著名的三環圖,人工智能、機器學習、深度學習三者的關系:
作者提到機器學習與統計學頗有淵源,但二者的不同之處在于機器學習往往需要處理海量高維數據,而很多傳統的統計分析方法只適用于小數據。另外,機器學習尤其是深度學習,是工程導向的,具有”應用倒逼理論“的特點,其理論體系還沒有完整建立起來,因而需要不斷地動手實驗來驗證各種想法。這其實與現在很多觀點認為深度學習像“煉丹術” 不謀而合,結合上文中作者的top-down派,這一點也不足為奇。
李航的《統計學習方法》中提到機器學習的三大要素:模型+策略+算法。第一章的這張圖是對此理念的完美體現:
模型是事先定義好的神經網絡架構,深度學習的模型中一般有著上百萬個的權重(weights),這些權重決定了輸入數據X后模型會輸出什么樣的預測結果Y‘,而所謂的“學習”就是尋找合適的權重使得預測結果和真實目標盡可能接近。而說道接近就涉及到了如何度量兩個值的接近程度,這就是策略要做的事情,其實就是定義合適的目標函數(損失函數)。目標函數以真實目標Y和預測結果Y'作為輸入,輸出一個損失值(loss score)作為反饋信號來更新權重以減少這個損失值,而具體實現這一步驟的就是算法,即上圖中的優化器(optimizer),優化器的典型例子就是梯度下降以及其各種變種。
所以這張圖清晰地描繪了神經網絡整個的訓練過程,開始時權重被初始化為一些隨機值,所以其預測結果和真實目標Y相差較大,進而損失值也會很大。隨著優化器不斷地更新權重,使得損失值也會越來越小,最后當損失值不再減少時我們就得到了一個訓練好的神經網絡。
Keras的設計基本上也是按照這個思路,先定義整個網絡,具體表現為加各種各樣的層(layer),再指定相應的損失函數和優化器,就可以開始訓練了。在另外一頁作者說可以把層(layers)想象成深度學習的樂高積木,那么是時候祭出這張圖了:
第二章講了一些基本概念,Keras的基本用法,張量,矩陣運算,隨機梯度下降等等,有意思的是作者說根據其多年經驗,對于一些數學概念使用Numpy代碼片段更易被擅長編程的人所接受,所以通篇都是像下圖這么解釋的(這里解釋的是relu激活函數),然而我覺得這明顯不如數學公式直觀。
第三章提供了三個簡單的例子以讓讀者快速上手Keras,分別為IMDB電影數據集的情感分析、新聞主題分類和房價預測,這三個例子對應了二分類、多分類和回歸這三個機器學習中最常遇到的問題。雖然都是比較簡單的例子,但麻雀雖小卻也五臟俱全,書中依然對各種可能碰到的問題做了比較詳盡的闡述,比如如何將數據預處理成適合神經網絡的輸入,如何定義神經網絡層,如何標準化數據,如何處理過擬合和欠擬合等等。而在這之前,作者簡要介紹了Keras。
Keras是一個基于Python的深度學習框架,最大的特點是易用性,近年來增長勢頭迅猛,在Kaggle上也非常流行,我印象中幾個比賽前幾名的Solution如果是神經網絡的話基本都用了Keras。
關于 Keras 在 Kaggle 上流行的原因,作者在一篇采訪中說:
在機器學習競賽中,這些獲勝者很少是從一開始就想出了最好的想法,然后簡單地部署它,提交結果,最后很快忘了這回事。開發一個好的模型需要對最初的想法進行多次迭代,直到時間到了;你總是能進一步改進你的模型。最終的模型與你最初嘗試解決這個問題時所設想的方案幾乎沒有任何共同點,因為一個事先想好的方案基本上從來不會在現實試驗中存活下來。所以贏不是說你最初的理論構想有多棒,而在于你的設想有多少能通過現實的考驗。你不會輸給比你更聰明的人,你會輸給那些比你重復更多實驗的人,他們一點點精化他們的模型。如果你把 Kaggle 上的團隊按照實驗的次數排名,我保證你會發現試驗次數排名與最后的競爭排行榜有很強的關聯。
Keras 被設計作為一種可快速構建許多不同模型的原型的方法,其關注的重點是盡可能減少從想法到實驗結果驗證之間所需的時間。Keras API 和工作流程基本上可以減少設置新實驗的開銷(overhead)(代碼開銷和認知開銷)。所以使用 Keras 讓你可以更快地迭代,嘗試更多事物。最終,這能讓你贏得比賽(或發表論文)。能夠以最小的延遲將想法變成結果對實現好的研究來說是很關鍵的——這是 Keras 背后的核心信念之一。
Keras中包含了兩種定義模型的方法:Sequential模型和Functional模型。Sequential模型是多個網絡層的線性堆疊,而Functional模型則使得用戶可以定義多輸出模型、非循環有向模型或具有共享層的模型等復雜模型。Functional模型具有很高的靈活性,而Sequential模型可以看做其一個特例。本書前半部分都是用Sequential模型,后半部分高級內容會使用Functional模型。
第四章比較理論化,介紹了機器學習的方方面面:監督學習、無監督學習、強化學習的概念,如何評估模型,特征工程,如何處理過擬合等等。這其中令我印象最深刻的點是講到 dropout 是一種神經網絡中常用的正則化方法,作者提到 Geoffrey Hinton 是受到了銀行中欺詐預防的啟發,大牛的腦洞就是不一樣啊~ Hinton說:
我去銀行的時候經常發現柜員一直在換,我詢問了這么做的原因,但卻沒人知道。后來我想明白了,如果想要成功地進行銀行欺詐往往需要內部員工的配合,這使我意識到如果對每個樣本隨機丟棄一部分不同的神經元,這樣就能阻止“陰謀”的發生,進而減少過擬合。
這里的意思是dropout相當于對每一層的輸出值添加了噪聲,將一些不重要的偶然模式剔除,這等于減少了”陰謀“ 的發生。如果不剔除的話神經網絡會開始記憶這些偶然模式,進而容易過擬合。
關于drouput為什么效果好,基本上沒有數學上的證明,因而誕生了很多直覺上的解釋(比如上文中Hinton的)。在《Hands On Machine Learning with Scikit Learn and TensorFlow》中,作者闡述了另一種有趣的解釋:
如果一個公司的員工每天早上都是扔硬幣決定今天去不去上班,那么這個公司會運作良好嗎?這并非沒有可能,這意味著任何重要的工作都會有替代者,不會只依賴于某一個人。同樣員工也會學會和公司內各種不同的人合作,而不是每天面對固定的人,每個員工的能力也會得到提升。這個想法雖然不見得適用于企業管理,但卻絕對適用于神經網絡。在進行dropout后,一個神經元不得不與隨機挑選出來的其他神經單元共同工作,而不是原先一些固定的周邊神經元。這樣經過幾輪訓練這些神經元的個體表現力大大增強,同時也減弱了神經元節點間的聯合適應性,增強了泛化能力。
臺大的李宏毅老師也貢獻了一個直覺解釋,見下圖:
我們知道通常是在訓練神經網絡的時候使用 dropout,這樣會降低神經網絡的擬合能力,而在預測的時候則關閉 dropout。這就好像在練輕功的時候在腳上綁著很多重物,但是在真正和別人打的時候會把重物全拿走,這樣就會一下子變得很強2333 。
從第五章開始,本書進入第二部分,開始從宏觀轉向具體的問題。第五章和第六章談了深度學習的兩大主力:卷積神經網絡和循環神經網絡分別在圖像和文本領域的應用。因為這里的重點是實戰,所以里面談到的原理大致有個直覺上的認識就行了(比如下面分別是是書中卷積和循環神經網絡的圖示),如果想要深入的話還是得找 《Deep Learning》。
第七章講了Keras的一些高級應用。其中的重點是Functional模型,其使得用戶能像函數一樣操作層(layer),并通過一個 tensor 來調用它。這增加了靈活性,從而一些比較復雜的網絡也不再是問題。比如下圖中的問答模型是一個典型的多輸入模型:
或者像構建Inception這樣的有向無環圖:
本章最后作者提到了一個集成方法,用樹模型和深度神經網絡做Ensemble很多時候能取得不錯的效果。他在2014年Kaggle上的Higgs Boson比賽中獲得了第4名,使用的就是多種樹模型和深度神經網絡的融合。Ensemble的真諦在于模型多樣性,幾個準確率最高但多樣性不足的模型做Ensemble可能還不如用幾個多樣性高但準確率低一點的模型。
于是,我順便翻到了作者的 Kaggle賬號。
第8章無疑是書中最吸引人的一章,作者教你使用Keras實現一些比較神奇的功能,如文本生成,藝術風格轉換等等。我按照這些內容做了兩個例子,順便吐槽下豆瓣為什么不能插代碼。。
============================ 2019.5.4 Update ============================
先上作者的一個演講視頻,講的內容和本書第 9 章有很多類似的地方。https://www.bilibili.com/video/av30762338
最后一章作為完結篇,作者談的東西都比較形而上,因而我寫得也會比較形而上。。
深度學習直接帶動了人工智能的第三次浪潮,但很多業內人士始終對此持謹慎態度,認為不該進行過度解讀。因為深度學習的原理,說白了 (如書中所述),就是一堆向量從輸入空間到目標空間的幾何變換,僅此而已。下圖來自于李宏毅老師的 PPT,機器學習大致就是尋找一個函數,輸入一些數字 (如圖片、聲音、文字等都可以轉換成一堆數字) 后,它能輸出結果,而這個函數中就包含著眾多幾何變換。
既然基本原理如此簡單,那為什么很多人對現在的人工智能發展感到恐慌?作者提到了比較關鍵的一點,那就是我們人類經常會不由自主地擬人化客體,比如在一塊石頭上畫個笑臉,這塊石頭就變為了”樂觀開朗“的石頭; 氣候問題嚴重,就認為地球需要被保護 (其實是人類自己需要保護自己,幾億年前地球的環境遠比現在惡劣卻依然延續了下來)。如果說函數是輸入值到輸出值的映射,那么這種擬人化也就是行為到心理的映射。當我們訓練出一個可以正確識別貓的模型,我們傾向于認為這個模型”理解“了什么是貓。然而事實是深度學習模型根本不理解什么是貓什么是狗 (至少不是以人類可以理解的方式) ,近幾年大火的 GAN 就顯示出模型是多么地容易被愚弄,可見模型對于事物本身并沒有本質上的認識。要想模型具有人類般的 extreme generalization (書中語) 能力,還有很長的路要走。
然而就我看來,人們感到恐慌的另一個原因,是在于不了解,因為恐懼的根源在于未知。《經濟學人》這篇文章中提到,近年來業內業外對人工智能的態度兩極分化。不搞人工智能的人通常對近年來的該領域的進展感到驚異,仿佛一夜之間就要全面取代人類了。而搞人工智能的人會覺得:“什么嘛,這不就是找一個損失函數,不斷優化,找到最優參數得出結果么,這其中根本不存在思維、推理、認知,因而離真正的智能還差得遠了”。 認為 AI 具有人的思維,能推理布局,能天神下凡,能拯救世界,本書作者直言這是 “pure fantasy” ,是對智能和技術的雙重誤讀。
寫到這里看來作者是代入了一些主觀情緒在里面了,作為一名“嚴謹”的科研技術人員,看見外界各路傳媒,暢銷書整天天花亂墜般宣揚著 AI 會不斷進化,統治全人類等等,難免會嗤之以鼻哈哈。不過人們的擔憂其實也不無道理,比如像 AlphaGo 知道自己在下圍棋嗎? 我的看法是不知道,它不過是為了達到強化學習里設定的最大獎勵罷了,這與人類認知里的圍棋文化實在是大相徑庭。而這才是最可怕的,我們人類所看重的東西: 善良、專一、共情、自由、平等、民主、金錢、身份、權力等等,AI 眼里都沒有這些概念,因而它們所做的決策可能不會關注這些東西。縱使現在的人工智能沒有作者所說的推理和抽象能力,其依然可能無意識下誤傷友軍。
最后吐槽一句,現在 tensorflow 2.0 版本出來后全面 keras 化,給人的感覺是不知道是在用 tf 還是 keras 了,不知這究竟是福還是禍。。。
/