多層感知機含有乙個隱藏層,
以下是一種含單隱藏層的多層感知機的設計,其輸出o∈r
n×
q\boldsymbol \in \mathbb^
o∈rn×q
的公式為:
h =x
wh+b
h,o=
hwo+
bo
,\begin \boldsymbol &= \boldsymbol \boldsymbol_h + \boldsymbol_h,\\ \boldsymbol &= \boldsymbol \boldsymbol_o + \boldsymbol_o, \end
ho=xw
h+b
h,=
hwo
+bo
,將以上兩個式子聯立起來,可以得到
o =(
xwh+
bh)w
o+bo
=xwh
wo+b
hwo+
bo
.\boldsymbol = (\boldsymbol \boldsymbol_h + \boldsymbol_h)\boldsymbol_o + \boldsymbol_o = \boldsymbol \boldsymbol_h\boldsymbol_o + \boldsymbol_h \boldsymbol_o + \boldsymbol_o.
o=(xwh
+bh
)wo
+bo
=xw
hwo
+bh
wo
+bo
.雖然神經網路引入了隱藏層,卻依然等價於乙個單層神經網路:其中輸出層權重引數為whw
o\boldsymbol_h\boldsymbol_o
whwo
,偏差引數為bhw
o+bo
\boldsymbol_h \boldsymbol_o + \boldsymbol_o
bhwo
+bo
。不難發現,即便再新增更多的隱藏層,以上設計依然只能與僅含輸出層的單層神經網路等價。
解決辦法是引入非線性變換,也叫啟用函式。
relu函式
relu(rectified linear unit)函式提供了乙個很簡單的非線性變換。給定元素x
xx,該函式定義為
relu(x
)=
max(x
,0).
\text(x) = \max(x, 0).
relu(x
)=max(x,
0).可以看出,relu函式只保留正數元素,並將負數元素清零。
sigmoid函式
sigmoid函式可以將元素的值變換到0和1之間:
sigmoid(x
)=11
+exp(
−x).
\text(x) = \frac.
sigmoid(x
)=1+
exp(−x
)1.
tanh函式
tanh(雙曲正切)函式可以將元素的值變換到-1和1之間:
tanh(x
)=1−
exp(−
2x)1
+exp(
−2x)
.\text(x) = \frac.
tanh(x
)=1+
exp(−2
x)1−
exp(−2
x).
關於啟用函式的選擇
relu函式是乙個通用的啟用函式,目前在大多數情況下使用。但是,relu函式只能在隱藏層中使用。
用於分類器時,sigmoid函式及其組合通常效果更好。由於梯度消失問題,有時要避免使用sigmoid和tanh函式。
在神經網路層數較多的時候,最好使用relu函式,relu函式比較簡單計算量少,而sigmoid和tanh函式計算量大很多。
在選擇啟用函式的時候可以先選用relu函式如果效果不理想可以嘗試其他啟用函式。
加上啟用函式之後,我們的多層感知機公式為
h =ϕ
(xwh
+bh)
,o=h
wo+b
o,
\begin \boldsymbol &= \phi(\boldsymbol \boldsymbol_h + \boldsymbol_h),\\ \boldsymbol &= \boldsymbol \boldsymbol_o + \boldsymbol_o, \end
ho=ϕ(
xwh
+bh
),=h
wo+
bo,
其中ϕ
\phi
ϕ表示啟用函式。
import torch
from torch import nn
from torch.nn import init
import numpy as np
import sys
num_inputs, num_outputs, num_hiddens =
784,10,
256# 網路結構
net = nn.sequential(
d2l.flattenlayer(),
# 資料轉為一維
nn.linear(num_inputs, num_hiddens)
,# 線性模型
nn.relu(),
# 啟用函式
nn.linear(num_hiddens, num_outputs)
,# 線性模型
)for params in net.parameters():
init.normal_(params, mean=
0, std=
0.01
)# 初始化引數
batch_size =
256train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size,root=
'/home/kesci/input/fashionmnist2065'
)loss = torch.nn.crossentropyloss(
)# 損失函式
optimizer = torch.optim.sgd(net.parameters(
), lr=
0.5)
# 梯度下降
num_epochs =
5d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size,
none
,none
, optimizer)
《動手學深度學習》之多層感知機
先看看多層感知機的定義 多層感知機 和softmax回歸唯一的不同在於 我們多加了乙個全連線層作為隱藏層。它的隱藏單元個數為256,並使用relu函式作為啟用函式。import torch from torch import nn from torch.nn import init import n...
深度學習入門07 多層感知機
異或門可以通過其他閘電路進行表示,我們可以通過組合與門 與非門 或門實現異或門的邏輯功能 在大學的 數字電子技術基礎 這門課中,這個是非常基礎的知識哦 在已知與門 與非門 或門的邏輯功能 真值表 的情況下,如何使用這些邏輯門組合出異或門的邏輯功能呢?我們在這裡給大家提供一種思路,按照下面組合的方式將...
動手學深度學習TF2 0第六課 多層感知機
前面介紹的線性回歸和softmax回歸都是單層神經網路.然而在深度學習中,大多數是多層模型.以下以多層感知機為例,介紹多層神經網路.多層感知機在單層神經網路的基礎上引入了 個隱藏層 hidden layer 隱藏層位於輸入層和輸出層之間 上圖中含有乙個隱藏層,該層中有 個隱藏單元 輸入層不參與計算,...