目前來看,很多對 nn 的貢獻(特別是核心的貢獻),都在於nn的梯度流上,比如
-sigmoid會飽和,造成梯度消失。於是有了relu。
-relu負半軸是死區,造成梯度變0。於是有了leakyrelu,prelu。
-強調梯度和權值分布的穩定性,由此有了elu,以及較新的selu。
-太深了,梯度傳不下去,於是有了highway。
-乾脆連highway的引數都不要,直接變殘差,於是有了resnet。
-強行穩定引數的均值和方差,於是有了batchnorm。
-在梯度流中增加雜訊,於是有了 dropout。
-rnn梯度不穩定,於是加幾個通路和門控,於是有了lstm。
-lstm簡化一下,有了gru。
-gan的js散度有問題,會導致梯度消失或無效,於是有了wgan。
-wgan對梯度的clip有問題,於是有了wgan-gp。
說到底,相對於8,90年代(已經有了cnn,lstm,以及反向傳播演算法),沒有特別本質的改變。
注:上述內容來在《**hinton最近提出的capsule計畫》(
**考慮了減少模型引數的方法:
sep-nets模組
在網路結構設計的發展中,存在著幾個關鍵的路線:
多樣性:structural diversity【inception系列】
另一種角度,可以將網路結構設計分為:
ensemble by train: 訓練過程不斷改進,比如droppath等技術【stochastic depth technique, swapout】
但是為什麼當前這種方式實際效果很好?hiton提出:
-全引數優化,end-to-end: 反向傳播(下面用bp代替)可以同時優化所有的引數,而不像一些逐層優化的演算法,
下層的優化不依賴上層,為了充分利用所有權值,所以最終還是要用bp來fine-tuning;
也不像隨機森林等整合演算法,有相對分立的引數。很多**都顯示end-to-end的系統效果會更好。
-形狀靈活: 幾乎什麼形狀的nn都可以用bp訓練,可以搞cnn,可以搞lstm,可以變成雙向的 bi-lstm,可以加attention,可以加殘差,
可以做成dcgan那種金字塔形的,或者搞出inception那種複雜的結構。如果某個結構對nn很有利,那麼就可以隨便加進去;
將訓練好的部分加入到另乙個nn中也是非常方便的事情。這樣隨著時間推進,nn結構會被人工優化得越來越好。
bp的要求非常低:只要連續,就可以像一根導線一樣傳遞梯度;
即使不連續,大部分也可以歸結為離散的強化學習問題來提供loss。
這也導致了大量nn框架的誕生,因為框架製作者知道,這些框架可以用於所有需要計算圖的問題(就像萬能引擎),
應用非常廣泛,大部分問題都可以在框架內部解決,所以有必要製作。
-計算高效:
bp要求的計算絕大多數都是張量操作,gpu跑起來賊快,並且nn的計算圖的形式天生適合分布式計算;
而且有大量的開源框架以及大公司的支援。
深度學習baseline模型 深度學習模型訓練流程
工作中訓練了很多的深度學習模型,目前到了上公升到方 的角度來看了。日常工作中有的人可能已經在遵循方 做事,可能自己沒有注意,有的人可能沒有遵循方 在做事,雖然可能最後的結果差不多,但花費的時間和精力應該會差別很大,當然這是我自己的感受。我們不必完全按照方 來做,但基本流程跟方 應該一致。下面的具體步...
動手學深度學習之深度學習基礎
資料集的形式主要有三種 訓練集測試集 測試資料集不可以用來調參 驗證集 k折交叉驗證 把原始資料分成k組,每次訓練時,使用k 1個子資料集訓練,使用乙個作為驗證,最後通過k次求取訓練誤差和驗證誤差的平均。過擬合 overfitting 模型的訓練誤差遠小於它在測試資料集上的誤差 欠擬合 underf...
深度學習模型
深度學習常用方法 深度置信網路 dbn 概率生成模型,生成資料 卷積神經網路 cnn 判別模型,處理二維圖 卷積深度置信網路 cdbn 兩者的結合 迴圈神經網路 rnn 與時間序列有關的 對抗神經網路 gan 兩個網路的零和遊戲,乙個網路用來判別,乙個網路用來生成 自動編碼器 vae 生成模型 深度...