點擊上方藍色字體,關注AI小白入門喲
跟著博主的腳步,每天進步一點點
本文介紹了傳統的三層神經網絡模型,首先介紹了網絡中的神經單元概念,將一個神經單元視為一個邏輯回歸模型。因此,神經網絡可以看作是邏輯回歸在(寬度,深度)上的延伸;然后,前向傳播是一個復合函數不斷傳播的過程,最終視目標而定損失函數;最后,反向傳播則是對復合函數求導的過程。當然三層神經網絡只是深度學習的雛形,如今深度學習已經包羅萬象。
作者 | 文杰
編輯 | yuquanle
三層神經網絡
A、神經單元
深度學習的發展一般分為三個階段,感知機-->三層神經網絡-->深度學習(表示學習)。早先的感知機由于采用線性模型,無法解決異或問題,表示能力受到限制。為此三層神經網絡放棄了感知機良好的解釋性,而引入非線性激活函數來增加模型的表示能力。三層神經網絡與感知機的兩點不同:
1)非線性激活函數的引入,使得模型能解決非線性問題。
2)引入激活函數之后,不再會有損失的情況,損失函數采用對數損失,這也使得三層神經網絡更像是三層多元(神經單元)邏輯回歸的復合。
神經網絡中每一個神經元都可以看作是一個邏輯回歸模型,三層神經網絡就是三層邏輯回歸模型的復合,只是不像邏輯回歸中只有一個神經元,一般輸入層和隱藏層都是具有多個神經元,而輸出層對應一個logistic回歸單元或者softmax單元,或者一個線性回歸模型。
這里對一些常用的非線性激活函數做一些簡單的介紹(圖像,性質,導數):
性質:對于以上幾個非線性激活函數都可以看作是
的一個近似。采用近似的一個重要原因是為了求導,早起常采用平滑的sigmoid和tanh函數,然而我們可以發現這兩個函數在兩端都存在導數極小的情況,這使得多層神經網絡在訓練時梯度消失,難以訓練。而Relu函數則很好的解決兩端導數極小的問題,也是解決神經網絡梯度消失問題的一種方法。
導數:
B、前向傳播
前向傳播是一個復合函數的過程,每一個神經元都是一個線性函數加一個非線性函數的復合,整個網絡的結構如下:其中上標表示網絡層,所以表示輸出層。
向量形式:
矩陣形式:
其中線性函數還是,不過要注意的是這里由于每一層不僅一個神經元,所以邏輯回歸中的向量則擴展為矩陣,表示有多個神經元(也正是因為多個神經元,導致神經網絡具有提取特征的能力)。非線性函數則可以有以下選擇,目前來看Relu函數具有一定的優勢。
其中值得注意的是矩陣的行列,深度學習常采用一列表示一個樣本,所以網絡中數據矩陣的大小如下:
損失函數同樣采用對數損失(二分類):
C、反向傳播
由于神經網絡是一個多層的復合函數,前向傳播就是在計算復合函數,所以反向傳播就是一個鏈式求導過程,確定所有參數的負梯度方向,采用梯度下降的方法來更行每一層網絡的參數。
1.損失函數:
2.激活函數:
3.線性函數:
對于損失函數直接對各個變量求導如下:
值得注意的是激活函數是一個數值操作,不涉及矩陣求導,線性函數中是因為是作用于個樣本,所以在確定負梯度方向時需要個樣本取均值,而對求導則不需要求均值。
代碼實戰
int?trainDNN()
{Matrix x;char?file[20]="data\\train.txt";x.LoadData(file);x = x.transposeMatrix();cout<<"x,y"<<endl;cout<<"----------------------"<<endl;Matrix y;cout<<x.row<<endl;y=x.getOneRow(x.row-1);x.deleteOneRow(x.row-1);y=one_hot(y,2);cout<<x.row<<"*"<<x.col<<endl;cout<<y.row<<"*"<<y.col<<endl;const?char?*initialization="he";double?learn_rateing=0.1;int?iter=1000;double?lambd=0.1;double?keep_prob=0.5;bool?print_cost=true;const?char?*optimizer="gd";int?mini_batch_size=64;double?beta1=0.9;double?beta2=0.999;double?epsilon=0.00000001;DNN(x,y,optimizer="gd",learn_rateing=0.001,initialization="he",lambd=0.001,keep_prob = 1,mini_batch_size=64, \beta1=0.9, beta2=0.999, epsilon=0.00000001, iter=5000, print_cost=true);predict(x,y);return?0;
}int?DNN(Matrix X,Matrix Y,const?char?*optimizer,double?learn_rateing,const?char?*initialization, double?lambd, double?keep_prob, \int?mini_batch_size,double?beta1, double?beta2, double?epsilon, int?iter, bool?print_cost)
{/**初始化參數**/int?i=0,k=0;int?lay_dim=3;int?lay_n[3]= {0,3,1};lay_n[0]=X.row;string?lay_active[3]= {"relu","relu","sigmoid"};sup_par.layer_dims=lay_dim;for(i=0; i<lay_dim; i++){sup_par.layer_n[i]=lay_n[i];sup_par.layer_active[i]=lay_active[i];}init_parameters(X,initialization);double?loss;Matrix AL(Y.row,Y.col,0,"ss");double?*keep_probs;if(keep_prob==1){keep_probs=new?double?(sup_par.layer_dims);for(k=0;k<sup_par.layer_dims;k++){keep_probs[k]=1;}}else?if?(keep_prob<1){keep_probs=new?double?(sup_par.layer_dims);for(k=0;k<sup_par.layer_dims;k++){if(k==0?|| k==sup_par.layer_dims-1){keep_probs[k]=1;}else{keep_probs[k]=1;}}}for(i=0; i<iter; i++){//cout<<"-----------forward------------"<<"i="<<i<<endl;AL=model_forward(X,keep_probs);//cout<<"-----------loss--------------"<<endl;loss=cost_cumpter(AL,Y,lambd);if(i%100==0)cout<<"loss="<<loss<<endl;//cout<<"-----------backword-----------"<<endl;model_backword(AL,Y,lambd,keep_probs);//cout<<"-----------update--------------"<<endl;updata_parameters(learn_rateing,i+1,optimizer,beta1,beta2,epsilon);}predict(X,Y);return?0;
}int?predict(Matrix X,Matrix Y)
{int?i,k;parameters *p;p=∥p->A = X.copyMatrix();Matrix AL;double?*keep_probs=new?double?[sup_par.layer_dims];for(k=0;k<sup_par.layer_dims;k++){keep_probs[k]=1;}AL=model_forward(X,keep_probs);for(i=0;i<Y.col;i++){if(AL.data[0][i]>0.5)AL.data[0][i]=1;elseAL.data[0][i]=0;}double?pre=0;for(i=0;i<Y.col;i++){if((AL.data[0][i]==1?&& Y.data[0][i]==1)||(AL.data[0][i]==0?&& Y.data[0][i]==0))pre+=1;}pre/=Y.col;cout<<"pre="<<pre<<endl;return?0;
}
The End
往期精彩回顧
那些年做的學術公益-你不是一個人在戰斗適合初學者入門人工智能的路線及資料下載機器學習在線手冊深度學習在線手冊備注:加入本站微信群或者qq群,請回復“加群”加入知識星球(4500+用戶,ID:92416895),請回復“知識星球”
你點的每個贊,我都認真當成了喜歡
總結
以上是生活随笔為你收集整理的【机器学习】三层神经网络的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。