深度學習現在這麼火熱,大部分人都會有‘那麼它與機器學習有什麼關係?’這樣的疑問,網上比較它們的文章也比較多,如果有機器學習相關經驗,或者做過類似資料分析、挖掘之類的人看完那些文章可能很容易理解,無非就是一個強調‘端到端’全自動處理,一個在特徵工程上需要耗費大量時間和精力(半自動處理);一個演算法更復雜、需要更多的資料和算力,能解決更復雜的問題,一個演算法可解釋性強,在少量資料集上就可以到達一定的效果。但是如果對於一個之前並沒有多少機器學習相關背景、半路出道直接殺入深度學習領域的初學者來講,可能那些文章太過理論。本篇文章嘗試使用傳統機器學習和深度學習兩種不同的方法去解決同一個問題,告訴你它們之間有哪些聯絡。
首先需要指出的是,主流定義上機器學習包含深度學習,後者是前者的一個分支。機器學習中有不同的演算法,比如線性迴歸、邏輯迴歸、SVM、決策樹、神經網路等等。由於使用神經網路演算法的機器學習比較特殊,所以單獨命名這類機器學習為‘深度學習’(為什麼叫深度,後面詳細說)。因此,比較兩者聯絡更準確的表述應該是:傳統機器學習和深度學習的關係(這裡的傳統機器學習不包含使用神經網路演算法這一類)。另外需要明確的是,在處理監督學習問題中,機器學習不管採用什麼演算法,解決問題最終方式都是一致的:即找出X->Y的對映關係。比如你的模型用線性迴歸或者神經網路演算法,最後都是要從訓練素材中找輸入和輸出之間的對映關係。
現在就以一個圖片二分類的任務為例,分別使用基於神經網路的深度學習和基於邏輯迴歸演算法的傳統機器學習兩種方式解決,讓我們看看它們在解決問題上的區別和聯絡。這個例子並沒有原始碼,我希望用圖片來說明問題。
如上圖,有一堆風景照片,我們需要訓練一個模型來判斷給定圖片是否屬於綠植風景照,這是一個二分類問題,綠植風景照屬於第一類,其他屬於第二類。輸入一張圖片,模型輸出圖片型別。現在我們分別用深度學習和傳統機器學習的方法嘗試去解決該問題。這裡需要明確的是,對於圖片分類而言(或其他大部分跟CV有關的應用),不管是用深度學習還是傳統機器學習,都是需要先得到每張圖片的特徵表示(特徵向量),特徵向量是一張圖片的資訊壓縮表示,如果不太瞭解何為影像特徵,可以參考這篇部落格:https://www.cnblogs.com/xiaozhi_5638/p/11512260.html,裡面介紹了影像特徵的作用和傳統影像特徵提取方式。
深度學習
對於深度學習而言,這個圖片二分類問題太簡單了,網上深度學習入門教程一大堆,比如貓狗識別跟這個差不多。在神經網路開始,我們使用幾個(卷積層-池化層)的block塊,提取圖片的高維特徵,然後再使用幾個連續的(卷積層)塊提取低維特徵。在神經網路末尾,我們再加一個MLP全連線網路做為特徵分類器,分類器最後包含一個輸出節點(使用Sigmoid啟用函式),代表預測為綠植風景照的機率,機率越接近1代表它為綠植風景照的可信度越高。這個網路結構可以參考2012年將深度學習帶入大眾視野的AlexNet網路。
如上圖,圖片直接輸入到模型,神經網路負責特徵提取,並且對特徵進行分類,最後輸出機率值。我們可以看到,對於深度學習方式而言,我們在預測一張圖的分類時,只需要將圖片傳給神經網路(可能需要事先調整一下圖片尺寸),然後在神經網路的輸出端就可以直接得到它所屬分類的機率值。這種全自動、無需人工干預的工作方式我們稱之為“端到端”(End-To-End)的方式。我們可以將上述網路結構(like-alexnet)使用python程式碼構建出來,然後影像化顯示:
如上圖所示,神經網路在處理該圖片分類任務時,從開始到結束一條龍服務。神經網路接收一張214*214大小的3通道彩圖,矩陣形狀為(214,214,3)。然後經過特徵提取,得到一個256維的特徵向量。最後進行特徵分類,直接輸出它的機率。注意上圖為了簡化結構,神經網路僅僅包含必要的卷積層、池化層以及全連線層,實際情況可能還需要歸一化、Dropout等結構。(忽略上圖Input和Output中的?號,它表示batch-size,即穿過神經網路的圖片數量)需要說明的是,隨著問題的複雜性加大(比如圖片特徵不明顯,分類數量增多,資料複雜等等),我們還可以靈活調整上圖中神經網路的結構,圖中是最簡單的直線型網路結構(Sequential結構),我們可以設計出來分支結構、迴圈結構、殘差結構,這些都是可以用來提取更復雜的特徵、解決更復雜的問題,當然這樣的話訓練需要的資料、算力、時間相應就會增加。關於神經網路的輸入輸出可以參考這篇部落格:https://www.cnblogs.com/xiaozhi_5638/p/12591612.html
傳統機器學習
看完深度學習解決該問題的流程,我們再來看一下如何使用傳統機器學習來解決該問題。傳統機器學習做不到‘端到端’的全自動處理,對於一個具體的任務需要拆分成幾步去解決,第一步就是特徵工程,(以圖片分類任務為例)需要人為確定使用哪種特徵以及特徵提取方式,第二步才是對已有特徵進行訓練,得到一個特徵分類模型。這裡有兩個問題,一是人為確定使用哪種特徵,需要專業人士判斷;而是知道要使用什麼特徵後,如何去提取?相比深度學習而言,傳統機器學習可以總結為‘半自動’模式:
如上圖所示,傳統機器學習在解決當前具體問題時,需要人工確認使用什麼特徵,以及提取該特徵的方法,最後才能用得到的特徵去訓練機器學習模型去做分類。那麼這裡有個比較重要:選擇什麼特徵更有利於問題的解決呢?既要考慮特徵對原資料的代表性,又要考慮特徵提取的可行性。具體到當前圖片二分類任務時,我們可以看到資料集中,綠植風景照大部分都是綠色,和其他圖片在畫素分佈上有很大差異,因此我們可以選取‘顏色分佈’來做為解決本次任務的影像特徵,具體採用‘顏色直方圖’的方式去生成每張圖片的特徵向量。
顏色直方圖簡單理解就是統計圖片中每種顏色所佔比例,RGB圖片每個通道顏色值在0-255之間,如果我們將這個區間分成10等份(子區間)然後計算每個子區間顏色佔比(和為1),那麼就可以得到3個10維向量,將這3個向量合併組成一個30維的向量,那麼這個30維向量就是基於顏色分佈的影像特徵。由於這種方式提取到的特徵沒有考慮顏色在圖片中的位置分佈,因此通常做法是,先將一張圖切成若干等份,然後分別計算單個圖片區域的特徵向量,最後將所有圖片區域的特徵向量拼接起來得到最終的影像特徵。如果將圖片切成5份,那麼最終得到的特徵向量維度為:5*3*10=150,這個特徵向量從一定程度上代表了顏色位置分佈。
如上圖所示,利用顏色直方圖可以為每張圖片提取到一個150維的特徵向量,後面我們再用這些特徵向量訓練機器學習模型,由於是一個二分類問題,我們直接選用‘邏輯迴歸’演算法即可。需要明確的是,一些常見的影像特徵點提取方法比如SIFT、SURF等等在這裡是無效的,因為這些方式提取得到的特徵向量更側重描述原影像中畫素之間的區域性聯絡,很顯然對於我們這個圖片二分類任務而言,根據顏色分佈提取到的特徵更適合解決本問題。這也同時說明,在傳統機器學習中的特徵提取環節非常重要,特徵工程也是制約傳統機器學習發展的一大瓶頸。
看完上面的舉例,現在總結一下:
深度學習在解決問題的時候採用‘端到端’的全自動模式,中間無需人為干預,能夠自動從原有資料中提取到有利於解決問題的特徵,該部分原理相對來講‘可解釋性弱’。同時,神經網路的結構多變,可以根據問題的複雜程度靈活調整網路結構,更復雜的網路結構需要更多更豐富的訓練資料去擬合引數,相對應對算力的要求也高一些。而對於傳統機器學習來講,一個很重要的工作就是特徵工程,我們必須人工篩選(挑選)什麼特徵有利於問題的解決,比如本篇文章中的例子,畫素分佈就是一個很好的特徵,同時我們還需要人工去提取這些特徵,這部分原理相對來講‘可解釋性更強’。對於特徵工程這塊工作而言,它對人工專業性要求較高,因為對於稍微複雜的問題,很難識別出資料集的哪些特徵有利於解決問題,尤其像圖片、語音、文字等等非結構化資料,這個也是制約傳統機器學習發展的瓶頸之一。不管怎樣,其實深度學習和傳統機器學習解決問題的思路基本是一致的,我們可以看到本文中兩種解決問題的過程中都會生成一個特徵向量,一個256維,一個150維,最後根據特徵向量分類。有問題的朋友歡迎留言討論。