學了本文你能學到什麼?僅供學習,如有疑問,請留言。。。
注:紅色是小結, 紫色是重點,能像被課文一樣背誦感知機
目錄
小結
多層感知機在輸出層與輸入層之間加入了一個或多個全連接隱藏層,並通過激活函數對隱藏層輸出進行變換。
常用的激活函數包括ReLU函數、sigmoid函數和tanh函數。
# 3.8.1 隱藏層
多層感知機在單層神經網絡的基礎上引入了一到多個隱藏層(hidden layer)。
"多層感知機中的隱藏層和輸出層都是全連接層。"
隱藏層位於輸入層和輸出層之間。
圖3.3展示了一個多層感知機的神經網絡圖,它含有一個隱藏層,該層中有5個隱藏單元。
# 3.8.2 激活函數
不難發現,即便再添加更多的隱藏層,以上設計依然只能與僅含輸出層的單層神經網絡等價。
上述問題的根源在於全連接層只是對數據做仿射變換(affine transformation),而多個仿射變換的疊加仍然是一個仿射變換。
解決問題的一個方法是引入非線性變換,例如對隱藏變量使用按元素運算的非線性函數進行變換,然後再作爲下一個全連接層的輸入。這個非線性函數被稱爲激活函數(activation function)。
# 3.8.2.1 ReLU函數
"ReLU函數只保留正數元素,並將負數元素清零。"
import torch
import numpy as np
import matplotlib.pyplot as plt
import sys
sys.path.append("..") # 爲了導入上層目錄的d2lzh_pytorch
import d2lzh_pytorch as d21
#
# def xyplot(x_vals, y_vals, name):
# d21.set_figsize(figsize = (5, 2.5))
# d21.ple.plot(x_vals.detach().numpy(), y_vals.detach().numpy())
# d21.plt.xlabel("x")
# d21.plt.ylabel(name +"(x)")
# #我們接下來通過Tensor提供的relu函數來繪製ReLU函數。可以看到,該激活函數是一個兩段線性函數。
# 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')
"""
# 3.8.2.2 sigmoid函數
"sigmoid函數可以將元素的值變換到0和1之間:"
下面繪製了sigmoid函數。當輸入接近0時,sigmoid函數接近線性變換。
y = x.sigmoid()
xyplot(x, y, 'sigmoid')
"當輸入爲0時,sigmoid函數的導數達到最大值0.25;當輸入越偏離0時,sigmoid函數的導數越接近0。"
# 3.8.2.3 tanh函數
"tanh(雙曲正切)函數可以將元素的值變換到-1和1之間:"
"當輸入接近0時,tanh函數接近線性變換。雖然該函數的形狀和sigmoid函數的形狀很像,但tanh函數在座標系的原點上對稱。"
y = x.tanh()
xyplot(x, y, 'tanh')
"當輸入爲0時,tanh函數的導數達到最大值1;當輸入越偏離0時,tanh函數的導數越接近0。"
x.grad.zero_()
y.sum().backward()
xyplot(x, x.grad, 'grad of tanh')
# 3.8.3 多層感知機
"多層感知機就是含有至少一個隱藏層的由全連接層組成的神經網絡,且每個隱藏層的輸出通過激活函數進行變換。"
"多層感知機的層數和各隱藏層中隱藏單元個數都是超參數"
"在分類問題中,我們可以對輸出OO做softmax運算,並使用softmax迴歸中的交叉熵損失函數。"
"在迴歸問題中,我們將輸出層的輸出個數設爲1,並將輸出OO直接提供給線性迴歸中使用的平方損失函數。"