多層感知機(jī)
- 多層感知機(jī)的基本知識(shí)
- 使用多層感知機(jī)圖像分類的從零開始的實(shí)現(xiàn)
- 使用pytorch的簡(jiǎn)潔實(shí)現(xiàn)
多層感知機(jī)的基本知識(shí)
深度學(xué)習(xí)主要關(guān)注多層模型尽纽。在這里,我們將以多層感知機(jī)(multilayer perceptron岳锁,MLP)為例,介紹多層神經(jīng)網(wǎng)絡(luò)的概念。
隱藏層
下圖展示了一個(gè)多層感知機(jī)的神經(jīng)網(wǎng)絡(luò)圖惩歉,它含有一個(gè)隱藏層,該層中有5個(gè)隱藏單元俏蛮。
表達(dá)公式
具體來說撑蚌,給定一個(gè)小批量樣本,其批量大小為
搏屑,輸入個(gè)數(shù)為
争涌。假設(shè)多層感知機(jī)只有一個(gè)隱藏層,其中隱藏單元個(gè)數(shù)為
睬棚。記隱藏層的輸出(也稱為隱藏層變量或隱藏變量)為
第煮,有
。因?yàn)殡[藏層和輸出層均是全連接層抑党,可以設(shè)隱藏層的權(quán)重參數(shù)和偏差參數(shù)分別為
和
,輸出層的權(quán)重和偏差參數(shù)分別為
和
害晦。
我們先來看一種含單隱藏層的多層感知機(jī)的設(shè)計(jì)。其輸出的計(jì)算為
也就是將隱藏層的輸出直接作為輸出層的輸入。如果將以上兩個(gè)式子聯(lián)立起來鳄逾,可以得到
從聯(lián)立后的式子可以看出,雖然神經(jīng)網(wǎng)絡(luò)引入了隱藏層枚抵,卻依然等價(jià)于一個(gè)單層神經(jīng)網(wǎng)絡(luò):其中輸出層權(quán)重參數(shù)為线欲,偏差參數(shù)為
李丰。不難發(fā)現(xiàn),即便再添加更多的隱藏層逼泣,以上設(shè)計(jì)依然只能與僅含輸出層的單層神經(jīng)網(wǎng)絡(luò)等價(jià)趴泌。
激活函數(shù)
上述問題的根源在于全連接層只是對(duì)數(shù)據(jù)做仿射變換(affine transformation)舟舒,而多個(gè)仿射變換的疊加仍然是一個(gè)仿射變換。解決問題的一個(gè)方法是引入非線性變換踱讨,例如對(duì)隱藏變量使用按元素運(yùn)算的非線性函數(shù)進(jìn)行變換魏蔗,然后再作為下一個(gè)全連接層的輸入。這個(gè)非線性函數(shù)被稱為激活函數(shù)(activation function)痹筛。
下面我們介紹幾個(gè)常用的激活函數(shù):
ReLU函數(shù)
ReLU(rectified linear unit)函數(shù)提供了一個(gè)很簡(jiǎn)單的非線性變換莺治。給定元素,該函數(shù)定義為
可以看出帚稠,ReLU函數(shù)只保留正數(shù)元素谣旁,并將負(fù)數(shù)元素清零。為了直觀地觀察這一非線性變換滋早,我們先定義一個(gè)繪圖函數(shù)xyplot榄审。
%matplotlib inline
import torch
import numpy as np
import matplotlib.pyplot as plt
import sys
sys.path.append("/home/kesci/input")
import d2lzh1981 as d2l
print(torch.__version__)
def xyplot(x_vals, y_vals, name):
# d2l.set_figsize(figsize=(5, 2.5))
plt.plot(x_vals.detach().numpy(), y_vals.detach().numpy())
plt.xlabel('x')
plt.ylabel(name + '(x)')
# relu函數(shù)
x = torch.arange(-8.0, 8.0, 0.1, requires_grad=True)
y = x.relu()
xyplot(x, y, 'relu')
# grad of relu 函數(shù)
y.sum().backward()
xyplot(x, x.grad, 'grad of relu')
Sigmoid函數(shù)
sigmoid函數(shù)可以將元素的值變換到0和1之間:
y = x.sigmoid()
xyplot(x, y, 'sigmoid')
依據(jù)鏈?zhǔn)椒▌t,sigmoid函數(shù)的導(dǎo)數(shù)
下面繪制了sigmoid函數(shù)的導(dǎo)數(shù)杆麸。當(dāng)輸入為0時(shí)搁进,sigmoid函數(shù)的導(dǎo)數(shù)達(dá)到最大值0.25;當(dāng)輸入越偏離0時(shí)昔头,sigmoid函數(shù)的導(dǎo)數(shù)越接近0饼问。
x.grad.zero_()
y.sum().backward()
xyplot(x, x.grad, 'grad of sigmoid')
tanh函數(shù)
tanh(雙曲正切)函數(shù)可以將元素的值變換到-1和1之間:
我們接著繪制tanh函數(shù)。當(dāng)輸入接近0時(shí)揭斧,tanh函數(shù)接近線性變換莱革。雖然該函數(shù)的形狀和sigmoid函數(shù)的形狀很像,但tanh函數(shù)在坐標(biāo)系的原點(diǎn)上對(duì)稱讹开。
y = x.tanh()
xyplot(x, y, 'tanh')
依據(jù)鏈?zhǔn)椒▌t盅视,tanh函數(shù)的導(dǎo)數(shù)
下面繪制了tanh函數(shù)的導(dǎo)數(shù)。當(dāng)輸入為0時(shí)旦万,tanh函數(shù)的導(dǎo)數(shù)達(dá)到最大值1闹击;當(dāng)輸入越偏離0時(shí),tanh函數(shù)的導(dǎo)數(shù)越接近0成艘。
x.grad.zero_()
y.sum().backward()
xyplot(x, x.grad, 'grad of tanh')
關(guān)于激活函數(shù)的選擇
ReLu函數(shù)是一個(gè)通用的激活函數(shù)拇砰,目前在大多數(shù)情況下使用。但是狰腌,ReLU函數(shù)只能在隱藏層中使用。
用于分類器時(shí)牧氮,sigmoid函數(shù)及其組合通常效果更好琼腔。由于梯度消失問題,有時(shí)要避免使用sigmoid和tanh函數(shù)踱葛。
在神經(jīng)網(wǎng)絡(luò)層數(shù)較多的時(shí)候丹莲,最好使用ReLu函數(shù)光坝,ReLu函數(shù)比較簡(jiǎn)單計(jì)算量少,而sigmoid和tanh函數(shù)計(jì)算量大很多甥材。
在選擇激活函數(shù)的時(shí)候可以先選用ReLu函數(shù)如果效果不理想可以嘗試其他激活函數(shù)盯另。
多層感知機(jī)
多層感知機(jī)就是含有至少一個(gè)隱藏層的由全連接層組成的神經(jīng)網(wǎng)絡(luò),且每個(gè)隱藏層的輸出通過激活函數(shù)進(jìn)行變換洲赵。多層感知機(jī)的層數(shù)和各隱藏層中隱藏單元個(gè)數(shù)都是超參數(shù)鸳惯。以單隱藏層為例并沿用本節(jié)之前定義的符號(hào),多層感知機(jī)按以下方式計(jì)算輸出:
其中表示激活函數(shù)。