- Python深度學習入門:從零構建CNN和RNN
- (美)塞思·韋德曼
- 4427字
- 2021-03-18 18:34:50
前言
在學習神經網絡和深度學習時,你可能會搜索到大量的資源,從博客文章到 MOOC1(如 Coursera 和 Udacity 提供的那些在線課程),甚至還有一些書……但是,這些資源的質量參差不齊,我在前幾年開始探索這個主題時就已經對此有所了解。既然你開始閱讀本書,就說明你之前了解的所有關于神經網絡的解釋在一定程度上有所欠缺。剛開始學習這一主題時,我有過同樣的經歷。就像盲人摸象似的,各種各樣的解釋描述了不同的方面,但都沒有提供一個整體的描述。基于這種情況,我便開始編寫本書。
1massive open online course,大規模開放式在線課程。
現有的神經網絡資源主要分為兩類。一類資源側重于概念領域和數學領域,包含兩個方面:一方面是用兩端有箭頭的線連接圓來形成示意圖,這種方式在解釋神經網絡時非常常見;另一方面是用大量數學公式來解釋運行機制,這樣做有助于“理解理論”。這類資源的一個典型例子是 Ian Goodfellow 等人所著的《深度學習》,這本書非常優秀。
另一類資源則包含密集的代碼塊,在運行這些代碼塊時,它們似乎會顯示隨時間減少的損失值。也就是說,神經網絡會“學習”。例如,PyTorch 文檔中的以下示例確實定義并訓練了一個基于隨機生成數據的簡單神經網絡:
# N是批次大小,D_in是輸入維度,H是隱藏維度,D_out是輸出維度 N, D_in, H, D_out = 64, 1000, 100, 10 # 創建隨機輸入數據和輸出數據 x = torch.randn(N, D_in, device=device, dtype=dtype) y = torch.randn(N, D_out, device=device, dtype=dtype) # 隨機初始化權重 w1 = torch.randn(D_in, H, device=device, dtype=dtype) w2 = torch.randn(H, D_out, device=device, dtype=dtype) learning_rate = 1e-6 for t in range(500): # 前向傳遞:計算預測值y h = x.mm(w1) h_relu = h.clamp(min=0) y_pred = h_relu.mm(w2) # 計算并輸出損失值 loss = (y_pred - y).pow(2).sum().item() print(t, loss) # 反向計算w1和w2相對于損失值的梯度 grad_y_pred = 2.0 * (y_pred - y) grad_w2 = h_relu.t().mm(grad_y_pred) grad_h_relu = grad_y_pred.mm(w2.t()) grad_h = grad_h_relu.clone() grad_h[h < 0] = 0 grad_w1 = x.t().mm(grad_h) # 使用梯度下降更新權重 w1 -= learning_rate * grad_w1 w2 -= learning_rate * grad_w2
當然,像這樣的解釋并不能讓我們深入了解“工作機制”,如基本的數學原理、其中的獨立神經網絡組件以及它們協同工作的方式,等等 2。
2這個示例旨在為那些已經了解神經網絡的人提供 PyTorch 庫的說明,而不是作為指導性教程。盡管如此,許多教程仍遵循這種風格,即僅展示代碼和一些簡短的注釋。
怎么樣才能更好地解釋神經網絡呢?對于這個問題,可以參考關于其他計算機科學概念的解釋。如果你想學習排序算法,那么會發現一些教科書中包含以下內容。
● 用簡單的語言解釋算法。
● 關于算法工作原理的可視化解釋,類似于編碼面試時在白板上畫的那種形式。
● 關于“算法運行機制”的一些數學方面的解釋 3。
● 實現算法的偽代碼。
3以排序算法為例,這方面的解釋是指為什么該算法能生成正確排序的列表。
盡管我認為理應用這種方式對神經網絡展開介紹,但很少有人(甚至從未有過)會全面地解釋神經網絡的這些內容,本書旨在填補這一空白。
理解神經網絡需要多種思維模型
雖然不是專業的研究人員,也沒有取得博士學位,但是我曾經熟練地教授數據科學:我曾與 Metis 公司合作輔導過幾個數據科學訓練營,并在接下來的一年中走訪世界各地,為許多不同行業的公司舉辦了為期 1 到 5 天的研討會,向那里的員工解釋機器學習和軟件工程的基本概念。我一直熱愛教學,致力于解決如何最好地解釋技術概念這一問題。近年來,我重點關注機器學習和統計學中的概念。對于神經網絡,我發現最具挑戰性的部分是,為“什么是神經網絡”傳達正確的“思維模型”。這主要是因為,了解神經網絡需要的不是一個而是多個思維模型,每一個都說明了神經網絡工作方式的不同方面(而且每個方面都必不可少)。為了說明這一點,來看一個例子。以下 4 個句子都是“什么是神經網絡”這一問題的正確答案。
● 神經網絡是一種數學函數,它接受輸入并產生輸出。
● 神經網絡是多維數組流經的計算圖。
● 神經網絡由層組成,每層都可以被認為具有許多“神經元”。
● 神經網絡是一種通用函數逼近器,從理論上講可以代表任何監督學習問題的解決方案。
事實上,很多人可能已經聽過其中一個或多個解釋,并且可能對神經網絡的工作原理和含義有一定的了解。但是,要完全理解它們,必須了解它們的所有內容并展示它們之間的關系。例如,神經網絡如何表示為與“層”的概念相關聯的計算圖?此外,為了使所有這些解釋更加精確,我們將通過 Python 從零開始實現所有這些概念,并將它們融合在一起,形成可以在筆記本計算機上訓練的有效神經網絡。盡管我們會在實現細節上花費大量時間,但是通過 Python 實現神經網絡模型的目的是鞏固并精確地理解概念,而不是盡可能簡潔或高效地編寫一個神經網絡庫。
本書旨在幫助你充分地理解所有這些思維模型以及它們對神經網絡實現方式的影響,這樣學習相關概念或在這個領域進一步做項目會變得容易得多。
章節概要
前 3 章是最重要的部分,每一章都可以用一本書來討論,當然,這里精簡了內容。
第 1 章說明如何將數學函數表示為一系列連接在一起構成計算圖的運算,并演示如何利用這種表示方法和微積分的鏈式法則,來計算函數的輸出相對于其輸入的導數。這一章將介紹一個非常重要的運算,即矩陣乘法,并說明如何讓它既能夠適應用這種方式表示的數學函數,又可以計算最終進行深度學習所需的導數。
第 2 章直接使用第 1 章中創建的構成要素來構建和訓練模型,從而解決實際問題。具體地說,就是使用它們來構建線性回歸模型和神經網絡模型,并基于真實的數據集預測房價。這一章提出,神經網絡比線性回歸具有更好的性能,并試圖直觀地解釋原因。在這一章中構建模型所采用的“基本原理”方法,可以幫助你很好地理解神經網絡的工作原理,同時也展示了逐步的、純粹基于基本原理的方法在定義深度學習模型方面的局限性。這便引出了第 3 章的內容。
第 3 章從前兩章基于基本原理的方法中提取構成要素,并使用它們來構建構成所有深度學習模型的“更高層次”的組件,即 Layer 類、Optimizer 類等。這一章的結尾在第 2 章的同一個數據集上訓練一個從零定義的深度學習模型,該模型比簡單的神經網絡具有更好的性能。事實證明,當基于本書中使用的標準訓練技術進行訓練時,很少有理論保證具有給定架構的神經網絡能夠在給定的數據集上找到良好的解決方案。第 4 章介紹最重要的訓練技術,這些技術通常會使神經網絡更有可能找到好的解決方案。另外,書中會盡可能從數學角度說明它們發揮作用的原理。
第 5 章介紹卷積神經網絡(convolutional neural network,CNN)背后的基本思想,它是一種專門用于理解圖像的神經網絡架構。關于 CNN 的解釋有很多,本書重點介紹 CNN 的核心要點及其與常規神經網絡的區別。比如說,CNN 如何將神經元的每一層都組織成“特征圖”,以及如何通過卷積過濾器將其中的兩層(每層都由多個特征圖組成)連接在一起。此外,就像從零開始對神經網絡中的常規層進行編碼一樣,這一章也將從零開始對卷積層進行編碼,加深對其工作原理的理解。
第 1 ~ 5 章構建了一個微型神經網絡庫,該庫將神經網絡定義為一系列 Layer 類,Layer 類本身由一系列 Operation 類組成,這些 Operation 類向前發送輸入,向后發送梯度。實際上,這不是大多數神經網絡的實現方式。相反,它們使用一種叫作自動微分(automatic differentiation)的技術。第 6 章對自動微分進行簡單說明,并用它來引出這一章的核心主題——循環神經網絡(recurrent neural network,RNN)。這種神經網絡架構通常用于理解數據點按順序出現的數據,例如時間序列數據或自然語言數據。這一章還會解釋 vanilla RNN 及其兩種變體 GRU 和 LSTM 的工作原理,當然,也會從零開始實現這 3 種神經網絡。在整個過程中,你將了解 RNN 及與其變體之間的共同點和不同點。
第 7 章展示如何使用高性能的開源神經網絡庫 PyTorch,來實現第 1 ~ 6 章中從零開始執行的操作。學習這樣的框架對于繼續學習神經網絡至關重要,但是如果不先深入了解神經網絡的工作方式和原理,就接觸并學習一個框架,那么從長遠來看會嚴重限制今后的學習。本書各章的目的是讓你有能力編寫高性能的神經網絡(通過教你使用 PyTorch),同時還能讓你長期學習并取得成功(在學習 PyTorch 之前先了解基本原理)。最后,這一章將簡要說明神經網絡如何用于無監督學習。
本書的目標就是成為我在學習神經網絡和深度學習時所渴望擁有的那樣一本書,希望你從中有所收獲。加油!
排版約定
本書采用了以下排版約定。
黑體
表示新術語或重點強調的內容。
等寬字體(constant width)
表示程序片段,以及正文中出現的變量、函數名、數據類型、環境變量、語句和關鍵字等。
等寬粗體(constant width bold)
表示應該由用戶直接輸入的命令或其他文本。
等寬斜體(constant width italic)
表示應該由用戶輸入的值或根據上下文確定的值替換的文本。
勾股定理表示為 。
該圖標表示一般的注記。
使用示例代碼
補充材料(示例代碼、練習等)可以從 https://github.com/SethHWeidman/DLFS_code 下載 4。
4也可以從圖靈社區本書主頁下載。——編者注
本書旨在幫助你完成工作。一般來說,你可以在自己的程序或文檔中使用本書提供的示例代碼。除非需要復制大量代碼,否則無須聯系我們獲得許可。比如,使用本書中的幾個代碼片段編寫程序無須獲得許可,銷售或分發 O'Reilly 圖書的示例光盤則需要獲得許可;引用本書中的示例代碼回答問題無須獲得許可,將本書中的大量示例代碼放到你的產品文檔中則需要獲得許可。
我們很希望但并不強制要求你在引用本書內容時加上引用說明。引用說明通常包括書名、作者、出版社和 ISBN,比如“Deep Learning from Scratch by Seth Weidman (O'Reilly). Copyright 2019 Seth Weidman, 978-1-492-04141-2”。
如果你覺得自己對示例代碼的用法超出了上述許可的范圍,歡迎你通過 permissions@oreilly.com 與我們聯系。
O'Reilly在線學習平臺(O'Reilly Online Learning)
近 40 年來,O'Reilly Media 致力于提供技術和商業培訓、知識和卓越見解,來幫助眾多公司取得成功。
我們擁有獨一無二的專家和革新者組成的龐大網絡,他們通過圖書、文章、會議和我們的在線學習平臺分享他們的知識和經驗。O'Reilly 的在線學習平臺允許你按需訪問現場培訓課程、深入的學習路徑、交互式編程環境,以及 O'Reilly 和 200 多家其他出版商提供的大量文本和視頻資源。有關的更多信息,請訪問 https://oreilly.com。
聯系我們
請把對本書的評價和問題發給出版社。美國:
O'Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中國:
北京市西城區西直門南大街 2 號成銘大廈 C 座 807 室(100035)
奧萊利技術咨詢(北京)有限公司
O'Reilly 的每一本書都有專屬網頁,你可以在那兒找到本書的相關信息,包括勘誤表、示例代碼以及其他信息 5。本書的網頁是 https://oreil.ly/dl-from-scratch。
5也可以通過圖靈社區下載示例代碼或提交中文版勘誤:ituring.cn/book/2759。——編者注
對于本書的評論和技術性問題,請發送電子郵件到 bookquestions@oreilly.com。
要更多地了解 O'Reilly 圖書、培訓課程、會議和新聞,請訪問以下網站:http://www.oreilly.com。
我們在 Facebook 的地址如下:http://facebook.com/oreilly。
請關注我們的 Twitter 動態:http://twitter.com/oreillymedia。
我們的 YouTube 視頻地址如下:http://www.youtube.com/oreillymedia。
致謝
我要感謝編輯 Melissa Potter 和 O'Reilly 團隊,他們為本書提供了認真且及時的反饋,并在整個出版過程中詳細解答我的疑問。
我要特別感謝一些人,正是他們的努力讓機器學習中的技術概念更容易為大多數人所接受,這直接影響了我。我有幸結識了其中一部分人,他們是 Brandon Rohrer、Joel Grus、Jeremy Watt 和 Andrew Trask。
我要感謝我在 Metis 公司和 Facebook 公司的領導,他們十分支持我寫作本書。
我要特別感謝 Mat Leonard,在我們決定各自發展之前,他一度參與了本書的寫作。Mat 幫助組織了與本書相關的小型圖書館示例 lincoln 的代碼,并在前兩章的初稿方面給予我非常有用的反饋,同時為這兩章撰寫了大部分內容。
最后,我要感謝我的朋友 Eva 和 John,他倆都直接鼓勵并啟發我真正開始寫作。我還要感謝我在舊金山的許多朋友,他們理解我幾個月以來為本書投入了大量的時間,表達了對本書的關心,并且在我需要時堅定地支持我。
更多信息
掃描下方二維碼,即可獲取電子書相關信息及讀者群通道入口。