關於BP演算法的一點理解
關於BP演算法的一點理解
由於最近在擼畢設初次接觸機器學習的神經網路部分今天學習了前饋神經網路的部分,僅供自身學習總結用,有不足之處還望指教。
前饋神經網路是一種最簡單的神經網路,各神經元分層排列。每個神經元只與前一層的神經元相連。接收前一層的輸出,並輸出給下一層.各層間沒有反饋。是目前應用最廣泛、發展最迅速的人工神經網路之一。研究從20世紀60年代開始,目前理論研究和實際應用達到了很高的水平。
一、神經網路模型
{
{
當前神經元的值為其相乘求和(看情況加上截距項或偏值項b);
輸出為當前神經元的值減去閾值
為了解決單層神經網路無法進行異或運算我們加了隱含層。
若繼續增加隱藏層,可以解決更多的分類問題。
但是加大了運算難度。
二、啟用函式
也叫激勵函式,表示神經元內部的反應機制,決定網路的處理能力,在數學上做非線性變換。
啟用函式通常有如下一些性質:
非線性: 當啟用函式是線性的時候,一個兩層的神經網路就可以逼近基本上所有的函式了。但是,如果啟用函式是恆等啟用函式的時候(即),就不滿足這個性質了,而且如果MLP使用的是恆等啟用函式,那麼其實整個網路跟單層神經網路是等價的。
可微性: 當優化方法是基於梯度的時候,這個性質是必須的。
單調性: 當啟用函式是單調的時候,單層網路能夠保證是凸函式。
: 當啟用函式滿足這個性質的時候,如果引數的初始化是random的很小的值,那麼神經網路的訓練將會很高效;如果不滿足這個性質,那麼就需要很用心的去設定初始值。
輸出值的範圍: 當啟用函式輸出值是 有限 的時候,基於梯度的優化方法會更加 穩定,因為特徵的表示受有限權值的影響更顯著;當啟用函式的輸出是 無限 的時候,模型的訓練會更加高效,不過在這種情況小,一般需要更小的learning rate。
常用的啟用函式有:
1、0-1階躍,Sgn符號函式;
2、Sigmoid:Logistics-Sigmoid邏輯迴歸、Tanh-Sigmoid雙曲正切;
3、ReLu、Leaky ReLu、PReLU 或者Maxout;
4、SoftMax,用作多分類。
三、BP演算法
解決了兩層神經網路所需要的複雜計算量問題。
利用前項傳導公式,計算第n層(輸出層)輸出值。
預測值y要跟我們的標籤值進行比對,將誤差反饋回去,減小誤差和,運用梯度下降等方法進行調整。
通過一層一層的往回傳遞調整每一層權值。
BP網路採用了反向傳播學習演算法,具體如下圖:
為方便理解我們以單一一條(以第一條為例)來談:
第一步:
計算神經元
用sigmoid函式作為啟用函式,
則
同理可得
第二步:(反向傳播)
總誤差:Error=(1/2)*
求輸出層到隱藏層的權重W的偏導,根據鏈式求導可得:
計算第一項可得:-(target-
計算第二項可得:
計算第三項可得:
三項相乘可得:
令
則公式可表示為:
更新
同理可計算別的層。多個輸入求和
四、BP演算法存在的問題
(1)訓練優化存在區域性最優解,也就是過擬合,無法得到全域性最優解。
(2)梯度消失問題,輸入值可能造成無效。多個隱含層時,在鏈式求導中結果越來越小,簡單的訓練幾次可能就得到一個看似準確的結果,即使只有一些隨機值,但梯度已經為0。
參考文章
[1]https://blog.csdn.net/zhaomengszu/article/details/77834845博主這孩子誰懂哈 大白話講解BP演算法
[2]https://blog.csdn.net/sinat_35512245/article/details/55224524博主qinjianhuang 機器學習之深入理解神經網路理論基礎、BP演算法及其Python實現
[3]https://blog.csdn.net/u013146742/article/details/51986575RELU 博主傷心的小屁孩 啟用函式及其他相關的函式
相關文章
- 關於latch的一點點理解
- 關於crontab 的一點理解
- 關於ora_rowscn的一點理解
- 關於建構函式的一點理解函式
- 關於C#中Thread.Join()的一點理解C#thread
- ruby關於flip-flop理解上一個注意點
- 關於position的一些理解
- 關於PHP 的一點點小分享PHP
- 關於Java的一點想法Java
- 關於position定位的一些理解
- 關於DDD概念的一些理解和困惑,煩勞Banq點撥
- 關於共享段與SGA的一點理解 上一週買了兩本書,
- 關於B*tree索引(index)的中度理解及bitmap 索引的一點探究(zt)索引Index
- 關於模式爭論的一點點思考模式
- 關於 DOM 的理解
- 關於Vuex的理解Vue
- 關於servlet的理解Servlet
- 關於-this指向的理解
- 關於DCI的理解
- 關於同步的一點思考-下
- 關於git flow的一點思考Git
- 關於PostCSS的一點小科普CSS
- 關於ORACLE的一點總結Oracle
- 關於“日誌”的一點心得
- 關於本書的一點想法
- BP演算法和LMBP演算法演算法
- 演算法中對數量級的一點理解演算法
- 關於Dart中Future的一些理解Dart
- 關於Swift中Properties的一些理解Swift
- 關於Base64的一些理解
- 關於WebWind一點想法Web
- 關於遊標的一些理解
- 關於GAN的個人理解
- 關於協程的理解
- 關於對Host的理解
- 關於SCN的理解(全面)
- 關於scn的理解 (zt)
- 關於社交圈子的一點思考