模型、策略、算法:
在深度學習中,無論多么復雜的結構,終究逃不過三種構造,那就是模型、策略、算法,它們都是在這三種結構基礎上進行的變形、擴展、豐富
模型:構建參數、函數,確定學習方式
策略:策略的重點時損失函數,即構造出一種能都使得損失最小的函數結構
算法:不斷迭代,深度學習
BP神經網絡基本概念:
BP神經網絡是一種多層的前饋神經網絡,其主要的特點是:信號是前向傳播的,而誤差是反向傳播的。它模擬了人腦的神經網絡的結構,而人大腦傳遞信息的基本單位是神經元,人腦中有大量的神經元,每個神經元與多個神經元相連接。BP神經網絡,類似於上述,是一種簡化的生物模型。每層神經網絡都是由神經元構成的,單獨的每個神經元相當於一個感知器。輸入層是單層結構的,輸出層也是單層結構的,而隱藏層可以有多層,也可以是單層的。輸入層、隱藏層、輸出層之間的神經元都是相互連接的,為全連接。總得來說,BP神經網絡結構就是,輸入層得到刺激后,會把他傳給隱藏層,至於隱藏層,則會根據神經元相互聯系的權重並根據規則把這個刺激傳給輸出層,輸出層對比結果,如果不對,則返回進行調整神經元相互聯系的權值。這樣就可以進行訓練,最終學會,這就是BP神經網絡模型。
BP神經網絡簡介:
BP神經網絡已廣泛應用於非線性建摸、函數逼近、系統辨識等方面,但對實際問題,其模型結構需由實驗確定,無規律可尋。大多數通用的神經網絡都預先預定了網絡的層數,而BP網絡可以包含不同的隱層。但理論上已經證明,在不限制隱含節點數的情況下,兩層(只有一個隱層)的BP網絡可以實現任意非線性映射。在模式樣本相對較少的情況下,較少的隱層節點,可以實現模式樣本空間的超平面划分,此時,選擇兩層BP網絡就可以了。當模式樣本數很多時,減小網絡規模,增加一個隱層是有必要的,但是BP網絡隱含層數一般不超過兩層。
BP神經網絡訓練流程圖:
BP神經網絡算法公式:
在三層BP神經網絡中,輸入向量,也就是輸入層神經元為:
隱藏層輸入向量,也就是隱藏層神經元:
輸出層輸出向量,也就是輸出層神經元:
期望輸出向量可以表示為:
輸入層到隱藏層之間的權值用數學向量可以表示為:
這里面的列向量vj為隱藏層第 j 個神經元對應的權重;隱藏層到輸出層之間
的權值用數學向量可以表示為:
上式中的列向量wk為輸出層第 k 個神經元對應的權重。
輸入層,隱藏層,輸出層之間的數學關系如下所示:
就輸出層而言
就隱藏層而言
在上述表達式中,激活函數 f(x)必須為單調函數,我們選取 sigmoid 函數:
這是由於 f(x)是連續函數,是可導函數,且f'(x)=f(x)[1-f(x)]。
BP 神經網絡的輸入誤差產生是由於輸出層到隱藏層的權值和隱藏層到輸入層的權值決定,因此調整輸出層到隱藏層的權值和隱藏層到輸入層的權值可以改變誤差。調整輸出層到隱藏層的權值和隱藏層到輸入層的權值的思想是讓這個誤差不斷縮小這樣才能滿足我們的要求,因此我們需要讓這些權值修改量與誤差 E 的負梯度下降量成正比。
通過數學原理可以看出,在 BP 學習算法中,輸入層,輸出層和隱藏層權值調整方式都是一樣的。由三個條件決定,它們分別是:學習效率,輸入層,輸出層和隱藏層的各層誤差信號和各層輸入信號 X/Y。其中最為重要的是輸出層誤差信號,它直接意味着和實際期望結果的差異,代表着與我們預期結果的差距,而前面的各層的誤差都是從后往前傳遞計算的誤差。
BP神經網絡優缺點:
優點:
- 網絡實質上實現了一個從輸入到輸出的映射功能,而數學理論已證明它具有實現任何復雜非線性映射的功能。因此它特別適合於求解內部機制復雜的問題;
- 網絡具有自學習能力;
- 網絡具有一定的推廣、概括能力。
缺點:
-
BP算法的學習速度很慢
-
網絡訓練失敗的可能性較大
BP神經網絡構建代碼:
% BP網絡 % BP神經網絡的構建 net=newff([-1 2;0 5],[3,1],{'tansig','purelin'},'traingd') net.IW{1} net.b{1} p=[1;2]; a=sim(net,p) net=init(net); net.IW{1} net.b{1} a=sim(net,p) %net.IW{1}*p+net.b{1} p2=net.IW{1}*p+net.b{1} a2=sign(p2) a3=tansig(a2) a4=purelin(a3) net.b{2} net.b{1} net.IW{1} net.IW{2} 0.7616+net.b{2} a-net.b{2} (a-net.b{2})/ 0.7616 help purelin p1=[0;0]; a5=sim(net,p1) net.b{2} % BP網絡 % BP神經網絡的構建 net=newff([-1 2;0 5],[3,1],{'tansig','purelin'},'traingd') net.IW{1} net.b{1} %p=[1;]; p=[1;2]; a=sim(net,p) net=init(net); net.IW{1} net.b{1} a=sim(net,p) net.IW{1}*p+net.b{1} p2=net.IW{1}*p+net.b{1} a2=sign(p2) a3=tansig(a2) a4=purelin(a3) net.b{2} net.b{1} P=[1.2;3;0.5;1.6] W=[0.3 0.6 0.1 0.8] net1=newp([0 2;0 2;0 2;0 2],1,'purelin'); net2=newp([0 2;0 2;0 2;0 2],1,'logsig'); net3=newp([0 2;0 2;0 2;0 2],1,'tansig'); net4=newp([0 2;0 2;0 2;0 2],1,'hardlim'); net1.IW{1} net2.IW{1} net3.IW{1} net4.IW{1} net1.b{1} net2.b{1} net3.b{1} net4.b{1} net1.IW{1}=W; net2.IW{1}=W; net3.IW{1}=W; net4.IW{1}=W; a1=sim(net1,P) a2=sim(net2,P) a3=sim(net3,P) a4=sim(net4,P) init(net1); net1.b{1} help tansig % 訓練 p=[-0.1 0.5] t=[-0.3 0.4] w_range=-2:0.4:2; b_range=-2:0.4:2; ES=errsurf(p,t,w_range,b_range,'logsig');%單輸入神經元的誤差曲面 plotes(w_range,b_range,ES)%繪制單輸入神經元的誤差曲面 pause(0.5); hold off; net=newp([-2,2],1,'logsig'); net.trainparam.epochs=100; net.trainparam.goal=0.001; figure(2); [net,tr]=train(net,p,t); title('動態逼近') wight=net.iw{1} bias=net.b pause; close; % 練 p=[-0.2 0.2 0.3 0.4] t=[-0.9 -0.2 1.2 2.0] h1=figure(1); net=newff([-2,2],[5,1],{'tansig','purelin'},'trainlm'); net.trainparam.epochs=100; net.trainparam.goal=0.0001; net=train(net,p,t); a1=sim(net,p) pause; h2=figure(2); plot(p,t,'*'); title('樣本') title('樣本'); xlabel('Input'); ylabel('Output'); pause; hold on; ptest1=[0.2 0.1] ptest2=[0.2 0.1 0.9] a1=sim(net,ptest1); a2=sim(net,ptest2); net.iw{1} net.iw{2} net.b{1} net.b{2}
matlab運行結果:
BP神經網絡與感知器神經網絡構建:
% 第一章 感知器 % 1. 感知器神經網絡的構建 % 1.1 生成網絡 net=newp([0 2],1);%單輸入,輸入值為[0,2]之間的數 inputweights=net.inputweights{1,1};%第一層的權重為1 biases=net.biases{1};%閾值為1 % 1.2 網絡仿真 net=newp([-2 2;-2 2],1);%兩個輸入,一個神經元,默認二值激活 net.IW{1,1}=[-1 1];%權重,net.IW{i,j}表示第i層網絡第j個神經元的權重向量 net.IW{1,1} net.b{1}=1; net.b{1} p1=[1;1],a1=sim(net,p1) p2=[1;-1],a2=sim(net,p2) p3={[1;1] [1 ;-1]},a3=sim(net,p3) %兩組數據放一起 p4=[1 1;1 -1],a4=sim(net,p4)%也可以放在矩陣里面 net.IW{1,1}=[3,4]; net.b{1}=[1]; a1=sim(net,p1) % 1.3 網絡初始化 net=init(net); wts=net.IW{1,1} bias=net.b{1} % 改變權值和閾值為隨機數 net.inputweights{1,1}.initFcn='rands'; net.biases{1}.initFcn='rands'; net=init(net); bias=net.b{1} wts=net.IW{1,1} a1=sim(net,p1) % 2. 感知器神經網絡的學習和訓練 % 1 網絡學習 net=newp([-2 2;-2 2],1); net.b{1}=[0]; w=[1 -0.8] net.IW{1,1}=w; p=[1;2]; t=[1]; a=sim(net,p) e=t-a help learnp dw=learnp(w,p,[],[],[],[],e,[],[],[],[],[]) w=w+dw net.IW{1,1}=w; a=sim(net,p) net = newp([0 1; -2 2],1); P = [0 0 1 1; 0 1 0 1]; T = [0 1 1 1]; Y = sim(net,P) net.trainParam.epochs = 20; net = train(net,P,T); Y = sim(net,P) % 2 網絡訓練 net=init(net); p1=[2;2];t1=0;p2=[1;-2];t2=1;p3=[-2;2];t3=0;p4=[-1;1];t4=1; net.trainParam.epochs=1; net=train(net,p1,t1) w=net.IW{1,1} b=net.b{1} a=sim(net,p1) net=init(net); p=[[2;2] [1;-2] [-2;2] [-1;1]]; t=[0 1 0 1]; net.trainParam.epochs=1; net=train(net,p,t); a=sim(net,p) net=init(net); net.trainParam.epochs=2; net=train(net,p,t); a=sim(net,p) net=init(net); net.trainParam.epochs=20; net=train(net,p,t); a=sim(net,p) % 3. 二輸入感知器分類可視化問題 P=[-0.5 1 0.5 -0.1;-0.5 1 -0.5 1]; T=[1 1 0 1] net=newp([-1 1;-1 1],1); plotpv(P,T); plotpc(net.IW{1,1},net.b{1}); %hold on; %plotpv(P,T); net=adapt(net,P,T); net.IW{1,1} net.b{1} plotpv(P,T); plotpc(net.IW{1,1},net.b{1}) net.adaptParam.passes=3; net=adapt(net,P,T); net.IW{1,1} net.b{1} plotpc(net.IW{1},net.b{1}) net.adaptParam.passes=6; net=adapt(net,P,T) net.IW{1,1} net.b{1} plotpv(P,T); plotpc(net.IW{1},net.b{1}) plotpc(net.IW{1},net.b{1}) %仿真 a=sim(net,p); plotpv(p,a) p=[0.7;1.2] a=sim(net,p); plotpv(p,a); hold on; plotpv(P,T); plotpc(net.IW{1},net.b{1}) %感知器能夠正確分類,從而網絡可行。 % 4. 標准化學習規則訓練奇異樣本 P=[-0.5 -0.5 0.3 -0.1 -40;-0.5 0.5 -0.5 1.0 50] T=[1 1 0 0 1]; net=newp([-40 1;-1 50],1); plotpv(P,T);%標出所有點 hold on; linehandle=plotpc(net.IW{1},net.b{1});%畫出分類線 E=1; net.adaptParam.passes=3;%passes決定在訓練過程中訓練值重復的次數。 while (sse(E)) [net,Y,E]=adapt(net,P,T); linehandle=plotpc(net.IW{1},net.b{1},linehandle); drawnow; end; axis([-2 2 -2 2]); net.IW{1} net.b{1} %另外一種網絡修正學習(非標准化學習規則learnp) hold off; net=init(net); net.adaptParam.passes=3; net=adapt(net,P,T); plotpc(net.IW{1},net.b{1}); axis([-2 2 -2 2]); net.IW{1} net.b{1} %無法正確分類 %標准化學習規則網絡訓練速度要快! % 訓練奇異樣本 % 用標准化感知器學習規則(標准化學習數learnpn)進行分類 net=newp([-40 1;-1 50],1,'hardlim','learnpn'); plotpv(P,T); linehandle=plotpc(net.IW{1},net.b{1}); e=1; net.adaptParam.passes=3; net=init(net); linehandle=plotpc(net.IW{1},net.b{1}); while (sse(e)) [net,Y,e]=adapt(net,P,T); linehandle=plotpc(net.IW{1},net.b{1},linehandle); end; axis([-2 2 -2 2]); net.IW{1}%權重 net.b{1}%閾值 %正確分類 %非標准化感知器學習規則訓練奇異樣本的結果 net=newp([-40 1;-1 50],1); net.trainParam.epochs=30; net=train(net,P,T); pause; linehandle=plotpc(net.IW{1},net.b{1}); hold on; plotpv(P,T); linehandle=plotpc(net.IW{1},net.b{1}); axis([-2 2 -2 2]); % 5. 設計多個感知器神經元解決分類問題 p=[1.0 1.2 2.0 -0.8; 2.0 0.9 -0.5 0.7] t=[1 1 0 1;0 1 1 0] plotpv(p,t); hold on; net=newp([-0.8 1.2; -0.5 2.0],2); linehandle=plotpc(net.IW{1},net.b{1}); net=newp([-0.8 1.2; -0.5 2.0],2); linehandle=plotpc(net.IW{1},net.b{1}); e=1; net=init(net); while (sse(e)) [net,y,e]=adapt(net,p,t); linehandle=plotpc(net.IW{1},net.b{1},linehandle); drawnow; end;
matlab運行結果:
參考網址:
利用C++語言實現BP神經網絡, 並利用BP神經網絡解決蟎蟲分類問題:https://blog.csdn.net/u25th_engineer/article/details/100167404