神經網路的理解
神經網路
典型的多層前饋神經網路,包括1層輸入層,至少1層隱層,1層輸出層,每層神經元與下一層神經元全連接,同層神經元之間不連接,輸入層不做數據處理,不含激活函數,其他層均有激活函數。
比如圖像分類中輸入層對應像素點,輸出層對應分類種數,逐層提取特徵後在輸出層進行分類。
多層,線性,激活
線性模型中的邏輯回歸其實就相當於一個神經元,接受若干個輸入,把輸入乘以權重加上偏置,然後通過激活函數得到輸出,對應一個基本的判斷過程,
其中激活函數之前的是線性部分,用於把各輸入的影響納入考量,因為全連接的關係,多個權重係數構成矩陣,通過線性變換把輸入映射到新的空間,
而激活函數則是非線性部分,把線性空間進行扭曲,以求得到方便劃分的新投影,
如果沒有激活函數,所有層的線性部分在參數合併後,依然是輸入的線性組合,只能進行1次線性分類,無法處理線性不可分的數據,
https://www.zhihu.com/question/22553761
為什麼全連接
對輸出層來說,1個邏輯回歸(神經元),只能進行1次分類,如果要進行多分類就需要更多的神經元,而且每個神經元都要和之前1層的各神經元連接,以得到全面信息。
對隱層來說,1個神經元對應1個要提取的特徵,要提取足夠多的特徵,就要有足夠多的神經元,而且每個神經元都要和之前1層的各神經元連接,以得到全面信息。
https://zhuanlan.zhihu.com/p/21525237
梯度下降與反向傳播
為了得到理想的模型參數,或者說訓練模型,一則需要告訴電腦當前模型預測的效果(設置損失函數,評價理想輸出與實際輸出的差異),二則需要告訴電腦該往哪個方向調整模型參數。如果是比較簡單的函數,可以直接對損失函數求導取0,但是一般函數都比較複雜,只好設個初始值,輸入訓練數據求出誤差,然後根據誤差逐步更新權重,對多個訓練數據進行權重更新時一般求平均。
在神經網路中,以梯度下降的方式,先求出損失函數對權重參數的導數(在神經網路中的反向傳播鏈式求導,從輸出差值與權重參數得出更新方向),乘以步長後對初始權重進行更新,以求損失極小值。
https://www.bilibili.com/video/av16144388/
https://www.bilibili.com/video/av16577449/
也可參考以下文章,說的也比我清楚。
http://ibillxia.github.io/blog/2013/03/30/back-propagation-neural-networks/
更好的損失函數與激活函數
使用均方誤差和sigmoid函數,在反向求導時每一層都要乘以激活函數的導數,而sigmoid函數在0附近導數取值大,在遠離0時導數越來越小,有可能導致多層網路的訓練中梯度變化很小,進而使得權重更新到極值的速度較慢,其中一個改善辦法是把損失函數替換為交叉熵(邏輯回歸中基於極大似然求得的損失函數就是交叉熵的一種表現),另一種辦法是使用ReLU做激活函數。
另外對分類任務,可使用softmax替換輸出層的sigmoid並使用對數似然損失函數,之前的隱層與其他網路一樣,即把輸出相加作為分母,使得處理後的輸出總和為1,不同輸出端的具體值為對應分類的概率。
http://www.cnblogs.com/pinard/p/6437495.html
歸一化與連續化
對神經網路來說,輸入要求介於0-1之間,為方便求導還要求把離散數據連續化,如果是無序的離散數據則設為向量
過擬合,早停,正則化
神經網路可以逼近任意函數,實際使用時容易出現過擬合,一種辦法是同時監控訓練誤差和測試誤差,當訓練誤差持續降低而測試誤差先減後增時及早停止迭代,另一種辦法是在損失函數增加正則項對複雜的模型進行懲罰。
全局最小,局部最小,動量
對形狀複雜的損失函數來說,求全局最小的行為有可能落入局部最小,其中一種改善辦法是增加動量。
推薦閱讀:
※機器學習篇-數據劃分
※2017年深度學習頂級論文盤點
※機器學習之數據預處理簡介
※logistic regression 邏輯回歸
※Introduction: Tracking, Fusion and Deep learning for ADAS
TAG:機器學習 |