【說在前面】本人博客新手一枚,象牙塔的老白,職業場的小白。如下內容僅爲我的看法,歡迎批評指正,不喜勿噴![認真看圖][認真看圖]html
【補充說明】深度學習有多火,我就很少說了。本文主要介紹深度學習項目實踐過程當中可能遇到的一些組件及使用技巧!python
梯度降低的通用計算公式以下:面試
其中,是學習率,
是梯度。梯度降低徹底依賴於當前的梯度,因此
可理解爲容許當前梯度多大程度影響參數更新。算法
梯度降低主要包含三種梯度降低:網絡
(1)批量梯度降低(Batch Gradient Descent)cors
(2)隨機梯度降低(Stochastic Gradient Descent)框架
(3)小批量梯度降低(Mini-Batch Gradient Descent):這個最經常使用機器學習
梯度降低的缺點:函數
Momentum是模擬物理裏動量的概念,公式以下:post
其中,是動量因子。Momentum積累以前的動量來替代真正的梯度。
Momentum有以下特色:
總的來講,Momentum能夠加速SGD算法的收斂速度,而且下降SGD算法收斂時的震盪。
將上一節中的公式展開可得:
能夠看出,Momentum並無直接改變當前梯度。Nesterov的改進就是讓以前的動量直接影響當前的動量。即:
其中,加上Nesterov項後,梯度在大的跳躍後,再計算當前梯度進行校訂。
Nesterov有以下特色:
總的來講,Nesterov項在梯度更新時作了一個校訂,避免前進太快,同時提升靈敏度。
Adagrad對學習率進行了一個約束。即:
其中,對從1到
進行一個遞推,造成一個約束項regularizer,
用來保證分母非0。
Adagrad有以下特色:
Adagrad的缺點:
Adadelta是對Adagrad的擴展,它主要解決了adagrad算法單調遞減學習率的問題。Adagrad會累加以前全部的梯度平方,而Adadelta只累加固定大小的項,而且也不直接存儲這些項,僅僅是近似計算對應的平均值。即:
其中,Adadelta仍是依賴於全局學習率,可是作了必定處理,通過近似牛頓迭代法以後:
其中,表明求指望。此時,能夠看出Adadelta已經不用依賴於全局學習率了。
Adadelta還有以下特色:
RMSprop能夠算做Adadelta的一個特例,一樣是用於解決adagrad算法學習率消失的問題。
當時,
就變爲了求梯度平方和的平均數。
若是再求根的話,就變成了RMS(均方根):
此時,這個RMS就能夠做爲學習率的一個約束:
RMSprop有以下特色:
Adam本質上是帶有動量項的RMSprop,它利用梯度的一階矩估計和二階矩估計動態調整每一個參數的學習率。
通過偏置校訂後,每一次迭代學習率都有個肯定範圍,使得參數比較平穩。公式以下:
其中,,
分別是對梯度的一階矩估計和二階矩估計,能夠看做對指望
,
的估計;
,
是對
,
的校訂,這樣能夠近似爲對指望的無偏估計。 能夠看出,直接對梯度的矩估計對內存沒有額外的要求,並且能夠根據梯度進行動態調整,而
對學習率造成一個動態約束,並且有明確的範圍。
Adam有以下特色:
例如Adamax(Adam的一種變體)、Nadam(相似於帶有Nesterov動量項的Adam)等,這裏不展開了。
發現這麼寫下去,篇幅太大了,因此找到一張圖,歸納一下吧:
經常使用的主要是這些吧,各類激活函數的特色看圖也顯而易見,其餘的(例如PReLU等)就不拓展了。
即增大訓練集的規模,實在難以得到新數據也可使用數據集加強的方法。
例如能夠對圖像數據集採用水平/垂直旋轉/翻轉、隨機改變亮度和顏色、隨機模糊圖像、隨機裁剪等方法進行數據集加強。
正則化,就是在原來的loss function的基礎上,加上了一些正則化項或者稱爲模型複雜度懲罰項。
以線性迴歸爲例,優化目標:
min
加上L1正則項(lasso迴歸):
min
加上L2正則項(嶺迴歸):
min
其中,L1範數更容易獲得稀疏解(解向量中0比較多);L2範數能讓解比較小(靠近0),可是比較平滑(不等於0)。
Dropout提供了一個簡單的方法來提高性能。其實至關於作簡單的Ensemble,但訓練速度會慢一些。
剩下就是選擇合適的模型和網絡結構了,甚至能夠採用多模型融合等思路。
解決Sigmoid函數存在的梯度消失/爆炸問題。
Hinton爲了解決梯度的問題,提出採起無監督逐層訓練方法,其基本思想是每次訓練一層隱節點,訓練時將上一層隱節點的輸出做爲輸入,而本層隱節點的輸出做爲下一層隱節點的輸入,此過程就是逐層「預訓練」。在預訓練完成後,再對整個網絡進行「微調」。
梯度剪切這個方案主要是針對梯度爆炸提出的,其思想是設置一個梯度剪切閾值,而後更新梯度的時候,若是梯度超過這個閾值,那麼就將其強制限制在這個範圍以內。另一種解決梯度爆炸的手段是採用權重正則化,比較常見的是L1正則和L2正則,以上已經提到了。
對每一層的輸出作scale和shift的方法,經過必定的規範化手段,把每層神經網絡任意神經元這個輸入值的分佈強行拉回到接近均值爲0方差爲1的標準正太分佈,即嚴重偏離的分佈強制拉回比較標準的分佈。這樣使得激活輸入值落在非線性函數對輸入比較敏感的區域,這樣輸入的小變化就會致使損失函數較大的變化,使得讓梯度變大,避免梯度消失問題產生。並且梯度變大意味着學習收斂速度快,能大大加快訓練速度。
Resnet
若是你但願訓練一個更深更復雜的網絡,那麼殘差塊絕對是一個重要的組件,它可讓你的網絡訓練的更深。
我在序列模型專題有介紹到LSTM,這裏再也不贅述。
有一些經常使用的初始化方法:
初始化很重要,知乎大佬們的慘痛教訓:
能夠採用遷移學習預訓練的方式。說到這裏,我以後想寫一個遷移學習的專題。
就是0均值和1方差化。主要是爲了公平對待每一個特徵、使優化過程變得平穩、消除量綱影響等。
在訓練的過程當中,若是數據很整齊,那每次學習到的特徵都是與某一個特徵相關,會讓學習效果有所誤差。
所以,通常在訓練的過程當中,建議要將數據打亂,這樣纔可以更好的實現泛化能力。
通常建議從一個正常大小的學習率開始,朝着終點不斷縮小。
batch_size會影響優化過程,建議值取64和128等,過小訓練速度慢,太大容易過擬合。
當Sigmoid函數和MSE一塊兒使用時會出現梯度消失。緣由以下:
MSE對參數的偏導:
corss-entropy對參數的偏導:
以上,相對於Sigmoid求損失函數,在梯度計算層面上,交叉熵對參數的偏導不含對Sigmoid函數的求導,而均方偏差MSE等則含有Sigmoid函數的偏導項。同時,Sigmoid的值很小或者很大時梯度幾乎爲零,這會使得梯度降低算法沒法取得有效進展,交叉熵則避免了這一問題。
爲了彌補Sigmoid 型函數的導數形式易發生飽和的缺陷,能夠引入Softmax做爲預測結果,再計算交叉熵損失。因爲交叉熵涉及到計算每一個類別的機率,因此在神經網絡中,交叉熵與Softmax函數緊密相關。
例如訓練時能夠先用一小部分數據集跑,看看損失的變化趨勢,有助於更快找到錯誤並調整網絡結構等技巧。
另外,看到一張不一樣參數對於網絡訓練的影響程度圖,分享一下:
最後,雖然有不少組件和技巧能夠方便使用(框架中通常都封裝好了),可是仍是須要注意各組件、技巧之間的靈活組合,才能取得最佳結果。
若是您對數據挖掘感興趣,歡迎瀏覽個人另幾篇博客:數據挖掘比賽/項目全流程介紹
若是你對智能推薦感興趣,歡迎先瀏覽個人另幾篇隨筆:智能推薦算法演變及學習筆記
若是您對人工智能算法感興趣,歡迎瀏覽個人另外一篇博客:人工智能新手入門學習路線和學習資源合集(含AI綜述/python/機器學習/深度學習/tensorflow)、人工智能領域經常使用的開源框架和庫(含機器學習/深度學習/強化學習/知識圖譜/圖神經網絡)
若是你是計算機專業的應屆畢業生,歡迎瀏覽個人另一篇博客:若是你是一個計算機領域的應屆生,你如何準備求職面試?
若是你是計算機專業的本科生,歡迎瀏覽個人另一篇博客:若是你是一個計算機領域的本科生,你能夠選擇學習什麼?
若是你是計算機專業的研究生,歡迎瀏覽個人另一篇博客:若是你是一個計算機領域的研究生,你能夠選擇學習什麼?
若是你對金融科技感興趣,歡迎瀏覽個人另外一篇博客:若是你想了解金融科技,不妨先了解金融科技有哪些可能?
以後博主將持續分享各大算法的學習思路和學習筆記:hello world: 個人博客寫做思路