0

深度學習的黑盒問題一直以來都是機器學習領域的一大難題,而直接導致這一難題的便是神經網絡中除輸入層和輸出層以外的隱藏層。
隱藏層不直接接受外界的信號,也不直接向外界發送信號,因而如何認識隱藏層內部的工作原理和運行機制,也成為深度學習研究中的一大挑戰。
可視化隱藏層是其中的一個解決方法,那如何做到呢?
對此,來自西蒙弗雷澤大學的幾位學生Pallavi Bharadwaj、Inderpartap Cheema、Najeeb Qazi 以及 Mrinal Gosain 合作寫作了一篇文章,不僅指出了了解神經網絡隱藏層的重要性,還詳盡地介紹了如何可視化神經網絡以及隱藏層的過程。
大腦皮層中神經元之間的連接,啟發了模仿這些復雜連接的算法的開發。簡而言之,可以將神經網絡的學習方法理解為類似于新生兒通過一段時間的觀察和聆聽來學習辨認父母的方式。一旦神經網絡接收到相當大的所需數據集后,該網絡就會使用其精確的知識“權重”來證明或識別未知數據樣本上的模式。
讓我們來思考一下關于面部識別的任務,網絡開始分析來自輸入層圖像的各個像素。在輸入層之后,“隱藏層”反復學習識別幾何形狀和特征,這些幾何形狀和特征由眼睛、嘴唇、疤痕等特定的特征構成。在最終的輸出層中,它根據計算出的概率信息對人臉進行了充分的猜測,并識別該面孔到底是誰。
顯然,這些隱藏層在最終將輸入分解為有價值的信息方面,起著至關重要的作用。從輸入到輸出的過程中每一層處理的信息越來越復雜,而且通常而言,隱藏層,顧名思義,這個名詞籠罩著神秘的色彩,但是它們是這樣嗎?
AI 領域流傳了一個關于神經網絡的故事,以檢測坦克為目標來訓練神經網絡,結果神經網絡卻學會了檢測一天的時間。
這個故事的來源是這樣的:
美國陸軍希望使用神經網絡來自動檢測偽裝的敵方坦克。 研究人員用兩組數據來訓練神經網絡,一組是50張坦克偽裝在樹林中的照片,另一組是50張沒有坦克的樹林照片。 然后,研究人員又拍攝了另外一組100張的照片,并進行了測試。
神經網絡將剩余的所有照片都進行了正確的分類。并且分類結果得到成功確認! 研究人員將他們的檢測方式移交給了五角大樓,五角大樓很快將其退還了,他們抱怨在該神經網絡上的測試完全失敗。
事實證明,在用于訓練的數據集中,偽裝坦克的照片是在陰天拍攝的,而平原森林的圖像是在晴天拍攝的。 神經網絡只不過是學會了區分多云和晴天,而不是學會識別偽裝的坦克。
無論故事是否真實,它都突出了深度學習中的“數據偏向”這一重要問題,但同時也讓一些人認識到,他們只有在得到最終輸出的結果后才能知道神經網絡正在學習什么。即使結果對于給定的數據而言是正確的,但是更重要的是知道網絡是如何給出這些結果的,這就是為什么我們必須要了解隱藏層的工作原理。
![]()
我們回到網絡的基本構建模塊——神經元。 神經元的各層構成了復雜、性能最佳的神經網絡。 但問題是,每個神經元學到了什么?是否可以捕獲在任意特定的時間上的網絡圖像并查看每個神經元的行為? 俗話說“一圖勝千言”,現階段所需要的就是可視化。
在最近的項目中,Tensorflow.js的合著者之一Daniel Smilkov和谷歌大腦團隊的Shan Carter共同創建了一個神經網絡訓練場( Playground),旨在通過讓用戶與其進行交互和實驗來可視化隱藏層。
The Tensorflow Playground
有趣的是,我們在給機器學習建立更好的模型過程中,得到了關于大腦運作方式的新信息。 處理和可視化隱藏層是開始此過程的好方法,同時也讓更多的人能夠理解深度學習這一概念。
當你對Tensorflow Playground的感受從玩的很開心轉換到厭煩時,你就可以加入我們,來學習如何親自構建可視化。
![]()
讓我們先來了解下 Keras可視化工具包(Keras-vis),這是一個用于可視化和調試訓練過的神經網絡的高級開發庫。
我們使用在ImageNet 數據集的子集上經過訓練的VGG16網絡的預訓練權重,ImageNet 數據集由120萬張手工標注的圖像組成,屬于1/1000的預定義類。
![]()


這讓我們可以深入地了解使用的層的類型、過濾器大小、可訓練的參數等。請注意,由于池化層不可訓練,因此該層有0個參數。 最大池化層通過選擇窗口中的最大值來減小輸入的大小,并且此過程不涉及任何權重更新。
如果我們要將一個“圖像分類問題”的輸出層可視化為一個圖像,那么我們需要將輸出層的激活函數轉換為線性函數而不是softmax函數。了解一種檢索與模型各層關聯的配置參數和權重的方法,會派上用場。
![]()
![]()
這為我們提供了一些有價值的信息,例如每一層使用的激活函數,該層是否可訓練,過濾器大小,使用了哪種類型的正則器等等。
該實用程序生成的輸入可最大化特定過濾器在給定層上的激活值。在這里,我們嘗試分析模型將輸入的圖像分類為黑熊的期望。
作為人類,我們知道熊的共同特征是身軀大,腿長,鼻子長,耳朵小而圓,毛發蓬亂,五個不能伸縮的爪子和短尾巴。
這里,神經網絡有多個層次的決定需要做,最后結合這一類別得出結論。我們需要知道這是一張動物的圖片,這只動物是熊,然后再根據熊的顯著特征將其縮小到熊的種類(極地熊/黑色熊/棕色熊等)。
我們知道黑熊生活在森林里,北極熊生活在多雪的地區。作為人類,即使圖像以白色為背景,我們仍然能正確地識別出黑熊的圖像。因此一個訓練有素的網絡應該具備這種跨多層學習的能力。
我們不需要網絡區分綠色和白色背景,需要的是它們根據熊的特征來分辨熊的類型。我們都不想重蹈覆轍都市傳奇的故事,不是嗎?
![]()
黑熊(左)及北極熊(右)圖像
我們嘗試將模型期望的輸入可視化,并將該輸入分類為黑熊。要將一個圖像分類為黑熊,我們需要激活輸出層的第295個索引,因為該索引與“黑熊”相對應。所以我們通過激活輸出層的這個節點來逆向構造一個輸入圖像。
(輸出層的每個節點都對應一類圖像。如果要查看 ImageNet 數據集的所有類和索引,可以進行以下操作。)
![]()
![]()
黑熊(左)和北極熊(右)的激活最大化圖
從上圖可以看出,在最后一層,模型正在尋找上述提到的熊最重要的特征。 在訓練過程中,模型也逐步學習各類型特征的微小差異。 現在,我們可以確信網絡正在學習正確的一系列特征,以識別熊!
您可能想知道每個隱藏層是如何對輸出層的最終結果起作用的。對模型進行微調以獲得預期的結果,這一點尤為重要。那怎么做呢?了解具體每一層最突出的一系列特征,使我們能夠在需要時,使用跳躍連接( Skip Connection)來略過這些特性。
讓我們考慮一下前面關于熊分類的例子。現在試著了解網絡在整個分類過程中是如何被引導的。我們嘗試提取網絡的一組隱藏層(block1_conv1、block2_conv1、block3_conv1、block4_conv1)的輸出,并在每個層中繪制圖像。
![]()
![]()
黑熊(左)和北極熊(右)的分層輸出
要注意的是,初始層正在學習識別形狀和邊緣等低級特征。這些層了解輸入的要點。在隨后的圖層中,網絡會嘗試接觸越來越多的模糊圖案,如腿、耳朵、眼睛、顏色等。這就是為什么我們會說,網絡越深,它學得越好。
網絡中神秘的隱藏層逐漸捕獲了輸入的最復雜的特征。
圖像中的顯著性是指圖像在視覺處理環境中的獨特特征(像素、分辨率)。它們代表了圖像中最具視覺吸引力的位置。顯著圖是它們的地形表示法。這種可視化技術使我們能夠認識到每個像素在生成輸出過程中的重要性。
論文《 Deep Inside Convolutional Networks: Visualising Image Classification Models and Saliency Maps》(《深度卷積網絡:可視化圖像分類模型和顯著圖》)最早介紹了這項技術,論文地址:https://arxiv.org/pdf/1312.6034v2.pdf
顯著圖生成激活類的種子輸入熱力圖。讓我們以下面這個例子來看看這是什么樣的:
![]()
這是一只可愛的狗狗,對吧?
您認為上圖中,網絡應該關注圖像的哪一部分? 當然是圖片中右側的狗。
網絡將忽略圖像中的其余圖像的像素,將該圖像正確地分類為狗的圖片。 現在,我們如何知道網絡是否專注于這一部分呢? 這正是顯著圖發揮重要作用的地方。
顯著圖計算每個像素對結果的影響。這涉及到計算輸入圖像上每一個像素的輸出梯度。正梯度表示像素值的變化會增加輸出值。
![]()
![]()
顯著圖-像素的熱力圖
正如我們上面所討論的,這個模型把焦點放在了圖中狗的臉上。由于梯度的大小等于圖像的大小(在每一個像素計算出來的),因此提供了一種只有狗圖像的直覺。
顯著圖有助于發現圖像的獨特特征,而遮擋圖則有助于找出圖像中對模型最重要的部分。
![]()
![]()
遮擋,在英語中的意思是“隱藏或阻擋”某物。 這就是遮擋圖的工作原理。 圖像的某些部分被遮蓋或“遮擋”,與此同時計算類的概率。 如果概率減少,則圖像的這部分很重要,否則就不重要。
通過這個小怪物的圖像可以更好地理解遮擋圖。
![]()
小怪物
我們首先加載此圖像,然后繪制它。 下一步是通過掩蓋圖像的不同部分來生成概率熱圖。
![]()
![]()
標準化概率的熱圖
現在,使用標準化的概率將遮擋圖轉換成灰度掩碼,最后,將其疊加到圖像上。 ![]()
遮罩最終圖像(左)和灰度遮罩(右)
這樣我們可以清楚地看到模型進行圖像分類的側重點。這為了解錯誤分類的原因,提供了更深入的說明。
via: https://medium.com/sfu-big-data/unveiling-the-hidden-layers-of-neural-networks-6269615fb8a9
雷鋒網雷鋒網雷鋒網
雷峰網原創文章,未經授權禁止轉載。詳情見轉載須知。