卷积神经网络

**卷積神經網路**（英語：Convolutional Neural Network，縮寫：**CNN**）是一種前饋神經網路，它的人工神經元可以回應一部分覆蓋範圍內的周圍單元，對於大型圖像處理有出色表現。

卷積神經網路由一個或多個卷積層和頂端的全連通層（對應經典的神經網路）組成，同時也包括關聯權重和池化層（pooling layer）。這一結構使得卷積神經網路能夠利用輸入資料的二維結構。與其他深度學習結構相比，卷積神經網路在圖像和語音辨識方面能夠給出更好的結果。這一模型也可以使用反向傳播演算法進行訓練。相比較其他深度、前饋神經網路，卷積神經網路需要考量的參數更少，使之成為一種頗具吸引力的深度學習結構。

卷積神經網路的靈感來自於動物視覺皮層組織的神經連接方式。單個神經元只對有限區域內的刺激作出反應，不同神經元的感知區域相互重疊從而覆蓋整個視野。

## 定義

 
卷積神經網路是人工神經網路的一種特殊類型，在其至少一層中使用稱為卷積的數學運算代替通用矩陣乘法。它們專門設計用於處理像素資料，並用於圖像辨識和處理。

## 概覽

## 發展

CNN 是根據生物的視覺處理過程來進行設計的。

### 大腦中視覺皮層接收視覺訊號的過程

Hubel 和 Wiesel 在 20 世紀 50 年代到 20 世紀 60 年代的研究發現，貓和猴子的視覺皮層中包含著能分別對某一小塊視覺區域進行回應的神經元。當眼睛不動的時候，在一定區域內的視覺刺激能使單個神經元興奮，那這個區域就稱為這個神經元的感受範圍。相鄰的細胞具有相似且重疊的感受範圍。為了形成一張完整的視覺圖像，整個視覺皮層上的神經元的感受範圍的大小和位置呈現系統性的變化。左腦和右腦分別對應其對側的視野。
他們在其 1968 年的一篇論文中確定了大腦中有兩種不同的基本視覺細胞：

* 簡單細胞
* 複雜細胞

Hubel 和 Wiesel 還提出了這兩種細胞用於圖型識別任務的級聯模型。

## 結構

卷積神經網路由輸入層、隱藏層和輸出層組成。

### 卷積層

卷積層可以產生一組平行的特徵圖（feature map），它通過在輸入圖像上滑動不同的卷積核並執行一定的運算而組成。此外，在每一個滑動的位置上，卷積核與輸入圖像之間會執行一個元素對應乘積並求和的運算以將感受野內的資訊投影到特徵圖中的一個元素。這一滑動的過程可稱爲步幅 Z\_s，步幅 Z\_s 是控制輸出特徵圖尺寸的一個因素。卷積核的尺寸要比輸入圖像小得多，且重疊或平行地作用於輸入圖像中，一張特徵圖中的所有元素都是通過一個卷積核計算得出的，也即一張特徵圖共享了相同的權重和偏置項。

### 線性整流層

線性整流層（Rectified Linear Units layer, ReLU layer）使用線性整流（Rectified Linear Units, ReLU） $f(x)=\max(0,x)$ 作為這一層神經的激勵函式（Activation function）。它可以增強判定函式和整個神經網路的非線性特性，而本身並不會改變卷積層。

事實上，其他的一些函式也可以用於增強網路的非線性特性，如雙曲正切函式 $f(x)=\tanh(x)$ , $f(x)=|\tanh(x)|$ ，或者 Sigmoid 函式 $f(x)=(1+e^{-x})^{-1}$ 。相比其它函式來說，ReLU 函式更受青睞，這是因為它可以將神經網路的訓練速度提升數倍，而並不會對模型的泛化準確度造成顯著影響。

### 池化層

池化（Pooling）是卷積神經網路中另一個重要的概念，它實際上是一種非線性形式的降採樣。有多種不同形式的非線性池化函式，而其中「最大池化（Max pooling）」是最為常見的。它是將輸入的圖像劃分為若干個矩形區域，對每個子區域輸出最大值。

直覺上，這種機制能夠有效地原因在於，一個特徵的精確位置遠不及它相對於其他特徵的粗略位置重要。池化層會不斷地減小資料的空間大小，因此參數的數量和計算量也會下降，這在一定程度上也控制了過擬合。通常來說，CNN 的網路結構中的卷積層之間都會周期性地插入池化層。池化操作提供了另一種形式的平移不變性。因為卷積核是一種特徵發現器，我們通過卷積層可以很容易地發現圖像中的各種邊緣。但是卷積層發現的特徵往往過於精確，我們即使高速連拍拍攝一個物體，相片中的物體的邊緣像素位置也不大可能完全一致，通過池化層我們可以降低卷積層對邊緣的敏感性。

池化層每次在一個池化窗口（depth slice）上計算輸出，然後根據步幅移動池化窗口。下圖是目前最常用的池化層，步幅為 2，池化窗口為 $2\times 2$ 的二維最大池化層。每隔 2 個元素從圖像劃分出 $2\times 2$ 的區塊，然後對每個區塊中的 4 個數取最大值。這將會減少 75% 的資料量。

$$
f_{X,Y}(S)=\max _{a,b=0}^{1}S_{2X+a,2Y+b}.
$$

除了最大池化之外，池化層也可以使用其他池化函式，例如「平均池化」甚至「L2 - 範數池化」等。過去，平均池化的使用曾經較為廣泛，但是最近由於最大池化在實踐中的表現更好，平均池化已經不太常用。

由於池化層過快地減少了資料的大小，目前文獻中的趨勢是使用較小的池化濾鏡，甚至不再使用池化層。

RoI 池化 (Region of Interest) 是最大池化的變體，其中輸出大小是固定的，輸入矩形是一個參數。

池化層是基於 Fast-RCNN 架構的卷積神經網路的一個重要組成部分。

### 完全連接層

最後，在經過幾個卷積和最大池化層之後，神經網路中的進階推理通過完全連接層來完成。就和常規的非卷積人工神經網路中一樣，完全連接層中的神經元與前一層中的所有啟用都有聯絡。因此，它們的啟用可以作為仿射變換來計算，也就是先乘以一個矩陣然後加上一個偏差 (bias) 偏移量 (向量加上一個固定的或者學習來的偏差量)。

## 應用

### 影像辨識

卷積神經網路通常在影像辨識系統中使用。

### 視訊分析

相比影像辨識問題，視訊分析要難許多。CNN 也常被用於這類問題。

### 自然語言處理

卷積神經網路也常被用於自然語言處理。 CNN 的模型被證明可以有效的處理各種自然語言處理的問題，如語意分析、搜尋結果提取、句子建模 、分類、預測、和其他傳統的 NLP 任務
等。

### 藥物發現

卷積神經網路已在藥物發現中使用。卷積神經網路被用來預測的分子與蛋白質之間的相互作用，以此來尋找靶向位點，尋找出更可能安全和有效的潛在治療方法。

### 圍棋

卷積神經網路在電腦圍棋領域也被使用。2016 年 3 月，AlphaGo 對戰李世乭的比賽，展示了深度學習在圍棋領域的重大突破。

## 微調（fine-tuning）

卷積神經網路（例如 Alexnet、VGG 網路）在網路的最後通常為 softmax 分類器。微調一般用來調整 softmax 分類器的分類數。例如原網路可以分類出 2 種圖像，需要增加 1 個新的分類從而使網路可以分類出 3 種圖像。微調（fine-tuning）可以留用之前訓練的大多數參數，從而達到快速訓練收斂的效果。例如保留各個卷積層，只重構卷積層後的全連接層與 softmax 層即可。

## 經典模型

* LeNet
* AlexNet
* VGG
* GoogLeNet
* ResNet
* DenseNet

## 可用包

* roNNie: 是一個簡易入門級框架，使用 Tensorflow 計算層。可於 python 下載 pip3 ronnie
* Caffe: Caffe 包含了 CNN 使用最廣泛的庫。它由伯克利視覺和學習中心（BVLC）研發，擁有比一般實現更好的結構和更快的速度。同時支援 CPU 和 GPU 計算，底層由 C++ 實現，並封裝了 Python 和 MATLAB 的介面。
* Torch7（www.torch.ch）
* OverFeat
* Cuda-convnet
* MatConvnet
* Theano：用 Python 實現的神經網路包
* TensorFlow
* Paddlepaddle (www.paddlepaddle.org （頁面存檔備份，存於網際網路檔案館）)
* Keras
* PyTorch

## 參考