這裡寫目錄标題
- 前饋神經網絡
- 連接配接主義
- 感覺器、多層感覺器
- BP算法
- 前饋神經網
- 梯度下降法
- 多層感覺機
- BP 算法
- BP算法的基本過程
- 梯度爆炸和梯度彌散
前饋神經網絡
連接配接主義
感覺器、多層感覺器
BP算法
前饋神經網
神經網絡是最早作為一種連接配接主義為主的模型。
神經元(M-P)
1943 年,美國神經生理學家沃倫·麥卡洛克( Warren McCulloch ) 和數學家沃爾特 ·皮茨(Walter Pitts )對生物神經元進行模組化,首次提出了一種形式神經元模型,并命名為McCulloch-Pitts模型,即後 來廣為人知的M-P模型。MLP,全連接配接神經網絡,單個神經元又稱感覺機。
在M-P模型中,神經元接受其他n個神經元的輸入信号(0或1),這些輸入信号經過權重權重并求和,将求和結果與門檻值(threshold) θ 比較,然後經過激活函數處理,得到神經元的輸出。
M-P 模型可以表示多種邏輯運算,如取反運算、邏輯或、邏輯與。
人工神經網絡由神經元模型構成,這種由許多神經元組成的資訊處理網絡具有并行分布結構。
其中圓形節點表示一個神經元,方形節點表示一組神經元。
1958 年,羅森布拉特( Roseblatt )提出了感覺器,與 M-P 模型需 要人為确定參數不同,感覺器能夠通過訓練自動确定參數。訓練方式為有監督學習,即需要設定訓練樣本和期望輸出,然後調整實際輸出和期望輸出之差的方式(誤差修正學習)。
其中,\alphaα 是學習率,rr 和 yy 分别是期望輸出和實際輸出。
感覺器權重調整的基本思路:
- 實際輸出 y 與期望輸出 r 相等時,w 和 θ 不變
- 實際輸出 y 與期望輸出 r 不相等時,調整 w 和 θ 的值
import torch
from torch import optim
xs = torch.arange(0.01,1,0.01)
ys = 3*xs+4+torch.randn(99)/100
class Line(torch.nn.Module):
def __init__(self):
super().__init__()
self.w = torch.nn.Parameter(torch.randn(1))
self.b = torch.nn.Parameter(torch.randn(1))
def forward(self,x):
return self.w*x+self.b
if __name__ == '__main__':
line = Line()
opt = optim.SGD(line.parameters(),lr=0.1,momentum=0.01)
# opt = optim.Adam(line.parameters(),lr=0.00001)
for epoch in range(10):
for _x,_y in zip(xs,ys):
z = line(_x)
loss = (z-_y)**2
opt.zero_grad()
loss.backward()
opt.step()
print(loss)
print(line.w)
print(line.b)
梯度下降法
# import random
# import matplotlib.pyplot as plt
#
# _x = [i/100. for i in range(100)]
# _y = [3*e+4+random.random()/10 for e in _x]
# print(_x)
# print(_y)
#
# # BP
# w = random.random()
# b = random.random()
#
# for i in range(30):
# for x,y in zip(_x,_y):
# z = w * x + b
# o = z - y
# loss = o ** 2
#
# dw = -2*o*x
# db = -2*o
#
# w = w + 0.1*dw
# b = b + 0.1*db
# # print(dw,db)
# print(w,b,loss)
#
# plt.plot(_x,_y,".")
#
# v = [w*e+b for e in _x]
# plt.plot(_x,v)
# plt.show()
import random
if __name__ == '__main__':
x = [ i/100. for i in range(100)]
y = [3*i+4+random.random()/100. for i in x]
w = random.random()
b = random.random()
for _ in range(5000):
for _x,_y in zip(x,y):
y_pre = _x*w+b
o = y_pre-_y
loss = o**2
dw = -2*o*_x
db = -2*o
w = w+0.1*dw
b = b+0.1*db
print(w,b,loss)
多層感覺機
單層感覺器隻能解決線性可分問題,而不能解決線性不可分問題;為了解決線性不可分問題,我們需要使用多層感覺器。
多層感覺器指的是由多層結構的感覺器遞階組成的輸入值向前傳播的網絡,也被稱為前饋網絡或正向傳播網絡。
以三層結構的多層感覺器為例,它由輸入層、中間層及輸出層組成
與M-P模型相同,中間層的感覺器通過權重與輸入層的各單元相連接配接,通過門檻值函數計算中間層各單元的輸出值
中間層與輸出層之間同樣是通過權重相連接配接
BP 算法
多層感覺器的訓練使用誤差反向傳播算法(Error Back Propagation),即BP算法。BP算法最早有沃博斯于1974年提出,魯梅爾哈特等人進一步發展了該理論。
BP算法的基本過程
- 前向傳播計算:由輸入層經過隐含層向輸出層的計算網絡輸出
- 誤差反向逐層傳遞:網絡的期望輸出與實際輸出之差的誤差信号由輸出層經過隐含層逐層向輸入層傳遞
- 由“前向傳播計算”與“誤差反向逐層傳遞”的反複進行的網絡訓練 過程
- BP算法就是通過比較實際輸出和期望輸出得到誤差信号,把誤差信 号從輸出層逐層向前傳播得到各層的誤差信号,再通過調整各層的連接配接權重以減小誤差。權重的調整主要使用梯度下降法:
- 通過誤差反向傳播算法調整多層感覺器的連接配接權重時,一個瓶頸問題就是激活函數:
M-P 模型中使用階躍函數作為激活函數,隻能輸出 0或 1,不連續是以 不可導
為了使誤差能夠傳播,魯梅爾哈特等人提出使用可導函數Sigmoid作為激活函數
可以看出,在0,1附近,接近飽和,容易發生梯度彌散或者梯度爆炸。在中間的梯度最為合适。
其他常見的激活函數:ReLU (Rectified Linear Unit,修正線性單元)和tanh等
- Relu 可以穩定的提供梯度,但是非線性能力不如sidmoid、tanh.
梯度爆炸和梯度彌散
- 網絡深度夠大、根據鍊式求導法則,網絡進行反向傳播時、如果某層的參數w過小或者過大,梯度求倒時,求導參數往往為參數的乘積,這樣就會導緻出現的參數梯度越來越大或者越來越小。
- 采用了飽和性激活函數