動手學深度學習9-多層感知機pytorch


多層感知機

之前已經介紹過了線性回歸和softmax回歸在內的單層神經網絡,然后深度學習主要學習多層模型,后續將以多層感知機(multilayer percetron,MLP),介紹多層神經網絡的概念。

隱藏層

多層感知機在單層神經網絡的基礎上引入了一到多個隱藏層(hidden layer)。隱藏層位於輸入層和輸出層質檢。下圖展示了一個多層感知機的神經網絡,它含有一個隱藏層,該層中有5個隱藏單元。


輸入和輸出個數為別為4和3,中間隱藏層中包含了5個隱藏單元。由於輸入層不涉及計算,多層感知機的層數為2。隱藏層中的神經元和輸入層各輸入完全連接,輸出層中的神經元和隱藏層中的各神經元也完全連接。因此多層感知機中的隱藏層和輸出層都是全連接。

具體來說,給定一個小批量樣本\(X∈R^{nxd}\),其批量大小為n,輸入個數為d。假設多層感知機只有一個隱含層,其中隱層單元個數為h。記隱藏層的輸出為H,有\(H∈R^{nxh}\),因為隱藏層和輸出層均為全連接層,可以設隱藏層的權重參數和偏差參數為別為\(W_{h}∈R^{dxh} 和b_{h}∈R^{1xh}\),輸出層的權重和偏差參數分別為$ W_{o}∈R^{hxq}和b_{o}∈R^{1xq}$

我們先來看一種含單隱藏層的多層感知機的的設計,其輸出\(O∈R^{nxq}\)的計算為

\[\begin{aligned} \boldsymbol { H } & = \boldsymbol { X } \boldsymbol { W } _ { h } + \boldsymbol { b } _ { h } \\ \boldsymbol { O } & = \boldsymbol { H } \boldsymbol { W } _ { o } + \boldsymbol { b } _ { o } \end{aligned} \]

也就是將隱藏層的輸出直接作為輸出層的輸入。如果將以上兩個

\[\boldsymbol { O } = \left( \boldsymbol { X } \boldsymbol { W } _ { h } + \boldsymbol { b } _ { h } \right) \boldsymbol { W } _ { o } + \boldsymbol { b } _ { o } = \boldsymbol { X } \boldsymbol { W } _ { h } \boldsymbol { W } _ { o } + \boldsymbol { b } _ { h } \boldsymbol { W } _ { o } + \boldsymbol { b } _ { o } \]

從聯立的公式中可以看出,雖然引入了隱藏層,卻依然等價於一個單層神經網絡:

其輸出層權重參數為\(W_{h}W_{o}\),偏差參數為\(b_{h}W_{o}+b_{o}\),即便添加更多的隱藏層,以上設計依然可以與僅含輸出層的單層神經網絡等價。

激活函數

使用隱藏變量使用按照元素運算的非線性函數進行變換,然后作為一個全連接層的輸入。這個非線性函數進行轉換叫作激活函數(activation function)

  • ReLU函數
    ReLu函數只保留正數元素,並將負數元素清零。為了直觀的觀察這一非線性變換,我可以先自己定義一個函數xyplot
%matplotlib inline
import torch
import numpy as  np
import matplotlib.pylab as plt
import sys
sys.path.append('..')
import d2lzh_pytorch as d2l

def xyplot(x_vals,y_vals,name):
    d2l.set_figsize(figsize=(5,2.5))
    d2l.plt.plot(x_vals.detach().numpy(),y_vals.detach().numpy())
    d2l.plt.xlabel('x')
    d2l.plt.ylabel(name+'(x)')
x = torch.arange(-8.0,8.0,0.1,requires_grad=True)
y= x.relu()
xyplot(x,y,'relu')

顯然,當輸入值為負數時,ReLU函數的導數為0,當輸入為正數時,ReLU導數為1。
盡管輸入為0時ReLu函數不可導,但是我們可以取此處的導數為0

y.sum().backward()
xyplot(x,x.grad,'grad of relu')

  • sigmoid函數
    sigmoid函數可以將元素的值轉變到0和1之間

\[sigmoid(x) = \frac{1}{1+exp(-x)} \]

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

根據鏈式法則,$$sigmoid^{'}(x) = sigmoid(x)(1-sigmoid(x))$$
sigmoid函數的導數,當輸入為0時,sigmoid函數的導數達到最大的0.25,當輸入越偏離0時,simoid函數的導數越接近0。

x.grad.zero_()
y.sum().backward()
xyplot(x,x.grad,'grad of simoid')

  • tanh 函數
    tanh函數(雙曲正切)可以將元素的值變換到-1和1之間:

\[anh(x) = \frac{1-exp^{(-2x)}}{1+exp^{(-2x)}} \]

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

根據鏈式法則,tanh函數的導數

\[tanh^{'}(x) = 1- tanh^{2}(x) \]

x.grad.zero_()
y.sum().backward()
xyplot(x,x.grad,'grad of tanh')

多層感知機就是含有至少一個隱藏層的由全連接組成的神經網絡,且每個隱藏層的輸出通過激活函數進行變換。多層感知機的層數和各層隱藏層中隱藏單元個數都是超參數。以隱藏層為例並沿用本節之前定義的符號,多層感知機按一下方式計算輸出:

\[\begin{aligned} \boldsymbol { H } & = \phi \left( \boldsymbol { X } \boldsymbol { W } _ { h } + \boldsymbol { b } _ { h } \right) \\ \boldsymbol { O } & = \boldsymbol { H } \boldsymbol { W } _ { o } + \boldsymbol { b } _ { o } \end{aligned} \]

其中,\(\phi\)表示激活函數。在分類問題中,我們可以輸出\(O\)做softmax運算,並使用softmax回歸中的交叉熵損失函數。在回歸問題中,我們將輸出層的輸出個數設為1,並將輸出O直接提供給線性回歸中使用的平方損失函數。

小結
  • 多層感知機在輸出層與輸入層之間加入了一個或多個全連接隱藏層,並通過激活函數
    對隱藏層輸出進行變換
  • 常用的激活函數包括ReLU函數,sigmoid函數,tanh函數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM