❶ 神經網路中的前向和後向演算法
神經網路中的前向和後向演算法
看了一段時間的深度網路模型,也在tf和theano上都跑了一些模型,但是感覺沒有潛下去,對很多東西的理解都只停留在「這個是干什麼的」層次上面。昨天在和小老師一起看一篇文章的時候,就被問到RNN裡面的後向傳播演算法具體是怎麼推。當時心裡覺得BP演算法其實很熟悉啊,然後在推導的過程中就一臉懵逼了。於是又去網上翻了翻相關內容,自己走了一遍,准備做個筆記,算是個交代。
准備一個神經網路模型,比如:
其中,[i1,i2]
代表輸入層的兩個結點,[h1,h2]代表隱藏層的兩個結點,[o1,o2]為輸出。[b1,b2]
為偏置項。連接每個結點之間的邊已經在圖中標出。
來了解一下前向演算法:
前向演算法的作用是計算輸入層結點對隱藏層結點的影響,也就是說,把網路正向的走一遍:輸入層—->隱藏層—->輸出層
計算每個結點對其下一層結點的影響。
?? 例如,我們要算結點h1
的值,那麼就是:
是一個簡單的加權求和。這里稍微說一下,偏置項和權重項的作用是類似的,不同之處在於權重項一般以乘法的形式體現,而偏置項以加法的形式體現。
??而在計算結點o1時,結點h1的輸出不能簡單的使用neth1的結果,必須要計算激活函數,激活函數,不是說要去激活什麼,而是要指「激活的神經元的特徵」通過函數保留並映射出來。以sigmoid函數為例,h1的輸出:
於是
最後o1的輸出結果,也就是整個網路的一個輸出值是:
按照上面的步驟計算出out02,則[outo1,outo2]就是整個網路第一次前向運算之後得到的結果。
後向演算法:
??在實際情況中,因為是隨機給定的權值,很大的可能(幾乎是100%)得到的輸出與實際結果之間的偏差非常的大,這個時候我們就需要比較我們的輸出和實際結果之間的差異,將這個殘差返回給整個網路,調整網路中的權重關系。這也是為什麼我們在神經網路中需要後向傳播的原因。其主要計算步驟如下:
1. 計算總誤差
2. 隱藏層的權值更新
在要更新每個邊的權重之前,必須要知道這條邊對最後輸出結果的影響,可以用整體誤差對w5求偏導求出:
具體計算的時候,可以採用鏈式法則展開:
在計算的時候一定要注意每個式子裡面哪些自變數是什麼,求導千萬不要求錯了。
??需要講出來的一個地方是,在計算w1的權重時,Etotal中的兩部分都需要對它進行求導,因為這條邊在前向傳播中對兩個殘差都有影響
3. 更新權重 這一步裡面就沒什麼東西了,直接根據學習率來更新權重:
至此,一次正向+反向傳播過程就到此為止,接下來只需要進行迭代,不斷調整邊的權重,修正網路的輸出和實際結果之間的偏差(也就是training整個網路)。
❷ 計算機網路的最短路徑演算法有哪些對應哪些協議
用於解決最短路徑問題的演算法被稱做「最短路徑演算法」,有時被簡稱作「路徑演算法」。最常用的路徑演算法有:
Dijkstra演算法、A*演算法、SPFA演算法、Bellman-Ford演算法和Floyd-Warshall演算法,本文主要介紹其中的三種。
最短路徑問題是圖論研究中的一個經典演算法問題,旨在尋找圖(由結點和路徑組成的)中兩結點之間的最短路徑。
演算法具體的形式包括:
確定起點的最短路徑問題:即已知起始結點,求最短路徑的問題。
確定終點的最短路徑問題:與確定起點的問題相反,該問題是已知終結結點,求最短路徑的問題。在無向圖中該問題與確定起點的問題完全等同,在有向圖中該問題等同於把所有路徑方向反轉的確定起點的問題。
確定起點終點的最短路徑問題:即已知起點和終點,求兩結點之間的最短路徑。
全局最短路徑問題:求圖中所有的最短路徑。
Floyd
求多源、無負權邊的最短路。用矩陣記錄圖。時效性較差,時間復雜度O(V^3)。
Floyd-Warshall演算法(Floyd-Warshall algorithm)是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題。
Floyd-Warshall演算法的時間復雜度為O(N^3),空間復雜度為O(N^2)。
Floyd-Warshall的原理是動態規劃:
設Di,j,k為從i到j的只以(1..k)集合中的節點為中間節點的最短路徑的長度。
若最短路徑經過點k,則Di,j,k = Di,k,k-1 + Dk,j,k-1;
若最短路徑不經過點k,則Di,j,k = Di,j,k-1。
因此,Di,j,k = min(Di,k,k-1 + Dk,j,k-1 , Di,j,k-1)。
在實際演算法中,為了節約空間,可以直接在原來空間上進行迭代,這樣空間可降至二維。
Floyd-Warshall演算法的描述如下:
for k ← 1 to n do
for i ← 1 to n do
for j ← 1 to n do
if (Di,k + Dk,j < Di,j) then
Di,j ← Di,k + Dk,j;
其中Di,j表示由點i到點j的代價,當Di,j為 ∞ 表示兩點之間沒有任何連接。
Dijkstra
求單源、無負權的最短路。時效性較好,時間復雜度為O(V*V+E),可以用優先隊列進行優化,優化後時間復雜度變為0(v*lgn)。
源點可達的話,O(V*lgV+E*lgV)=>O(E*lgV)。
當是稀疏圖的情況時,此時E=V*V/lgV,所以演算法的時間復雜度可為O(V^2) 。可以用優先隊列進行優化,優化後時間復雜度變為0(v*lgn)。
Bellman-Ford
求單源最短路,可以判斷有無負權迴路(若有,則不存在最短路),時效性較好,時間復雜度O(VE)。
Bellman-Ford演算法是求解單源最短路徑問題的一種演算法。
單源點的最短路徑問題是指:給定一個加權有向圖G和源點s,對於圖G中的任意一點v,求從s到v的最短路徑。
與Dijkstra演算法不同的是,在Bellman-Ford演算法中,邊的權值可以為負數。設想從我們可以從圖中找到一個環
路(即從v出發,經過若干個點之後又回到v)且這個環路中所有邊的權值之和為負。那麼通過這個環路,環路中任意兩點的最短路徑就可以無窮小下去。如果不處理這個負環路,程序就會永遠運行下去。 而Bellman-Ford演算法具有分辨這種負環路的能力。
SPFA
是Bellman-Ford的隊列優化,時效性相對好,時間復雜度O(kE)。(k< 與Bellman-ford演算法類似,SPFA演算法採用一系列的鬆弛操作以得到從某一個節點出發到達圖中其它所有節點的最短路徑。所不同的是,SPFA演算法通過維護一個隊列,使得一個節點的當前最短路徑被更新之後沒有必要立刻去更新其他的節點,從而大大減少了重復的操作次數。
SPFA演算法可以用於存在負數邊權的圖,這與dijkstra演算法是不同的。
與Dijkstra演算法與Bellman-ford演算法都不同,SPFA的演算法時間效率是不穩定的,即它對於不同的圖所需要的時間有很大的差別。
在最好情形下,每一個節點都只入隊一次,則演算法實際上變為廣度優先遍歷,其時間復雜度僅為O(E)。另一方面,存在這樣的例子,使得每一個節點都被入隊(V-1)次,此時演算法退化為Bellman-ford演算法,其時間復雜度為O(VE)。
SPFA演算法在負邊權圖上可以完全取代Bellman-ford演算法,另外在稀疏圖中也表現良好。但是在非負邊權圖中,為了避免最壞情況的出現,通常使用效率更加穩定的Dijkstra演算法,以及它的使用堆優化的版本。通常的SPFA。
❸ 請問matlab中RBF神經網路newrbe函數用的什麼演算法
newrbe是設計精確的徑向基神經網路的函數,用法如:
P = [1 2 3];%輸入
T = [2.0 4.1 5.9];%目標
net = newrbe(P,T);%生成神經網路
其演算法是:生成的網路有2層,第一層是radbas神經元,用dist計算加權輸入,用netprod計算網路輸入,第二層是purelin神經元,用 dotprod計算加權輸入,用netsum計算網路輸入。兩層都有偏差b。
newrbe先設第一層權重為p',偏差為0.8326,第二層權重IW{2,1}從第一層的模擬輸出 A{1}得到,偏差 b{2}從解線性方程 [W{2,1} b{2}] * [A{1}; ones] = T 得到。
❹ 神經網路中rprop是什麼演算法
對於bp神經網路來說沒有固定的標准可以得到最好的bp網路,設計好後只能手動修改參數然後選擇最好的。下邊是個分類的例子
clc
clear
close all
%---------------------------------------------------
% 產生訓練樣本與測試樣本,每一列為一個樣本
P1 = [rand(3,5),rand(3,5)+1,rand(3,5)+2];
T1 = [repmat([1;0;0],1,5),repmat([0;1;0],1,5),repmat([0;0;1],1,5)];
P2 = [rand(3,5),rand(3,5)+1,rand(3,5)+2];
T2 = [repmat([1;0;0],1,5),repmat([0;1;0],1,5),repmat([0;0;1],1,5)];
%---------------------------------------------------
% 歸一化
[PN1,minp,maxp] = premnmx(P1);
PN2 = tramnmx(P2,minp,maxp);
%---------------------------------------------------
% 設置網路參數
NodeNum = 10; % 隱層節點數
TypeNum = 3; % 輸出維數
TF1 = 'tansig';TF2 = 'purelin'; % 判別函數(預設值)
%TF1 = 'tansig';TF2 = 'logsig';
%TF1 = 'logsig';TF2 = 'purelin';
%TF1 = 'tansig';TF2 = 'tansig';
%TF1 = 'logsig';TF2 = 'logsig';
%TF1 = 'purelin';TF2 = 'purelin';
net = newff(minmax(PN1),[NodeNum TypeNum],{TF1 TF2});
%---------------------------------------------------
% 指定訓練參數
% net.trainFcn = 'traingd'; % 梯度下降演算法
% net.trainFcn = 'traingdm'; % 動量梯度下降演算法
%
% net.trainFcn = 'traingda'; % 變學習率梯度下降演算法
% net.trainFcn = 'traingdx'; % 變學習率動量梯度下降演算法
%
% (大型網路的首選演算法 - 模式識別)
% net.trainFcn = 'trainrp'; % RPROP(彈性bp)演算法,內存需求最小
%
% 共軛梯度演算法
% net.trainFcn = 'traincgf'; % Fletcher-Reeves修正演算法
% net.trainFcn = 'traincgp'; % Polak-Ribiere修正演算法,內存需求比Fletcher-Reeves修正演算法略大
% net.trainFcn = 'traincgb'; % Powell-Beal復位演算法,內存需求比Polak-Ribiere修正演算法略大
% (大型網路的首選演算法 - 函數擬合,模式識別)
% net.trainFcn = 'trainscg'; % Scaled Conjugate Gradient演算法,內存需求與Fletcher-Reeves修正演算法相同,計算量比上面三種演算法都小很多
%
% net.trainFcn = 'trainbfg'; % Quasi-Newton Algorithms - BFGS Algorithm,計算量和內存需求均比共軛梯度演算法大,但收斂比較快
% net.trainFcn = 'trainoss'; % One Step Secant Algorithm,計算量和內存需求均比BFGS演算法小,比共軛梯度演算法略大
%
% (中小型網路的首選演算法 - 函數擬合,模式識別)
net.trainFcn = 'trainlm'; % Levenberg-Marquardt演算法,內存需求最大,收斂速度最快
%
% net.trainFcn = 'trainbr'; % 貝葉斯正則化演算法
%
% 有代表性的五種演算法為:'traingdx','trainrp','trainscg','trainoss', 'trainlm'
%---------------------%
net.trainParam.show = 1; % 訓練顯示間隔
net.trainParam.lr = 0.3; % 學習步長 - traingd,traingdm
net.trainParam.mc = 0.95; % 動量項系數 - traingdm,traingdx
net.trainParam.mem_rec = 10; % 分塊計算Hessian矩陣(僅對Levenberg-Marquardt演算法有效)
net.trainParam.epochs = 1000; % 最大訓練次數
net.trainParam.goal = 1e-8; % 最小均方誤差
net.trainParam.min_grad = 1e-20; % 最小梯度
net.trainParam.time = inf; % 最大訓練時間
%---------------------------------------------------
% 訓練與測試
net = train(net,PN1,T1); % 訓練
%---------------------------------------------------
% 測試
Y1 = sim(net,PN1); % 訓練樣本實際輸出
Y2 = sim(net,PN2); % 測試樣本實際輸出
Y1 = full(compet(Y1)); % 競爭輸出
Y2 = full(compet(Y2));
%---------------------------------------------------
% 結果統計
Result = ~sum(abs(T1-Y1)) % 正確分類顯示為1
Percent1 = sum(Result)/length(Result) % 訓練樣本正確分類率
Result = ~sum(abs(T2-Y2)) % 正確分類顯示為1
Percent2 = sum(Result)/length(Result) % 測試樣本正確分類率
❺ 在MATLAB中用神經網路演算法求解無約束最優化問題
程序一:GA訓練BP權值的主函數 function net=GABPNET(XX,YY) % 使用遺傳演算法對BP網路權值閾值進行優化,再用BP演算法訓練網路 %數據歸一化預處理 nntwarn off XX=[1:19;2:20;3:21;4:22]'; YY=[1:4]; XX=premnmx(XX); YY=premnmx(YY); YY %創建網路 net=newff(minmax(XX),[19,25,1],{'tansig','tansig','purelin'},'trainlm'); %下面使用遺傳演算法對網路進行優化 P=XX; T=YY; R=size(P,1); S2=size(T,1); S1=25;%隱含層節點數 S=R*S1+S1*S2+S1+S2;%遺傳演算法編碼長度 aa=ones(S,1)*[-1,1]; popu=50;%種群規模 save data2 XX YY % 是將 xx,yy 二個變數的數值存入 data2 這個MAT-file, initPpp=initializega(popu,aa,'gabpEval');%初始化種群 gen=100;%遺傳代數 %下面調用gaot工具箱,其中目標函數定義為gabpEval [x,endPop,bPop,trace]=ga(aa,'gabpEval',[],initPpp,[1e-6 1 1],'maxGenTerm',gen,... 'normGeomSelect',[0.09],['arithXover'],[2],'nonUnifMutation',[2 gen 3]); %繪收斂曲線圖 figure(1) plot(trace(:,1),1./trace(:,3),'r-'); hold on plot(trace(:,1),1./trace(:,2),'b-'); xlabel('Generation'); ylabel('Sum-Squared Error'); figure(2) plot(trace(:,1),trace(:,3),'r-'); hold on plot(trace(:,1),trace(:,2),'b-'); xlabel('Generation'); ylabel('Fittness');
❻ 神經網路中Belief Net和標準的神經網路有什麼區別
這兩個概念實際上是互相交叉的,例如,卷積神經網路(Convolutional neural networks,簡稱CNNs)就是一種深度的監督學習下的機器學習模型,而深度置信網(Deep Belief Nets,簡稱DBNs)就是一種無監督學習下的機器學習模型。深度學習的概念源於人工神經網路的研究。含多隱層的多層感知器就是一種深度學習結構。深度學習通過組合低層特徵形成更加抽象的高層表示屬性類別或特徵,以發現數據的分布式特徵表示。深度學習的概念由Hinton等人於2006年提出。基於深信度網(DBN)提出非監督貪心逐層訓練演算法,為解決深層結構相關的優化難題帶來希望,隨後提出多層自動編碼器深層結構。此外Lecun等人提出的卷積神經網路是第一個真正多層結構學習演算法,它利用空間相對關系減少參數數目以提高訓練性能。BP神經網路是ANN人工神經中的一種,常用的神經網路有BP、RBF、SOM、Hopfield等等,其功能不經相同,可總體來說ANN的主要功能是模式識別和分類訓練。最本質的區別可以說是學習方法不同,或者說模型的優化方法不同。前者應該是基於遺傳演算法進行網路權值的學習,而後者大都是採用反向傳播(BP)演算法進行權值學習,而這兩種演算法差異很大。建議你分別了解:
❼ 如何用MATLAB的神經網路工具箱實現三層BP網路
使用神經網路工具箱可以非常簡便地實現網路建立和訓練,實例代碼如下:
%%BP演算法
functionOut=bpnet(p,t,p_test)
%p,t為樣本需要提前組織好
globalS1
net=newff(minmax(p),[S1,8],{'tansig','purelin'},'trainlm');%trainlm訓練函數最有效
%net=newff(P,T,31,{'tansig','purelin'},'trainlm');%新版用法
net.trainParam.epochs=1000;
net.trainParam.goal=0.00001;
net.trainParam.lr=0.01;
net.trainParam.showWindow=false;%阻止訓練窗口的彈出
net.trainParam.showCommandLine=false;%阻止訓練窗口的彈出
net=train(net,p,t);
Out=sim(net,p_test);
end
上面的代碼不完整,完整的帶訓練樣本數據的程序見附件。
❽ 多層前饋網路模型及BP演算法
多層前饋網中,以單隱層網的應用最為普遍,如圖6.1所示。習慣上將其稱為三層前饋網或三層感知器,所謂三層即輸入層、隱層和輸出層。
圖6.1 三層前饋神經網路結構
Fig.6.1 BP neural network structure
三層前饋網中,輸入向量為X=(x1,x2,…,xi,…,xn)T,如加入x0=-1,可為輸出層神經元引入閾值;隱層輸出向量為Y=(y1,y2,…,yl,…,ym)T,如加入y0=-1,可為輸出層神經元引入閾值;輸出層輸出向量為O=(o1,o2,…,ok,…,ol)T。輸入層到隱層之間的權值陣用V表示,V=(V1,V2,…,Vj,…,Vm),其中列向量Vj為隱層第j個神經元對應的權向量;隱層到輸出層之間的權值矩陣用W 表示,W=(W1,W2,…,Wk,…,Wl),其中列向量Wk為輸出層第k個神經元對應的權向量。下面分析各層信號之間的數學關系。
輸出層:
ok=f(netk)k=1,2,…,ι(6-1)
煤層開采頂板導水裂隙帶高度預測理論與方法
隱層:
yj=f(netj)j=1,2,…,m(6-3)
煤層開采頂板導水裂隙帶高度預測理論與方法
以上兩式中,轉移函數f(x)均為單極性Sigmoid函數
煤層開采頂板導水裂隙帶高度預測理論與方法
f(x)具有連續、可導的特點,且有
煤層開采頂板導水裂隙帶高度預測理論與方法
根據應用需要,也可以採用雙極性Sigmoid函數(或稱雙曲線正切函數)
煤層開采頂板導水裂隙帶高度預測理論與方法
式6-1~式6-6共同構成了三層前饋網的數學模型。
BP學習演算法中按以下方法調整其權重與誤差:
當網路輸出與期望輸出不相等時,存在輸出誤差E,定義如下:
煤層開采頂板導水裂隙帶高度預測理論與方法
將以上誤差定義式展開到隱層,
煤層開采頂板導水裂隙帶高度預測理論與方法
進一步展開到輸入層,
煤層開采頂板導水裂隙帶高度預測理論與方法
由上式可以看出,網路輸入誤差是各層權值ωjk、υij的函數,因此調整權值可改變誤差E。
顯然,調整權值的原則是使誤差不斷減小,因此權值的調整量與誤差的負梯度成正比,即
煤層開采頂板導水裂隙帶高度預測理論與方法
煤層開采頂板導水裂隙帶高度預測理論與方法
式中負號表示梯度下降,常數η∈(0,1)表示比例系數,在訓練中反映了學習速率。可以看出BP法屬於δ學習規則類,這類演算法常被稱為誤差的梯度下降(GradientDescent)演算法。
❾ 如何用matlab構建一個三層bp神經網路模型,用於預測溫度。
第0節、引例
本文以Fisher的Iris數據集作為神經網路程序的測試數據集。Iris數據集可以在http://en.wikipedia.org/wiki/Iris_flower_data_set 找到。這里簡要介紹一下Iris數據集:
有一批Iris花,已知這批Iris花可分為3個品種,現需要對其進行分類。不同品種的Iris花的花萼長度、花萼寬度、花瓣長度、花瓣寬度會有差異。我們現有一批已知品種的Iris花的花萼長度、花萼寬度、花瓣長度、花瓣寬度的數據。
一種解決方法是用已有的數據訓練一個神經網路用作分類器。
如果你只想用C#或Matlab快速實現神經網路來解決你手頭上的問題,或者已經了解神經網路基本原理,請直接跳到第二節——神經網路實現。
第一節、神經網路基本原理
1. 人工神經元( Artificial Neuron )模型
人工神經元是神經網路的基本元素,其原理可以用下圖表示:
圖1. 人工神經元模型
圖中x1~xn是從其他神經元傳來的輸入信號,wij表示表示從神經元j到神經元i的連接權值,θ表示一個閾值 ( threshold ),或稱為偏置( bias )。則神經元i的輸出與輸入的關系表示為:
圖中 yi表示神經元i的輸出,函數f稱為激活函數 ( Activation Function )或轉移函數 ( Transfer Function ) ,net稱為凈激活(net activation)。若將閾值看成是神經元i的一個輸入x0的權重wi0,則上面的式子可以簡化為:
若用X表示輸入向量,用W表示權重向量,即:
X = [ x0 , x1 , x2 , ....... , xn ]
則神經元的輸出可以表示為向量相乘的形式:
若神經元的凈激活net為正,稱該神經元處於激活狀態或興奮狀態(fire),若凈激活net為負,則稱神經元處於抑制狀態。
圖1中的這種「閾值加權和」的神經元模型稱為M-P模型 ( McCulloch-Pitts Model ),也稱為神經網路的一個處理單元( PE, Processing Element )。
2. 常用激活函數
激活函數的選擇是構建神經網路過程中的重要環節,下面簡要介紹常用的激活函數。
(1) 線性函數 ( Liner Function )
(2) 斜面函數 ( Ramp Function )
(3) 閾值函數 ( Threshold Function )
以上3個激活函數都屬於線性函數,下面介紹兩個常用的非線性激活函數。
(4) S形函數 ( Sigmoid Function )
該函數的導函數:
(5) 雙極S形函數
該函數的導函數:
S形函數與雙極S形函數的圖像如下:
圖3. S形函數與雙極S形函數圖像
雙極S形函數與S形函數主要區別在於函數的值域,雙極S形函數值域是(-1,1),而S形函數值域是(0,1)。
由於S形函數與雙極S形函數都是可導的(導函數是連續函數),因此適合用在BP神經網路中。(BP演算法要求激活函數可導)
具體http://blog.csdn.net/gongxq0124/article/details/7681000/