文章選自Medium,作者:Blake West,機器之心編譯。卷積神經網路(CNN)經常被用於影像識別、語音處理等領域,是人工智慧近年來快速發展的重要組成部分。然而,對於入門人士來說,我們似乎難以理解其中的原理。實際上「卷積」等概念並非遙不可及,本文作者 Blake West 向我們介紹了使用 Excel、Google Sheets 等電子表格實現卷積神經網路的方法。
事實上,深度卷積神經網路根本不像它聽起來這麼可怕。本文將在谷歌表格中實現一次來證明給你看。進入演示地址,下載為 Excel 表格,然後你就可以隨意編輯,看看不同層是怎樣影響模型最後的預測結果的。
演示地址:docs.google.com/spreadsheet…
下面我們會從較高角度來做一個簡短的卷積神經網路原理的介紹。
在我們開始前,我要介紹一下 FastAI,我最近完成了他們的深度學習課程,所有的靈感和功勞都歸他們。Jeremy Hdward 是一個非常棒的導師,和他的聯合創始人 Rachel Thomas 在課上展示了怎樣用 excel 做卷積神經網路。但就現在的狀況來說,這個表在網上找不到,而且我不認為這個表格是完整的網路。我做了一點擴充套件,然後把這個放到了谷歌表格裡,這樣大家都能隨意地耍了。
如何構建?
我用 MNIST 資料集訓練了一個非常簡單的卷積神經網路,這個資料集是用來預測有手寫數字圖片裡的數字的。每一個圖片都是 28×28 畫素大小。每一個畫素用 0(空白)到 1(深色)之間來表示。MNIST 是一個非常經典的資料集,常被用於各種新技術的研究,如 Geoffrey Hinton 等人的 Capsule。這個資料集非常的小所以訓練起來很快,但這個資料集又有足夠多的資料來展示機器學習的複雜性。這個模型的工作是預測圖片裡的數字是多少。每一個圖片都明確的是 0-9 之間的一個數。
MNIST 資料集的一個例子,28×28 畫素大小。注意:我加了有條件的格式,這樣有更大數字的畫素會顯得更紅。
我用了一個非常著名的深度學習庫 Keras,然後把我模型中訓練好的權重放到表裡。訓練好的權重只是數字。把它們放到表格裡就是說從模型裡複製然後貼上到表格裡。最後一步是在表格里加上覆制模型功能的公式,就用傳統的加法、乘法等。讓我再說一次:用來重現一個深度學習模型的數學就是乘法和加法。
Keras 文件:keras.io
下圖是模型每一層的權重/引數。權重是機器學習模型自動學來的。這個模型有差不多 100 個權重。更復雜的模型很容易就有幾億個引數。在下圖你可以看到這模型的所有的 1000 個引數。
何時應該使用卷積神經網路?
卷積神經網路的工作方式是在序列資料中找尋模式,這個模式可能難以用語言表達,或用簡單的規則來表達。卷積神經網路假設序列的順序是很重要的。
舉個例子,圖片分類是卷積神經網路主要的用途之一,因為畫素是邏輯上有序的,而且對於所有人類來說圖片裡充滿了模式。但是,只要試著用語言來描述到底什麼區分開了一隻貓和吉娃娃,你就知道為什麼卷積神經網路有用了(下意識感知過程)。
另一方面,如果你收集了兩支棒球隊的各種資料,並希望從中預測出兩者對決的結果,在這種情況下卷積神經網路就是一個不太合適的選擇。你所擁有的資料(如聯賽獲勝&失敗次數,球隊擊球平均數)並無固有順序性。在這裡順序其實並不重要,而我們也已提取了自己所認為有用的特徵。在這裡,卷積神經網路並不適用。
理解 CNN
為了理解 CNN 背後的工作原理,我們將深度卷積神經網路拆分成「深度」、「卷積」和「神經網路」並分別解釋。
卷積
想象你正閉著眼睛,試圖識別手寫影像上的數字。你可以和看著影像的人交談,但他們並不知道這個數字是什麼。所以你只能問一些簡單的問題,該怎麼辦?
有一些可行的問題,例如,「它在頂部是基本呈直線嗎?」「它有對角線嗎?」等。問了足夠多的問題以後,你就能很好的猜測該數字到底是 7 還是 2,或任何其它數字。
直觀上,這正是卷積運算的工作方式。計算機是盲目的,所以它會按照自己的方式詢問大量的關於小區域模式的問題。
為了詢問這些問題,影像中的每一個畫素需要執行一個函式(即卷積運算),生成相應的畫素值,以回答對應的關於小區域模式的問題。卷積運算利用卷積核尋找模式。例如,上圖方框 2 中的數字在右側的紅色更深(值更大),左側更淺(值更小)。則該卷積核的作用就是尋找豎直的顏色從左向右變深的邊緣(簡稱左邊緣)。
這可能不夠直觀,但只要在該表格中嘗試互動你就能發現卷積核的工作方式。卷積核尋找的是和自己相似的模式。並且一個 CNN 通常有數百個卷積核,你可以對所有畫素捕捉不同型別的模式,例如左邊緣、上邊緣、對角線、角等。
深度
尋找邊緣是很基本的要素,那對於更復雜的形狀要怎麼處理呢?這正是「深度」即多層的用武之地。通過底部卷積層的運算中,我們已經有了影像的「左邊緣」、「上邊緣」和其它簡單的卷積模式的分佈。現在新增更多的層,對前面得到的所有模式分佈再次進行卷積操作,然後組合起來。所以結合一個左邊緣和一個上邊緣各 50% 可以給你一個任意的左角,怎麼樣,很強大吧。
第二個卷積層取上一個卷積層得到的畫素輸出為輸入,並用自己的卷積核對其進行卷積運算。和之前一樣,我們得到了第二個卷積層的新的對應畫素值。
實際應用的 CNN 會有很多個層,使得網路能構建越來越抽象和複雜的形狀。即使僅僅經過 4 到 5 層的卷積,模型也能開始尋找關於臉部、動物等物體的關鍵特徵。
神經網路
現在你或許會問自己,「這都很好,但是把所有的卷積結果一起提出來聽起來很乏味?怎樣才能把所有這些卷積核給出的結果結合起來變成有意義的東西呢。
首先,在一個更高的層面上,我們的卷積網路可以分成兩個部分。第一個是卷積,卷積在圖片資料裡找出有用的特徵。
第二部分是,在表格靠後的」密集層「(即全連線層,這麼命名是因為這裡每一個神經元都有好多引數)是用來分類的。一但你有了這些紋理,這些密集層的作用其實就是對每一個可能的數計算一堆線性迴歸,然後給一個分數。最高的分數就是模型的最終預測。
矩陣 1 是我們的卷積輸出。每個矩陣 1 中的畫素乘以矩陣 2 中的數字,求和之後的結果生成方框 3 裡的數字。接下來對綠色框裡的矩陣重複同樣的運算。在這裡,我們最終得到了 8 個輸出,在深度學習裡它們被稱為「神經元」。
想要最終找出這些卷積核和密集層中正確的權重,是非常繁雜的一項工作。幸運的是,自動更新權重是神經網路工作的一部分,所以我們不必擔心這一點。如果你對此比較好奇,請查詢「反向傳播」的有關內容(可參閱:被 Geoffrey Hinton 拋棄,反向傳播為何飽受質疑?(附 BP 推導))。
總結
每個卷積神經網路都包含兩大部分:卷積,它總是先開始行動,尋找圖片中有用的特徵;而分層在其後,經常被稱為「密集」層,它們會根據特徵對事物進行分類。
為了對這些概念有一個清晰的認識,我推薦你使用電子表格對它們進行操作。
在這裡,你可以從頭到尾跟蹤一個畫素,看著它通過過濾器,最終會發生些什麼。我還在電子表格的評論中加入了更多技術細節的解釋。
資源
想要學習更多?我推薦這些資源:
互動式卷積——一個強大的互動式卷積神經網路教程(只包括卷積部分,不包括神經網路部分),由 Victor Powell 編寫:setosa.io/ev/image-ke…。
深度學習實踐——我已從這份 Fast.AI 課程中學到了很多,它是線上課程,完全免費:course.fast.ai/。
卷積神經網路視訊展示——這份包含 20 分鐘 CNN 講解的教程由 Jeremy Howard(FastAI 創始人)授課,請跳至視訊的第 21 分鐘開始:www.usfca.edu/data-instit…。
Notes
訓練卷積神經網路需要的數學基礎包括微積分,這樣才能自動調整權重。但隨著模型訓練完成,它實際上只需要乘法與加法進行預測。在實踐中,微積分部分的內容是由你使用的深度學習庫來處理的。