初窺神經網路內部機制,圖文詳解權重和隱藏層
【編者按】本文是機器學習開發者和講師、生成藝術家Gene Kogan為沒有很多背景知識的讀者撰寫的神經網路內部機制入門教程。和假定讀者已經有一定的數學能力,甚至擁有計算機科學的學位或背景的CS231n課程相比,本文對讀者的背景知識沒有很多要求。本文儘可能地減少使用數學公式,更多地基於可視化幫助讀者入門,一方面降低了對背景知識的要求,一方面也是因為用這種方式介紹神經網路可能更易於理解。事實上,理解大部分機器學習的內容都只需要高中程度的數學知識,加上一點類比和抽象的能力。在此基礎上入門機器學習是可能的,也是很多人所盼望的(否則很多人可能就放棄接觸這個領域了)。
註:本文為作者授權論智(公眾號:jqr_ai)編譯,請勿隨意改變、轉載。
在前一篇介紹神經網路的文章(https://ml4a.github.io/ml4a/cn/neural_networks/)中,我們討論了如何訓練一個神經網路來對手寫數字進行分類,精確度可以達到90%左右。在本文中,我們將更仔細些地評估它的表現,同時查看它的內部狀態,以得到一些關於它是如何運作的直覺。在本文的後半部分,我們將嘗試在一個更複雜的數據集(狗、汽車和船舶)上訓練神經網路,看看需要什麼樣的革新能將我們的網路提高一個等級。
可視化權重
讓我們來訓練一個分類MNIST手寫數字的網路,和前一篇文章不同的是,我們直接映射輸入層到輸出層,不設置隱藏層。所以我們的網路看起來像這樣。
用於MNIST的單層神經網路。10個輸出神經元對應數字0-9
當我們向神經網路輸入圖像時,我們通過將像素「展開」為一列神經元來可視化網路,如下圖左半部分所示。讓我們集中注意力到第一個輸出神經元的連接,我們將這個神經元標記為z,並將每個輸入神經元和相應的權重標記為xi和wi。
我們並不展開像素,而是將權重看成一個28x28的網格,其中權重的排列方式與對應的像素完全一致。上圖右半部分和下圖看起來不同,但是它們都表達了相同的等式,即z = b + ∑ wx。
現在讓我們看一下基於這個架構的訓練好的網路,同時可視化第一個輸出神經元接受的學習好的權重,這是負責歸類數字0的神經元。我們給它們標上顏色,最低的權重是黑色的,最高的則是白色。
眯起你的眼睛,右邊那個圖形看起來是不是有點像一個模糊的0?想一下這個神經元在做什麼,這樣可以更容易理解為什麼這個圖形是這個形狀。這個神經元「負責」歸類零,它的目標是輸出一個較高的值(如果數字是零)或一個較低的值(如果數字不是零)。它將較高的權重賦值給一些像素,在表示零的圖像中,這些像素通常趨向高值。通過這樣的方法,對於表示零的圖像,它可以得出較高的值。類似地,它將較低的權重賦值給一些像素,在表示非零的圖像中,這些像素通常趨向高值,而在表示零的圖像中,這些像素通常趨向低值。通過這樣的方法,對於表示非零的圖像,它可以得出較低的值。權重圖像中相對黑的中心源自這樣一個事實,表示零的圖像的像素在這個位置通常趨向於最低值(數字零當中的空洞),而表示其他數字的圖像的像素在這個位置通常有一個相對較高的值。
讓我們來看看所有10個輸出神經元學習到的權重。 正如我們所猜測的那樣,它們都看起來像是10個數字有些模糊的版本,看起來好像是我們平均了許多屬於每個數字類別的圖像。
假設輸入是表示數字2的圖像,我們可以預見負責歸類2的神經元的值應該較高,因為它的權重是這樣設定的:高權重傾向於賦值給在表示2的圖像中趨向於高值的像素。其他神經元的一些權重也會與高值像素一致,使得他們的分數也有所提高。然而,共同之處要少很多,並且這些圖像中的許多高值像素會被歸類2的神經元中的低權重所抵消。激活函數不會改變這一點,因為它是單調的,也就是說,輸入值越高,輸出值越高。
我們可以將這些權重解釋為輸出分類的模板。這真是引人入勝,因為我們從來沒有事先告訴過網路這些數字是什麼或者這些數字是什麼意思,然而它們最終卻和這些分類的對象很相似。這暗示了神經網路內部機制的特殊性:它們形成了訓練對象的表示,在簡單的分類或預測之外,這些表示還有其他作用。當我們開始研究卷積神經網路時,我們將把這個表示能力提升至一個新等級,但就目前而言,讓我們不要過於超前了。
相比提供的答案,這引發了更多問題。例如,添加隱藏層時權重會發生什麼變化?正如我們很快會看到的,這個問題的答案基於我們在前一節中以直觀的方式看到的東西。但在我們討論這一點之前,讓我們先檢視一下我們神經網路的表現,特別是考慮它往往會造成哪些種類的錯誤。
0op5, 1 d14 17 2ga1n
有時候,我們的網路會犯一些情有可原的錯誤。 在我看來,下面的第一個數字是9這一點並不是很明顯。有人可能很容易把它誤認為4,就像我們的網路做的那樣。類似地,我們也可以理解為什麼第二個數字3被網路誤認為8。下面第三和第四個數字的錯誤更明顯。幾乎任何人都可以立刻認出它們分別是3和2,我們的機器卻把第一個數字誤認為5,對第二個數字是什麼則毫無頭緒。
讓我們仔細看看上一篇的最後一個神經網路的性能,它在MNIST數字上達到了90%的精確度。達到這個精確度的其中一個方法是查找一個混淆矩陣,這個矩陣將我們的預測分解成一張表格。在下面的混淆矩陣中,行對應MNIST數據集的實際標籤,列對應預測的標籤。例如,第4行(actual 3)、第6列(predicted 5)的單元格表示有71個3被我們的神經網路誤標記為5。混淆矩陣的綠色對角線表示預測正確的數量,而其他所有單元格均表示錯誤的數量。
將每個單元格的頂部取樣填入混淆矩陣,我們可以得到一些很好的洞見。
這給了我們一個網路如何學習進行某種預測的印象。看前面兩列,我們看到,我們的網路看起來在尋找大環形來預測0,尋找細線來預測1,如果其他數字碰巧具有這些特徵,網路會誤認。
玩壞我們的神經網路
到目前為止,我們只討論了訓練識別手寫數字的神經網路。我們從中獲得了許多洞見,但是我們選擇的卻是一個非常簡單的數據集,這給了我們很多優勢;我們只有10個分類,這些分類定義非常明確,其中的內部差異相對很小。在大多數現實世界的場景中,我們試圖在非常不理想的情況下分類圖像。 讓我們來看看同一個神經網路在另一個數據集CIFAR-10上的表現。這個數據集包括6萬張32x32的彩色圖像,分屬10類:飛機、汽車、鳥、貓、鹿、狗、青蛙、馬、船和卡車。以下是CIFAR-10中的一些隨機樣本圖像。
現在,很明顯,我們必須面對這樣一個困境,這些圖像類別存在我們未曾應對過的差異。例如,貓可以面向不同的方向,具有不同的顏色和毛皮紋理,舒展或捲曲,還有許多其他我們在手寫數字上不曾遇到過的變體。貓的照片也會與其他物體混雜在一起,加劇問題的複雜程度。
果然,如果我們在這些圖像上訓練一個雙層神經網路,我們的精確度只有37%。這還是要比隨機猜測好很多(精確度10%),但是遠遠低於我們的MNIST分類器達到的90%。使用卷積神經網路後,我們將大大提升精確度,不管是MNIST還是CIFAR-10。目前而言,我們可以通過審查權重來更準確地了解普通神經網路的缺陷。
讓我們重複先前的試驗,觀察一個不帶隱藏層的單層神經網路的權重,只不過這次我們將訓練CIFAR-10中的圖像。權重顯示在下面。
與MNIST的權重相比,明顯的特徵更少,清晰度也低很多。某些細節確實有直覺上的意義,例如飛機和船舶圖像的外邊緣大多是藍色,反映了這些圖像的周圍傾向於是藍天或者水體。由於特定類別的權重圖像確實與屬於該類別的圖像的平均值相關,所以我們可以如先前一般期待斑點狀的平均顏色凸現出來。然而,由於CIFAR類的內部一致性要低很多,我們看到的界限清晰的「模板」相比MNIST要不明顯很多。
讓我們來看看與這個CIFAR-10分類器相關的混淆矩陣。
毫無意外,表現非常差,精確度只有37%。顯然,我們簡單的單層神經網路不能應付這個複雜的數據集。我們可以引入一個隱藏層,多少改善一下表現。下一小節將分析這樣做的效果。
添加隱藏層
到目前為止,我們專註於輸入直接連接到輸出的單層神經網路。隱藏層將如何影響我們的神經網路?在我們的MNIST網路中插入一個包含10個神經元的中間層看看。那麼,現在我們的手寫數字分類神經網路大概是這個樣子:
上面提到的單層網路的簡單模板象徵不再適用於這種情況,因為784個輸入像素並沒有直接連接到輸出類。從某種意義上來說,我們過去「強制」我們原來的單層網路去學習這些模板,因為每個權重直接連接到一個類別標籤,因而隻影響該類別。但在我們現在引入的更複雜的網路中,隱藏層的權重影響輸出層中所有10個神經元。那麼我們應該期待這些權重看起來是什麼樣子呢?
為了理解發生了什麼,我們將像原來那樣可視化第一層中的權重,但是我們也會仔細查看他們的激活在第二層是如何合併的,從而得到類別分數。回顧一下前面提到的內容,如果圖像在很大程度上和過濾器相交感,那麼圖像將在第一層的特定神經元中產生高激活。因此,隱藏層中的10個神經元反映了原始圖像中這10個特徵的存在性。在輸出層中,對應於某個類別標籤的單個神經元,是前10次隱藏激活的加權組合。下圖展示了這一點。
讓我們先來看看上圖頂部的第一層權重。它們看起來很陌生,不再像圖像模板了。一些看起來像偽數字,其他看起來像數字的組成部分:半環、對角線、孔,等等。
過濾器圖像下面的行對應於我們的輸出神經元,每行代表一個圖像類別。條形代表隱藏層傳遞給10個過濾器的激活對應的權重。例如,0類似乎偏愛外緣的值較高的第一層過濾器(因為數字零傾向於如此)。它厭惡中間的像素的值較低的過濾器(通常對應數字零中間的孔)。1類幾乎與此正相反,鍾愛在中間的值較高的過濾器,你可能已經想到了,那裡對應數字1的豎筆。
這種方法的優勢是靈活性。對於每個類別而言,更廣泛的輸入模式可以刺激相應的輸出神經元。每個類別都可以由前一個隱藏層的若干抽象特徵或者它們的組合來觸發。從本質上講,我們可以學習不同種類的數字零,不同種類的數字一等等。對大多數任務而言,這通常能改善網路的表現(儘管並不總是如此)。
特徵和表示
讓我們概括一下我們在本文學到的內容。在單層和多層神經網路中,每一層都有類似的功能;它將來自前一層的數據轉換為該數據的「高層」表示。「高層」的意思是它包含了這些數據更緊湊、更突出的表示,就像內容概要是書的「高層」表示一樣。例如,在上面提到的雙層網路中,我們將「低層」像素映射到第一層網路中數字(筆劃、圓圈等)的「高層」特徵,然後將這些高層特徵映射為下一層的更高層表示(實際數字)。這種將數據轉換成更小但更有意義的信息的觀念是機器學習的核心,也是神經網路的主要功能。
通過在神經網路中增加一個隱藏層,我們讓它有機會在多個抽象層次上學習特徵。這給了我們數據的豐富表示,其中,較前的層包含低層特徵,較後的層包含由前層特徵組合而成的高層特徵。
正如我們所看到的,隱藏層可以提高精確性,不過程度有限。隨著越來越多圖層的迅速增加,很快精確性就不能再提升了,而且這會帶來運算成本——我們不能簡單地要求我們的神經網路在隱藏層中記憶圖像類別的每個可能版本。事實證明,使用卷積神經網路是一個更好的方法,這將在後面的文章中介紹。
推薦閱讀
- Demo: Tinker with a neural network by Daniel Smilkov and Shan Carter
- Visualizing what ConvNets learn (Stanford CS231n) by Andrej Karpathy
原文地址: Looking inside neural nets
本文由原作者Gene Kogan基於GPL-2.0授權論智編譯。請按GPL-2.0要求規範轉載。
推薦閱讀:
※從結構、原理到實現,Faster R-CNN全解析(原創)
※膠囊網路結構Capsule初探
※【可解釋 AI 重大突破】DeepMind 構建心智理論神經網路讓機器互相理解
※Michael Nielsen對交叉熵的解釋(三)
※【Neural Networks and Deep Learning】3.改進神經網路的學習方法(過擬合)