多層感知機(jī)

多層感知機(jī)

  1. 多層感知機(jī)的基本知識(shí)
  2. 使用多層感知機(jī)圖像分類的從零開始的實(shí)現(xiàn)
  3. 使用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è)隱藏單元。

Image Name

表達(dá)公式

具體來說,給定一個(gè)小批量樣本\boldsymbol{X} \in \mathbb{R}^{n \times d},其批量大小為n,輸入個(gè)數(shù)為d。假設(shè)多層感知機(jī)只有一個(gè)隱藏層,其中隱藏單元個(gè)數(shù)為h。記隱藏層的輸出(也稱為隱藏層變量或隱藏變量)為\boldsymbol{H},有\boldsymbol{H} \in \mathbb{R}^{n \times h}。因?yàn)殡[藏層和輸出層均是全連接層,可以設(shè)隱藏層的權(quán)重參數(shù)和偏差參數(shù)分別為\boldsymbol{W}_h \in \mathbb{R}^{d \times h}\boldsymbol_h \in \mathbb{R}^{1 \times h},輸出層的權(quán)重和偏差參數(shù)分別為\boldsymbol{W}_o \in \mathbb{R}^{h \times q}\boldsymbol_o \in \mathbb{R}^{1 \times q}。

我們先來看一種含單隱藏層的多層感知機(jī)的設(shè)計(jì)。其輸出\boldsymbol{O} \in \mathbb{R}^{n \times q}的計(jì)算為

\begin{aligned} \boldsymbol{H} &= \boldsymbol{X} \boldsymbol{W}_h + \boldsymbol_h,\\ \boldsymbol{O} &= \boldsymbol{H} \boldsymbol{W}_o + \boldsymbol_o, \end{aligned}

也就是將隱藏層的輸出直接作為輸出層的輸入。如果將以上兩個(gè)式子聯(lián)立起來,可以得到

\boldsymbol{O} = (\boldsymbol{X} \boldsymbol{W}_h + \boldsymbol_h)\boldsymbol{W}_o + \boldsymbol_o = \boldsymbol{X} \boldsymbol{W}_h\boldsymbol{W}_o + \boldsymbol_h \boldsymbol{W}_o + \boldsymbol_o.

從聯(lián)立后的式子可以看出,雖然神經(jīng)網(wǎng)絡(luò)引入了隱藏層,卻依然等價(jià)于一個(gè)單層神經(jīng)網(wǎng)絡(luò):其中輸出層權(quán)重參數(shù)為\boldsymbol{W}_h\boldsymbol{W}_o,偏差參數(shù)為\boldsymbol_h \boldsymbol{W}_o + \boldsymbol_o。不難發(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)單的非線性變換。給定元素x,該函數(shù)定義為

\text{ReLU}(x) = \max(x, 0).

可以看出,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之間:

\text{sigmoid}(x) = \frac{1}{1 + \exp(-x)}.

y = x.sigmoid()
xyplot(x, y, 'sigmoid')

依據(jù)鏈?zhǔn)椒▌t,sigmoid函數(shù)的導(dǎo)數(shù)

\text{sigmoid}'(x) = \text{sigmoid}(x)\left(1-\text{sigmoid}(x)\right).

下面繪制了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之間:

\text{tanh}(x) = \frac{1 - \exp(-2x)}{1 + \exp(-2x)}.

我們接著繪制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ù)

\text{tanh}'(x) = 1 - \text{tanh}^2(x).

下面繪制了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ì)算輸出:

\begin{aligned} \boldsymbol{H} &= \phi(\boldsymbol{X} \boldsymbol{W}_h + \boldsymbol_h),\\ \boldsymbol{O} &= \boldsymbol{H} \boldsymbol{W}_o + \boldsymbol_o, \end{aligned}

其中\phi表示激活函數(shù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容