直到最近,您在日常生活中可能與之交互的幾乎每個計算機程序都被編碼為一組嚴格的規則,精確指定了它應該如何運行。假設我們要編寫一個應用程序來管理電子商務平臺。在圍著白板思考幾個小時后,我們可能會確定一個可行解決方案的大致思路,例如:(i) 用戶通過在 Web 瀏覽器或移動應用程序中運行的界面與應用程序交互;(ii) 我們的應用程序與商業級數據庫引擎交互,以跟蹤每個用戶的狀態并維護歷史交易記錄;(iii) 在我們應用程序的核心,業務邏輯(你可能會說,大腦) 我們的應用程序闡明了一組規則,將每一種可能的情況映射到我們的程序應該采取的相應行動。
為了構建我們應用程序的大腦,我們可能會枚舉我們的程序應該處理的所有常見事件。例如,每當客戶點擊將商品添加到他們的購物車時,我們的程序就應該向購物車數據庫表添加一個條目,將用戶的 ID 與請求的產品 ID 相關聯。然后我們可能會嘗試遍歷每一個可能的極端情況,測試我們的規則的適當性并進行任何必要的修改。如果用戶使用空購物車開始購買會怎樣?雖然很少有開發人員第一次就完全正確(可能需要進行一些測試才能解決問題),但在大多數情況下,我們可以編寫此類程序并自信地啟動它們見過真正的客戶。我們通常在新情況下手動設計驅動功能產品和系統的自動化系統的能力是一項了不起的認知壯舉。當您能夠設計出有效的解決方案時 \(100\%\)當時,您通常不應該擔心機器學習。
幸運的是,對于不斷壯大的機器學習科學家群體來說,我們想要自動化的許多任務并不容易屈從于人類的聰明才智。想象一下,你認識的最聰明的人圍坐在白板周圍,但這一次你要解決以下問題之一:
-
編寫一個程序,根據地理信息、衛星圖像和過去天氣的拖尾窗口預測明天的天氣。
-
編寫一個程序,接受一個以自由格式文本表達的事實型問題,并正確回答它。
-
編寫一個程序,根據給定的圖像識別圖像中描繪的所有人,并在每個人周圍畫出輪廓。
-
編寫一個程序,向用戶展示他們可能會喜歡但在自然瀏覽過程中不太可能遇到的產品。
對于這些問題,即使是精英程序員也很難從頭開始編寫解決方案。原因可能各不相同。有時我們正在尋找的程序遵循一種隨時間變化的模式,因此沒有固定的正確答案!在這種情況下,任何成功的解決方案都必須優雅地適應不斷變化的世界。在其他時候,關系(比如像素和抽象類別之間的關系)可能過于復雜,需要數千或數百萬次計算并遵循未知的原則。在圖像識別的情況下,執行任務所需的精確步驟超出了我們的意識理解,即使我們的潛意識認知過程毫不費力地執行任務。
機器學習是對可以從經驗中學習的算法的研究。隨著機器學習算法積累更多經驗(通常以觀察數據或與環境交互的形式),其性能會提高。將此與我們的確定性電子商務平臺進行對比,無論積累多少經驗,它都遵循相同的業務邏輯,直到開發人員自己學習并決定是時候更新軟件了。在本書中,我們將向您介紹機器學習的基礎知識,尤其是深度學習,這是一套強大的技術,可在計算機視覺、自然語言處理、醫療保健和基因組學等不同領域推動創新。
1.1. 一個激勵人心的例子
在開始寫作之前,本書的作者和許多工作人員一樣,不得不喝下咖啡因。我們跳上車,開始開車。亞歷克斯使用 iPhone 喊出“Hey Siri”,喚醒了手機的語音識別系統。然后Mu命令“去Blue Bottle咖啡店的方向”。手機很快就顯示出他的命令抄錄。它還認識到我們正在詢問方向并啟動了地圖應用程序 (app) 來滿足我們的請求。啟動后,地圖應用程序會識別出多條路線。在每條路線旁邊,手機會顯示預計的通行時間。雖然我們為了教學方便而編造了這個故事,但它表明,在短短幾秒鐘的時間里,我們與智能手機的日常互動可以涉及多種機器學習模型。
想象一下,只需編寫一個程序來響應諸如“Alexa”、“OK Google”和“Hey Siri”之類的喚醒詞。嘗試自己在房間里用計算機和代碼編輯器編寫代碼,如圖1.1.1所示。你會如何根據第一性原理編寫這樣的程序?想一想……這個問題很難。每秒,麥克風將收集大約 44000 個樣本。每個樣本都是對聲波振幅的測量。什么規則可以可靠地將一段原始音頻映射到自信的預測 \(\{\text{yes}, \text{no}\}\)關于片段是否包含喚醒詞?如果您被卡住了,請不要擔心。我們也不知道如何從頭開始編寫這樣的程序。這就是我們使用機器學習的原因。
這是訣竅。通常,即使我們不知道如何明確地告訴計算機如何將輸入映射到輸出,我們仍然能夠自己完成認知壯舉。換句話說,即使你不知道如何讓計算機識別“Alexa”這個詞,你自己也能識別它。有了這種能力,我們可以收集一個巨大的數據集,其中包含音頻片段和相關標簽的示例,指示哪些片段包含喚醒詞。在機器學習的主流方法中,我們不會嘗試設計一個明確識別喚醒詞的系統。相反,我們定義了一個靈活的程序,其行為由許多參數決定. 然后我們使用數據集來確定可能的最佳參數值,即那些可以根據所選性能指標提高程序性能的參數值。
您可以將參數視為我們可以轉動的旋鈕,從而操縱程序的行為。固定參數,我們稱程序為模型。我們僅通過操縱參數就可以生成的所有不同程序(輸入-輸出映射)的集合稱為 模型族。而使用我們的數據集來選擇參數的元程序稱為學習算法。
在我們繼續使用學習算法之前,我們必須精確定義問題,確定輸入和輸出的確切性質,并選擇合適的模型系列。在這種情況下,我們的模型接收一段音頻作為輸入,然后模型生成一個選擇\(\{\text{yes}, \text{no}\}\)作為 輸出。如果一切按計劃進行,模型對片段是否包含喚醒詞的猜測通常是正確的。
如果我們選擇正確的模型系列,應該有一個旋鈕設置,這樣模型每次聽到“Alexa”這個詞時都會發出“是”。因為喚醒詞的確切選擇是任意的,我們可能需要一個足夠豐富的模型系列,通過旋鈕的另一種設置,它可以僅在聽到“Apricot”這個詞時發出“是”。我們期望相同的模型系列應該適用于“Alexa”識別和“Apricot”識別,因為從直覺上看,它們似乎是相似的任務。然而,如果我們想要處理根本不同的輸入或輸出,比如我們想要從圖像映射到字幕,或者從英文句子映射到中文句子,我們可能需要完全不同的模型系列。
您可能會猜到,如果我們只是隨機設置所有旋鈕,我們的模型不太可能識別“Alexa”、“Apricot”或任何其他英文單詞。在機器學習中,學習是我們發現旋鈕的正確設置的過程,通過該過程可以從我們的模型中強制執行所需的行為。換句話說,我們用數據訓練我們的模型。如圖 1.1.2所示,訓練過程通常如下所示:
-
從一個隨機初始化的模型開始,它不能做任何有用的事情。
-
抓取你的一些數據(例如,音頻片段和相應的 \(\{\text{yes}, \text{no}\}\)標簽)。
-
調整旋鈕以使模型在這些示例中評估時表現更好。
-
重復步驟 2 和 3,直到模型很棒。
總而言之,我們不是編寫喚醒詞識別器的代碼,而是編寫一個可以學習識別喚醒詞的程序,如果提供一個大型標記數據集的話。您可以將這種通過向程序展示數據集來確定程序行為的行為視為使用數據進行編程. 也就是說,我們可以通過為我們的機器學習系統提供許多貓和狗的例子來“編程”一個貓檢測器。這樣,檢測器最終將學習如果它是貓則發出一個非常大的正數,如果它是狗則發出一個非常大的負數,如果不確定則發出接近于零的值。這僅僅觸及了機器學習可以做什么的皮毛。我們稍后將更詳細地解釋深度學習,它只是解決機器學習問題的眾多流行方法之一。
1.2. 關鍵部件
在我們的喚醒詞示例中,我們描述了一個由音頻片段和二進制標簽組成的數據集,并且我們對如何訓練模型來近似從片段到分類的映射給出了一個簡單的概念。這類問題,我們嘗試根據已知輸入預測指定的未知標簽,給定由標簽已知的示例組成的數據集,稱為 監督學習。這只是眾多機器學習問題中的一種。在我們探索其他品種之前,我們想更清楚地了解一些核心組件,無論我們處理什么樣的機器學習問題,這些核心組件都會跟隨我們:
-
我們可以從中學習的數據。
-
如何轉換數據的模型。
-
量化模型運行情況的目標函數。
-
調整模型參數以優化目標函數的算法。
1.2.1. 數據
不用說,沒有數據就無法進行數據科學。我們可能會浪費數百頁來思考數據到底是什么,但現在,我們將專注于我們將關注的數據集的關鍵屬性。通常,我們關注示例的集合。為了有效地處理數據,我們通常需要提出合適的數字表示。每個示例(或數據點、數據實例、樣本)通常由一組稱為特征的屬性(有時稱為協變量或 輸入),模型必須基于此做出預測。在監督學習問題中,我們的目標是預測一個特殊屬性的值,稱為標簽(或目標),它不是模型輸入的一部分。
如果我們處理的是圖像數據,則每個示例都可能包含一張單獨的照片(特征)和一個指示照片所屬類別的數字(標簽)。照片將以數字方式表示為三個數值網格,代表每個像素位置的紅光、綠光和藍光的亮度。例如,一個\(200\times 200\)彩色照片將包括\(200\times200\times3=120000\)數值。
或者,我們可以使用電子健康記錄數據來處理預測給定患者在接下來 30 天內存活的可能性的任務。在這里,我們的特征可能包括一組現成的屬性和經常記錄的測量值,包括年齡、生命體征、合并癥、當前藥物治療和最近的程序。可用于訓練的標簽將是一個二進制值,指示歷史數據中的每個患者是否在 30 天窗口內存活。
在這種情況下,當每個示例都具有相同數量的數字特征時,我們說輸入是固定長度的向量,我們將向量的(恒定)長度稱為數據的維度。正如您想象的那樣,固定長度的輸入可能很方便,讓我們不必擔心那么復雜。但是,并非所有數據都可以輕松表示為固定長度向量。雖然我們可能期望顯微鏡圖像來自標準設備,但我們不能期望從 Internet 中提取的圖像都以相同的分辨率或形狀顯示。對于圖像,我們可能會考慮將它們全部裁剪為標準尺寸,但該策略只能讓我們走到這一步。我們冒著丟失裁剪部分信息的風險。此外,文本數據更頑固地抵制固定長度的表示。考慮在亞馬遜、IMDb 和 TripAdvisor 等電子商務網站上留下的客戶評論。有些很短:“它很臭!”。其他人漫不經心地尋找頁面。與傳統方法相比,深度學習的一大優勢是現代模型可以相對優雅地處理變長數據。
通常,我們擁有的數據越多,我們的工作就越容易。當我們擁有更多數據時,我們可以訓練更強大的模型,減少對先入為主的假設的依賴。從(相對)小數據到大數據的機制變化是現代深度學習成功的主要貢獻者。為了說明這一點,深度學習中許多最令人興奮的模型如果沒有大型數據集就無法工作。其他一些在小數據領域工作,但并不比傳統方法好。
最后,擁有大量數據并巧妙地處理數據是不夠的。我們需要正確的數據。如果數據充滿錯誤,或者如果所選特征不能預測感興趣的目標數量,學習就會失敗。陳詞濫調很好地描述了這種情況:垃圾進,垃圾出. 此外,糟糕的預測性能并不是唯一的潛在后果。在機器學習的敏感應用中,例如預測性監管、簡歷篩選和用于貸款的風險模型,我們必須特別警惕垃圾數據的后果。一種常見的故障模式發生在訓練數據中沒有代表某些人群的數據集中。想象一下,在以前從未見過黑色皮膚的野外應用皮膚癌識別系統。當數據不僅不能充分代表某些群體而且反映了社會偏見時,也可能會失敗。例如,如果過去的招聘決定被用來訓練一個用于篩選簡歷的預測模型,那么機器學習模型可能會無意中捕捉到歷史上的不公正現象并將其自動化。
1.2.2. 楷模
大多數機器學習都涉及在某種意義上轉換數據。我們可能想要構建一個系統來攝取照片并預測笑臉。或者,我們可能想要獲取一組傳感器讀數并預測讀數的正常與異常程度。按 型號,我們表示用于攝取一種類型的數據并吐出可能不同類型的預測的計算機器。特別是,我們對可以從數據中估計的統計模型感興趣。雖然簡單的模型完全能夠解決適當的簡單問題,但我們在本書中關注的問題超出了經典方法的局限性。深度學習與經典方法的區別主要在于它關注的一組強大模型。這些模型由許多連續的數據轉換組成,這些數據從上到下鏈接在一起,因此得名深度學習。在討論深度模型的過程中,我們還將討論一些更傳統的方法。
1.2.3. 目標函數
早些時候,我們將機器學習介紹為從經驗中學習。通過 在這里學習,我們的意思是隨著時間的推移在某些任務上有所改進。但是誰能說什么是改進呢?您可能會想象我們可以提議更新我們的模型,而有些人可能不同意提議的更新是改進還是下降。
為了開發一個正式的學習機器數學系統,我們需要對我們的模型有多好(或多壞)有正式的衡量標準。在機器學習和更一般的優化中,我們稱這些 為目標函數。按照慣例,我們通常將目標函數定義為越低越好。這只是一個慣例。您可以采用任何越高越好的函數,并通過翻轉符號將其轉換為質量相同但越低越好的新函數。因為越低越好,這些函數有時被稱為損失函數。
當嘗試預測數值時,最常見的損失函數是平方誤差,即預測值與真實目標之間的差值的平方。對于分類,最常見的目標是最小化錯誤率,即我們的預測與基本事實不一致的示例部分。一些目標(例如,平方誤差)易于優化,而其他目標(例如,錯誤率)由于不可微性或其他復雜性而難以直接優化。在這些情況下,通常會優化替代目標。
在優化過程中,我們將損失視為模型參數的函數,并將訓練數據集視為常數。我們通過最小化由為訓練收集的一些示例組成的集合所產生的損失來學習模型參數的最佳值。然而,在訓練數據上做得很好并不能保證我們在看不見的數據上也會做得很好。因此,我們通常希望將可用數據分成兩個部分:訓練數據集(或訓練集),用于學習模型參數;和測試數據集(或測試集), 用于評估。在一天結束時,我們通常會報告我們的模型在兩個分區上的表現。您可以將培訓績效視為類似于學生在用于準備某些實際期末考試的練習考試中取得的分數。即使結果令人鼓舞,也不能保證在期末考試中取得成功。在學習過程中,學生可能會開始背誦練習題,看似掌握了主題,但在面對實際期末考試中以前沒見過的問題時卻步履蹣跚。當一個模型在訓練集上表現良好但無法泛化到看不見的數據時,我們說它對訓練數據過度擬合。
1.2.4. 優化算法
一旦我們獲得了一些數據源和表示、模型和定義明確的目標函數,我們就需要一種能夠搜索最佳參數以最小化損失函數的算法。流行的深度學習優化算法基于一種稱為梯度下降的方法。簡而言之,在每個步驟中,此方法都會檢查每個參數,以查看如果您對該參數進行少量擾動,訓練集損失將以何種方式移動。然后它在降低損失的方向上更新參數。
1.3. 機器學習問題的種類
我們激勵示例中的喚醒詞問題只是機器學習可以解決的眾多問題之一。為了進一步激勵讀者并為我們提供一些貫穿全書的通用語言,我們現在提供機器學習問題公式的廣泛概述。
1.3.1. 監督學習
監督學習描述的任務是給定一個包含特征和標簽的數據集,并負責生成一個模型來預測給定輸入特征的標簽。每個特征-標簽對稱為一個示例。有時,當上下文清楚時,我們可以使用術語示例引用一組輸入,即使相應的標簽未知。監督發揮作用是因為為了選擇參數,我們(監督者)為模型提供了一個由標記示例組成的數據集。在概率方面,我們通常對估計給定輸入特征的標簽的條件概率感興趣。雖然它只是機器學習中的幾種范式之一,但監督學習占機器學習在工業中的大部分成功應用。部分原因是,許多重要任務可以清晰地描述為在給定一組特定的可用數據的情況下估計未知事物的概率:
-
根據計算機斷層掃描圖像預測癌癥與非癌癥。
-
給出英語句子,預測正確的法語翻譯。
-
根據本月的財務報告數據預測下個月的股票價格。
雖然所有監督學習問題都被簡單描述“預測給定輸入特征的標簽”所捕獲,但監督學習可以采取多種形式并需要大量建模決策,具體取決于(除其他考慮因素外)輸入的類型、大小和數量和輸出。例如,我們使用不同的模型來處理任意長度的序列和處理固定長度的向量表示。我們將在本書中深入探討其中的許多問題。
非正式地,學習過程如下所示。首先,獲取大量特征已知的示例,并從中隨機選擇一個子集,為每個示例獲取真實標簽。有時這些標簽可能是已經收集到的可用數據(例如,患者是否在下一年內死亡?),而其他時候我們可能需要使用人工注釋器來標記數據(例如,將圖像分配給類別)。這些輸入和相應的標簽一起構成了訓練集。我們將訓練數據集輸入監督學習算法,該算法將數據集作為輸入并輸出另一個函數:學習模型。最后,我們可以將以前看不見的輸入提供給學習模型,使用其輸出作為相應標簽的預測。圖 1.3.1。
1.3.1.1. 回歸
也許最簡單的監督學習任務就是回歸。例如,考慮從房屋銷售數據庫中收集的一組數據。我們可以構建一個表,其中每一行對應不同的房子,每一列對應一些相關屬性,例如房子的平方英尺、臥室數、浴室數和分鐘數(步行) 到市中心。在這個數據集中,每個例子都是一個特定的房子,對應的特征向量是表格中的一行。如果你住在紐約或舊金山,而且你不是亞馬遜、谷歌、微軟或 Facebook 的首席執行官,那么你家的(平方英尺、臥室數量、浴室數量、步行距離)特征向量可能看起來像:\([600, 1, 1, 60]\). 然而,如果你住在匹茲堡,它可能看起來更像\([3000, 4, 3, 10]\). 像這樣的固定長度特征向量對于大多數經典機器學習算法來說都是必不可少的。
使問題回歸的實際上是目標的形式。假設您正在市場上購買新房。考慮到上述某些特征,您可能想要估算房屋的公平市場價值。這里的數據可能包括歷史房屋清單,標簽可能是觀察到的銷售價格。當標簽采用任意數值(即使在某個區間內)時,我們稱之為 回歸問題。目標是生成一個模型,其預測非常接近實際標簽值。
許多實際問題很容易描述為回歸問題。預測用戶對電影的評分可以被認為是一個回歸問題,如果你在 2009 年設計了一個偉大的算法來完成這一壯舉,你可能會贏得 100 萬美元的 Netflix獎。預測患者住院時間的長短也是一個回歸問題。一個好的經驗法則是多少?或者有多少?問題應該建議回歸,例如:
-
這個手術需要幾個小時?
-
這個鎮在接下來的六個小時內會有多少降雨量?
即使您以前從未接觸過機器學習,您也可能非正式地解決過回歸問題。想象一下,例如,您修理了下水道,而您的承包商花了 3 個小時從污水管道中清除垃圾。然后他寄給你一張 350 美元的賬單。現在想象一下,您的朋友雇用了同一個承包商 2 小時,他收到了一張 250 美元的賬單。如果隨后有人問你對他們即將開出的清除垃圾發票的期望值是多少,你可能會做出一些合理的假設,比如工作更多的時間會花費更多的錢。您可能還假設有一些基本費用,然后承包商按小時收費。如果這些假設成立,那么根據這兩個數據示例,您已經可以確定承包商的定價結構:每小時 100 美元外加 50 美元出現在你家。如果你遵循了這么多,那么你已經理解了線性回歸背后的高級思想。
在這種情況下,我們可以生成與承包商價格完全匹配的參數。有時這是不可能的,例如,如果某些差異歸因于除您的兩個特征之外的幾個因素。在這些情況下,我們將嘗試學習最小化我們的預測與觀察值之間的距離的模型。在我們的大部分章節中,我們將重點關注最小化平方誤差損失函數。正如我們稍后將看到的,這種損失對應于我們的數據被高斯噪聲破壞的假設。
評論
查看更多