首先介紹一個高大尚的名詞,卷積神經網絡 (Convolutional Neural Network)。
2016 年,著名的阿爾法狗戰勝李世石,也讓大眾記住了一個名詞——卷積神經網絡。
一時間,卷積神經網絡在計算機視覺、自然語言處理、醫學圖像處理等領域內可算得上是風頭無兩,一枝獨秀。
網上講卷積神經網絡的文章很多,但是,很多文章引入了過多的細節和公式,讓人看完以後只有不明覺厲的感覺,讓人對卷積神經網絡的理解仍然停留在公式的層面。
我這個專欄,想撥開重重迷霧,幫助大家理解什麼是卷積神經網絡的核心。
我先總結一下本篇文章的脈絡。
卷積神經網絡其實是一個分類模型。
分類模型
分類模型可以用來幫助我們進行圖像識別,聲音識別等工作。
以圖像識別為例,分類模型的輸入是一個圖像,輸出是該圖像的類別,比如貓、狗、人
等。
要想得到一個好的模型,我們必須用數據去訓練分類模型,這些數據叫做訓練數據。
以圖像識別為例,訓練數據包括大量的圖像,以及每個圖像的類別。
訓練完以後,我們希望訓練後的模型可以達到這樣的效果:
當我們把一個圖像輸入模型後,模型可以比較準確的輸出該圖像的類別。
從分類模型內部而言,包括兩個串聯的部分:
(1) 特徵提取器 (feature extractor)(2) 分類器 (classifer)
第一部分「特徵提取器」從輸入的圖像中提取一些特徵,然後將這些特徵輸入到分類器,分類器會給出最終的類別判斷。
在傳統的方法中,分類模型中的特徵提取器是人為選定的;分類模型中的分類器的結構是人為選定的,但參數是通過訓練數據更新的。
這種方法的缺點在於難以找到好的特徵,尤其在高維空間中。
如果同分類器一樣,特徵提取器也用數據訓練出來的話,那麼就有可能找到「接近最好」的特徵。
因此,卷積神經網絡就是一種同時訓練特徵提取器和分類器的分類模型。
分類問題
分類問題的本質,就是給觀察到的每一個現象一個標籤,這個標籤就是現象的類別。
要解決分類問題,我們往往需要一個模型,在這裡我們把該模型叫做「分類模型」。
分類模型的輸入,是觀察到的現象;分類模型的輸出,是該現象對應的類別。
例如,圖像識別是一個典型的分類問題。
對應的分類模型的輸入是一個圖像,輸出是該圖像的類別 (貓、狗、人等)。
垃圾郵件識別是一個典型的分類問題。
現在有一封電子郵件,你把該郵件的內容送進一個分類模型,模型需要判斷這封郵件是否是垃圾郵件。
要想得到一個好的分類模型,我們必須用數據去訓練這些模型,這些數據叫做訓練數據 (training data)。
以圖像識別為例,訓練數據包括大量的圖像以及每個圖像的類別。
訓練完以後,我們希望達到這樣的效果:當我們把一個圖像輸入到訓練好的分類模型後,該模型輸出的類別,能夠比較符合該圖像真實的類別。
分類模型的訓練
從某個角度來看,分類模型本質上是一個函數
y = f(x, θ)
該函數輸入x,就輸出一個類別y。
分類模型會包含一些允許我們調節的參數 θ,通過訓練數據來訓練模型,從本質上就是調節這些參數 θ,使得該分類模型可以滿足分類的性能要求。
至於訓練方法是怎麼樣的,這個是屬於機器學習的訓練算法問題,我在這裡簡單介紹一下。
以圖像識別為例。
一個分類模型本質是一個函數 f,函數的輸入是圖像,輸出是類別。
即
f(圖像) = 圖像類別
還需要注意的是,每個分類模型中都包含一些參數,例如特徵提取器的參數和分類器的參數,我們用 θ 來表示。
這樣,細分下來,一個分類模型可以寫成如下的形式
f(圖像, θ) = 圖像類別
對於一個確定的分類模型 (給定了θ),輸入某一個圖像,就可以輸出該圖像類別了。
我們現在有一組訓練數據,即一批圖像和每個圖像的類別。
我們的任務,就是要找到某一個分類模型 (確定其θ),使得這個分類模型能夠儘可能的符合訓練數據。
換句話說,將某個圖像輸入該模型,該模型應該輸出該圖像的真實類別。
當然,很多情況下,該模型不一定能對所有的訓練數據都滿足要求,這時,目標就是使得判斷錯誤的次數越少越好。
為此,我們先定義一個函數 L(y1, y2):
L(y1, y2)函數定義
這個函數非常簡單:
當 y1 = y2 時為0,否則為1。
這樣,我們訓練的目標,就是要找到一個最優的參數θ*,使得θ*對應的模型,在輸入訓練的圖像後,判斷的類別結果和真實的類別的誤差越小越好,即
注意,f(圖像i, θ) 就是參數為θ的模型,在輸入為圖像i的情況下,模型「算出」的圖像類別。
argmin的含義,就是最優的θ,使得後面部分的值最小。
從數學上來講,因為每個訓練圖像i和它的真實類別都是已知的,因此式1.1中變量就剩下了 θ。
式1.1本質上就是找到一個θ,使得某個關於該變量的函數g(θ) 達到最小值。通常,該函數是一個關於 θ 的非線性函數。
那如何找到這個使得 g(θ) 取得最小值的θ呢?
通常求一個函數極值的方法,就是求導數,並令其為零,然後解出該方程,但這種方法只在 g(θ)的表達式比較簡單的情況下才好用。
在絕大多數機器學習的應用中的 g(θ),表達式都非常複雜,該方法基本不適用。
我們通常採用的方法是用數值解法。
基本的思路是,先隨便給一個θ的初值,然後不斷去調整θ,使得函數g(θ)的值不斷下降,來最終達到要求。
學過數值分析的同學應該了解一些常用的方法,包括牛頓法、最速下降法、共軛梯度法、隨機梯度法等等。
分類模型的進階:串聯結構
一個分類模型的內部結構通常分為兩個串聯的部分,如圖1.1所示,包括特徵提取器 (feature extractor)和後面的分類器 (classifer)。
特徵提取器從輸入的圖像中提取一些特徵,這些特徵輸入到分類器,分類器會給出最終的類別判斷。
有人問,為什麼需要先提取特徵,然後再根據特徵進行分類,而不是直接根據輸入的原始數據進行分類呢?
這個主要的原因在於,原始數據作為輸入的維度實在是太高了。
我們以聲音識別而言,如果我們想根據一段聲音來判斷這個聲音來自狗還是貓,通常主流聲音採集卡上,採樣頻率最低是 22.05KHz,也就是每秒鐘採集兩萬多個樣本。
要想識別的話,至少需採集5秒鐘的數據,也就是近10萬個樣本。
這樣,分類模型對應的函數y = f(x) 的輸入x,就是一個包含10萬維度的向量,輸出是一個標量二進位數(0: 貓,1: 狗)。
如果不中間提取特徵的話,那我們就要找一個從10萬維度的向量到1個標量的映射。
直覺上來看,這個就會很難,因為你需要給這個10萬維的向量中的每一個輸入,都給一個係數。
不僅如此,高維度向量還會導致分類器的性能下降。
機器學習中把這個叫做「維數災」問題 (The Curse of Dimensionality)。
因此,解決的方法,就是如圖1.1中的兩層串聯結構,先從輸入的原始數據中提取特徵。
通常情況下,特徵的維度比輸入原始數據的維度要小很多。因此,用特徵來訓練分類器,就不會出現維數災問題。
傳統的分類模型中,特徵提取器是人手動設計的。
在圖像識別中,常用的特徵包括邊沿檢測器 (edge detector),方向梯度直方圖(HOG, Histogram of Oriented Gradient) 等;在聲音識別中,最常用的莫過於梅爾倒譜係數 (MFCC);文字語義分析中,常用特徵包括詞袋模型 (Bag-of-words),以及TF-IDF 等。
後面的分類器模型則不同。
分類器模型是人為先確定一個框架 (例如 SVM,神經網絡,隨機森林等),在此結構基礎上,用訓練數據來確定該框架的具體參數。
如果用函數的角度來看,在分類模型y = f(x, θ)中,允許我們用訓練數據整定的參數θ,只包含在分類器中。
卷積神經網絡的構成
卷積神經網絡包括兩個部分:
卷積 (特徵提取器) +神經網絡 (分類器)
卷積從本質上來講,就是濾波器,濾波器不僅可以用來去除噪聲,而且可以用來提取特徵。這就是為什麼我們需要卷積。
因此,在卷積神經網絡中,卷積就是濾波器,就是特徵提取器;而神經網絡,就是分類器。
我們需要用大量的數據來同時訓練這兩個部分。
我們找到最好的濾波器,來幫助我們提取好的特徵特徵;同時我們要找到最好的神經網絡,幫助我們把這些特徵進行分類,得到準確的分類結果。
這樣,由卷積構成的特徵提取器,再加上由神經網絡構成的分類器,就構成了卷積神經網絡。