打開一些神經網絡的網絡描述文件,可以看到不同的層,其中就有一種層的類型,叫做ReLU。今天正好有小夥伴問起,雖然是基礎部分但是還是來總結一下吧。首先看網絡結構描述的形式:
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
convolution_param {
num_output: 96
pad: 3
kernel_size: 7
stride: 2
}
}
layer {
name: "relu1"
type: "ReLU"
bottom: "conv1"
top: "conv1"
}
這裏截取Faster R-CNN的模型文件一小部分,可以看到,在卷積層後面緊接着是一個ReLU層,主要定義了name,type,bottom,top,其屬於非線性激活函數的一種,同類型的函數還有sigmoid函數,tanh函數,softplus函數等等。對於ReLU函數,其公式即爲個ReLU(x)=max(0, x)
,而sigmoid函數爲sigmoid(x)= 1/(1+e^-x)
,而Softplus(x)=log(1+ex)
。有一個經典的4種函數圖形表示如下:
從圖形可以看出,後圖中的ReLU與softplus函數與前圖中的傳統sigmoid系激活函數相比,主要變化有三點:①單側抑制 ②相對寬闊的興奮邊界 ③稀疏激活性(重點,可以看到紅框裏前端狀態完全沒有激活)。
那麼爲什麼現在這麼多網絡都更多地使用ReLU函數呢?
一個重要原因就是上面提到的,其稀疏激活性。
標準的sigmoid函數輸出不具備稀疏性,需要用一些懲罰因子來訓練出一大堆接近0的冗餘數據來,從而產生稀疏數據,例如L1、L1/L2或Student-t作懲罰因子。因此需要進行無監督的預訓練。
而ReLU是線性修正,是purelin的折線版。它的作用是如果計算出的值小於0,就讓它等於0,否則保持原來的值不變。這是一種簡單粗暴地強制某些數據爲0的方法,然而經實踐證明,訓練後的網絡完全具備適度的稀疏性。而且訓練後的可視化效果和傳統方式預訓練出的效果很相似,這也說明了ReLU具備引導適度稀疏的能力。
因此,ReLu的使用,使得網絡可以自行引入稀疏性,同時大大地提高了訓練速度。下面貼出一些不同函數下的訓練結果對比數據:
ReLU因而在深度網絡中已逐漸取代sigmoid而成爲主流。