1. 程式人生 > >機器學習入門系列(1)--機器學習概覽(上)

機器學習入門系列(1)--機器學習概覽(上)

最近打算系統學習和整理機器學習方面的知識,會將之前看的 Andrew Ng 在 course 課程筆記以及最近看的書籍《hands-on-ml-with-sklearn-and-tf》結合起來,簡單總結下機器學習的常用演算法,由於數學功底有限,所以可能不會也暫時不能過多深入公式和演算法原理,所以就做成一個入門系列吧。

這是本系列的第一篇,也是機器學習概覽的上半部分。

1 . 什麼是機器學習

簡單的定義,機器學習是通過程式設計讓計算機從資料中進行學習的科學(和藝術)

但還有另外兩種定義,一個更廣義的定義:

機器學習是讓計算機具有學習的能力,無需進行明確程式設計。 —— 亞瑟·薩繆爾,1959

和一個工程性的定義:

計算機程式利用經驗 E 學習任務 T,效能是 P,如果針對任務 T 的效能 P 隨著經驗 E 不斷增長,則稱為機器學習。 —— 湯姆·米切爾,1997

一個簡單的例子,也是經常提及的例子:垃圾郵件過濾器。它可以根據垃圾郵件(比如,使用者標記的垃圾郵件)和普通郵件(非垃圾郵件,也稱作 ham)學習標記垃圾郵件。用來進行學習的樣例稱作訓練集。每個訓練樣例稱作訓練例項(或樣本)。在這個例子中,任務 T 就是標記新郵件是否是垃圾郵件,經驗E是訓練資料,效能 P 需要定義:例如,可以使用正確分類的比例。這個效能指標稱為準確率,通常用在分類任務中。

2. 為什麼要用機器學習

為什麼要用機器學習方法呢?

原因如下:

  • 需要進行大量手工調整或需要擁有長串規則才能解決的問題:機器學習演算法通常可以簡化程式碼、提高效能
  • 問題複雜,傳統方法難以解決:最好的機器學習方法可以找到解決方案。
  • 環境有波動:機器學習演算法可以適應新資料
  • 洞察複雜問題和大量資料

一些機器學習的應用例子:

  • 資料探勘
  • 一些無法通過手動程式設計來編寫的應用:如自然語言處理,計算機視覺、語音識別等
  • 一些自助式的程式:如推薦系統等
  • 理解人類是如何學習的

3. 機器學習系統的型別

機器學習有多種型別,可以根據如下規則進行分類:

  • 是否在人類監督下進行訓練(監督,非監督,半監督和強化學習)
    • 是否可以動態漸進學習(線上學習 vs批量學習)
    • 它們是否只是通過簡單地比較新的資料點和已知的資料點,或者在訓練資料中進行模式識別,以建立一個預測模型,就像科學家所做的那樣(基於例項學習 vs基於模型學習)

3.1 監督/非監督學習

第一種分類機器學習的方法是可以根據訓練時監督的量和型別進行分類。主要有四類:監督學習、非監督學習、半監督學習和強化學習。

3.1.1 監督學習

監督學習,顧名思義就是帶有監督的學習,而監督就是體現在訓練資料都是有標籤的,所有在訓練模型的時候可以根據資料的真實標籤不斷調整模型,從而得到一個性能更好的模型。

監督學習主要有兩個常見的典型的任務–分類和迴歸。

3.1.1.1 分類

分類問題主要就是預測新資料的類別問題。例如上文提到的垃圾郵件過濾器就是一個二分類問題,將郵件分為垃圾郵件還是正常的郵件,如下圖所示。

3.1.1.2 迴歸

迴歸問題主要是預測目標數值。比如給定預測房價的問題,給定一些特徵,如房子大小、房間數量、地理位置等等,然後預測房子的價格。如下圖所示:

注意,一些迴歸演算法也可以用來進行分類,反之亦然。例如,邏輯迴歸通常用來進行分類,它可以生成一屬於每個類別的概率值,然後選擇最大概率的類別作為預測的類別。

常用的監督學習演算法有:

  • K近鄰演算法
  • 線性迴歸
  • 邏輯迴歸
  • 支援向量機(SVM)
  • 決策樹和隨機森林
  • 神經網路
3.1.2 非監督學習

和監督學習相反,非監督學習就是採用沒有標籤的資料集。

非監督主要有四個典型的任務,分別是聚類、降維、異常檢測和關聯規則學習。

3.1.2.1. 聚類

聚類就是將資料根據一定的規則分成多個類,通常是採用相似性。比如對於部落格訪客的聚類,通過聚類演算法,檢測相似性訪客的分組,如下圖所示。不需要告訴演算法訪客是哪個類別,它會自動根據訪客的屬性找到相互間的關係,比如它可能找出訪客的職業關係,將訪客分為有 40% 的是上班族,有 50% 的是學生,或者對於技術部落格,可能就是根據開發方向,劃分為前端、後臺、移動開發、人工智慧等等。甚至,如果採用層次聚類分析演算法,還可以繼續對上述的分類進行更加詳細的劃分。這種做法可以幫助博主知道自己部落格的主要群體是誰,更好規劃自己部落格發表的文章應該以什麼方向為主。

視覺化演算法也是極佳的非監督學習案例:給演算法大量複雜的且不加標籤的資料,演算法輸出資料的2D或3D影象。如下圖所示,演算法會試圖保留資料的結構(即嘗試保留輸入的獨立聚類,避免在影象中重疊),這樣就可以明白資料是如何組織起來的,也許還能發現隱藏的規律。

3.1.2.2. 降維

降維的目的是簡化資料、但是不能失去大部分資訊。做法之一是合併若干相關的特徵。例如,汽車的里程數與車齡高度相關,降維演算法就會將它們合併成一個,表示汽車的磨損。這叫做特徵提取。

此外,在採用機器學習演算法訓練的時候,可以對訓練集進行降維,這樣有助於提高訓練速度,降低佔用的硬碟和記憶體空間,有時候也能提高演算法的效能,但必須選擇合適的降維演算法,否則效能實際上是很有可能會下降的。

3.1.2.3. 異常檢測

另一個重要的非監督任務是異常檢測(anomaly detection)。例如,檢測異常的信用卡轉賬以防欺詐,檢測製造缺陷,或者在訓練之前自動從訓練資料集去除異常值。異常檢測的系統使用正常值訓練的,當它碰到一個新例項,它可以判斷這個新例項是像正常值還是異常值。

3.1.2.4. 關聯規則學習

最後,另一個常見的非監督任務是關聯規則學習,它的目標是挖掘大量資料以發現屬性間有趣的關係。例如,假設你擁有一個超市。在銷售日誌上執行關聯規則,可能發現買了燒烤醬和薯片的人也會買牛排。因此,你可以將這些商品放在一起。

下面是一些最重要的非監督學習演算法:

  1. 聚類
    • K 均值
    • 層次聚類分析(Hierarchical Cluster Analysis, HCA)
    • 期望最大值
  2. 視覺化和降維
    • 主成分分析(Principal Component Analysis, PCA)
    • 核主成分分析
    • 區域性線性嵌入(Locally-Linear Embedding, LLE)
    • t-分佈鄰域嵌入演算法(t-distributed Stochastic Neighbor Embedding, t-SNE)
  3. 關聯性規則學習
    • Apriori 演算法
      • Eclat演算法
3.1.3 半監督學習

一些演算法可以處理部分帶標籤的訓練資料,通常是大量不帶標籤資料加上小部分帶標籤資料。這稱作半監督學習。如下圖所示,圖中灰色圓點表示沒有標籤的資料,僅有幾個三角形和正方形點表示帶標籤的資料。

半監督學習示例

多數半監督學習演算法是非監督和監督演算法的結合。例如,深度信念網路(deep belief networks)是基於被稱為互相疊加的受限玻爾茲曼機(restricted Boltzmann machines,RBM)的非監督元件。RBM 是先用非監督方法進行訓練,再用監督學習方法進行整個系統微調。

半監督學習的示例,如一些圖片儲存服務,比如 Google Photos,是半監督學習的好例子。一旦你上傳了所有家庭相片,它就能自動識別相同的人 A 出現了相片1、5、11 中,另一個人 B 出現在了相片 2、5、7 中。這是演算法的非監督部分(聚類)。現在系統需要的就是你告訴這兩個人是誰。只要給每個人一個標籤,演算法就可以命名每張照片中的每個人,特別適合搜尋照片。

3.1.4強化學習

強化學習和上述三種學習問題是非常不同的。學習系統在這裡被稱為智慧體( agent),可以對環境進行觀察,選擇和執行動作,獲得獎勵(負獎勵是懲罰,見下圖)。然後它必須自己學習哪個是最佳方法(稱為策略,policy),以得到長久的最大獎勵。策略決定了智慧體在給定情況下應該採取的行動 。

強化學習示例

目前強化學習的應用還不算非常廣,特別是結合了深度學習的強化學習,主要是應用在機器人方面,當然最著名的一個應用就是 DeepMind 的 AlphaGo 了,它是通過分析數百萬盤棋局學習制勝策略,然後自己和自己下棋。要注意,在比賽中機器學習是關閉的;AlphaGo 只是使用它學會的策略。

3.2 批量和線上學習

第二種分類機器學習的準則是,它是否能從匯入的資料流進行持續學習。也就是如果匯入的是持續的資料流,機器學習演算法能否在不斷採用新資料來訓練已經訓練好的模型,並且新的模型對新舊資料都還有很好的效能。

3.2.1 批量學習

在批量學習中,系統不能進行持續學習:必須用所有可用資料進行訓練。這通常會佔用大量時間和計算資源,所以一般是線下做的。首先是進行訓練,然後部署在生產環境且停止學習,它只是使用已經學到的策略。這稱為離線學習。

對於批量學習演算法來說,當獲取到新資料的時候,就需要重新重頭訓練整個資料集,然後更新模型,如果是應用該算法系統,那就相當於需要更新系統,需要停掉舊版本的系統,重新上線新版本的系統。

當然,一般訓練、評估、部署一套機器學習的系統的整個過程可以自動進行,所以即便是批量學習也可以適應改變。只要有需要,就可以方便地更新資料、訓練一個新版本。並且對於更新週期,可以選擇每 24 小時或者每週更新一次。

但是,批量學習還是存在下面的缺點:

  1. 實時性差,即對於需要快速適應變化的系統,比如預測股票變化、電商推薦系統等,就不適合採用批量學習演算法;
  2. 耗費大量計算資源,用全部資料訓練需要大量計算資源(CPU、記憶體空間、磁碟空間、磁碟 I/O、網路 I/O 等等),特別是訓練集特別大的情況,更加凸顯這個問題的嚴峻性;
  3. 無法應用在資源有限的裝置上,比如需要自動學習的系統,但是如果採用智慧手機,每次採用大量訓練資料重新訓練幾個小時是非常不實際的。
3.2.2 線上學習

批量學習的缺陷和問題可以通過採用線上學習演算法來解決。

在線上學習中,是用資料例項持續地進行訓練,可以一次一個或一次幾個例項(稱為小批量)。每個學習步驟都很快且廉價,所以系統可以動態地學習到達的新資料。

線上學習雖然名字帶著線上兩個字,但是實際上它的訓練過程也是離線的,因此應該說是持續學習或者增量學習。

線上學習有下面幾個優點:

  1. 實時性好。線上學習演算法非常適合接收連續流的資料,然後自動更新模型,實時性比批量學習更好;
  2. 可以節省大量計算資源。線上學習演算法在學習新資料後,可以扔掉訓練資料,從而節省大量儲存空間;此外,訓練得過程不需要載入所有訓練資料,對於記憶體、CPU 等資源的要求也大大減少;
  3. 實現核外學習(out-of-core learning)。當記憶體不足以載入訓練集的時候,可以採用線上學習演算法多次訓練,每次載入一部分訓練集,即將一部分訓練集當做新資料不斷載入,直到訓練完所有資料。

線上學習也存在兩個挑戰:

  1. 學習速率問題。學習速率是線上學習的一個重要引數,它反映了線上學習演算法有多快地適應資料的改變,必須選擇一個合適的學習速率,因為學習速率過大,系統可以很快適應新資料,但是也容易遺忘舊資料,比如影象分類問題,訓練了一個 50 類分類器後,增加新的 10 類資料,一旦學習速率過快,系統只會記住新的 10 個類別,忘記了前面的 50 個類別的資料。相反的,如果你設定的學習速率低,系統的惰性就會強:即,它學的更慢,但對新資料中的噪聲或沒有代表性的資料點結果不那麼敏感。
  2. 壞資料的影響。如果採用壞資料訓練,會破壞系統的效能。要減小這種風險,你需要密集監測,如果檢測到效能下降,要快速關閉(或是滾回到一個之前的狀態)。你可能還要監測輸入資料,對反常資料做出反應(比如,使用異常檢測演算法)。

3.3 基於例項 vs 基於模型學習

第三種分類機器學習的方法是判斷它們是如何進行歸納推廣的。大多機器學習任務是關於預測的。這意味著給定一定數量的訓練樣本,系統需要能推廣到之前沒見到過的樣本。對訓練資料集有很好的效能還不夠,真正的目標是對新例項預測的效能。

有兩種主要的歸納方法:基於例項學習和基於模型學習。

3.3.1 基於例項學習

基於例項學習是系統先用記憶學習案例,然後使用相似度測量推廣到新的例子,如下圖所示:

基於例項學習示例

這種學習演算法可以說是機器學習中最簡單的演算法了,它實際上就是採用儲存的資料集進行分類或者回歸,典型的演算法就是 KNN 演算法,即 K 近鄰演算法,它就是將新的輸入資料和已經儲存的訓練資料採用相似性度量(一般採用歐式距離)得到最近的 K 個訓練樣本,並採用 K 個訓練樣本中類別出現次數最多的類別作為預測的結果。

所以,這種演算法的缺點就比較明顯了:

  • 一是對儲存空間的需求很大,需要佔用的空間直接取決於例項數量的大小;
  • 二是執行時間比較慢,因為需要需要與已知的例項進行比對。
3.3.2 基於模型學習

和基於例項學習相反的就是基於模型學習:建立這些樣本的模型,然後使用這個模型進行預測。如下圖所示:

基於模型學習

基於模型學習演算法的流程一般如下所示:

  • 研究資料。先對資料進行分析,這可能包含清洗資料、特徵篩選、特徵組合等等
  • 選擇模型。選擇合適的模型,從簡單的線性迴歸、邏輯迴歸,到慢慢複雜的隨機森林、整合學習,甚至深度學習的卷積神經網路模型等等
  • 用訓練資料進行訓練。也就是尋找最適合演算法模型的引數,使得代價函式取得最小值。
  • 使用模型對新案例進行預測(這稱作推斷)。預測結果非常好,就能上線系統;如果不好,就需要進行錯誤分析,問題出現在哪裡,是資料問題還是模型問題,找到問題,然後繼續重複這個流程。

4. 小結

最後,總結下:

  1. 機器學習就是讓機器通過學習資料得到解決更好解決某些問題的能力,而不需要確定的程式碼規則;
  2. 機器學習的應用非常廣泛,包含影象、自然語言處理、語音、推薦系統和搜尋等方面,每個方面還有更加具體詳細的應用方向;
  3. 機器學習按照不同的劃分標準可以分為不同的學習型別,包括監督和非監督學習、批量和線上學習,基於例項和基於模型學習;
  4. 最常見的監督學習任務是分類和迴歸;
  5. 常見的非監督學習任務是聚類、降維、異常值檢測和關聯規則學習;

以上就是本文的主要內容和總結,歡迎關注我的微信公眾號–機器學習與計算機視覺或者掃描下方的二維碼,和我分享你的建議和看法,指正文章中可能存在的錯誤,大家一起交流,學習和進步!