1. 程式人生 > >【深度學習理論】一文看懂卷積神經網路

【深度學習理論】一文看懂卷積神經網路

本文主要介紹了神經網路中的卷積神經網路,適合初學者閱讀。

概述

深度學習和人工智慧是 2016 年的熱詞;2017 年,這兩個詞愈發火熱,但也更加容易混淆。我們將深入深度學習的核心,也就是神經網路。大多數神經網路的變體是難以理解的,並且它們的底層結構元件使得它們在理論上和圖形上是一樣的。

下圖展示了最流行的神經網路變體,可參考這篇部落格 (http://www.asimovinstitute.org/neural-network-zoo/)。

本文介紹卷積神經網路(CNN)。在開始之前,我們首先了解一下感知機。神經網路是一些被稱作感知機的單元的集合,感知機是二元線性分類器。

如上圖所示,輸入 x1 和 x2 分別和各自的權重 w1 和 w2 相乘、求和,所以函式 f=x1*w1+x2*w2+b(偏置項,可以選擇性地新增)。函式 f 可以是任意的運算,但是對於感知機而言通常是求和。函式 f 隨後會通過一個啟用函式來評估,該啟用函式能夠實現期望分類。Sigmoid 函式是用於二元分類的最常見的啟用函式。如果您想進一步瞭解感知機,推薦閱讀這篇文章(https://appliedgo.net/perceptron/)。

如果我們把多個輸入堆疊在一起,並且使用函式 f 將其與位於另一層的多個堆疊在一起的單元連線在一起,這就形成了多個全連線的感知機,這些單元(隱藏層)的輸出成為最後一個單元的輸入,再通過函式 f 和啟用函式得到最終的分類。如下圖所示,這個就是最簡單的神經網路。

神經網路有一個獨特的能力,被稱作「泛逼近函式」(Universal Approximation function),所以神經網路的拓撲和結構變體是很多樣化的。這本身就是一個很大的話題,Michael Nielsen 在文章中做了詳細的描述(http://neuralnetworksanddeeplearning.com/chap4.html)。讀完這個我們可以相信:神經網路可以模擬任何函式,不管它是多麼的複雜。上面提到的神經網路也被稱為前饋神經網路(FFNN),因為資訊流是單向、無環的。現在我們已經理解了感知機和前饋神經網路的基本知識,我們可以想象,數百個輸入連線到數個這樣的隱藏層會形成一個複雜的神經網路,通常被稱為深度神經網路或者深度前饋神經網路。

那麼深度神經網路和卷積神經網路有什麼不同呢?讓我們來探討一下。

CNN 由於被應用在 ImageNet 等競賽中而廣受歡迎,最近也被應用在自然語言處理和語音識別中。需要記住的關鍵點是,其他的變體,如 RNN、LSTM、GRU 等,基於和 CNN 類似的結構,不過架構存在一些差異。

CNN 由三種不同的層組成,即「卷積層」、「池化層」、「密集層或全連線層」。我們之前的神經網路都是典型的全連線層神經網路。如果想了解更多卷積和池化層的知識,可以閱讀 Andrej Karpathy 的解釋(https://cs231n.github.io/convolutional-networks/)。現在繼續我們關於層的討論,下面我們來看一下卷積層。

(在下面的內容裡,我們會以影象分類為例來理解卷積神經網路,後面再轉移到自然語言處理和視訊任務中。)

卷積層:假設一張影象有 5*5 個畫素,1 代表白,0 代表黑,這幅影象被視為 5*5 的單色影象。現在用一個由隨機地 0 和 1 組成的 3*3 矩陣去和影象中的子區域做乘法,每次迭代移動一個畫素,這樣該乘法會得到一個新的 3*3 的矩陣。下面的動圖展示了這個過程。

上述的 3*3 的矩陣被稱作「濾波器」,它的任務是提取影象特徵,它使用「優化演算法」來決定 3*3 矩陣中具體的 0 和 1。我們在神經網路的卷積層中使用好幾個這樣的濾波器來提取多個特徵。3*3 矩陣的每一個單個步驟被稱作「步幅」(stride)。

下圖展示了使用兩個三通道濾波器從三通道(RGB)影象中生成兩個卷積輸出的詳細過程。

濾波器 w0 和 w1 是「卷積」,輸出是提取到的特徵,包含這些濾波器的層叫做卷積層。

池化層:這個層主要使用不同的函式為輸入降維。通常,最大池化層(max-pooling layer)出現在卷積層之後。池化層使用 2*2 的矩陣,以卷積層相同的方式處理影象,不過它是給影象本身降維。下面分別是使用「最大池化」和「平均池化」的示例。

全連線層:這個層是位於之前一層和啟用函式之間的全連線層。它和之前討論過的簡單「神經網路」是類似的。

注意:卷積神經網路結果也會使用正則化層,不過本文將分開討論。此外,池化層會損失資訊,所以也不是首選的。通常的做法是在卷機層中使用一個較大的步幅。

ILSVRC 2014 的亞軍 VGGNet 是一個流行的卷積神經網路,它使用 16 個層來幫助我們理解 CNN 中深度的重要性,AlexNet 是 ILSVRC 2012 的冠軍,它只有 8 層。Keras 中有可以直接使用的模型 VGG-16。

在 Keras 中載入了這個模型之後,我們可以觀察每一層的「output shape」來理解張量維度,觀察「Param#」來了解如何計算引數來得到卷積特徵。「Param#」是每一次獲取卷積特徵時的所有權重更新。

現在我們已經熟悉了卷積神經網路的結構,理解了每一層都是如何執行的,那麼我們可以進一步去理解它是如何用在自然語言處理和視訊處理中的了。您可以在這個連結中瞭解自 2012 年以來所有獲得 ImageNet 競賽冠軍的 CNN 模型(https://adeshpande3.github.io/The-9-Deep-Learning-Papers-You-Need-To-Know-About.html)。

原文連結:https://towardsdatascience.com/a-deeper-understanding-of-nnets-part-1-cnns-263a6e3ac61