官术网_书友最值得收藏!

1.2 從標記數據中學習

機器學習的算法是多種多樣的,我們也將在本書中學習許多機器學習算法。許多算法在概念上是很簡單的(盡管它們本身的數學或編程基礎可能很復雜),例如,假設我們想通過一組數據點找到最佳直線,如圖1.5所示。

圖1.5 給定一組數據點,我們可以想象一個直線算法,它通過這些點來計算出最佳直線

從概念上講,我們可以想象一種算法,它可以僅用幾個數字來表示任意直線,在給定輸入數據點的情況下,它會用一些公式來計算出這些數字。這是一種常見的算法,它通過深入、仔細的分析來找到解決問題的最佳方法,然后將這一方法在執行該分析的程序中實現,這是許多機器學習算法使用的策略。

相比之下,許多深度學習算法使用的策略就不那么為人所熟知了,它們需要慢慢地從例子中學習,每次學習一點點,而后一遍又一遍地學習。每當程序看到要學習的新數據,它就會調節自己的參數,最終找到一組參數值——這組參數值便可以很好地幫助我們計算出我們想要的東西。雖然我們仍在執行一個算法,但它比用于擬合直線的算法更開放。這里運用到的思想是指:我們不知道如何直接計算出正確的答案,于是搭建了一個系統,這個系統可以自己搞明白如何去做。我們之所以要分析和編程,是為了創建一種能夠自行求解出屬于它自己的答案的算法,而不是去實現一個能夠直接產生答案的已知的過程。

如果這聽起來很瘋狂,那就是它本身真的很瘋狂,以這種方式找到它們自己的答案的程序,是深度學習算法取得巨大成功的關鍵。

在接下來的幾節中,我們會進一步研究這種技術,去了解它,但它可能并不像傳統的機器學習算法那樣為我們所熟悉。最終,我們希望你可以用它來完成一些任務,例如,向系統展示一張照片,然后由系統返回其中每個人的名字。

這是一項艱巨的任務,所以讓我們從一些比較簡單的事情開始,來看看幾個學習的示例。

1.2.1 一種學習策略

現在,讓我們來思考一種對于教學生而言糟糕的方式,如圖1.6所示。對于大多數學生來說,這并不是實際的教育方式,但這是我們教計算機的方式之一。

圖1.6 這是一種很糟糕的育人方式。首先,讓學生背誦一組事例,然后測試每個學生的背誦情況,之后測試他們沒有接觸過的其他事例。雖然學生并沒有接觸過這些事例,但是如果他們能夠較好地理解第一組事例,那么就能推導出新給出的事例。如果學生在測試中取得了好成績(尤其是第二門),那么他就畢業了;否則,就會再次重復這個循環,重新背誦相同的事例

在這種情景下(希望是虛構的),老師會站在教室前面,重復敘述一系列學生應該記住的事例,之后每個星期五下午學生們都要接受兩次測試,第一次測試是根據這些特定的事例對他們進行盤問,以測試他們的記憶力;而第二個測試會在第一次測試之后馬上進行,會問一些學生以前從未見過的新問題,以測試他們對事例的整體理解。當然,如果他們只收到一些事例,那么任何人都不太可能“理解”這些事例,這也是這種方式糟糕的原因之一。

如果一個學生在第二次測試中表現出色,那么老師就會宣布他已經學會了這門課,之后他就可以順利畢業了。

如果一個學生在第二次測試中表現得不好,那么下個星期他將再次重復同樣的過程:老師以完全相同的方式講述同一個事例,然后還是通過第一次測試來衡量學生的記憶力,再通過第二次新的測試來衡量他們的理解或概括能力。每個學生都在重復這個過程,直到他們在第二次測試中表現得足夠好,才可以畢業。

對于學生來說,這種教育方式是糟糕的,但這確實是一種非常好的教計算機學習的方式。

在本書中,我們將看到許多其他的教計算機學習的方式,但是現在讓我們先來深入了解一下這種方式。我們將看到,與大多數人不同的是,每當計算機接觸完全相同的信息,它都會學到一點點新的東西。

1.2.2 一種計算機化的學習策略

從收集我們要教的知識開始:我們需要收集盡可能多的數據。每一項觀測數據(如某一特定時刻的天氣)稱為一個樣本(sample);構成觀測數據的名稱(如溫度、風速、濕度等)稱為它的特征(feature)[Bishop06],每個被命名的測量數據或特征都有一個關聯的值,通常被存儲為一個數字。

在為計算機準備數據的過程中,我們需要將每個樣本(即每個數據片段,其中的每個特征都被賦予一個值)都交給人類專家,由人類專家檢查其特征并為該樣本注明一個標簽(label)。例如,如果樣本是一張照片,那么標簽可能是照片中人的名字、照片中所顯示的動物的類型、照片中的交通是否順暢或擁堵等。

以測量山上的天氣為例,專家的意見用0~100分表示,它的含義是專家多大程度上認為“這一天的天氣有利于徒步旅行”,如圖1.7所示。

圖1.7 我們從一組樣本或數據項目開始對數據集進行標記,每個樣本都由描述它的特征列表組成,我們將這個數據集交給一位人類專家,由他逐一檢查每個樣本的特征,并為該樣本注明一個標簽

我們通常會取一些帶標簽的樣本并暫時把它們放在一邊,并將在不久后用到它們。

一旦有了帶標簽的數據,我們就可以把它交給計算機,之后就可以讓計算機找到一種方法來為每個輸入匹配正確的標簽。我們并沒有告訴計算機如何去完成這個動作,而是給了它一個具有大量可調參數(甚至數百萬個參數)的算法。不同的學習類型會使用不同的算法,本書的大部分內容都是致力于對它們的研究以及講述如何更好地使用它們。一旦選擇了一個算法,我們就需要通過它來運行一個輸入,從而產生一個輸出。這是計算機的預測(prediction),表達了計算機認為該樣本是屬于哪個專家標簽。

當計算機的預測與專家標記的標簽相符時,我們什么也不會做,但一旦計算機出錯,我們就要求計算機修改它所使用的算法的內部參數,這樣當我們再次給它相同的數據時,計算機就更有可能預測出正確的答案。

這基本上是一個反復試驗的過程,計算機盡其所能給我們正確的答案,如果失敗了,它就會遵循一個程序來改變和改進。

一旦做出預測,我們就只檢查計算機的預測與專家的標簽是否匹配,如果它們不匹配,我們會計算出一個誤差(error),也稱為代價(cost)或損失。這是一個數值,用于告知算法離正確結果還有多遠。該系統會根據其內部參數的當前值、專家的預測結果(當前已知)以及自己的錯誤預測來調整算法中的參數,以便在再次看到這個樣本時預測正確的標簽。稍后我們將仔細研究這些步驟是如何執行的。圖1.8展示了上述過程。

圖1.8 訓練(或者說學習)過程的一個步驟。我們將樣本的特征和標簽分開,根據這些特征,算法會預測出一個標簽。我們將預測值與實際標簽進行比較,如果預測標簽與我們想要的標簽相匹配,我們就什么都不做,否則我們將告知算法去進行修改或更新,這樣它就不會再犯同樣的錯誤

我們是通過“(1)分析訓練數據集中的樣本;(2)針對不正確的預測對算法進行更新”來訓練(train)系統學習如何預測數據的標簽。

我們將在后續章節中詳細討論應該如何進行選擇不同的算法和更新步驟,目前我們需要知道的是,每個算法都是通過改變內部參數來實現預測的。每當出現錯誤預測,算法就可以對其參數進行修改,但是如果修改太多,就會使得其他的預測變得糟糕起來。同樣,算法也可以只對其參數做很微小的修改,但是這樣會導致學習速度較其他情況而言更加緩慢。我們必須通過對每種類型的算法和我們所訓練的每一個數據集進行反復的試驗,才能夠在這兩種極端之間找到正確的平衡。我們把對參數更新的多少稱為學習率(learning rate),所以,如果我們采用一個小的學習率,就代表著謹慎和緩慢;而如果采用一個大的學習率,就可以加速整個過程,但也有可能會適得其反。

打個比方,假設我們在沙漠里,需要用金屬探測器找到一個埋在地下的裝滿東西的金屬盒子。我們會把金屬探測器晃來晃去,如果在某個方向得到響應,我們就會朝那個方向移動。如果我們謹慎一點,每次只走出一小步,就不會錯過盒子或是丟掉信號;但如果我們非常激進,每次邁出一大步,這樣我們就能更快地接近盒子。也許我們可以從大步前進開始,但是隨著離盒子越來越近,我們可以逐漸減小步幅,這也就是我們通常所說的“調整學習率”,通過調整學習率使得在剛開始訓練時對系統的改動很大,但是會逐漸減小這個改動。

有一種有趣的方法可以讓計算機在只記住輸入而不進行學習的情況下獲得高分,為了得到一個完美的分數,算法所要做的就是記住專家為每個樣本標記的標簽,然后返回那個標簽的值。換句話說,它不需要學習如何計算出給定樣本的標簽值,而只需要在表中查找到正確的答案即可,在前文假設的學習場景中,這就相當于學生在考試中記住了問題的答案。

有時這會是一個很好的策略,稍后我們就會看到,有些非常有效的算法就遵循了這種方法。但是,如果是讓計算機從數據中學到一些東西,并能夠將所學推廣應用到新的數據中,那么使用這種有趣的方法往往會適得其反。這種方法的問題在于:系統已經記住了樣本的標簽,導致所有訓練工作都不會給我們帶來任何新的東西,且由于計算機對數據本身一無所知,而只是從表中得到答案,計算機就不知道如何為它從未見過和記住的新數據創建預測。整個問題的關鍵在于我們需要讓系統能夠預測以前從未見過的新數據的標簽,這樣就可以放心地將其應用于會不斷出現新數據的實際場景中。

如果算法在訓練集上執行得足夠好,但是在新數據上執行得很差,就說該算法的泛化能力很差。現在讓我們看看如何提高算法的泛化能力,或者說如何學習數據,使得它能夠準確地預測新數據的標簽。

1.2.3 泛化

我們會用到1.2.2節中提到的暫時擱置的標記數據。

我們通過向系統展示它之前從未見過的樣本來評估系統對所學知識的泛化(generalization),而這個測試集(test set)也會向我們展示系統對于新數據的表現。

現在,讓我們來看一個分類器(classifier),這種系統會為每個樣本分配一個標簽(標簽描述了該樣本所屬的類別或類)。假如輸入是一首歌,那么它的標簽可能是歌曲的流派(如搖滾或古典);假如輸入是動物的照片,那么它的標簽可能是照片上的動物(如老虎或大象)。而在運行的例子中,我們便可以將每天預期的“徒步旅行經歷”歸為三類:糟糕的、好的和很棒的。

我們會要求計算機預測測試集中每個樣本的標簽(這些都是計算機以前從未見過的樣本),然后比較計算機的預測和專家的標簽,如圖1.9所示。

圖1.9 評估一個分類器的整個過程

在圖1.9中,我們將測試數據拆分為特征和標簽兩部分,該算法為每一組特征分配(或者說預測)了一個標簽。然后,我們通過比較預測的標簽和真實標簽來衡量預測的準確率。如果預測結果足夠好,那么我們就可以部署系統;如果預測結果不夠好,那么我們需要繼續進行訓練。注意,與訓練不同,這個過程中沒有反饋和學習,在我們回到明確的訓練模式之前,算法并不會改變它的參數,不管它的預測結果是否準確。

如果計算機對這些全新的樣本(對于算法來說是全新的)的預測與專家分配的標簽不匹配,那么我們將回到圖1.8所示的訓練步驟。我們會把原先訓練集中的每個樣本再給計算機看一遍,讓它繼續進行學習。注意,給出的是相同的樣本,所以我們要求計算機從相同的數據中反復學習。通常來說,我們會對數據進行洗牌,使得樣本以不同的順序到達,但是不會給算法任何新的信息。

然后我們會要求算法再次預測測試集的標簽,如果表現不夠好,我們將再次返回原先的訓練集進行學習,然后再測試,一遍又一遍地重復這個過程。這個過程往往需要重復幾百次,我們一遍又一遍地向計算機展示同樣的數據,而計算機每次都多學習一點。

正如我們之前所說的那樣,這是一種糟糕的教學方式,但是計算機不會因為一遍又一遍地看到相同的數據而感到厭煩或焦躁,它只是不斷學習它能夠學會的東西,之后在每次學習中一點點地變得更好。

1.2.4 讓我們仔細看看學習過程

我們通常認為數據中存在某種關聯,畢竟如果它是完全隨機的,我們就不會試圖從中提取信息。在1.2.3節中,我們所希望的過程是通過向計算機一遍又一遍地展示訓練集,來讓它從每個樣本中一點點地學習,最終該算法將找到樣本特征與專家分配的標簽之間的關聯,進而可以將這種關聯應用到測試集的新數據上。如果預測大部分是正確的,那么我們就說它具有很高的準確率,或者說泛化誤差(generalization error)很小。

但是,如果計算機一直無法改進它對測試集標簽的預測,我們就會因無法取得進展而停止訓練。通常我們會修改算法以期待得到更好的表現,再重新進行訓練。但這只是我們的一種期待,無法保證對于每一組數據都有一個成功的學習算法,即便有,我們也無法確保一定能夠找到它。好消息是,即使不通過數學運算,計算機也可以通過實踐找到泛化的方法,有時得到的結果比人類專家做得更好。

其中一個導致算法學習失敗的可能原因是:它沒有足夠的計算資源來找到樣本與其標簽之間的關聯。有時,我們會認為計算機創建了一種底層數據的模型(model)。例如,如果我們測量到在每天的前3個小時里溫度會上升,計算機就可能會構建一個“模型”來表達早上溫度會上升。這只是數據的一個版本,就像小型塑料版本的跑車或飛機是大型交通工具的一種“模型”一樣,我們在前文中所看到的分類器就是一種模型。

在計算機中,模型是由軟件結構和它所用的參數值組成的,更龐大的程序和參數集可以引導模型從數據中學習更多內容,這時我們就說它有更大的容量(capacity),或者說表征能力。我們可以把這看作算法能夠學習的東西的深度和廣度,而更大的容量使我們有更大的能力從已知的數據中發現含義。

打個比方,假設我們在為一名汽車經銷商工作,就需要為所銷售的汽車寫廣告,而市場部已經給了我們一份可以用于描述汽車的“得到認可的詞匯”,工作一段時間后,我們也許就可以學會用這個模型(得到認可的詞匯表)來完美地描述每一輛車。

假設這時經銷商買了一輛摩托車,那么我們現有的詞匯(或者說現有的模型)就沒有足夠的“容量”來描述這個交通工具——我們的容量只能描述之前描述過的那些交通工具。我們并沒有足夠多的詞匯量來指代有兩個輪子而不是4個輪子的東西,我們可以竭盡所能,但是結果可能并不理想。如果我們可以使用更強大的、有更大容量的模型(也就是說,更多用于描述交通工具的詞匯),就能做得更好。

但是更龐大的模型也意味著更多的工作量,正如我們將在后續章節中看到的那樣:相比小一點的模型,更龐大的模型往往會產生更好的結果,但代價是耗費更多的計算時間和計算機內存。

算法中會隨著時間的推移自主進行修改的值稱為參數(parameter),同時學習算法也會受設定的值所控制(如學習率),這些設定的值稱為超參數(hyper parameter)。

參數和超參數的區別在于:計算機會在學習過程中自主調整它自己的參數值,而超參數值則是在我們編寫和運行程序時設定的。

當算法學得足夠好,能夠在測試集上執行得足夠好,足以令人滿意時,我們就可以將它部署(deploy)(或者說發布)。一旦用戶提交了數據,系統就會返回它預測的標簽。

這就是人臉圖如何變成名字、聲音如何變成文字以及對天氣的監測如何變為預報的過程。

現在讓我們回過頭來宏觀地看看整個機器學習領域。如果要對機器學習這一廣闊且持續發展的領域進行調查,那么需要占用一整本書的篇幅(參見“參考資料”中的[Bishopo6]和[Goodfellow17])。接下來,我們介紹當今大多數學習工具的主要分類。在本書中,我們會反復提到這類算法。

主站蜘蛛池模板: 牙克石市| 肇州县| 博乐市| 仙游县| 晋中市| 永宁县| 营山县| 隆化县| 嘉兴市| 海晏县| 梨树县| 荔浦县| 张家口市| 伊宁县| 福贡县| 乌兰浩特市| 东安县| 宜宾市| 云安县| 西贡区| 蓝山县| 陆丰市| 拉萨市| 镇江市| 体育| 墨竹工卡县| 东方市| 西丰县| 慈利县| 桐乡市| 凤翔县| 舟山市| 望都县| 邵阳县| 洛南县| 汤原县| 遵义市| 普陀区| 库伦旗| 安图县| 铁力市|