【Pytorch with fastai】第 1 章:你的深度学习之旅
????????🔎大家好,我是Sonhhxg_柒,希望你看完之后,能對你有所幫助,不足請指正!共同學習交流🔎
📝個人主頁-Sonhhxg_柒的博客_CSDN博客?📃
🎁歡迎各位→點贊👍 + 收藏?? + 留言📝?
📣系列專欄 - 機器學習【ML】?自然語言處理【NLP】? 深度學習【DL】
?
?🖍foreword
?說明?本人講解主要包括Python、機器學習(ML)、深度學習(DL)、自然語言處理(NLP)等內容。
如果你對這個系列感興趣的話,可以關注訂閱喲👋
文章目錄
深度學習適合所有人
神經網絡:簡史
如何學習深度學習
你的項目和你的心態
軟件:PyTorch、fastai 和 Jupyter?(以及為什么不重要)
您的第一個模型
獲取 GPU 深度學習服務器
行話:圖形處??理單元 (GPU)
行話:JUPYTER NOTEBOOK
運行你的第一臺筆記本
完整和剝離的筆記本
訓練時間
什么是機器學習?
行話:機器學習
什么是神經網絡?
一點深度學習術語
機器學習固有的局限性
我們的圖像識別器如何工作
行話:分類和回歸
驗證集
行話:遷移學習
行話:微調
我們的圖像識別器學到了什么
圖像識別器可以處理非圖像任務
行話回顧
深度學習不僅僅用于圖像分類
行話:表格
驗證集和測試集
在定義測試集時使用判斷
進一步的研究
深度學習適合所有人
很多人認為你需要各種難以找到的東西才能通過深度學習獲得好的結果,但正如你將在本書中看到的那樣,這些人是錯誤的。?表 1-1列出了世界級深度學習絕對不需要的一些東西。
| 很多數學 | 高中數學就夠了。 |
| 大量數據 | 我們已經看到了少于 50 項數據的破紀錄結果。 |
| 很多昂貴的電腦 | 您可以免費獲得最先進的工作所需的東西。 |
深度學習是一種提取和轉換數據的計算機技術——用例從人類語音識別到動物圖像分類——通過使用多層神經網絡。這些層中的每一層都從先前的層中獲取輸入并逐步細化它們。這些層通過算法進行訓練,以最大限度地減少錯誤并提高其準確性。通過這種方式,網絡學習執行指定的任務。我們將在下一節詳細討論訓練算法。
深度學習具有強大的功能、靈活性和簡單性。這就是為什么我們認為它應該應用于許多學科。這些包括社會和物理科學、藝術、醫學、金融、科學研究等等。舉一個個人的例子,盡管杰里米沒有醫學背景,但他開始Enlitic,一家使用深度學習算法診斷疾病的公司。在公司成立后的幾個月內,宣布其算法可以?比放射科醫生更準確地識別惡性腫瘤。
以下是深度學習或大量使用深度學習的方法現在是世界上最好的不同領域的數千個任務的列表:
自然語言處理 (NLP)
回答問題;語音識別;?總結文件;分類文件;在文件中查找姓名、日期等;搜索提及概念的文章
計算機視覺
衛星和無人機圖像解釋(例如,用于抗災)、人臉識別、圖像?字幕,閱讀交通標志,在自動駕駛汽車中定位行人和車輛
藥物
在放射學圖像中發現異常,包括 CT、MRI 和 X 射線圖像;計數病理切片中的特征;測量超聲波的特征;診斷糖尿病視網膜病變
生物學
折疊蛋白;分類蛋白質;許多基因組學任務,例如腫瘤正常測序和臨床上可行的基因突變分類;細胞分類;分析蛋白質/蛋白質相互作用
圖像生成
著色圖像,提高圖像分辨率,去除圖像中的噪聲,將圖像轉換為著名藝術家風格的藝術
推薦系統
網頁搜索、產品推薦、首頁布局
玩游戲
國際象棋、圍棋、大多數 Atari 視頻游戲和許多實時戰略游戲
機器人技術
處理難以定位(例如透明、有光澤、缺乏紋理)或難以拾取的物體
其他應用
財務和后勤預測、文本轉語音等等……
值得注意的是,深度學習有如此多樣的應用,但幾乎所有的深度學習都基于一種創新的模型:神經網絡。
但事實上,神經網絡并不是全新的。為了對該領域有更廣闊的視野,值得從一點歷史開始。
神經網絡:簡史
1943 年,神經生理學家 Warren McCulloch 和邏輯學家 Walter Pitts,聯手開發了一個人工神經元的數學模型。在他們的論文“神經活動中內在思想的邏輯演算”中,他們宣布了以下內容:
由于神經活動的“全有或全無”特性,神經事件及其之間的關系可以用命題邏輯來處理。發現每個網絡的行為都可以用這些術語來描述。
McCulloch 和 Pitts 意識到可以使用簡單的加法和閾值化來表示真實神經元的簡化模型,?如圖 1-1所示。皮茨是自學成才的,到 12 歲時,他收到了劍橋大學的錄取通知書,師從偉大的伯特蘭·羅素。他沒有接受這個邀請,實際上他一生都沒有接受任何高級學位或權威職位的提議。他的大部分著名作品都是在他無家可歸的時候完成的。盡管他缺乏官方認可的職位并且日益受到社會孤立,但他與 McCulloch 的合作頗具影響力,并被一位心理學家弗蘭克·羅森布拉特。????????????????????????????????????????????????????????圖 1-1。自然和人工神經元
羅森布拉特進一步開發了人工神經元,使其具有學習能力。更重要的是,他致力于制造第一個使用這些原理的設備,Mark I 感知器。在“智能自動機的設計”中,?羅森布拉特對這項工作寫道:“我們現在將見證這樣一臺機器的誕生——一臺無需任何人工訓練或控制就能感知、識別和識別周圍環境的機器。”?感知器已構建并能夠成功識別簡單的形狀。
麻省理工學院教授馬文·明斯基(在同一所高中比羅森布拉特落后一個年級!),與 Seymour Papert 一起,寫了一本書叫?感知器(麻省理工學院出版社)關于羅森布拉特的發明。他們表明,這些設備的單層無法學習一些簡單但關鍵的數學函數(例如 XOR)。在同一本書中,他們還表明,使用多層設備可以解決這些限制。不幸的是,只有這些見解中的第一個被廣泛認可。結果,在接下來的二十年里,全球學術界幾乎完全放棄了神經網絡。
在過去 50 年中,神經網絡中最關鍵的工作可能是多卷并行分布式處理(PDP)David Rumelhart、James McClelland 和 PDP 研究小組,1986 年由麻省理工學院出版社出版。第 1 章提出了與 Rosenblatt 相似的希望:
人們比今天的計算機更聰明,因為大腦采用了一種基本的計算架構,該架構更適合處理人們非常擅長的自然信息處理任務的核心方面……我們將介紹一個用于建模認知過程的計算框架, …比其他框架更接近計算風格,因為它可能由大腦完成。
PDP 在這里使用的前提是傳統計算機程序的工作方式與大腦非常不同,這可能就是為什么計算機程序(在那時)在做大腦認為容易的事情(例如識別圖片中的物體)方面做得如此糟糕的原因。作者聲稱 PDP 方法“比其他框架更接近”大腦的工作方式,因此它可能能夠更好地處理這些類型的任務。
事實上,PDP 中的方法與當今神經網絡中使用的方法非常相似。該書將并行分布式處理定義為需要以下內容:
-
一組處理單元
-
激活狀態
-
每個單元的輸出功能
-
單元之間的連接模式
-
通過連接網絡傳播活動模式的傳播規則
-
一種?激活規則,用于將沖擊一個單元的輸入與該單元的當前狀態相結合,以產生該單元的輸出
-
通過經驗修改連接模式的學習?規則
-
系統必須運行的環境
我們將在本書中看到現代神經網絡可以處理這些?要求中的每一個。
在 1980 年代,大多數模型都是用第二層神經元構建的,從而避免了 Minsky 和 ??Papert 發現的問題(這是他們的“單元之間的連接模式”,使用前面的框架)。事實上,神經網絡在 80 年代和 90 年代被廣泛用于實際項目。然而,對理論問題的誤解再次阻礙了該領域的發展。理論上,只增加一層額外的神經元就足以讓任何數學函數用這些神經網絡來近似,但在實踐中,這樣的網絡通常太大太慢而無法使用。
盡管 30 年前研究人員表明,要獲得實用的良好性能,您需要使用更多層的神經元,但直到最近十年,這一原理才得到更廣泛的認可和應用。由于使用了更多的層,再加上計算機硬件的改進、數據可用性的增加以及允許神經網絡更快訓練的算法調整,神經網絡現在終于發揮了它們的潛力。更容易。我們現在擁有了 Rosenblatt 承諾的東西:“一臺無需任何人工訓練或控制即可感知、識別和識別周圍環境的機器。”
這就是您將在本書中學習如何構建的內容。但首先,由于我們將要花很多時間在一起,讓我們互相了解一下……
如何學習深度學習
哈佛大學教授大衛·珀金斯(David Perkins)撰寫了《讓學習整體》(Jossey-Bass)一書,他對教學有很多話要說。基本思想是教整場比賽。這意味著如果你在教棒球,你首先要帶人們去看棒球比賽或讓他們玩。你不會教他們如何纏繞麻線從頭開始制作棒球、拋物線的物理學或球在球棒上的摩擦系數。
保羅洛克哈特,哥倫比亞數學博士,前布朗教授和 K-12 數學老師,在有影響力的文章“數學家的悲嘆”?是一個噩夢般的世界,音樂和藝術的教學方式與數學的教學方式相同。在孩子們花了十多年時間掌握樂譜和理論之前,不允許孩子聽或演奏音樂,通過課程將活頁樂譜轉換成不同的調。在藝術課上,學生學習顏色和涂抹器,但直到大學才允許實際繪畫。聽起來很荒謬?這就是數學的教學方式——我們要求學生花費數年時間死記硬背,學習枯燥的、不連貫的基礎知識?,我們聲稱這些基礎知識將在他們中的大多數人退出這門學科很久之后才會得到回報。
不幸的是,這是許多深度學習教學資源的起點——要求學習者遵循 Hessian 的定義和損失函數的泰勒近似定理,而沒有給出實際工作代碼的示例。我們不是在敲擊微積分。我們熱愛微積分,Sylvain 甚至在大學階段教授過微積分,但我們認為這不是學習深度學習的最佳起點!
在深度學習中,如果您有動力修復模型以使其做得更好,那真的很有幫助。那是你開始學習相關理論的時候。但是你首先需要有模型。我們通過真實的例子教授幾乎所有的東西。隨著我們構建這些示例,我們會越來越深入,我們將向您展示如何使您的項目越來越好。這意味著您將逐步學習所需的所有理論基礎,在上下文中,您將了解它為什么重要以及它是如何工作的。
因此,這是我們對您的承諾。在本書中,我們遵循以下原則:
教學整個游戲
我們將首先向您展示如何使用一個完整的、有效的、可用的、最先進的深度學習網絡,使用簡單、富有表現力的工具來解決現實世界的問題。然后我們將逐漸深入了解這些工具是如何制造的,以及制造這些工具的工具是如何制造的,等等……
總是通過例子教學
我們將確保您可以直觀地理解上下文和目的,而不是從代數符號操作開始。
盡可能簡化
我們花了數年時間構建工具和教學方法,使以前復雜的主題變得簡單。
消除障礙
到目前為止,深度學習一直是一種獨家游戲。我們正在打破它并確保每個人都可以玩。
深度學習最難的部分是手工:你怎么知道你是否有足夠的數據,它的格式是否正確,你的模型是否訓練正確,如果不是,你應該怎么做?這就是為什么我們相信邊做邊學。與基本的數據科學技能一樣,深度學習只有通過實踐經驗才能變得更好。試圖在理論上花費太多時間可能會適得其反。關鍵是編寫代碼并嘗試解決問題:理論可以稍后出現,當你有背景和動機時。
有時旅途會很艱難。感覺卡住的時候。不要放棄!倒回這本書,找到最后一點你肯定沒有被卡住的地方,然后從那里慢慢閱讀,找出第一個不清楚的地方。然后自己嘗試一些代碼實驗,并在谷歌上搜索更多關于你遇到的任何問題的教程——通常你會發現材料的不同角度可能有助于點擊。此外,在第一次閱讀時不理解所有內容(尤其是代碼)是正常的。在繼續之前嘗試連續理解材料有時會很困難。有時,在您從未來的部分中獲得更多背景信息后,事情就會到位,從更大的圖景來看。因此,如果您確實卡在某個部分,請嘗試繼續前進,并記下稍后再返回。
請記住,您不需要任何特定的學術背景即可在深度學習方面取得成功。沒有博士學位的人在研究和工業領域取得了許多重要突破,例如論文?“Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks”?——過去十年中最有影響力的論文之一,被引用超過 5000 次?——亞歷克·拉德福 (Alec Radford) 讀本科時寫的。即使在特斯拉,他們正在努力解決制造自動駕駛汽車的極其艱巨的挑戰,首席執行官?埃隆馬斯克說:
絕對不需要博士學位。重要的是對人工智能的深刻理解和以實際有用的方式實施神經網絡的能力(后一點是真正困難的)。就算高中畢業也沒關系。
然而,要取得成功,你需要做的是將你在本書中學到的知識應用到個人項目中,并始終堅持下去。
你的項目和你的心態
無論您是興奮地從葉子的照片中識別植物是否患病,自動生成針織圖案,通過 X 射線診斷 TB,還是確定浣熊何時使用您的貓門,我們都會讓您使用深度學習解決您自己的問題(通過其他人的預訓練模型)盡快,然后將逐步深入研究更多細節。在下一章的前 30 分鐘內,您將學習如何使用深度學習以最先進的準確性解決您自己的問題!(如果你很想馬上開始編碼,現在可以直接跳過。)有一個有害的神話,你需要擁有與谷歌一樣大的計算資源和數據集才能進行深度學習,但事實并非如此。
那么,什么樣的任務才能構成好的測試用例呢?你可以訓練你的模型來區分畢加索和莫奈的畫作,或者挑選出你女兒的照片而不是你兒子的照片。它有助于專注于你的愛好和激情——給自己設置四五個小項目,而不是努力解決一個大問題,當你開始時往往會更好地工作。由于很容易陷入困境,因此過早地過于雄心勃勃往往會適得其反。然后,一旦你掌握了基礎知識,就努力完成你真正引以為豪的事情!
軟件:PyTorch、fastai 和 Jupyter?(以及為什么不重要)
我們已經使用幾十個包和許多編程語言完成了數百個機器學習項目。在 fast.ai,我們使用當今使用的大多數主要深度學習和機器學習包編寫了課程。PyTorch 于 2017 年問世后,我們花了一千多個小時對其進行測試,然后才決定將其用于未來的課程、軟件開發和研究。從那時起,PyTorch 已經成為世界上增長最快的深度學習庫,并且已經在頂級會議上用于大多數研究論文。這通常是工業使用的領先指標,因為這些紙張最終被用于商業產品和服務。我們發現 PyTorch 是深度學習最靈活、最具表現力的庫。它不會為了簡單而犧牲速度,但兩者兼而有之。
PyTorch 最適合作為低級基礎庫,為高級功能提供基本操作。fastai 庫是最受歡迎的庫,用于在 PyTorch 之上添加這種更高級別的功能。它也特別適合本書的目的,因為它在提供深度分層的軟件架構方面是獨一無二的(甚至還有 一篇關于這種分層 API的同行評審的學術論文)。在本書中,隨著我們對深度學習的基礎越來越深入,我們也將越來越深入到 fastai 的各個層面。這本書涵蓋fastai 庫的第 2 版,這是一個從頭開始的重寫,提供了許多獨特的功能。
但是,您學習什么軟件并不重要,因為只需幾天時間即可學會從一個庫切換到另一個庫。真正重要的是正確學習深度學習的基礎和技術。我們的重點將是使用盡可能清晰地表達您需要學習的概念的代碼。在我們教授高級概念的地方,我們將使用高級 fastai 代碼。在我們教授低級概念的地方,我們將使用低級 PyTorch 甚至是純 Python 代碼。
盡管現在看起來新的深度學習庫正在快速出現,但您需要為未來幾個月和幾年內更快的變化速度做好準備。隨著越來越多的人進入這個領域,他們會帶來更多的技能和想法,并嘗試更多的東西。您應該假設您今天學習的任何特定庫和軟件都將在一兩年內過時。想想在 Web 編程領域一直在發生的庫和技術堆棧的變化——這是一個比深度?學習更成熟且增長緩慢的領域。我們堅信,學習的重點需要理解底層技術以及如何在實踐中應用它們,以及如何在新工具和技術發布時快速建立專業知識。
在本書的最后,您將了解 fastai 中的幾乎所有代碼(以及 PyTorch 的大部分代碼),因為在每一章中,我們將深入挖掘一個層次,以準確地向您展示我們構建和訓練時發生了什么我們的模型。這意味著您將了解現代深度學習中使用的最重要的最佳實踐——不僅僅是如何使用它們,還有它們是如何真正工作和實施的。如果您想在另一個框架中使用這些方法,那么您將擁有必要的知識。
由于學習深度學習最重要的事情是編寫代碼和進行實驗,因此擁有一個很好的代碼實驗平臺很重要。最流行的編程實驗平臺稱為Jupyter。這就是我們將在本書中使用的內容。我們將向您展示如何使用 Jupyter 來訓練和試驗模型,并自省數據預處理和模型開發管道的每個階段。Jupyter 是最流行的 Python 數據科學工具,有充分的理由。它功能強大、靈活且易于使用。我們認為您會喜歡它!
讓我們在實踐中看到它并訓練我們的第一個模型。
您的第一個模型
正如我們之前所說,在解釋它們為什么起作用之前,我們將教你如何做事。按照這種自上而下的方法,我們將從實際訓練一個圖像分類器以幾乎 100% 的準確率識別狗和貓。要訓??練此模型并運行我們的實驗,您需要進行一些初始設置。不用擔心;?它并不像看起來那么難。
獲取 GPU 深度學習服務器
要完成本書中的幾乎所有內容,您需要使用配備?NVIDIA?GPU的計算機(很遺憾,其他品牌的 GPU 并沒有得到主要深度學習庫的完全支持)。但是,我們不建議您購買;事實上,即使您已經擁有,我們也不建議您立即使用它!設置一臺計算機需要時間和精力,你現在希望所有的精力都集中在深度學習上。因此,我們建議您租用一臺已經預裝了您需要的一切并準備就緒的計算機。使用它時,成本可能低至每小時 0.25 美元,有些選項甚至是免費的。
行話:圖形處??理單元 (GPU)
也稱為顯卡。計算機中的一種特殊處理器,可以同時處理數千個單一任務,特別設計用于在計算機上顯示 3D 環境以進行游戲。這些相同的基本任務與神經網絡的工作非常相似,因此 GPU 運行神經網絡的速度比普通 CPU 快數百倍。所有現代計算機都包含 GPU,但很少有包含深度學習所需的正確類型的 GPU。
隨著公司的來來去去和價格的變化,與本書一起使用的 GPU 服務器的最佳選擇會隨著時間的推移而改變。我們在本書的網站上維護了我們推薦的選項列表,所以現在就去那里并按照說明連接到 GPU 深度學習服務器。不用擔心;?在大多數平臺上設置只需大約兩分鐘,許多平臺甚至不需要任何付款甚至信用卡即可開始使用。
網站上顯示的每個選項都包含一個教程;完成本教程后,您將看到?如圖 1-2 所示的屏幕。
圖 1-2。Jupyter Notebook 的初始視圖
您現在已準備好運行您的第一個 Jupyter 筆記本!
行話:JUPYTER NOTEBOOK
一款允許您包含格式化文本、代碼、圖像、視頻等的軟件,所有這些都在一個交互式文檔中。Jupyter 獲得了軟件領域的最高榮譽——ACM 軟件系統獎,這要歸功于它在許多學術領域和工業領域的廣泛使用和巨大影響。Jupyter Notebook 是數據科學家最廣泛使用的軟件,用于開發深度學習模型并與之交互。
運行你的第一臺筆記本
筆記本按章節編號本書中介紹的順序。因此,您將看到的第一個筆記本是您現在需要使用的筆記本。您將使用此筆記本來訓練可以識別狗和貓照片的模型。為此,您將?下載狗和貓照片的數據集,并用它來訓練?一個模型。
數據集只是一堆數據——它可以是圖像、電子郵件、財務指標、聲音或其他任何東西。有許多免費提供的適用于訓練模型的數據集。其中許多數據集是由學者創建的,以幫助推進研究,許多數據集可用于競賽(數據科學家可以參加競賽,看看誰擁有最準確的模型!),還有一些是其他過程的副產品(例如金融備案)。
完整和剝離的筆記本
筆記本有兩個版本。回購的根源包含用于創建您現在正在閱讀的書的確切筆記本,以及所有散文和輸出。clean文件夾具有相同的標題和代碼單元,但已刪除所有輸出和散文。閱讀完本書的一部分后,我們建議您閱讀干凈的筆記本,合上??書本,看看您是否可以在執行之前弄清楚每個單元格將顯示什么。還要嘗試回憶代碼所演示的內容。
要打開一個筆記本,只需單擊它。筆記本會打開,它看起來類似于圖 1-3(請注意,不同平臺的細節可能存在細微差異;您可以忽略這些差異)。
圖 1-3。一個 Jupyter 筆記本
筆記本由單元格組成。主要有兩個細胞類型:
-
包含格式化文本、圖像等的單元格。這些使用一種稱為Markdown的格式,您將很快了解。
-
包含可以執行的代碼的單元格,將出現輸出?緊接在下面(可以是純文本、表格、圖像、動畫、聲音,甚至是交互式應用程序)。
Jupyter 筆記本可以處于以下兩種模式之一:編輯模式或命令模式。在編輯模式下,在鍵盤上鍵入以通常的方式將字母輸入單元格。但是,在命令模式下,您不會看到任何閃爍的光標,并且鍵盤上的每個鍵都有特殊功能。
在繼續之前,請按鍵盤上的 Escape 鍵切換到命令模式(如果您已經處于命令模式,這沒有任何作用,所以現在按下它以防萬一)。要查看所有可用功能的完整列表,請按 H;按 Escape 刪除此幫助屏幕。請注意,在命令模式下,與大多數程序不同,命令不需要您按住 Control、Alt 或類似鍵,您只需按下所需的字母鍵即可。
可以通過按C來復制一個單元格(需要先選中單元格,用輪廓表示周圍;?如果尚未選擇,請單擊一次)。然后按 V 粘貼它的副本。
單擊以“# CLICK ME”行開頭的單元格以將其選中。其中的第一個字符?line 表示后面是 Python 中的注釋,因此在執行單元格時將被忽略。信不信由你,細胞的其余部分是一個完整的系統,用于創建和訓練用于識別貓與狗的最先進模型。所以,讓我們現在訓練它!為此,只需按鍵盤上的 Shift-Enter,或單擊工具欄上的“播放”按鈕。然后等待幾分鐘,同時發生以下事情:
一個數據集稱為?Oxford-IIIT Pet Dataset包含來自 37 個品種的 7,349 張貓狗圖像,將從 fast.ai 數據集集合下載到您正在使用的 GPU 服務器,然后將被提取。
已經訓練好的預訓練模型使用競賽獲勝模型的 130 萬張圖像將從互聯網上下載。
預訓練模型將使用最新的遷移學習的進步創建了一個專門為識別狗和貓而定制的模型。
前兩個步驟只需要在您的 GPU 服務器上運行一次。如果再次運行該單元,它將使用已經下載的數據集和模型,而不是再次下載它們。我們來看看單元格的內容及結果(表1-2):
# CLICK ME from fastai.vision.all import * path = untar_data(URLs.PETS)/'images'def is_cat(x): return x[0].isupper() dls = ImageDataLoaders.from_name_func(path, get_image_files(path), valid_pct=0.2, seed=42,label_func=is_cat, item_tfms=Resize(224))learn = cnn_learner(dls, resnet34, metrics=error_rate) learn.fine_tune(1)| 0 | 0.169390 | 0.021388 | 0.005413 | 00:14 |
| 0 | 0.058748 | 0.009240 | 0.002706 | 00:19 |
您可能不會看到此處顯示的完全相同的結果。訓練模型中涉及許多小的隨機變化來源。然而,在這個例子中,我們通常看到的錯誤率遠低于 0.02。
訓練時間
根據您的網絡速度,下載預訓練模型和數據集可能需要幾分鐘時間。跑步fine_tune可能需要一分鐘左右。本書中的模型通常需要幾分鐘的時間來訓練,你自己的模型也是如此,所以最好想出好的技術來充分利用這段時間。例如,在您的模型訓練時繼續閱讀下一部分,或者打開另一個筆記本并將其用于一些編碼實驗。
這本書是用 JUPYTER NOTEBOOKS 寫的
我們使用 Jupyter 筆記本編寫了本書,因此對于本書中的幾乎所有圖表、表格和計算,我們將向您展示自己復制它所需的確切代碼。這就是為什么在本書中,你經常會看到一些代碼緊跟在表格、圖片或只是一些文本之后。如果您訪問?本書的網站,您會找到所有代碼,您可以嘗試自己運行和修改每個示例。
您剛剛看到了輸出表格的單元格在書中的外觀。下面是一個輸出文本的單元格示例:
1+1 2Jupyter 將始終打印或顯示最后一行的結果(如果有的話)。例如,這是一個輸出圖像的單元格示例:
img = PILImage.create(image_cat()) img.to_thumb(192)那么,我們怎么知道這個模型好不好呢?在表格的最后一列,您可以看到錯誤率,即被錯誤識別的圖像的比例。錯誤率作為我們的指標——我們對模型質量的衡量,選擇直觀和易于理解。如您所見,該模型幾乎是完美的,盡管訓練時間只有幾秒鐘(不包括數據集的一次性下載和預訓練模型)。事實上,你已經達到的準確度比任何人在 10 年前達到的要好得多!
最后,讓我們檢查一下這個模型是否真的有效。去拍一張狗或貓的照片;如果您手邊沒有,只需搜索 Google 圖片并下載您在那里找到的圖片。現在執行已uploader定義的單元格。它將輸出一個您可以單擊的按鈕,因此您可以選擇要分類的圖像:
uploader = widgets.FileUpload() uploader現在您可以將上傳的文件傳遞給模型。確保它是單只狗或貓的清晰照片,而不是線條畫、卡通或類似內容。筆記本會告訴你它認為自己是狗還是貓,以及它的自信程度。希望您會發現您的模型做得很好:
img = PILImage.create(uploader.data[0]) is_cat,_,probs = learn.predict(img) print(f"Is this a cat?: {is_cat}.") print(f"Probability it's a cat: {probs[1].item():.6f}") Is this a cat?: True. Probability it's a cat: 0.999986祝賀你的第一個分類器!
但是,這是什么意思?你實際上做了什么?為了解釋這一點,讓我們再次縮小以了解全局。
什么是機器學習?
您的分類器是一個深度學習模型。如前所述,深度學習模型使用神經網絡,它最初可以追溯到 1950 年代,并且由于最近的進步而在最近變得強大。
另一個關鍵的背景是深度學習只是機器學習更一般學科中的一個現代領域。要了解您在訓練自己的分類模型時所做的事情的本質,您無需了解深度學習。了解您的模型和訓練過程如何成為一般適用于機器學習的概念示例就足夠了。
所以在本節中,我們將描述機器學習。我們將探索關鍵概念,并了解如何將它們追溯到介紹它們的原始文章。
與常規編程一樣,機器學習是一種讓計算機完成特定任務的方法。但是我們如何使用常規編程來完成我們在上一節中所做的事情:識別照片中的狗和貓?我們必須為計算機寫下完成任務所需的確切步驟。
通常,我們在編寫程序時很容易寫下完成任務的步驟。我們只是考慮如果我們必須手動完成任務會采取的步驟,然后我們將它們轉換為代碼。例如,我們可以編寫一個對列表進行排序的函數。一般來說,我們會編寫一個類似于圖 1-4的函數(其中輸入可能是一個未排序的列表,結果是一個排序的列表)。
圖 1-4。一個傳統的節目
但是要識別照片中的物體,這有點棘手。當我們識別圖片中的物體時,我們會采取哪些?步驟?我們真的不知道,因為這一切都發生在我們的大腦中,而我們沒有意識到!
早在 1949 年計算剛開始時,一位名叫?亞瑟·塞繆爾開始研究一種不同的方法來讓計算機?完成任務,他稱之為機器學習。在他 1962 年的經典文章《人工智能:自動化的前沿》中,他寫道:
為此類計算編程計算機充其量是一項艱巨的任務,這主要不是因為計算機本身存在任何固有的復雜性,而是因為需要以最令人惱火的細節詳細說明該過程的每一分鐘步驟。正如任何程序員都會告訴你的那樣,計算機是巨大的白癡,而不是巨大的大腦。
他的基本想法是:而不是告訴計算機確切的步驟?需要解決問題,向它展示要解決的問題的示例,并讓它自己弄清楚如何解決它。結果證明這是非常有效的:到 1961 年,他的跳棋程序已經學到了很多東西,以至于它擊敗了康涅狄格州冠軍!他是這樣描述他的想法的(來自前面提到的同一篇文章):
假設我們安排了一些自動方法來測試任何當前權重分配在實際性能方面的有效性,并提供一種改變權重分配的機制以最大化性能。我們不需要深入了解這樣一個程序的細節,就可以看到它可以完全自動化,并看到這樣編程的機器會從它的經驗中“學習”。
在這個簡短的聲明中嵌入了許多強大的概念:
-
“權重分配”的想法
-
每個重量分配都有一些“實際性能”的事實
-
要求有一種“自動方法”來測試該性能
-
需要通過改變權重分配來提高性能的“機制”(即另一個自動過程)
讓我們一一了解這些概念,以了解它們在實踐中是如何結合在一起的。首先,我們需要了解 Samuel 所說的權重分配是什么意思。
權重只是變量,權重分配是這些變量的特定值選擇。程序的輸入是它為產生結果而處理的值——例如,將圖像像素作為輸入,并返回分類“狗”作為結果。程序的權重分配是定義程序如何運行的其他值。
因為它們會影響程序,它們在某種意義上是另一種輸入。我們將更新圖 1-4中的基本圖片 并將其替換為圖 1-5以考慮到這一點。
圖 1-5。使用權重分配的程序
我們將盒子的名稱從program更改為model。這是為了遵循現代術語并反映該模型是一種特殊的程序:它可以做很多不同的事情,具體取決于重量。它可以以許多不同的方式實現。例如,在 Samuel 的跳棋程序中,不同的權重值會導致不同的跳棋策略。
(順便說一下,Samuel 所謂的“權重”現在最常被稱為模型參數,以防你遇到?學期。權重一詞是為特定類型的模型參數保留的。)
接下來,Samuel 說我們需要一種自動測試有效性的方法?任何當前的權重分配在實際表現方面。就他的跳棋程序而言,模型的“實際表現”將是它的表現如何。您可以通過設置兩個模型相互對戰并查看哪個模型通常獲勝來自動測試兩個模型的性能。
最后,他說我們需要一種改變權重分配的機制,以最大限度地提高性能。例如,我們可以查看獲勝模型和失敗模型之間的權重差異,并在獲勝方向上進一步調整權重。
我們現在可以明白為什么他說這樣的程序可以完全自動化,而且……這樣編程的機器會從它的經驗中“學習”。當權重的調整也是自動的時,學習將變得完全自動化——我們不是通過手動調整權重來改進模型,而是依靠一種基于性能進行調整的自動化機制。
圖 1-6展示了 Samuel 訓練機器學習模型的想法的全貌。
圖 1-6。訓練機器學習模型
注意模型結果之間的區別(例如,跳棋游戲中的移動)以及它的表現(例如,它是否贏得了比賽,或者它獲勝的速度)。
還要注意,一旦模型被訓練——也就是說,一旦我們選擇了我們最終的、最好的、最喜歡的權重分配——那么我們可以將權重視為模型的一部分,因為我們不再改變它們。
因此,實際使用經過訓練的模型如圖 1-7 所示。
圖 1-7。使用經過訓練的模型作為程序
這看起來與?圖 1-4中的原始圖相同,只是將單詞program替換為?model。這是一個重要的見解:經過訓練的模型可以像普通計算機程序一樣對待。
行話:機器學習
通過允許計算機從其經驗中學習而開發的程序培訓,而不是通過手動編碼各個步驟。
什么是神經網絡?
不難想象該模型對于跳棋程序會是什么樣子。可能有一系列跳棋策略?編碼,以及某種搜索機制,然后權重可能會改變策略的選擇方式,搜索過程中關注的板的哪些部分等等。但是,對于圖像識別程序、理解文本或我們可能想象的許多其他有趣問題,模型看起來是什么樣子的,這一點并不明顯。
我們想要的是某種非常靈活的函數,它可以用來解決任何給定的問題,只需改變它的權重。?令人驚訝的是,這個功能確實存在!這是我們已經討論過的神經網絡。也就是說,如果您將神經網絡視為一個數學函數,那么它會變成一個非常靈活的函數,具體取決于其權重。一種稱為通用逼近定理的數學證明表明這個函數理論上可以解決任何問題,達到任何精度水平。神經網絡如此靈活的事實意味著,在實踐中,它們通常是一種合適的模型,您可以將精力集中在訓練它們的過程上——即找到好的權重分配。
但是那個過程呢?可以想象,您可能需要找到一種新的“機制”來自動更新每個問題的權重。這會很費力。我們在這里也想要一種完全通用的方法來更新神經網絡的權重,以使其在任何給定的任務中得到改進。方便的是,這也存在!
這稱為隨機梯度下降(SGD)。我們將在下面詳細了解神經網絡和 SGD 的工作原理?第 4 章,以及解釋通用逼近定理。然而,現在,我們將改為使用塞繆爾自己的話:我們不需要深入了解這樣一個程序的細節,看看它是否可以完全自動化,并且看到這樣編程的機器會從它的經驗中“學習”。
不用擔心;?SGD 和神經網絡在數學上都不是復雜的。兩者幾乎完全依賴加法和乘法來完成他們的工作(但他們做了很多加法和乘法!)。當學生看到細節時,我們聽到的主要反應是:“就是這樣嗎?”
換句話說,回顧一下,神經網絡是一種特殊的機器學習模型,完全符合 Samuel 的原始概念。神經網絡很特別,因為它們非常靈活,這意味著它們可以通過找到正確的權重來解決異常廣泛的問題。這很強大,因為隨機梯度下降為我們提供了一種自動找到這些權重值的方法。
縮小后,現在讓我們重新放大并使用 Samuel 的框架重新審視我們的圖像分類問題。
我們的輸入是圖像。我們的權重是?神經網絡。我們的模型是一個神經網絡。我們的結果是由神經網絡計算的值,例如“狗”或“貓”。
下一篇文章呢,一種自動測試任何當前權重分配在實際性能方面的有效性的方法?確定“實際性能”很容易:我們可以簡單地將模型的性能定義為其預測正確答案的準確性。
綜上所述,假設 SGD 是我們更新權重分配的機制,我們可以看到我們的圖像分類器是一個機器學習模型,就像 Samuel 所設想的那樣。
一點深度學習術語
Samuel 在 1960 年代工作,從那時起術語發生了變化。以下是我們討論過的所有部分的現代深度學習術語:
-
模型的功能形式稱為它的架構(但?小心——有時人們將模型用作架構的同義詞,所以這會讓人感到困惑)。
-
權重稱為參數。
-
預測是根據自變量計算的,自變量是不包括標簽的數據。
-
模型的結果稱為預測。
-
性能度量稱為損失。
-
損失不僅取決于預測,還取決于正確的?標簽(也稱為目標或因變量);例如,“狗”或“貓”。
進行這些更改后,我們在圖 1-6中的圖表 類似于圖 1-8。
圖 1-8。詳細的訓練循環
機器學習固有的局限性
從這張圖片中,我們現在可以看到一些關于訓練深度學習模型的基本知識:
-
沒有數據就無法創建模型。
-
模型可以學習僅對用于訓練它的輸入數據中看到的模式進行操作。
-
這種學習方法只創建預測,而不是推薦?操作。
-
僅僅有輸入數據的例子是不夠的;我們也需要該數據的標簽(例如,狗和貓的圖片不足以訓練模型;我們需要為每個人一個標簽,說明哪些是狗,哪些是貓)。
一般來說,我們已經看到大多數聲稱他們沒有足夠數據的組織實際上意味著他們沒有足夠的標簽數據。如果任何組織有興趣在實踐中使用模型做某事,那么大概他們有一些他們計劃運行模型的輸入。并且大概他們已經以其他方式這樣做了一段時間(例如,手動或使用一些啟發式程序),所以他們有來自這些過程的數據!例如,放射學實踐幾乎肯定會有醫學掃描檔案(因為他們需要能夠檢查患者隨著時間的推移如何進展),但這些掃描可能沒有包含診斷或干預列表的結構化標簽(因為放射科醫生通常會創建自由文本的自然語言報告,而不是結構化數據)。我們將在本書中大量討論標記方法,因為它在實踐中是一個非常重要的問題。
由于這些機器學習模型只能做出預測?(即嘗試復制標簽),這可能導致組織目標和模型能力之間存在顯著差距。例如,在本書中,您將學習如何創建一個?可以預測用戶可能購買哪些產品的推薦系統。這是?常用于電子商務,例如通過顯示排名最高的項目來自定義主頁上顯示的產品。但是這樣的模型通常是通過查看用戶及其購買歷史(輸入)以及他們繼續購買或查看的內容(標簽)來創建的,這意味著該模型可能會告訴您用戶已經擁有的產品,或已經知道,而不是他們最有可能感興趣的新產品。這與當地書商的專家可能會做的事情非常不同,他們會提出問題以了解您的品味,然后告訴您您以前從未聽說過的作者或系列。
另一個重要的見解來自考慮模型如何與其環境交互。這可以創建反饋循環,如下所述:
根據過去的逮捕地點創建預測性警務模型。在實踐中,這實際上并不是預測犯罪,而是預測逮捕,因此部分只是反映了現有警務?過程中的偏見。
然后,執法人員可能會使用該模型來決定將他們的警務活動集中在哪里,從而增加在這些地區的逮捕人數。
然后將反饋這些額外逮捕的數據,以重新訓練模型的未來版本。
這是一個正反饋循環:模型使用得越多,?數據的偏差越大,模型的偏差就越大,等等。
反饋回路也會在商業環境中產生問題。例如,視頻推薦系統可能會偏向于推薦最大的視頻觀看者消費的內容(例如,陰謀論者和極端分子傾向于觀看比平均水平更多的在線視頻內容),導致這些用戶增加他們的視頻消費,從而導致更多此類視頻被推薦。我們將在第 3 章中更詳細地討論這個主題。
現在您已經了解了理論的基礎,讓我們回到我們的代碼示例,詳細了解代碼與我們剛剛描述的過程的對應關系。
我們的圖像識別器如何工作
讓我們看看我們的圖像識別器代碼如何映射到這些想法。我們將每一行放入一個單獨的單元格中,然后查看?每個人在做什么(我們不會解釋每個參數的每一個細節,但會給出重要位的描述;完整的細節將在本書后面提供)。第一行導入所有 fastai.vision 庫:
from fastai.vision.all import *這為我們提供了創建各種計算機視覺模型所需的所有函數和類。
許多 Python 編碼人員建議避免像這樣(使用import *語法)導入整個庫,因為在大型軟件項目中它可能會導致問題。但是,對于像 Jupyter notebook 這樣的交互式工作,它的效果很好。fastai 庫是專門為支持這種交互使用而設計的,它只會將必要的部分導入您的環境。
第二行從?fast.ai 數據集集合(如果之前未下載)到您的服務器,提取它(如果之前未提取),并返回Path具有提取位置的對象:
path = untar_data(URLs.PETS)/'images'在我在 fast.ai 學習的整個過程中,直到今天,我都學到了很多關于高效編碼實踐的知識。fastai 庫和 fast.ai 筆記本充滿了很棒的小技巧,這些小技巧幫助我成為了一個更好的程序員。例如,請注意 fastai 庫不僅返回包含數據集路徑的字符串,還返回一個Path對象。這是 Python 3 標準庫中一個非常有用的類,它使訪問文件和目錄變得更加容易。如果您以前沒有遇到過它,請務必查看它的文檔或教程并嘗試一下。請注意,本書的網站包含指向每章推薦教程的鏈接。我會不斷地讓你知道一些我發現有用的小編碼技巧,因為我們遇到了它們。
在第三行中,我們定義了一個函數 ,is_cat它根據數據集的創建者提供的文件名規則來標記貓:
def is_cat(x): return x[0].isupper()我們在第四行使用該函數,它告訴 fastai 我們擁有什么樣的數據集以及它是如何構建的:
dls = ImageDataLoaders.from_name_func(path, get_image_files(path), valid_pct=0.2, seed=42,label_func=is_cat, item_tfms=Resize(224))對于不同類型的深度學習數據集和問題,有各種類——我們在這里使用?ImageDataLoaders.?類名的第一部分通常是您擁有的數據類型,例如圖像或文本。
我們必須告訴 fastai 的另一條重要信息是如何從數據集中獲取標簽。計算機視覺數據集通常以這樣一種方式構建,即圖像的標簽是文件名或路徑的一部分——最常見的是父文件夾名稱。fastai 帶有許多標準化的標簽方法,以及編寫自己的方法。在這里,我們告訴 fastai 使用is_cat我們剛剛定義的函數。
最后,我們定義Transform我們需要的 s。一個Transform包含?在訓練期間自動應用的代碼;fastai 包含許多預定義Transform的,添加新的就像創建 Python 函數一樣簡單。有兩種:item_tfms應用于每個項目(在這種情況下,每個項目都調整為 224 像素的正方形),同時?使用 GPU 一次batch_tfms應用于一批項目,?所以它們特別快(我們將在本書中看到很多這樣的例子)。
為什么是 224 像素?由于歷史原因,這是標準尺寸(舊的預訓練模型完全需要這個尺寸),但你幾乎可以通過任何東西。如果你增加尺寸,你通常會得到一個效果更好的模型(因為它可以專注于更多細節),但代價是速度和內存消耗;如果減小尺寸,則相反。
行話:分類和回歸
分類和回歸在機器學習中有非常具體的含義。這是我們將在本書中研究的兩種主要模型類型。分類模型是試圖預測一個類別或類別的模型。也就是說,它從許多離散的可能性中進行預測,例如“狗”或“貓”。回歸模型是一種嘗試預測一個或多個數字量的模型,例如溫度或位置。有時人們使用回歸一詞來指代一種稱為線性回歸模型的特定模型;這是一種不好的做法,我們不會在本書中使用該術語!
Pet 數據集包含 7,390 張狗和貓的圖片,包括?37個品種。每個圖像都使用其文件名進行標記:例如,文件great_pyrenees_173.jpg是數據集中大比利牛斯犬品種圖像的第 173 個示例。如果圖像是貓,則文件名以大寫字母開頭,否則以小寫字母開頭。我們必須告訴 fastai 如何從文件名中獲取標簽,我們通過調用from_name_func(這意味著可以使用應用于文件名的函數來提取標簽)并傳遞?is_cat,它返回x[0].isupper(),它評估True第一個字母是否為大寫 (即,它是一只貓)。
這里要提到的最重要的參數是valid_pct=0.2.?這告訴 fastai 保留 20% 的數據,根本不使用它來訓練模型。這 20% 的數據稱為驗證集;?剩下的 80% 稱為訓練集。驗證集用于衡量模型的準確性。?默認情況下,保留的 20% 是隨機選擇的。每次運行此代碼時,該參數都會seed=42將隨機種子設置為相同的值,這意味著每次運行它都會獲得相同的驗證集——這樣,如果我們更改模型并重新訓練它,我們就會知道任何差異都是由于對模型的更改,而不是由于具有不同的隨機驗證集。
fastai 將始終僅使用驗證集而不是訓練集向您展示模型的準確性 。這一點非常關鍵,因為如果你訓練一個足夠大的模型足夠長的時間,它最終會記住數據集中每個項目的標簽!結果將不是一個有用的模型,因為我們關心的是我們的模型在以前看不見的圖像上的工作情況。在創建模型時,這始終是我們的目標:在模型經過訓練之后,它對模型僅在未來才能看到的數據有用。
即使您的模型沒有完全記住您的所有數據,在訓練的早期它也可能已經記住了其中的某些部分。因此,你訓練的時間越長,你在訓練集上的準確率就越高;這驗證集的準確性也會在一段時間內提高,但隨著模型開始記憶訓練集而不是在數據中找到可概括的潛在模式,最終它會開始變得更糟。發生這種情況時,我們說模型過度擬合。
圖 1-9顯示了當你過擬合時會發生什么,使用一個簡化的例子,我們只有一個參數和一些基于函數隨機生成的數據x**2。如您所見,盡管過擬??合模型中的預測對于觀察到的數據點附近的數據是準確的,但當超出該范圍時,它們就相差甚遠。
圖 1-9。過擬合的例子
過度擬合是最重要和最具挑戰性的問題?為所有機器學習從業者和所有算法提供培訓。正如您將看到的那樣,創建一個模型很容易,該模型在對其已訓練的確切數據進行預測方面做得很好,但對模型從未見過的數據進行準確預測要困難得多。當然,這是在實踐中很重要的數據。例如,如果您創建了一個手寫數字分類器(我們很快就會這樣做!)并使用它來識別支票上的數字,那么您將永遠不會看到模型訓練時使用的任何數字——每張支票都會有輕微的不同的寫作變體要處理。
在本書中,您將學習許多避免過度擬合的方法。但是,只有在確認發生過擬合后(即,如果您觀察到在訓練期間驗證準確度變差),您才應該使用這些方法。我們經常看到從業者使用過擬合避免技術,即使他們有足夠的數據,他們不需要這樣做,最終得到的模型可能不如他們可以實現的準確。
驗證集
訓練模型時,必須始終同時擁有訓練集和驗證集,并且您必須僅在驗證集上測量模型的準確性。如果你訓練的時間太長,沒有足夠的數據,你會看到你的模型的準確性開始變差;這稱為過擬合。fastai 默認valid_pct為0.2,所以即使你忘記了,fastai 也會為你創建一個驗證集!
訓練我們的圖像識別器的代碼的第五行告訴 fastai 創建一個卷積神經網絡?(CNN)并指定要使用的架構(即要創建什么樣的模型)、我們想要訓練它的數據以及要使用的指標:
learn = cnn_learner(dls, resnet34, metrics=error_rate)為什么是CNN?這是當前最先進的創建方法?計算機視覺模型。我們將在本書中全面了解 CNN 的工作原理。它們的結構受到人類視覺系統工作方式的啟發。
fastai 中有很多架構,我們將在本書中介紹(以及討論如何創建自己的架構)。然而,大多數時候,選擇架構并不是深度學習過程中非常重要的部分。這是學者們喜歡談論的話題,但在實踐中,這不太可能是您需要花費大量時間的話題。有一些標準架構在大多數情況下都可以工作,在這種情況下,我們使用的是一種稱為ResNet的架構?我們將在書中談論很多;對于許多數據集和問題,它既快速又準確。34in 指的resnet34是該架構變體中的層數(其他選項是18、50、101和152)。使用具有更多層的架構的模型需要更長的時間來訓練并且更容易過度擬合(即,在驗證集的準確性開始變差之前,您不能訓練它們盡可能多的時期)。另一方面,當使用更多數據時,它們可能會更加準確。
什么是指標?度量是衡量質量的函數?模型使用驗證集的預測,并將在每個 epoch 結束時打印。在這種情況下,我們使用error_rate,這是 fastai 提供的一個函數,它按照它所說的做:告訴你驗證集中有多少百分比的圖像被錯誤地分類。另一個常見的分類指標是accuracy(只是1.0 - error_rate)。fastai 提供了更多,這將在本書中進行討論。
度量的概念可能會讓你想起損失,但有一個?重要區別。損失的全部目的是定義訓練系統可以用來自動更新權重的“性能度量”。換句話說,一個好的損失選擇是一個易于隨機梯度下降使用的選擇。但是一個指標是為人類消費定義的,所以一個好的指標是一個易于理解的指標,并且盡可能接近您希望模型執行的操作。有時,您可能會認為損失函數是一個合適的指標,但不一定如此。
cnn_learner還有一個參數pretrained,默認為?True(因此在這種情況下使用它,即使我們沒有指定它),它將模型中的權重設置為已經由專家訓練的值,以識別 130 萬張照片中的一千個不同類別(使用著名的ImageNet數據集)。具有已經在另一個數據集上訓練過的權重的模型稱為預訓練模型。您幾乎應該始終使用預訓練模型,因為這意味著您的模型在您向其展示任何數據之前就已經非常有能力了。正如您將看到的,在深度學習模型中,其中許多功能都是您需要的,幾乎不管您的項目細節如何。例如,部分預訓練模型將處理邊緣、梯度和顏色檢測,這些都是許多任務所必需的。
使用預訓練模型時,cnn_learner將刪除最后一層,?因為它總是專門針對原始訓練任務(即 ImageNet 數據集分類)進行定制,并將其替換為一個或多個具有隨機權重的新層,其大小適合您正在使用的數據集。模型的最后一部分稱為頭部。
使用預訓練模型是我們必須訓練更準確模型的最重要方法,更快,更少的數據,更少的時間和金錢。你可能認為這意味著使用預訓練模型將是學術深度學習中研究最多的領域……但你錯了!預訓練模型的重要性在大多數課程、書籍或軟件庫功能中通常沒有得到認可或討論,也很少在學術論文中考慮。當我們在 2020 年初撰寫本文時,情況才剛剛開始發生變化,但可能需要一段時間。所以要小心:與你交談的大多數人可能會大大低估你在使用少量資源的情況下可以做的深度學習,因為他們可能不會深入了解如何使用預訓練模型。
將預訓練模型用于不同于最初訓練的任務的任務稱為遷移學習。不幸的是,由于遷移學習的研究如此之少,因此很少有領域有可用的預訓練模型。例如,很少預訓練模型目前可用于醫學,這使得遷移學習在該領域的使用具有挑戰性。此外,如何將遷移學習用于時間序列分析等任務還不是很清楚。
行話:遷移學習
將預訓練模型用于不同于最初訓練的任務。
我們代碼的第六行告訴 fastai 如何擬合模型:
learn.fine_tune(1)正如我們所討論的,該架構只描述了一個模板?數學函數;在我們為其包含的數百萬個參數提供值之前,它實際上并沒有做任何事情。
這是深度學習的關鍵——確定如何擬合模型的參數?得到它來解決你的問題。為了擬合模型,我們必須提供至少一條信息:查看每張圖像的次數(稱為epochs數)。您選擇的 epoch 數量在很大程度上取決于您有多少可用時間,以及您發現在實踐中需要多長時間才能適合您的模型。如果你選擇的數字太小,你總是可以在以后訓練更多的 epoch。
但是為什么方法被調用fine_tune,而不是fit?fastai?確實有一個方法叫做fit,這確實適合模型(即,多次查看訓練集中的圖像,每次更新參數以使預測越來越接近目標標簽)。但在這種情況下,我們從一個預訓練模型開始,我們不想丟棄它已經擁有的所有功能。正如您將在本書中學到的那樣,有一些重要的技巧可以讓預訓練模型適應新數據集——這個過程稱為微調。
行話:微調
一種遷移學習技術,用于更新預訓練模型的參數通過使用與預訓練不同的任務來訓練額外的時期。
當您使用該fine_tune方法時,fastai 將使用這些技巧?你。您可以設置一些參數(我們稍后會討論),但在此處顯示的默認形式中,它執行兩個步驟:
使用一個 epoch 來擬合模型的那些必要部分,以使新的隨機頭與您的數據集正確工作。
使用調用該方法時請求的 epoch 數來擬合整個模型,更新后面層(尤其是頭部)的權重比前面的層更快(正如我們將看到的,通常不需要從預訓練的權重)。
模型的頭部是新添加的特定于?新的數據集。一個紀元是對數據集的一次完整遍歷。?在調用fit之后,每個 epoch 之后的結果都會被打印出來,顯示 epoch 編號、訓練和驗證集損失(用于訓練模型的“性能度量”)以及?您請求的任何指標(錯誤率,在這種情況下)。
因此,通過所有這些代碼,我們的模型學會了識別貓和狗?從標記的例子。但是它是怎么做到的呢?
我們的圖像識別器學到了什么
在這個階段,我們有一個運行良好的圖像識別器,但是?我們不知道它在做什么!盡管許多人抱怨深度學習會導致難以理解的“黑匣子”模型(即給出預測但沒人能理解的東西),但事實并非如此。有大量研究表明如何深入檢查深度學習模型并從中獲得豐富的見解。話雖如此,要完全理解各種機器學習模型(包括深度學習和傳統統計模型)可能具有挑戰性,尤其是在考慮遇到與用于訓練它們的數據截然不同的數據時它們的行為方式時。我們將在整本書中討論這個問題。
2013 年,博士生 Matt Zeiler 和他的導師 Rob Fergus 發表了“Visualizing and Understanding Convolutional Networks”,它展示了如何可視化在模型的每一層中學習到的神經網絡權重。他們仔細分析了贏得 2012 年 ImageNet 比賽的模型,并利用這種分析極大地改進了模型,使他們能夠繼續贏得 2013 年的比賽!圖 1-10是他們發布的第一層權重的圖片。
圖 1-10。CNN 第一層的激活(由 Matthew D. Zeiler 和 Rob Fergus 提供)
這張照片需要一些解釋。對于每一層,淺灰色背景的圖像部分顯示了重建的權重,底部較大的部分顯示了訓練圖像中與每組權重最匹配的部分。對于第 1 層,我們可以看到模型發現了代表對角線、水平和垂直邊緣以及各種梯度的權重。(請注意,對于每一層,只顯示了特征的一個子集;實際上,所有層都有數千個。)
這些是模型為計算機視覺學習的基本構建塊。神經科學家和計算機視覺研究人員對它們進行了廣泛分析,事實證明,這些學習到的構建塊與人眼中的基本視覺機制以及在深度學習。下一層?如圖 1-11 所示。
?????????????????????????圖 1-11。CNN 第二層的激活(由 Matthew D. Zeiler 和 Rob Fergus 提供)
對于第 2 層,模型找到的每個特征都有 9 個權重重建示例。我們可以看到該模型已經學會創建特征檢測器來尋找角落、重復線、圓圈和其他簡單模式。這些是從第一層開發的基本構建塊構建的。對于其中的每一個,圖片的右側顯示了這些特征最匹配的實際圖像中的小塊。例如,第 2 行第 1 列中的特定圖案與日落相關的漸變和紋理相匹配。
圖 1-12顯示了論文中的圖像,顯??示了重建第 3 層特征的結果。
?????????????????????????圖 1-12。CNN 第三層的激活(由 Matthew D. Zeiler 和 Rob Fergus 提供)
從這張圖片的右側可以看出,這些特征現在能夠識別和匹配更高級別的語義組件,例如車輪、文本和花瓣。使用這些組件,第 4 層和第 5 層可以識別更高級別的概念,如圖 1-13所示。
??????????????圖 1-13。CNN 第四層和第五層的激活(由 Matthew D. Zeiler 和 Rob Fergus 提供)????????
這篇文章正在研究一個名為AlexNet的舊模型,它只包含五層。從那時起開發的網絡可以有數百層——因此您可以想象這些模型開發的功能有多么豐富!
當我們早些時候微調我們的預訓練模型時,我們調整了最后一層關注的內容(花、人類、動物),以專注于貓與狗的問題。更一般地說,我們可以將這種預訓練模型專門用于許多不同的任務。讓我們看一些例子。
圖像識別器可以處理非圖像任務
顧名思義,圖像識別器只能識別圖像。?但是很多東西都可以表示為圖像,這意味著圖像識別器可以學習完成很多任務。
例如,聲音可以轉換為頻譜圖,這是一個?顯示音頻文件中每個時間的每個頻率的數量的圖表。Fast.ai 的學生 Ethan Sutin 使用這種方法,使用 8,732?個城市聲音的數據集輕松擊敗了已發布的最先進環境聲音檢測模型的準確性。fastaishow_batch清楚地顯示了每個聲音如何具有非常獨特的頻譜圖,?如圖 1-14 所示。
????????????????????????????????????????????????圖 1-14。帶有聲音頻譜圖的 show_batch
通過簡單地繪制時間序列可以很容易地轉換為圖像?圖上的時間序列。但是,嘗試以一種盡可能容易地提取最重要組件的方式來表示數據通常是一個好主意。在時間序列中,像季節性和異常這樣的東西最有可能引起人們的興趣。
各種轉換可用于時間序列數據。例如,fast.ai 的學生 Ignacio Oguiza 使用稱為 Gramian Angular Difference Field (GADF) 的技術從時間序列數據集中創建用于橄欖油分類的圖像;您可以在圖 1-15中看到結果。然后,他將這些圖像輸入到圖像分類模型中,就像您在本章中看到的那樣。他的結果盡管只有 30 張訓練集圖像,但準確率遠遠超過 90%,接近最先進的水平。
圖 1-15。將時間序列轉換為圖像
另一個有趣的 fast.ai 學生項目示例來自 Gleb Esman。他在 Splunk 從事欺詐檢測工作,使用用戶鼠標移動和鼠標點擊的數據集。他把這些變成圖片,用彩色線條畫出鼠標指針的位置、速度和加速度,并用彩色?小圓圈顯示點擊,如圖1-16所示。他將其輸入到圖像識別模型中,就像我們在本章中使用的模型一樣,并且效果非常好,以至于為這種欺詐分析方法獲得了專利!
圖 1-16。將計算機鼠標行為轉換為圖像
另一個例子來自?Mahmoud Kalash 等人的論文“Malware Classification with Deep Convolutional Neural Networks” ,該論文解釋了?“惡意軟件二進制文件被分成 8 位序列,然后轉換為等效的十進制值。這個十進制向量被重新整形,并生成了代表惡意軟件樣本的 [a] 灰度圖像,”在圖 1-17中。
圖 1-17。惡意軟件分類過程
然后作者展示了不同類別的惡意軟件通過這個過程生成的“圖片”,如圖 1-18所示。
?????????????????????????????????????????????????圖 1-18。惡意軟件示例
如您所見,不同類型的惡意軟件在人眼中看起來非常獨特。研究人員基于此圖像表示訓練的模型在惡意軟件分類方面比學術文獻中顯示的任何先前方法更準確。這表明了將數據集轉換為圖像表示的一個很好的經驗法則:如果人眼可以從圖像中識別類別,那么深度學習模型也應該能夠做到這一點。
一般來說,如果您在表示數據的方式上有點創意,您會發現深度學習中的少數通用方法可以走很長一段路!您不應將此處描述的方法視為“hacky workarounds”,因為它們經常(如此處)擊敗以前最先進的結果。這些確實是思考這些問題領域的正確方法。
行話回顧
我們剛剛介紹了很多信息,所以讓我們簡要回顧一下。?表 1-3提供了一個方便的詞匯表。
| Label | 我們試圖預測的數據,例如“狗”或“貓” |
| Architecture | 我們試圖擬合的模型模板;即,我們將輸入數據和參數傳遞給的實際數學函數 |
| Model | 架構與一組特定參數的組合 |
| Parameters | 模型中的值會改變它可以執行的任務,并通過模型訓練更新 |
| Fit | 更新模型的參數,使使用輸入數據的模型預測與目標標簽匹配 |
| Train | 適合的代名詞 |
| Pretrained model | 已經訓練過的模型,通常使用大型數據集,并且會進行微調 |
| Fine-tune | 為不同的任務更新預訓練模型 |
| Epoch | 一次完整地遍歷輸入數據 |
| Loss | 衡量模型好壞的指標,選擇通過 SGD 驅動訓練 |
| Metric | 衡量模型使用驗證集的效果,為人類消費選擇 |
| Training set | 從訓練中提取的一組數據,僅用于衡量模型的好壞 |
| Training set | 用于擬合模型的數據;不包括驗證集中的任何數據 |
| Overfitting | 以記住輸入數據的特定特征的方式訓練模型,而不是很好地泛化到訓練期間沒有看到的數據 |
| CNN | 卷積神經網絡;一種特別適用于計算機視覺任務的神經網絡 |
有了這個詞匯表,我們現在可以將迄今為止介紹的所有關鍵概念匯總在一起。花點時間查看這些定義并閱讀以下摘要。如果您可以按照解釋進行操作,那么您就可以很好地理解即將進行的討論。
機器學習是一門學科,我們在其中定義程序而不是通過?完全由我們自己編寫,但通過從數據中學習。深度學習是機器學習中的一門專業,它使用多層神經網絡。圖像分類是一個有代表性的例子(也稱為圖像識別)。我們從標記數據開始——一組圖像,我們為每個圖像分配了一個?標簽,表明它代表什么。我們的目標是生成一個程序,稱為模型,給定一張新圖像,該程序將準確預測該新圖像所代表的內容。
每個模型都從架構的選擇開始,這是該模型在內部如何工作的通用模板。訓練?(或擬合)模型的過程是找到一組參數值(或權重)的過程,這些參數值(或權重)將通用架構專門化為適用于我們特定類型數據的模型。為了定義一個模型在單個預測上的表現如何,我們需要定義一個?損失函數,它決定了我們如何對預測進行評分。
為了讓訓練過程更快,我們可能會從一個?預訓練模型開始——一個已經在其他人的數據上訓練過的模型。然后,我們可以通過對我們的數據進行更多的訓練來使其適應我們的數據,這個過程稱為微調。
當我們訓練一個模型時,一個關鍵的問題是確保我們的模型?泛化:它從我們的數據中學習一般的經驗教訓?這也適用于它將遇到的新項目,因此它可以對這些項目做出良好的預測。風險在于,如果我們訓練我們的模型不好,而不是學習一般課程,它會有效地記住它已經看到的內容,然后它會對新圖像做出糟糕的預測。這種失敗稱為過擬合。
為了避免這種情況,我們總是將數據分成兩部分,訓練集和?驗證集。我們通過僅顯示訓練集來訓練模型,然后通過查看模型在驗證集中的項目上的表現來評估模型的表現。通過這種方式,我們檢查模型從訓練集中學到的課程是否是推廣到驗證集的課程。為了讓人們評估模型在整個驗證集上的表現如何,我們定義了一個?metric。在訓練過程中,當模型看到訓練集中的每個項目時,我們稱之為epoch。
所有這些概念通常都適用于機器學習。它們適用于通過數據訓練來定義模型的各種方案。使深度學習與眾不同的是一類特殊的架構:基于神經網絡的架構。特別是,像圖像分類這樣的任務在很大程度上依賴于?卷積神經網絡,我們將在稍后討論。
深度學習不僅僅用于圖像分類
近年來,深度學習對圖像分類的有效性得到了廣泛的討論,甚至在復雜的任務中表現出超人的?結果,比如在 CT 掃描中識別惡性腫瘤。但它可以做的遠不止這些,我們將在這里展示。
例如,讓我們談談對自動駕駛汽車至關重要的事情:定位圖片中的對象。如果一個?自動駕駛汽車不知道行人在哪里,那就不知道如何避開!創建一個可以識別圖像中每個單獨像素內容的模型稱為?分割。以下是我們如何使用Gabriel J. Brostow 等人的論文?“視頻中的語義對象類:高清地面實況數據庫”中的CamVid數據集的子集,使用 fastai 訓練分割模型的方法:
path = untar_data(URLs.CAMVID_TINY) dls = SegmentationDataLoaders.from_label_func(path, bs=8, fnames = get_image_files(path/"images"),label_func = lambda o: path/'labels'/f'{o.stem}_P{o.suffix}',codes = np.loadtxt(path/'codes.txt', dtype=str) )learn = unet_learner(dls, resnet34) learn.fine_tune(8)| 0 | 2.906601 | 2.347491 | 00:02 |
| 0 | 1.988776 | 1.765969 | 00:02 |
| 1 | 1.703356 | 1.265247 | 00:02 |
| 2 | 1.591550 | 1.309860 | 00:02 |
| 3 | 1.459745 | 1.102660 | 00:02 |
| 4 | 1.324229 | 0.948472 | 00:02 |
| 5 | 1.205859 | 0.894631 | 00:02 |
| 6 | 1.102528 | 0.809563 | 00:02 |
| 7 | 1.020853 | 0.805135 | 00:02 |
我們甚至不打算逐行瀏覽此代碼,因為它與我們之前的示例幾乎相同!(我們將在第 15 章中深入探討分割模型?,以及我們在本章中簡要介紹的所有其他模型以及許多其他模型。)
我們可以通過要求模型對圖像的每個像素進行顏色編碼來可視化它完成任務的效果。如您所見,它幾乎完美地分類了每個對象中的每個像素。例如,注意所有的汽車都覆蓋了相同的顏色,所有的樹都覆蓋了相同的顏色(在每對圖像中,左邊的圖像是地面實況標簽,右邊是來自該模型):
learn.show_results(max_n=6, figsize=(7,8))另一個深度學習在過去得到顯著改善的領域?幾年是自然語言處理(NLP)。計算機現在可以生成文本、自動從一種語言翻譯成另一種語言、分析評論、在句子中標記單詞等等。以下是訓練模型所需的所有代碼,該模型可以比五年前世界上存在的任何東西更好地對電影評論的情緒進行分類:
from fastai.text.all import *dls = TextDataLoaders.from_folder(untar_data(URLs.IMDB), valid='test') learn = text_classifier_learner(dls, AWD_LSTM, drop_mult=0.5, metrics=accuracy) learn.fine_tune(4, 1e-2)| 0 | 0.594912 | 0.407416 | 0.823640 | 01:35 |
| 0 | 0.268259 | 0.316242 | 0.876000 | 03:03 |
| 1 | 0.184861 | 0.246242 | 0.898080 | 03:10 |
| 2 | 0.136392 | 0.220086 | 0.918200 | 03:16 |
| 3 | 0.106423 | 0.191092 | 0.931360 | 03:15 |
該模型使用Andrew Maas 等人的“Learning Word Vectors for Sentiment Analysis”中的IMDb Large Movie Review 數據集。它適用于成千上萬字的電影評論,但讓我們用一個簡短的評論來測試它,看看它是如何工作的:
learn.predict("I really liked that movie!") ('pos', tensor(1), tensor([0.0041, 0.9959]))在這里我們可以看到模型認為評論是積極的。結果的第二部分是“pos”在我們的數據詞匯表中的索引,最后一部分是歸因于每個類的概率(“pos”為 99.6%,“neg”為 0.4%)。
現在輪到你了!寫你自己的迷你影評,或者從網上復制一個,你可以看看這個模型是怎么想的。
訂單很重要
在 Jupyter 筆記本中,執行每個單元的順序很重要。它不像 Excel,只要您在任何地方鍵入內容,所有內容都會立即更新 - 它具有每次執行單元格時都會更新的內部狀態。例如,當您運行筆記本的第一個單元格時(帶有“CLICK ME”注釋),您?創建一個名為的對象learn,其中包含圖像分類問題的模型和數據。
如果我們要立即運行文本中剛剛顯示的單元格(預測評論是否良好的單元格),我們會得到一個錯誤,因為該learn對象不包含文本分類模型。此單元格需要在包含以下內容的單元格之后運行:
from fastai.text.all import *dls = TextDataLoaders.from_folder(untar_data(URLs.IMDB), valid='test') learn = text_classifier_learner(dls, AWD_LSTM, drop_mult=0.5,metrics=accuracy) learn.fine_tune(4, 1e-2)輸出本身可能具有欺騙性,因為它們包括上次執行單元格的結果;如果您更改單元格內的代碼而不執行它,舊的(誤導性)結果將保留。
除非我們明確提及,否則本書網站上提供的筆記本是按順序運行的,從上到下。通常,在進行實驗時,您會發現自己以任意順序執行單元以快速運行(這是 Jupyter Notebook 的一個超級簡潔的功能),但是一旦您探索并到達了代碼的最終版本,請確保您可以運行按順序排列筆記本中的單元格(你未來的自己不一定會記得你走的錯綜復雜的道路!)。
在命令模式下,鍵入0兩次將重新啟動內核(即為筆記本電腦提供動力的引擎)。這將清除您的狀態并使其就像您剛剛開始使用筆記本一樣。從“單元格”菜單中選擇“運行所有以上”以運行您所在位置上方的所有單元格。我們發現這在開發 fastai 庫時很有用。
如果您對 fastai 方法有任何疑問,您應該使用?function?doc,將方法名稱傳遞給它:
doc(learn.predict)彈出一個窗口,其中包含簡短的單行說明。“在文檔中顯示”鏈接將帶您進入完整文檔,您可以在其中找到所有詳細信息和大量示例。還,?fastai 的大多數方法都只是幾行代碼,因此您可以單擊“源”鏈接以查看幕后發生的確切情況。
讓我們繼續做一些不那么性感,但可能在商業上更有用的東西:從簡單的表格數據構建模型。
行話:表格
表格形式的數據,例如來自電子表格、數據庫或逗號分隔值 (CSV) 文件的數據。表格模型是一種嘗試根據表中其他列中的信息來預測表中的一列的模型。
事實證明,這看起來也非常相似。以下是訓練一個模型所必需的代碼,該模型將根據一個人的社會經濟背景預測一個人是否是高收入者:
from fastai.tabular.all import * path = untar_data(URLs.ADULT_SAMPLE)dls = TabularDataLoaders.from_csv(path/'adult.csv', path=path, y_names="salary",cat_names = ['workclass', 'education', 'marital-status', 'occupation','relationship', 'race'],cont_names = ['age', 'fnlwgt', 'education-num'],procs = [Categorify, FillMissing, Normalize])learn = tabular_learner(dls, metrics=accuracy)如您所見,我們必須告訴 fastai 哪些列是分類的(包含作為離散選擇集之一的值,例如occupation)與連續的(包含表示數量的數字,例如age)。
沒有可用于此任務的預訓練模型(通常,預訓練模型不適用于任何表格建模任務,盡管一些組織已經創建它們供內部使用),fine_tune所以我們在這種情況下?不使用。相反,我們使用?fit_one_cycle最常用的從頭開始訓練 fastai 模型的方法(即,沒有遷移學習):
learn.fit_one_cycle(3)| 0 | 0.359960 | 0.357917 | 0.831388 | 00:11 |
| 1 | 0.353458 | 0.349657 | 0.837991 | 00:10 |
| 2 | 0.338368 | 0.346997 | 0.843213 | 00:10 |
該模型使用Ron Kohavi的論文?“Scaling Up the Accuracy of Naive-Bayes Classifiers: a Decision-Tree Hybrid”中的成人數據集,其中包含一些?有關個人的人口統計數據(例如他們的教育、婚姻狀況、種族、性別以及他們的年收入是否超過 5 萬美元)。該模型的準確率超過 80%,訓練時間約為 30 秒。
讓我們再看一個。推薦系統很重要,尤其是在電子商務中。亞馬遜和 Netflix 等公司努力推薦用戶可能喜歡的產品或電影。這是訓練預測電影人的模型的方法?可能會根據他們之前的觀看習慣,使用MovieLens數據集:
from fastai.collab import * path = untar_data(URLs.ML_SAMPLE) dls = CollabDataLoaders.from_csv(path/'ratings.csv') learn = collab_learner(dls, y_range=(0.5,5.5)) learn.fine_tune(10)| 0 | 1.554056 | 1.428071 | 00:01 |
| 0 | 1.393103 | 1.361342 | 00:01 |
| 1 | 1.297930 | 1.159169 | 00:00 |
| 2 | 1.052705 | 0.827934 | 00:01 |
| 3 | 0.810124 | 0.668735 | 00:01 |
| 4 | 0.711552 | 0.627836 | 00:01 |
| 5 | 0.657402 | 0.611715 | 00:01 |
| 6 | 0.633079 | 0.605733 | 00:01 |
| 7 | 0.622399 | 0.602674 | 00:01 |
| 8 | 0.629075 | 0.601671 | 00:00 |
| 9 | 0.619955 | 0.601550 | 00:01 |
該模型在 0.5 到 5.0 的范圍內預測電影收視率,平均誤差在 0.6 左右。由于我們預測的是一個連續的數字,而不是一個類別,我們必須使用y_range參數告訴 fastai 我們的目標有什么范圍。
盡管我們實際上并沒有使用預訓練模型(與我們沒有使用表格模型的原因相同),這個例子表明 fastai 讓我們在這種情況下無論如何都可以使用(你將在第 5 章fine_tune了解它的工作原理和原因?)。有時最好試驗一下vs看看哪個最適合您的數據集。fine_tunefit_one_cycle
我們可以使用之前看到的相同show_results調用來查看一些用戶和電影 ID、實際評分和預測的示例:
learn.show_results()| 157 | 1200 | 4.0 | 3.558502 |
| 23 | 344 | 2.0 | 2.700709 |
| 19 | 1221 | 5.0 | 4.390801 |
| 430 | 592 | 3.5 | 3.944848 |
| 547 | 858 | 4.0 | 4.076881 |
| 292 | 39 | 4.5 | 3.753513 |
| 529 | 1265 | 4.0 | 3.349463 |
| 19 | 231 | 3.0 | 2.881087 |
| 475 | 4963 | 4.0 | 4.023387 |
| 130 | 260 | 4.5 | 3.979703 |
數據集:模型的食物
您已經在本節中看到了很多模型,每個模型都使用不同的數據集進行訓練以執行不同的任務。在機器學習和深度學習中,沒有數據我們什么都做不了。因此,為我們創建數據集以訓練我們的模型的人是(通常被低估的)英雄。一些最有用和最重要的數據集是那些成為重要學術基線的數據集——?研究人員廣泛研究并用于比較算法變化的數據集。其中一些成為家喻戶曉的名字(至少在訓練模型的家庭中!),例如 MNIST、CIFAR-10 和 ImageNet。
之所以選擇本書中使用的數據集,是因為它們提供了您可能遇到的數據類型的很好示例,并且學術文獻中有許多使用這些數據集的模型結果示例,您可以將其與您的工作進行比較。
本書中使用的大多數數據集都花費了創建者大量的工作來構建。例如,在本書的后面,我們將向您展示如何創建一個可以在法語和英語之間進行翻譯的模型。鑰匙?對此的輸入是賓夕法尼亞大學的 Chris Callison-Burch 教授于 2009 年編寫的法語/英語平行文本語料庫。該數據集包含超過 2000 萬個句子對?法語和英語。他以一種非常聰明的方式構建了數據集:通過爬取數百萬加拿大網頁(通常是多語言的),然后使用一組簡單的啟發式方法將法語內容的 URL 轉換為指向相同英語內容的 URL。
當你在本書中查看數據集時,想想它們可能來自哪里以及它們可能是如何被整理的。然后想想你可以為自己的項目創建什么樣的有趣數據集。(我們甚至會很快帶您逐步完成創建自己的圖像數據集的過程。)
fast.ai 花了很多時間創建流行數據集的縮減版本,這些數據集專門用于支持快速原型設計和?實驗,更容易學習。在本書中,我們通常會從使用其中一個縮小版開始,然后放大到完整版(就像我們在本章中所做的那樣!)。這就是世界頂級從業者在實踐中的建模方式;他們使用數據子集進行大部分實驗和原型設計,并且只有在充分了解自己必須做什么時才使用完整的數據集。
我們訓練的每個模型都顯示了訓練和驗證損失。一個好的驗證集是訓練過程中最重要的部分之一。讓我們看看為什么并學習如何創建一個。
驗證集和測試集
正如我們所討論的,模型的目標是對數據進行預測。但是模型訓練過程從根本上說是愚蠢的。如果我們使用所有數據訓練模型,然后使用相同的數據評估模型,我們將無法判斷我們的模型在它未見過的數據上的表現如何。如果沒有這條非常有價值的信息來指導我們訓練我們的模型,它很有可能會很好地預測該數據,但在新數據上表現不佳。
為了避免這種情況,我們的第一步是將我們的數據集分成兩組:訓練集(我們的模型在訓練中看到)和驗證集,也稱為開發集?(僅用于評估)。這讓我們可以測試模型是否從訓練數據中吸取教訓,這些數據可以推廣到新數據,即驗證數據。
理解這種情況的一種方法是,從某種意義上說,我們不希望我們的模型通過“作弊”來獲得好的結果。如果它對一個數據項做出了準確的預測,那應該是因為它已經學習了該類項的特征,而不是因為模型是通過實際看到該特定項而形成的。
分離我們的驗證數據意味著我們的模型在訓練中永遠不會看到它,因此完全不受它的污染,也沒有以任何方式作弊。正確的?
事實上,不一定。情況更加微妙。這是因為在現實場景中,我們很少只通過訓練一次參數來構建模型。相反,我們可能會通過關于網絡架構、學習率、數據增強策略以及我們將在接下來的章節中討論的其他因素的各種建模選擇來探索模型的許多版本。許多這些選擇可以描述為超參數的選擇。這個詞反映了?它們是關于參數的參數,因為它們是控制權重參數含義的更高級別的選擇。
問題在于,即使普通的訓練過程在學習權重參數值時只查看對訓練數據的預測,但我們的情況并非如此。當我們決定探索新的超參數值時,作為建模者,我們正在通過查看對驗證數據的預測來評估模型!因此,模型的后續版本間接地由我們看到驗證數據形成。正如自動訓練過程存在過度擬合訓練數據的危險一樣,我們也存在通過人工試錯和探索過度擬合驗證數據的危險。
這個難題的解決方案是引入另一個級別更高的保留數據:測試集。正如我們在訓練過程中保留驗證數據一樣,我們必須保留測試?甚至來自我們自己的數據。不能用于改進模型;它只能用于在我們努力的最后階段評估模型。實際上,我們定義了數據切割的層次結構,基于我們希望將其從訓練和建模過程中隱藏的程度:訓練數據完全公開,驗證數據公開較少,測試數據完全隱藏。這種層次結構與不同類型的建模和評估過程本身平行——帶有反向傳播的自動訓練過程,在訓練會話之間嘗試不同超參數的更多手動過程,以及對我們最終結果的評估。
測試和驗證集應該有足夠的數據來確保你?對您的準確性有一個很好的估計。例如,如果您正在創建一個貓檢測器,您通常希望驗證集中至少有 30 只貓。這意味著,如果您有一個包含數千個項目的數據集,則使用默認的 20% 驗證集大小可能超出您的需要。另一方面,如果您有大量數據,使用其中的一些進行驗證可能沒有任何缺點。
擁有兩個級別的“保留數據”——一個驗證集和一個測試集,其中一個級別代表你實際上對自己隱藏的數據——可能看起來有點極端。但這通常是必要的,因為模型傾向于使用最簡單的方法來進行良好的預測(記憶),作為易犯錯誤的人類,我們往往傾向于自欺欺人,因為我們的模型表現如何。測試集的紀律幫助我們在智力上保持誠實。這并不意味著我們總是需要一個單獨的測試集——如果你的數據很少,你可能只需要一個驗證集——但通常最好盡可能使用一個。
如果您打算聘請第三方代表您執行建模工作,那么同樣的紀律也很重要。第三方可能無法準確理解您的要求,或者他們的激勵措施甚至可能鼓勵他們誤解它們。一個好的測試集可以大大降低這些風險,并讓您評估他們的工作是否解決了您的實際問題。
坦率地說,如果您是組織中的高級決策者(或者您正在為高級決策者提供建議),那么最重要的一點是:如果您確保您真正了解測試和驗證集是什么以及為什么它們'很重要,當組織決定使用 AI 時,您將避免我們看到的最大的單一失敗源。例如,如果您正在考慮引入外部供應商或服務,請確保您提供一些供應商永遠無法看到的測試數據。然后,您根據您的測試數據檢查他們的模型,使用您根據實踐中對您真正重要的因素選擇的指標,然后您決定什么水平的性能是足夠的。(您自己嘗試簡單的基線也是一個好主意,這樣您就知道一個真正簡單的模型可以實現什么。通常會證明您的簡單模型的性能與外部“專家”產生的模型一樣好! )
在定義測試集時使用判斷
要做好定義驗證集(也可能是測試集)的工作,?您有時會想做的不僅僅是隨機抓取原始數據集的一小部分。請記住:驗證集和測試集的一個關鍵屬性是它們必須代表您將來會看到的新數據。這聽起來像是一個不可能的命令!根據定義,您還沒有看到這些數據。但你通常仍然知道一些事情。
看幾個例子很有啟發意義。其中許多示例來自預測建模競賽在?Kaggle平臺上,它很好地代表了你在實踐中可能會看到的問題和方法。
一種情況可能是您正在查看時間序列數據。對于時間序列,選擇數據的隨機子集都太容易了(您?可以查看您嘗試預測的日期之前和之后的數據)并且不代表大多數業務用例(您使用歷史數據構建模型以供將來使用)。如果您的數據包含日期并且您正在構建一個模型以供將來使用,您將需要選擇具有最新日期的連續部分作為您的驗證集(例如,最近兩周或上個月的可用數據)。
假設您要將圖 1-19中的時間序列數據拆分 為訓練集和驗證集。
?????????????????????????????????????????????????圖 1-19。一個時間序列
正如我們在圖 1-20中看到的那樣,隨機子集是一個糟糕的選擇(太容易填補空白,并且不能說明您在生產中需要什么)。
?????????????????????????????????????????????????圖 1-20。一個糟糕的訓練子集
相反,使用較早的數據作為您的訓練集(以及較晚的數據作為驗證集),如圖 1-21所示。
?????????????????????????????????????????????????????????????????????圖 1-21。一個好的訓練子集
例如,Kaggle 舉辦了一場?預測厄瓜多爾連鎖雜貨店銷售額的比賽。卡格爾的?訓練數據從 2013 年 1 月 1 日到 2017 年 8 月 15 日,測試數據從 2017 年 8 月 16 日到 2017 年 8 月 31 日。這樣,比賽組織者確保參賽者?在未來,從他們的模型的角度來看。這類似于量化對沖基金交易員根據過去的數據進行回測以檢查他們的模型是否可以預測未來時期的方式。
第二種常見情況是,您可以輕松預測在生產中預測的數據可能與您必須用來訓練模型的數據在質量上不同的方式。
在 Kaggle?分心駕駛員比賽中,自變量是駕駛汽車的駕駛員的照片,因變量是諸如?發短信、吃飯或安全地向前看。很多圖片都是相同的司機在不同的位置,?如圖 1-22 所示。如果您是一家保險公司,根據這些數據構建模型,請注意,您最感興趣的是模型在以前從未見過的駕駛員身上的表現(因為您可能只有一小部分人的訓練數據)。認識到這一點,比賽的測試數據由未出現在訓練集中的人的圖像組成。
?????????????????????????????????????????????????????????????????????圖 1-22。來自訓練數據的兩張圖片
如果將圖 1-22中的一張圖像放入訓練集中,另一張放入驗證集中,您的模型將很容易對驗證集中的一張進行預測,因此它的性能似乎比它會在新人身上。另一種觀點是,如果你使用所有人來訓練你的模型,你的模型可能會過度擬合這些特定人的特殊性,而不僅僅是學習狀態(發短信、吃飯等)。
Kaggle 漁業競賽中也有類似的動態,?以確定漁船捕獲的魚類種類,以減少對瀕危種群的非法捕撈。這?測試集由未出現在訓練數據中的船只圖像組成,因此在這種情況下,您希望驗證集也包括不在訓練集中的船只。
有時可能不清楚您的驗證數據將有何不同。例如,對于使用衛星圖像的問題,您需要收集有關訓練集是僅包含某些地理位置還是來自地理上分散的數據的更多信息。
現在您已經了解了如何構建模型,您可以決定接下來要深入研究什么。
進一步的研究
每章還有一個“進一步研究”部分,提出了一些文本中沒有完全回答的問題,或者給出了更高級的作業。這些問題的答案不在本書的網站上。你需要自己做研究!
為什么 GPU 對深度學習有用?CPU 有何不同,為什么它對深度學習的效果較差?
嘗試考慮反饋循環可能影響機器學習使用的三個領域。看看您是否可以找到在實踐中發生的記錄示例。
總結
以上是生活随笔為你收集整理的【Pytorch with fastai】第 1 章:你的深度学习之旅的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xampp php5.6 7.1共存,N
- 下一篇: 为什么析构函数可以能声明为虚函数,构造函