《動手學深度學習》多層感知機

2021-10-02 23:10:25 字數 3374 閱讀 3338

多層感知機含有乙個隱藏層,

以下是一種含單隱藏層的多層感知機的設計,其輸出o∈r

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

h​wo

​+bh

​wo​

+bo​

.雖然神經網路引入了隱藏層,卻依然等價於乙個單層神經網路:其中輸出層權重引數為whw

o\boldsymbol_h\boldsymbol_o

wh​wo​

,偏差引數為bhw

o+bo

\boldsymbol_h \boldsymbol_o + \boldsymbol_o

bh​wo​

+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 隱藏層位於輸入層和輸出層之間 上圖中含有乙個隱藏層,該層中有 個隱藏單元 輸入層不參與計算,...