『壹』 神經網路超參數選擇
深度學習模型通常由隨機梯度下降演算法進行訓練。隨機梯度下降演算法有許多變形:例如 Adam、RMSProp、Adagrad 等等。這些演算法都需要你設置學習率。學習率決定了在一個小批量(mini-batch)中權重在梯度方向要移動多遠。
如果學習率很低,訓練會變得更加可靠,但是優化會耗費較長的時間,因為朝向損失函數最小值的每個步長很小。
如果學習率很高,訓練可能根本不會收斂,損失函數一直處於波動中,甚至會發散。權重的改變數可能非常大,使得優化越過最小值,使得損失函數變得更糟。
訓練應當從相對較大的學習率開始。這是因為在開始時,初始的隨機權重遠離最優值。在訓練過程中,學習率應當下降,以允許細粒度的權重更新。
參考: https://www.jiqixin.com/articles/2017-11-17-2
批次大小是每一次訓練神經網路送入模型的樣本數。在 合理的范圍之內 ,越大的 batch size 使下降方向越准確,震盪越小,通常取值為[16,32,64,128]。
Batch_Size=全部數據集 缺點:
1) 隨著數據集的海量增長和內存限制,一次性載入所有的數據進來變得越來越不可行。
2) 以 Rprop 的方式迭代,會由於各個 Batch 之間的采樣差異性,各次梯度修正值相互抵消,無法修正。
Batch_Size = 1 缺點:
使用在線學習,每次修正方向以各自樣本的梯度方向修正,橫沖直撞各自為政,難以達到收斂。
在合理范圍內,增大 Batch_Size 有何好處?
1) 內存利用率提高了,大矩陣乘法的並行化效率提高。
2) 跑完一次 epoch(全數據集)所需的迭代次數減少,對於相同數據量的處理速度進一步加快。
3) 在一定范圍內,一般來說 Batch_Size 越大,其確定的下降方向越准,引起訓練震盪越小。
盲目增大 Batch_Size 有何壞處?
1) 內存利用率提高了,但是內存容量可能撐不住了。
2) 跑完一次 epoch(全數據集)所需的迭代次數減少,要想達到相同的精度,其所花費的時間大大增加了,從而對參數的修正也就顯得更加緩慢。
3) Batch_Size 增大到一定程度,其確定的下降方向已經基本不再變化。
參考: https://blog.csdn.net/juronghui/article/details/78612653
迭代次數是指整個訓練集輸入到神經網路進行訓練的次數,當測試錯誤率和訓練錯誤率相差較小,且測試准確率趨於穩定時(達到最優),可認為當前迭代次數合適;當測試錯誤率先變小後變大時則說明迭代次數過大了,需要減小迭代次數,否則容易出現過擬合。
用激活函數給神經網路加入一些非線性因素,使得網路可以更好地解決較為復雜的問題。參考: https://blog.csdn.net/tyhj_sf/article/details/79932893
它能夠把輸入的連續實值變換為0和1之間的輸出。
缺點:
1) 在深度神經網路中梯度反向傳遞時導致梯度爆炸和梯度消失,其中梯度爆炸發生的概率非常小,而梯度消失發生的概率比較大。
2) Sigmoid 的 output 不是0均值,使得收斂緩慢。batch的輸入能緩解這個問題。
它解決了Sigmoid函數的不是zero-centered輸出問題,然而梯度消失的問題和冪運算的問題仍然存在。
tanh函數具有中心對稱性,適合於有對稱性的二分類
雖然簡單,但卻是近幾年的重要成果,有以下幾大優點:
1) 解決了梯度消散問題 (在正區間)
2)計算速度非常快,只需要判斷輸入是否大於0
3)收斂速度遠快於sigmoid和tanh
ReLU也有幾個需要特別注意的問題:
1)ReLU的輸出不是zero-centered
2)Dead ReLU Problem,指的是某些神經元可能永遠不會被激活,導致相應的參數永遠不能被更新。有兩個主要原因可能導致這種情況產生: (1) 非常不幸的參數初始化,這種情況比較少見 (2) learning rate太高導致在訓練過程中參數更新太大,不幸使網路進入這種狀態。解決方法是可以採用Xavier初始化方法,以及避免將learning rate設置太大或使用adagrad等自動調節learning rate的演算法。
為了解決Dead ReLU Problem,提出了將ReLU的前半段設為 αx 而非 0 ,如 PReLU 。
1)深度學習往往需要大量時間來處理大量數據,模型的收斂速度是尤為重要的。所以,總體上來講,訓練深度學習網路盡量使用zero-centered數據 (可以經過數據預處理實現) 和zero-centered輸出。所以要盡量選擇輸出具有zero-centered特點的激活函數以加快模型的收斂速度。
2)如果使用 ReLU,那麼一定要小心設置 learning rate,而且要注意不要讓網路出現很多 「dead」 神經元,如果這個問題不好解決,那麼可以試試 Leaky ReLU、PReLU 或者 Maxout.
3)最好不要用 sigmoid,你可以試試 tanh,不過可以預期它的效果會比不上 ReLU 和 Maxout.
公式: https://www.cnblogs.com/xiaobingqianrui/p/10756046.html
優化器比較: https://blog.csdn.net/weixin_40170902/article/details/80092628
『貳』 三值神經網路
權重壓縮:三值神經網路
卷積神經網路(Convolutional Neural Network,CNN)尤其適合於目標識別、分類、檢測及圖像分割等計算機視覺應用。 典型的模型有數百萬參數並 運算量大 ;例如,AlexNet有6100萬參數(浮點數權值共佔用249MB存儲空間),分類一張圖片需要15億高精度運算。 所以為降低CNN規模和使用資源,現在有模型修剪(model pruning,去掉值較小的權值)和權值壓縮(weight compression,利用少數幾位量化權值) 兩種方法。
權值壓縮:二值神經網路
重要點:網路中的權重更新使用三值{+1,0,-1};並最小化全精度權重W和三值權重W的歐式距離。
傳播過程:
公式1的優化問題化解為如下:
從而 解:
最終確定一個閾值 、 來構建三值神經網路;根據 W 具體的分布情況來確定閾值 :
均勻分布:在 大於閾值的條件下 : 約等於均值( )*數量( )
[圖片上傳失敗...(image-885207-1554553493996)]
正態分布:
[圖片上傳失敗...(image-2a3804-1554553493996)]
最後本文章作者根據經驗:
確定三值網路中的閾值與W期望的關系 : :
均值分布: (注 在[-a,a]均勻取值,均值為 )
正態分布: (註:
演算法:
[圖片上傳失敗...(image-d013ce-1554553493996)]
只在前向和後向過程中使用使用權值簡化 ,但是更新是仍然是使用連續的權值。
優化方法:隨機梯度下降(SGD+動量)、批量標准化和學習率衰減
Momentum動量:
本實驗基於數據集MNIST、CIFAR-10、ImageNet以及三種網路結構(LeNet-5、VGG-7、ResNet-18(B))進行測試,分別使用二值神經網路、三值神經網路及全精度網路,評測其效果。
TWNs在benchmark表現比全精度網路稍微差一點,但是模型壓縮率達到了16/32倍。
源碼:
前向後向 更改在conv_layer.cpp line 30-100 Forward_cpu | backward_cpu
『叄』 深度神經網路dnn怎麼調節參數
深度神經網路(DNN)目前是許多現代AI應用的基礎。
自從DNN在語音識別和圖像識別任務中展現出突破性的成果,使用DNN的應用數量呈爆炸式增加。這些DNN方法被大量應用在無人駕駛汽車,癌症檢測,游戲AI等方面。
在許多領域中,DNN目前的准確性已經超過人類。與早期的專家手動提取特徵或制定規則不同,DNN的優越性能來自於在大量數據上使用統計學習方法,從原始數據中提取高級特徵的能力,從而對輸入空間進行有效的表示。
然而,DNN超高的准確性是以超高的計算復雜度為代價的。
通常意義下的計算引擎,尤其是GPU,是DNN的基礎。因此,能夠在不犧牲准確性和增加硬體成本的前提下,提高深度神經網路的能量效率和吞吐量的方法,對於DNN在AI系統中更廣泛的應用是至關重要的。研究人員目前已經更多的將關注點放在針對DNN計算開發專用的加速方法。
鑒於篇幅,本文主要針對論文中的如下幾部分詳細介紹:
DNN的背景,歷史和應用
DNN的組成部分,以及常見的DNN模型
簡介如何使用硬體加速DNN運算
DNN的背景
人工智慧與深度神經網路
深度神經網路,也被稱為深度學習,是人工智慧領域的重要分支,根據麥卡錫(人工智慧之父)的定義,人工智慧是創造像人一樣的智能機械的科學工程。深度學習與人工智慧的關系如圖1所示:
圖1:深度神經網路與人工智慧的關系
人工智慧領域內,一個大的子領域是機器學習,由Arthur Samuel在1959年定義為:讓計算機擁有不需要明確編程即可學習的能力。
這意味著創建一個程序,這個程序可以被訓練去學習如何去做一些智能的行為,然後這個程序就可以自己完成任務。而傳統的人工啟發式方法,需要對每個新問題重新設計程序。
高效的機器學習演算法的優點是顯而易見的。一個機器學習演算法,只需通過訓練,就可以解決某一領域中每一個新問題,而不是對每個新問題特定地進行編程。
在機器學習領域,有一個部分被稱作brain-inspired computation。因為人類大腦是目前學習和解決問題最好的「機器」,很自然的,人們會從中尋找機器學習的方法。
盡管科學家們仍在探索大腦工作的細節,但是有一點被公認的是:神經元是大腦的主要計算單元。
人類大腦平均有860億個神經元。神經元相互連接,通過樹突接受其他神經元的信號,對這些信號進行計算之後,通過軸突將信號傳遞給下一個神經元。一個神經元的軸突分支出來並連接到許多其他神經元的樹突上,軸突分支和樹突之間的連接被稱為突觸。據估計,人類大腦平均有1014-1015個突觸。
突觸的一個關鍵特性是它可以縮放通過它的信號大小。這個比例因子可以被稱為權重(weight),普遍認為,大腦學習的方式是通過改變突觸的權重實現的。因此,不同的權重導致對輸入產生不同的響應。注意,學習過程是學習刺激導致的權重調整,而大腦組織(可以被認為是程序)並不改變。
大腦的這個特徵對機器學習演算法有很好的啟示。
神經網路與深度神經網路
神經元的計算是輸入值的加權和這個概念啟發了神經網路的研究。這些加權和對應於突觸的縮放值以及神經元所接收的值的組合。此外,神經元並不僅僅是輸入信號的加權和,如果是這樣的話,級聯的神經元的計算將是一種簡單的線性代數運算。
相反的是,神經元組合輸入的操作似乎是一種非線性函數,只有輸入達到某個閾值的時候,神經元才會生成輸出。因此,通過類比,我們可以知道神經網路在輸入值的加權和的基礎上應用了非線性函數。
圖2(a)展示了計算神經網路的示意圖,圖的最左邊是接受數值的「輸入層」。這些值被傳播到中間層神經元,通常也叫做網路的「隱藏層」。通過一個或更多隱藏層的加權和最終被傳播到「輸出層」,將神經網路的最終結果輸出給用戶。
圖2:神經網路示意圖
在神經網路領域,一個子領域被稱為深度學習。最初的神經網路通常只有幾層的網路。而深度網路通常有更多的層數,今天的網路一般在五層以上,甚至達到一千多層。
目前在視覺應用中使用深度神經網路的解釋是:將圖像所有像素輸入到網路的第一層之後,該層的加權和可以被解釋為表示圖像不同的低階特徵。隨著層數的加深,這些特徵被組合,從而代表更高階的圖像特徵。
例如,線可以被組合成形狀,再進一步,可以被組合成一系列形狀的集合。最後,再訓練好這些信息之後,針對各個圖像類別,網路給出由這些高階特徵組成各個對象的概率,即分類結果。
推理(Inference)與訓練(Training)
既然DNN是機器學習演算法中的一員,那麼它的基本編程思想仍然是學習。DNN的學習即確定網路的權重值。通常,學習過程被稱為訓練網路(training)。一旦訓練完成,程序可以使用由訓練確定的權值進行計算,這個使用網路完成任務的操作被被稱為推斷(inference)。
接下來,如圖3所示,我們用圖像分類作為例子來展示如何訓練一個深度神經網路。當我們使用一個DNN的時候,我們輸入一幅圖片,DNN輸出一個得分向量,每一個分數對應一個物體分類;得到最高分數的分類意味著這幅圖片最有可能屬於這個分類。
訓練DNN的首要目標就是確定如何設置權重,使得正確分類的得分最高(圖片所對應的正確分類在訓練數據集中標出),而使其他不正確分類的得分盡可能低。理想的正確分類得分與目前的權重所計算出的得分之間的差距被稱為損失函數(loss)。
因此訓練DNN的目標即找到一組權重,使得對一個較大規模數據集的loss最小。
圖3:圖像分類
權重(weight)的優化過程類似爬山的過程,這種方法被稱為梯度下降(gradient decent)。損失函數對每個權值的梯度,即損失函數對每個權值求偏導數,被用來更新權值(例:第t到t+1次迭代:,其中α被稱為學習率(Learning rate)。梯度值表明權值應該如何變化以減小loss。這個減小loss值的過程是重復迭代進行的。
梯度可以通過反向傳播(Back-Propagation)過程很高效地進行計算,loss的影響反向通過網路來計算loss是如何被每個權重影響的。
訓練權重有很多種方法。前面提到的是最常見的方法,被稱為監督學習,其中所有的訓練樣本是有標簽的。
無監督學習是另一種方法,其中所有訓練樣本都沒有標簽,最終目標是在數據中查找結構或聚類。半監督學習結合了兩種方法,只有訓練數據的一小部分被標記(例如,使用未標記的數據來定義集群邊界,並使用少量的標記數據來標記集群)。
最後,強化學習可以用來訓練一個DNN作為一個策略網路,對策略網路給出一個輸入,它可以做出一個決定,使得下一步的行動得到相應的獎勵;訓練這個網路的過程是使網路能夠做出使獎勵(即獎勵函數)最大化的決策,並且訓練過程必須平衡嘗試新行為(Exploration)和使用已知能給予高回報的行為(Exploitation)兩種方法。
用於確定權重的另一種常用方法是fine-tune,使用預先訓練好的模型的權重用作初始化,然後針對新的數據集(例如,傳遞學習)或新的約束(例如,降低的精度)調整權重。與從隨機初始化開始相比,能夠更快的訓練,並且有時會有更好的准確性。
『肆』 ga-bp神經網路預測效果不好
。
1. 根據你的預測對象的特性選取合適的輸入層、輸出層和隱層神經元數目。
2. 選擇合適的神經網路訓練函數。
3. 保證足夠的訓練樣本數據,並且確保這個訓練樣本數據有足夠的精度能夠反映需要預測的對象的特性。
谷歌人工智慧寫作項目:小發貓
2、BP神經網路的精度低,怎麼解決?
建議用RBP神經網路進行訓練如何提高bp神經網路的准確率。使用方法:
x=-1:0.1:5;
y=-1:0.1:5;
z=x.^2.*y-0.1*x+2*y;
net=newrbe([x;y],z); %創建一個RBF網路
t=sim(net,[x;y]);%模擬未經訓練的網路net
plot3(x,y,z,'rd');hold on
plot3(x,y,t,'b-');
3、怎麼才能使bp神經網路預測的結果更准確
這個問的太哪個了吧,神經網路預測一般也就是對已有數據進行非線性擬合而已,簡單的說,他只是一個擬合方法,只是與傳統的擬合方法相比有一些優點。用神經網路預測也不會是一定很非常准確的。
4、採用什麼手段使神經網路預測更加准確
優化神經網路結構。如BP神經網路改變隱層神經元數量、訓練演算法等;
使用其他神經網路。如Elman神經網路考慮了前一時刻的輸出,比較適合用於預測,預測效果往往更好。RBF神經網路的訓練速度很快,訓練效果也很好。
改進的神經網路演算法。例如BP神經網路增加動量項、自適應學習率等措施,防止陷入局部極小影響預測效果。
組合神經網路。取長補短,將全局搜索能力強的演算法與局部逼近快的演算法組合起來,如遺傳演算法優化初始權值,再訓練。這種方法比較靈活,可以和許多演算法融合。
全面考慮影響因素。未來的預測值受許多因素影響,所以應該在基於歷史數據的基礎上,充分考慮各種因素,考慮得越周全,預知信息越多,預測效果一般更好。
5、優化初始權值及閾值為什麼可以提高bp神經網路識別率
bp的學習過程就是不斷的網路訓練工程,而訓練的就是利用權值和閾值的激活函數計算輸出的。權值與輸入相乘,經過激活函數計算出的值與閾值比較,達到閾值的可輸出,不滿足的則返回繼續訓練。因此可以提高識別率。
6、bp神經網路遇到新的數據,就預測不準,怎麼弄?
預測數據的話BP不是特別好用,最好用Elman反饋神經網路或者RNN循環神經網路,這些有記憶功能的網路比較好用。bp主要和你選擇的隱含層數,和誤差范圍,學習率有關。你可以調節相關參數來改變神經網路,獲得更精確的結果。
7、BP神經網路誤差如何提高
你好,誤差大,第一步需要嘗試的是做歸一化處理。有線性歸一化,有對數函數歸一化等等,這個你可以去網上搜索數據歸一化方法,有相關的代碼,應該。
第二部需要做出的改動是隱層節點數量,如果節點數量太多,那麼結果的隨機性就會很大,如果太少,那麼復雜數據的規律計算不出來。多少層節點最合適,這個目前除了一個一個試沒有更好的辦法。但是你會發現每一個相同的結構計算出的結果卻不盡相同,這個時候就需要考慮後續的問題。
第三步嘗試,變換transfer function。麻煩你查查字典,因為我不是用中文學的神經網路。我姑且翻譯成傳輸函數。傳輸函數在matlab中內建了3中 pureline logsig tansig。分別有不同的應用范圍。因為沒看到你的數據,我也不清楚具體應該推薦你用哪一種。不過你可以去網上搜索一下三種傳輸函數的特點。
如果有用請給「採納」謝謝。
8、BP神經網路模擬時模擬結果准確率低。請問高手如何處理 5
是預測低還是擬合低?
如果是預測那沒辦法的,如果是擬合低,可以重新選擇網路種類或者網路結構
『伍』 如何提高BP神經網路模型的預測精度
直接調用歸一化函數就可以啦,不會的話看一下這個帖子吧:遺傳演算法優化BP神經網路的案例(matlab代碼分享)
http://www.ilovematlab.cn/forum. ... &fromuid=679292
希望對你有幫助!
『陸』 神經網路(Neural Network)
(1)結構:許多樹突(dendrite)用於輸入,一個軸突 (axon)用於輸出。
(2)特性:興奮性和傳導性。興奮性是指當信號量超過某個閾值時,細胞體就會被激活,產生電脈沖。傳導性是指電脈沖沿著軸突並通過突觸傳遞到其它神經元。
(3)有兩種狀態的機器:激活時為「是」,不激活時為「否」。神經細胞的狀態取決於從其他神經細胞接收到的信號量,以及突觸的性質(抑制或加強)。
(1)神經元——不重要
① 神經元是包含權重和偏置項的 函數 :接收數據後,執行一些計算,然後使用激活函數將數據限制在一個范圍內(多數情況下)。
② 單個神經元:線性可分的情況下,本質是一條直線, ,這條直線將數據劃分為兩類。而線性分類器本身就是一個單層神經網路。
③ 神經網路:非線性可分的情況下,神經網路通過多個隱層的方法來實現非線性的函數。
(2)權重/參數/連接(Weight)——最重要
每一個連接上都有一個權重。一個神經網路的訓練演算法就是讓權重的值調整到最佳,以使得整個網路的預測效果最好。
(3)偏置項(Bias Units)——必須
① 如果沒有偏置項,所有的函數都會經過原點。
② 正則化偏置會導致欠擬合:若對偏置正則化,會導致激活變得更加簡單,偏差就會上升,學習的能力就會下降。
③ 偏置的大小度量了神經元產生激勵(激活)的難易程度。
(1)定義:也稱為轉換函數,是一種將輸入 (input) 轉成輸出 (output) 的函數。
(2)作用:一般直線擬合的精確度要比曲線差很多,引入激活函數能給神經網路 增加一些非線性 的特性。
(3)性質:
① 非線性:導數不是常數,否則就退化成直線。對於一些畫一條直線仍然無法分開的問題,非線性可以把直線變彎,就能包羅萬象;
② 可微性:當優化方法是基於梯度的時候,處處可導為後向傳播演算法提供了核心條件;
③ 輸出范圍:一般限定在[0,1],使得神經元對一些比較大的輸入會比較穩定;
④ 非飽和性:飽和就是指,當輸入比較大的時候輸出幾乎沒變化,會導致梯度消失;
⑤ 單調性:導數符號不變,輸出不會上躥下跳,讓神經網路訓練容易收斂。
(1)線性函數 (linear function)—— purelin()
(2)符號函數 (sign function)—— hardlim()
① 如果z值高於閾值,則激活設置為1或yes,神經元將被激活。
② 如果z值低於閾值,則激活設置為0或no,神經元不會被激活。
(3)對率函數 (sigmoid function)—— logsig()
① 優點:光滑S型曲線連續可導,函數閾值有上限。
② 缺點:❶ 函數飽和使梯度消失,兩端梯度幾乎為0,更新困難,做不深;
❷ 輸出不是0中心,將影響梯度下降的運作,收斂異常慢;
❸ 冪運算相對來講比較耗時
(4)雙曲正切函數(hyperbolic tangent function)—— tansig()
① 優點:取值范圍0中心化,防止了梯度偏差
② 缺點:梯度消失現象依然存在,但相對於sigmoid函數問題較輕
(5)整流線性單元 ReLU 函數(rectified linear unit)
① 優點:❶ 分段線性函數,它的非線性性很弱,因此網路做得很深;
❷ 由於它的線性、非飽和性, 對於隨機梯度下降的收斂有巨大的加速作用;
② 缺點:❶ 當x<0,梯度都變成0,參數無法更新,也導致了數據多樣化的丟失;
❷ 輸出不是0中心
(6)滲漏型整流線性單元激活函數 Leaky ReLU 函數
① 優點:❶ 是為解決「ReLU死亡」問題的嘗試,在計算導數時允許較小的梯度;
❷ 非飽和的公式,不包含指數運算,計算速度快。
② 缺點:❶ 無法避免梯度爆炸問題; (沒有體現優於ReLU)
❷ 神經網路不學習 α 值。
(7)指數線性單元 ELU (Exponential Linear Units)
① 優點:❶ 能避免「死亡 ReLU」 問題;
❷ 能得到負值輸出,這能幫助網路向正確的方向推動權重和偏置變化;
❸ 在計算梯度時能得到激活,而不是讓它們等於 0。
② 缺點:❶ 由於包含指數運算,所以計算時間更長;
❷ 無法避免梯度爆炸問題; (沒有體現優於ReLU)
❸ 神經網路不學習 α 值。
(8)Maxout(對 ReLU 和 Leaky ReLU的一般化歸納)
① 優點:❶ 擁有ReLU的所有優點(線性和不飽和)
❷ 沒有ReLU的缺點(死亡的ReLU單元)
❸ 可以擬合任意凸函數
② 缺點 :參數數量增加了一倍。難訓練,容易過擬合
(9)Swish
① 優點:❶ 在負半軸也有一定的不飽和區,參數的利用率更大
❷ 無上界有下界、平滑、非單調
❸ 在深層模型上的效果優於 ReLU
每個層都包含一定數量的單元(units)。增加層可增加神經網路輸出的非線性。
(1)輸入層:就是接收原始數據,然後往隱層送
(2)輸出層:神經網路的決策輸出
(3)隱藏層:神經網路的關鍵。把前一層的向量變成新的向量,讓數據變得線性可分。
(1)結構:僅包含輸入層和輸出層,直接相連。
(2)作用:僅能表示 線性可分 函數或決策,且一定可以在有限的迭代次數中收斂。
(3)局限:可以建立與門、或門、非門等,但無法建立更為復雜的異或門(XOR),即兩個輸入相同時輸出1,否則輸出0。 (「AI winter」)
(1)目的:擬合某個函數 (兩層神經網路可以逼近任意連續函數)
(2)結構:包含輸入層、隱藏層和輸出層 ,由於從輸入到輸出的過程中不存在與模型自身的反饋連接,因此被稱為「前饋」。 (層與層之間全連接)
(3)作用: 非線性 分類、聚類、預測等,通過訓練,可以學習到數據中隱含的知識。
(4)局限:計算復雜、計算速度慢、容易陷入局部最優解,通常要將它們與其他網路結合形成新的網路。
(5)前向傳播演算法(Forward Propagation)
① 方法:從左至右逐級依賴的演算法模型,即網路如何根據輸入X得到輸出Y,最終的輸出值和樣本值作比較, 計算出誤差 。
② 目的:完成了一次正反向傳播,就完成了一次神經網路的訓練迭代。通過輸出層的誤差,快速求解對每個ω、b的偏導,利用梯度下降法,使Loss越來越小。
② 局限:為使最終的誤差達到最小,要不斷修改參數值,但神經網路的每條連接線上都有不同權重參數,修改這些參數變得棘手。
(6)誤差反向傳播(Back Propagation)
① 原理:梯度下降法求局部極值
② 方法:從後往前,從輸出層開始計算 L 對當前層的微分,獲得各層的誤差信號,此誤差信號即作為修正單元權值的依據。計算結束以後,所要的兩個參數矩陣的 梯度 就都有了。
③ 局限:如果激活函數是飽和的,帶來的缺陷就是系統迭代更新變慢,系統收斂就慢,當然這是可以有辦法彌補的,一種方法是使用 交叉熵函數 作為損失函數。
(1)原理:隨著網路的層數增加,每一層對於前一層次的抽象表示更深入。在神經網路中,每一層神經元學習到的是前一層神經元值的更抽象的表示。通過抽取更抽象的特徵來對事物進行區分,從而獲得更好的區分與分類能力。
(2)方法:ReLU函數在訓練多層神經網路時,更容易收斂,並且預測性能更好。
(3)優點:① 易於構建,表達能力強,基本單元便可擴展為復雜的非線性函數
② 並行性號,有利於在分布是系統上應用
(4)局限:① 優化演算法只能獲得局部極值,性能與初始值相關
② 調參理論性缺乏
③ 不可解釋,與實際任務關聯性模糊
(1)原理:由手工設計卷積核變成自動學習卷積核
(2)卷積(Convolutional layer): 輸入與卷積核相乘再累加 (內積、加權疊加)
① 公式:
② 目的:提取輸入的不同特徵,得到維度很大的 特徵圖(feature map)
③ 卷積核:需要訓練的參數。一般為奇數維,有中心像素點,便於定位卷積核
④ 特點:局部感知、參數變少、權重共享、分層提取
(3)池化(Pooling Layer):用更高層的抽象表達來表示主要特徵,又稱「降采樣」
① 分類: 最大 (出現與否)、平均(保留整體)、隨機(避免過擬合)
② 目的:降維,不需要訓練參數,得到新的、維度較小的特徵
(4)步長(stride):若假設輸入大小是n∗n,卷積核的大小是f∗f,步長是s,則最後的feature map的大小為o∗o,其中
(5)填充(zero-padding)
① Full模式:即從卷積核(fileter)和輸入剛相交開始做卷積,沒有元素的部分做補0操作。
② Valid模式:卷積核和輸入完全相交開始做卷積,這種模式不需要補0。
③ Same模式:當卷積核的中心C和輸入開始相交時做卷積。沒有元素的部分做補0操作。
(7)激活函數:加入非線性特徵
(8)全連接層(Fully-connected layer)
如果說卷積層、池化層和激活函數層等是將原始數據映射到隱層特徵空間(決定計算速度),全連接層則起到將學到的「分布式特徵表示」映射到樣本標記空間的作用(決定參數個數)。
參考:
[1] 神經網路(入門最詳細)_ruthy的博客-CSDN博客_神經網路演算法入門
[2] 神經網路(容易被忽視的基礎知識) - Evan的文章 - 知乎
[3] 人工神經網路——王的機器
[4] 如何簡單形象又有趣地講解神經網路是什麼? - 舒小曼的回答 - 知乎
[5] 神經網路15分鍾入門!足夠通俗易懂了吧 - Mr.括弧的文章 - 知乎
[6] 神經網路——最易懂最清晰的一篇文章_illikang的博客-CSDN博客_神經網路
[7] 直覺化深度學習教程——什麼是前向傳播——CSDN
[8] 「反向傳播演算法」過程及公式推導(超直觀好懂的Backpropagation)_aift的專欄-CSDN
[9] 卷積、反卷積、池化、反池化——CSDN
[10] 浙大機器學習課程- bilibili.com
『柒』 手機上運行的深度神經網路模型-MobileNet
文章引用自《 從MobileNet看輕量級神經網路的發展 》,詳情請點擊原文觀看
前 言
隨著深度學習的火熱,計算機視覺領域內的卷積神經網路模型也層出不窮。從1998年的LeNet,到2012年引爆深度學習熱潮的AlexNet,再到後來2014年的VGG,2015年的ResNet,深度學習網路模型在圖像處理中應用的效果越來越好。神經網路體積越來越大,結構越來越復雜,預測和訓練需要的硬體資源也逐步增多,往往只能在高算力的伺服器中運行深度學習神經網路模型。移動設備因硬體資源和算力的限制,很難運行復雜的深度學習網路模型。
深度學習領域內也在努力促使神經網路向小型化發展。在保證模型准確率的同時體積更小,速度更快。到了2016年直至現在,業內提出了SqueezeNet、ShuffleNet、NasNet、MnasNet以及MobileNet等輕量級網路模型。這些模型使移動終端、嵌入式設備運行神經網路模型成為可能。而MobileNet在輕量級神經網路中較具代表性。
谷歌在2019年5月份推出了最新的MobileNetV3。新版MobileNet使用了更多新特性,使得MobileNet非常具有研究和分析意義,本文將對MobileNet進行詳細解析。
MobileNet的優勢
MobileNet網路擁有更小的體積,更少的計算量,更高的精度。在輕量級神經網路中擁有極大的優勢。
1
更小的體積
MobileNet相比經典的大型網路,參數量明顯更少,參數量越少模型體積越小。
2
更少的計算量
MobileNet優化網路結構使模型計算量成倍下降。
3
更高的准確率
MobileNet憑借網路結構優化,在更少的參數及更少的計算量情況下,網路精度反而超過了部分大型神經網路。在最新的MobileNetV3-Large中,實現ImageNet數據集Top1准確率達到75.2%。
4
更快的速度
使用Google Pixel-1手機測試,MobileNet各版本都能保持運行時間在120ms以下,最新版MobileNetV3-Large運行時間達到66ms,參數量和計算量更低的MobileNetV3-Small更是能達到22ms;GoogleNet運行速度約為250ms,而VGG-16由於一次性需要載入至內存的空間已超過500MB,手機系統會報內存溢出錯誤導致無法運行。
5
多種應用場景
MobileNet可以在移動終端實現眾多的應用,包括目標檢測,目標分類,人臉屬性識別和人臉識別等。
MobileNet各版本介紹
1
MobileNetV1網路結構
整個網路不算平均池化層與softmax層,共28層;
在整個網路結構中步長為2的卷積較有特點,卷積的同時充當下采樣的功能;
第一層之後的26層都為深度可分離卷積的重復卷積操作;
每一個卷積層(含常規卷積、深度卷積、逐點卷積)之後都緊跟著批規范化和ReLU激活函數;
最後一層全連接層不使用激活函數。
2
MobileNetV2網路結構
MobileNetV2中主要引入線性瓶頸結構和反向殘差結構。
MobileNetV2網路模型中有共有17個Bottleneck層(每個Bottleneck包含兩個逐點卷積層和一個深度卷積層),一個標准卷積層(conv),兩個逐點卷積層(pw conv),共計有54層可訓練參數層。MobileNetV2中使用線性瓶頸(Linear Bottleneck)和反向殘差(Inverted Resials)結構優化了網路,使得網路層次更深了,但是模型體積更小,速度更快了。
3
MobileNetV3網路結構
MobileNetV3分為Large和Small兩個版本,Large版本適用於計算和存儲性能較高的平台,Small版本適用於硬體性能較低的平台。
Large版本共有15個bottleneck層,一個標准卷積層,三個逐點卷積層。
Small版本共有12個bottleneck層,一個標准卷積層,兩個逐點卷積層。
MobileNetV3中引入了5×5大小的深度卷積代替部分3×3的深度卷積。引入Squeeze-and-excitation(SE)模塊和h-swish(HS)激活函數以提高模型精度。結尾兩層逐點卷積不使用批規范化(Batch Norm),MobileNetV3結構圖中使用NBN標識。
(圖片來源https://arxiv.org/pdf/1905.02244.pdf)
網路結構上相對於MobileNetV2的結尾部分做了優化,去除三個高階層,如上圖所示。去除後減少了計算量和參數量,但是模型的精度並沒有損失。
值得一提的是,不論是Large還是Small版本,都是使用神經架構搜索(NAS)技術生成的網路結構。
4
MobileNet各版本特性
MobileNet實現計算量減小、參數量減少的同時保證了較高的准確率,這和其擁有的特性息息相關:
MobileNetV1提出的特性
MobileNetV2提出的特性
MobileNetV3提出的特性
MobileNet各個版本擁有的特性匯總
下文將對上表中的各個特性詳細闡述。
MobileNet的特性詳解
1
深度可分離卷積
從MobileNetV1開始,到V2、V3的線性瓶頸結構都大量使用了深度可分離卷積。
深度可分離卷積(Depthwise Separable Convolution)是一種卷積結構。它是由一層深度卷積(Depthwise convolution)與一層逐點卷積(Pointwise Convolution)組合而成的,每一層卷積之後都緊跟著批規范化和ReLU激活函數。跟標准卷積的區別就是精度基本不變的情況下,參數與計算量都明顯減少。
深度卷積
深度卷積(Depthwise convolution, DW)不同於常規卷積操作,深度卷積中一個卷積核只有一維,負責一個通道,一個通道只被一個卷積核卷積;常規卷積每個卷積核的維度與輸入維度相同,每個通道單獨做卷積運算後相加。
以一張5x5x3(長和寬為5,RGB3通道)的彩色圖片舉例。每層深度卷積卷積核的數量與上一層的通道數相同(通道和卷積核一一對應)。設padding=1,stride=1,一個三通道的圖像經過運算後生成了3個特徵圖,如下圖所示:
深度卷積完成後的輸出特徵圖通道數與輸入層的通道數相同,無法擴展通道數。而且這種運算對輸入層的每個通道獨立進行卷積運算,沒有有效的利用不同通道在相同空間位置上的特徵信息。因此需要逐點卷積來將生成的特徵圖進行組合生成新的特徵圖。
逐點卷積
逐點卷積(Pointwise Convolution, PW)的運算與標准卷積運算非常相似。
逐點卷積卷積核大小為1×1xM(M為輸入數據的維度),每次卷積一個像素的區域。逐點卷積運算會將上一層的特徵圖在深度方向上進行加權組合,生成新的特徵圖,新的特徵圖的大小與輸入數據大小一致;然後組合各通道的特徵圖,以較少的計算量進行降維或升維操作(改變輸出數據的維度)。
以一張5x5x3(長和寬為5,RGB3通道)的彩色圖片舉例,使用4個1x1x3的逐點卷積核進行卷積,逐點卷積運算後生成了4個特徵圖。這個例子是使用逐點卷積進行升維的操作,特徵圖從5x5x3 升維到5x5x4。如下圖所示:
深度可分離卷積結構解析
將深度卷積和逐點卷積組成深度可分離卷積後的示意圖,如下圖所示:
首先進行深度卷積操作,得出的特徵圖各通道之間是不關聯的。接著進行逐點卷積把深度卷積輸出的特徵圖各通道關聯起來。
深度可分離卷積使用了更小的空間代價(參數減少)和更少的時間代價(計算量更少)實現了標准卷積層一樣的效果(提取特徵)。
一般的設Df為輸入特徵圖邊長,Dk為卷積核邊長,特徵圖和卷積核均為長寬一致,輸入通道數為M,輸出通道數為N,則:
標准卷積計算量為:Df×Df×Dk×Dk×M×N
深度卷積的計算量為:Df×Df×Dk×Dk×M
逐點卷積的計算量為:Df×Df×M×N
上圖所示實現輸入特徵圖大小為5×5×3,輸出特成圖大小為5×5×4,設padding=1,stride=1,深度卷積卷積核大小為3×3,標准卷積也使用3×3尺寸卷積核。實現相同的卷積效果,參數量(不包含偏置)與計算量對比如下表所示:
深度可分離卷積的演變
事實上深度可分離卷積不是在MobileNetV1中第一次提出的,而是在2016年由谷歌的Xception網路結構中提出的。MobileNetV1在Xception的基礎上,對深度可分離卷積進行了改進,做到了計算量與參數量的下降:
假定M為輸入層的通道數,N為輸出層的通道數。
Xcenption的深度可分離卷積是由輸入參數開始,使用1x1xMxN卷積將輸入層的通道數轉換為目標通道數,再通過3x3x1卷積核對每個通道進行卷積,每次卷積過後使用ReLU進行激活。
MobileNetV1的深度可分離卷積則是先使用3x3x1xM對輸入層的每個通道分別卷積,之後通過1x1xMxN將輸入層通道數轉換為輸出層通道數,每次卷積過後做一次批規范化操作,再使用ReLU進行激活。
這里我們使用MobileNetV1網路結構的第一個深度可分離卷積層來舉例,輸入層維度為112x112x32,輸出層維度為112x112x64,Xception與MobileNet的深度可分離卷積的計算量與參數個數對比如下表:
由此可知將PW卷積與DW卷積的順序調整後,優化了網路的空間復雜度和時間復雜度。
2
寬度因子
MobileNet本身的網路結構已經比較小並且執行延遲較低,但為了適配更定製化的場景,MobileNet提供了稱為寬度因子(Width Multiplier)的超參數給我們調整。寬度因子在MobileNetV1、V2、V3都可以運用。
通過寬度因子,可以調整神經網路中間產生的特徵的大小,調整的是特徵數據通道數大小,從而調整了運算量的大小。
寬度因子簡單來說就是新網路中每一個模塊要使用的卷積核數量相較於標準的MobileNet比例。對於深度卷積結合1x1方式的卷積核,計算量為:
算式中α即為寬度因子,α常用的配置為1,0.75,0.5,0.25;當α等於1時就是標準的MobileNet。通過參數α可以非常有效的將計算量和參數數量約減到α的平方倍。
下圖為MobileNetV1使用不同α系數進行網路參數的調整時,在ImageNet上的准確率、計算量、參數數量之間的關系(每一個項中最前面的數字表示α的取值)。
(數據來源https://arxiv.org/pdf/1704.04861.pdf)
可以看到當輸入解析度固定為224x224時,隨著寬度因子的減少,模型的計算量和參數越來越小。從上表可以看到, 0.25 MobileNet的正確率比標准版1.0MobileNet低20%,但計算量和參數量幾乎只有標准版1.0MobileNet計算量、參數量的10%!對於計算資源和存儲資源都十分緊張的移動端平台,可以通過α寬度因子調節網路的餐數量是非常實用的,在真正使用時我們可以按需調整α寬度因子達到准確率與性能的平衡。
3
解析度因子
MobileNet還提供了另一個超參數解析度因子(Resolution Multiplier)供我們自定義網路結構,解析度因子同樣在MobileNetV1、V2、V3都可以運用。
解析度因子一般用β來指代,β的取值范圍在(0,1]之間,是作用於每一個模塊輸入尺寸的約減因子,簡單來說就是將輸入數據以及由此在每一個模塊產生的特徵圖都變小了,結合寬度因子α,深度卷積結合1x1方式的卷積核計算量為:
下圖為MobileNetV1使用不同的β系數作用於標准MobileNet時,在ImageNet上對精度和計算量的影響(α固定1.0)
(數據來源https://arxiv.org/pdf/1704.04861.pdf)
上圖中的 224、192、160、128 對應的解析度因子分別為 1、 6/7、5/7、4/7。
β=1時,輸入圖片的解析度為224x224,卷積後的圖像大小變化為: 224x224 、112x112、56x56、28x28、14x14、7x7。
β= 6/7時,輸入圖片的解析度為192x192,卷積後各層特徵圖像大小變化為:192x192、96x96、48x48、24x24、12x12、6x6。
卷積特徵圖像的大小變化不會引起參數量的變化,只改變模型M-Adds計算量。上圖中 224解析度模型測試ImageNet數據集准確率為70.6%,192解析度的模型准確率為69.1%,但是M-Adds計算量減少了151M,對移動平台計算資源緊張的情況下,同樣可以通過β解析度因子調節網路輸入特徵圖的解析度,做模型精度與計算量的取捨。
4
規范化
深度學習中的規范化操作(Normalization),有助於加快基於梯度下降法或隨機梯度下降法模型的收斂速度,提升模型的精度,規范化的參數能夠提升模型泛化能力,提高模型的可壓縮性。
按照規范化操作涉及對象的不同可以分為兩大類,一類是對輸入值進行規范化操作,比如批規范化(Batch Normalization)、層規范化(Layer Normalization)、實例規范化(Instance Normalization)、組規范化(Group Normalization)方法都屬於這一類。另外一類是對神經網路中參數進行規范化操作,比如使用L0,L1范數。
批規范化
批規范化(Batch Normalization)幾乎存在於MobileNetV1、V2、V3的每個卷積層的後面,目的是加快訓練收斂速度,提升准確率。
批規范化是一種對數值的特殊函數變換方法,也就是說假設原始的某個數值是 x,套上一個起到規范化作用的函數,對規范化之前的數值 x 進行轉換,形成一個規范化後的數值,即:
所謂規范化,是希望轉換後的數值滿足一定的特性,至於對數值具體如何變換,跟規范化目標有關,不同的規范化目標導致具體方法中函數所採用的形式不同。通過自適應的重新參數化的方法,克服神經網路層數加深導致模型難以訓練的問題。
參數規范化
參數規范化(Weight Normalization, WN)是規范化的一種, 通過人為的設定稀疏演算法,去除模型中多餘的參數(置為0)使得模型參數稀疏化,可以通過L1範式實現。
參數規范化是防止模型過分擬合訓練數據。當訓練一批樣本的時候,隨著訓練的推移模型會越來越趨向於擬合樣本數據。因為參數太多,會導致模型復雜度上升,容易過擬合。
需要保證模型"簡單"的基礎上最小化訓練誤差,這樣得到的參數才具有好的泛化性能(也就是測試誤差也小),而模型"簡單"就是通過規則函數來實現的。
如上圖所示,左側分類明顯的是欠擬合,模型並沒有能夠擬合數據。中間圖示為合適的擬合,右邊圖示是過擬合,模型在訓練樣本中擬合度是很好的,但是卻違背了特徵分類規律,在新的測試樣本中表現糟糕,影響模型的泛化能力。顯然右側模型在訓練是受到額外參數干擾。參數規則化能夠使參數稀疏,減少額外參數的干擾,提高泛化能力。
模型擁有稀疏的參數(模型中有大量參數為0),也有利於通過壓縮演算法壓縮模型的大小。
5
線性瓶頸
線性瓶頸英文為Linear Bottleneck,是從Bottleneck結構演變而來的,被用於MobileNetV2與V3。
Bottleneck結構首次被提出是在ResNet網路中。該結構第一層使用逐點卷積,第二層使用3×3大小卷積核進行深度卷積,第三層再使用逐點卷積。MobileNet中的瓶頸結構最後一層逐點卷積使用的激活函數是Linear,所以稱其為線性瓶頸結構(Linear Bottleneck)。線性瓶頸結構有兩種,第一種是步長為1時使用殘差結構,第二種是步長為2時不使用殘差結構。
其中輸入通道數為M,擴大倍數系數為T。T的值為大於0 的正數,當 0<T<1時,第一層逐點卷積起到的作用是降維。當 1<T時,第一層逐點卷積起到的作用是升維。
第二層為深度卷積,輸入通道數 = 輸出通道數 = M×T。
第三層為逐點卷積,作用是關聯深度卷積後的特徵圖並輸出指定通道數N。
線性瓶頸結構相對標准卷積能夠減少參數數量,減少卷積計算量。從空間和時間上優化了網路。
6
反向殘差
MobileNetV2中以ResNet的殘差(Resials)結構為基礎進行優化,提出了反向殘差(Inverted Resials)的概念,之後也同樣運用與MobileNetV3中。
ResNet中提出的殘差結構解決訓練中隨著網路深度增加而出現的梯度消失問題,使反向傳播過程中深度網路的淺層網路也能得到梯度,使淺層網路的參數也可訓練,從而增加特徵表達能力。
ResNet的殘差結構實際是在線性瓶頸結構的基礎上增加殘差傳播。如下圖所示:
ResNet中的殘差結構使用第一層逐點卷積降維,後使用深度卷積,再使用逐點卷積升維。
MobileNetV2版本中的殘差結構使用第一層逐點卷積升維並使用Relu6激活函數代替Relu,之後使用深度卷積,同樣使用Relu6激活函數,再使用逐點卷積降維,降維後使用Linear激活函數。這樣的卷積操作方式更有利於移動端使用(有利於減少參數與M-Adds計算量),因維度升降方式與ResNet中的殘差結構剛好相反,MobileNetV2將其稱之為反向殘差(Inverted Resials)。
7
5x5 的深度卷積
MobileNetV3中,深度卷積大量使用5x5大小的卷積核。這是因為使用神經結構搜索(NAS)技術計算出的MobileNetV3網路結構的過程中,發現了在深度卷積中使用5x5大小的卷積核比使用3x3大小的卷積核效果更好,准確率更高。關於NAS技術將會在下文的單獨章節中做介紹。
8
Squeeze-and-excitation 模塊
Squeeze-and-Excitation模塊(簡稱SE模塊)的首次提出是在2017年的Squeeze-and-Excitation Networks(SENet)網路結構中,在MNasNet中進行了改進,之後在MobileNetV3中大量使用。研究人員期望通過精確的建模卷積特徵各個通道之間的作用關系來改善網路模型的表達能力。為了達到這個期望,提出了一種能夠讓網路模型對特徵進行校準的機制,使得有效的權重大,無效或效果小的權重小的效果,這就是SE模塊。
(圖片來源https://arxiv.org/pdf/1905.02244.pdf)
如上圖,MobileNetV3的SE模塊被運用在線性瓶頸結構最後一層上,代替V2中最後的逐點卷積,改為先進行SE操作再逐點卷積。這樣保持了網路結構每層的輸入和輸出,僅在中間做處理,類似於軟體開發中的鉤子。
SE模塊結構詳解
下圖表示一個SE 模塊。主要包含Squeeze和Excitation兩部分。W,H表示特徵圖寬,高。C表示通道數,輸入特徵圖大小為W×H×C。
壓縮(Squeeze)
第一步是壓縮(Squeeze)操作,如下圖所示
這個操作就是一個全局平均池化(global average pooling)。經過壓縮操作後特徵圖被壓縮為1×1×C向量。
激勵(Excitation)
接下來就是激勵(Excitation)操作,如下圖所示
由兩個全連接層組成,其中SERatio是一個縮放參數,這個參數的目的是為了減少通道個數從而降低計算量。
第一個全連接層有C*SERatio個神經元,輸入為1×1×C,輸出1×1×C×SERadio。
第二個全連接層有C個神經元,輸入為1×1×C×SERadio,輸出為1×1×C。
scale操作
最後是scale操作,在得到1×1×C向量之後,就可以對原來的特徵圖進行scale操作了。很簡單,就是通道權重相乘,原有特徵向量為W×H×C,將SE模塊計算出來的各通道權重值分別和原特徵圖對應通道的二維矩陣相乘,得出的結果輸出。
這里我們可以得出SE模塊的屬性:
參數量 = 2×C×C×SERatio
計算量 = 2×C×C×SERatio
總體來講SE模塊會增加網路的總參數量,總計算量,因為使用的是全連接層計算量相比卷積層並不大,但是參數量會有明顯上升,所以MobileNetV3-Large中的總參數量比MobileNetV2多了2M。
MobileNetV3中的SE模塊
SE模塊的使用是很靈活的,可以在已有網路上添加而不打亂網路原有的主體結構。
ResNet中添加SE模塊形成SE-ResNet網路,SE模塊是在bottleneck結構之後加入的,如下圖左邊所示。
MobileNetV3版本中SE模塊加在了bottleneck結構的內部,在深度卷積後增加SE塊,scale操作後再做逐點卷積,如上圖右邊所示。MobileNetV3版本的SERadio系數為0.25。使用SE模塊後的MobileNetV3的參數量相比MobileNetV2多了約2M,達到5.4M,但是MobileNetV3的精度得到了很大的提升,在圖像分類和目標檢測中准確率都有明顯提升。
9
h-swish激活函數
MobileNetV3中發現swish激活函數能夠有效提高網路的精度,但是swish的計算量太大了,並不適合輕量級神經網路。MobileNetV3找到了類似swish激活函數但是計算量卻少很多的替代激活函數h-swish(hard version of swish)如下所示:
sigmoid、h-sigmoid、swish、h-swish激活函數的比較:
(圖片來源https://arxiv.org/pdf/1905.02244.pdf)
這種非線性在保持精度的情況下帶來了很多優勢,首先ReLU6在眾多軟硬體框架中都可以實現,其次量化時避免了數值精度的損失,運行快。這一非線性改變將模型的延時增加了15%。但它帶來的網路效應對於精度和延時具有正向促進,剩下的開銷可以通過融合非線性與先前層來消除。
『捌』 unet模型屬於哪種神經網路
unet模型屬於卷積神經網路。是德國弗萊堡大學計算機科學系為生物醫學圖像分割而開發的,該網路基於全卷積網路其架構經過修改和擴展,可以使用更少的訓練圖像並產生更精確的分割,Unet是2015年誕生的模型。
unet模型的特點
Unet是比較早的基於深度學習的分割演算法了,優點是速度真的快P100上基於VGG的backbone能跑到50幀,同時不是太開放的場景下可以做到令人滿意的分割效果,在對實時性要求較高的場合下是比較適用的不是所有的場合都能上MaskRCNN的Backbone大一點。
如果顯卡差點就容易爆顯存了,同時相比大分割網路的模型動輒幾百Mb,Unet用小backbone模型就可以做到10Mb內,Conv層通道減少一點再把網路模型參數分開,模型大小可以做到很小,用CPU跑速度都挺快的,關鍵是分割精度在較為簡單場景下還可以。
『玖』 AI面試題第二彈(神經網路基礎)
提取主要特徵,減小網路參數量,減小計算量
層層傳遞的梯度>1 梯度爆炸
層層傳遞的梯度<1 梯度消失
與權重有很大關系,激活函數的影響較小。
每次訓練一層隱節點,訓練時將上一層隱節點的輸出作為輸入,而本層隱節點的輸出作為下一層隱節點的輸入,此過程就是逐層「預訓練」(pre-training);在預訓練完成後,再對整個網路進行「微調」(fine-tunning)。Hinton在訓練深度信念網路(Deep Belief Networks中,使用了這個方法,在各層預訓練完成後,再利用BP演算法對整個網路進行訓練。
這個方案主要是針對梯度爆炸提出的,其思想是設置一個梯度剪切閾值,然後更新梯度的時候,如果梯度超過這個閾值,那麼就將其強制限制在這個范圍之內。這可以防止梯度爆炸。
比較常見的是l1l1l1正則,和l2l2l2正則,在各個深度框架中都有相應的API可以使用正則化
反向傳播中,經過每一層的梯度會乘以該層的權重。
舉個簡單例子:
為了得到一致假設而使假設變得過度復雜稱為過擬合(overfitting), 過擬合表現在訓練好的模型在訓練集上效果很好,但是在測試集上效果差 。也就是說模型的泛化能力弱。
過擬合主要由兩個原因造成,數據集太小或模型太復雜
(1). 數據集擴增(Data Augmentation)
(2). 改進模型
·Early Stopping。在模型效果比較好的時候便提前停止訓練
·正則化(regularization)
L1:稀疏參數
L2:更小參數
·Dropout
·多任務學習
深度學習中兩種多任務學習模式:隱層參數的硬共享和軟共享
硬共享機制是指在所有任務中共享隱藏層,同時保留幾個特定任務的輸出層來實現。硬共享機制降低了過擬合的風險。多個任務同時學習,模型就越能捕捉到多個任務的同一表示,從而導致模型在原始任務上的過擬合風險越小。
軟共享機制是指每個任務有自己的模型,自己的參數。模型參數之間的距離是正則化的,以便保障參數相似性。
見後文
leaky relu
輸入是x輸出是y,正常的流程是:我們首先把x通過網路前向傳播,然後把誤差反向傳播以決定如何更新參數讓網路進行學習。使用Dropout之後,過程變成如下:
(1)首先隨機(臨時)刪掉網路中一半的隱藏神經元,輸入輸出神經元保持不變(圖中虛線為部分臨時被刪除的神經元)
(2) 然後把輸入x通過修改後的網路前向傳播,然後把得到的損失結果通過修改的網路反向傳播。一小批訓練樣本執行完這個過程後,在沒有被刪除的神經元上按照隨機梯度下降法更新對應的參數(w,b)。
(3)然後繼續重復這一過程:
恢復被刪掉的神經元(此時被刪除的神經元保持原樣,而沒有被刪除的神經元已經有所更新)
從隱藏層神經元中隨機選擇一個一半大小的子集臨時刪除掉(備份被刪除神經元的參數)。
對一小批訓練樣本,先前向傳播然後反向傳播損失並根據隨機梯度下降法更新參數(w,b) (沒有被刪除的那一部分參數得到更新,刪除的神經元參數保持被刪除前的結果)。
不斷重復這一過程。
沒有對數據進行歸一化
忘記檢查輸入和輸出
沒有對數據進行預處理
沒有對數據正則化
使用過大的樣本
使用不正確的學習率
在輸出層使用錯誤的激活函數
網路中包含壞梯度
初始化權重錯誤
過深的網路
隱藏單元數量錯誤
網路設計不合理(任務-網路不匹配)
機器學習有個很重要的假設:就是假設訓練數據和測試數據是滿足獨立同分布的,這保障了通過訓練數據獲得的優秀模型也能夠在測試集獲得好的效果。但是在機器學習訓練中輸入層的每個批量(X,Y)中X的分布是不一致的,並且神經網路的隱藏層的輸入分布在每次訓練迭代中發生變化。 BatchNorm就是在深度神經網路訓練過程中使得每一層神經網路的輸入保持相同分布的。
BN的基本思想其實相當直觀:因為深層神經網路在做非線性變換前(激活前)的 輸入值 (就是那個x=WU+B,U是輸入) 隨著網路深度加深或者在訓練過程中,其分布逐漸發生偏移或者變動,之所以訓練收斂慢,一般是整體分布逐漸往非線性函數的取值區間的上下限兩端靠近 (對於Sigmoid函數來說,意味著激活輸入值WU+B是大的負值或正值),所以這 導致反向傳播時低層神經網路的梯度消失 ,這是訓練深層神經網路收斂越來越慢的 本質原因 , 而BN就是通過一定的規范化手段,把每層神經網路任意神經元這個輸入值的分布強行拉回到均值為0方差為1的標准正態分布 ,其實就是把越來越偏的分布強制拉回比較標準的分布,這樣使得激活輸入值落在非線性函數對輸入比較敏感的區域,這樣輸入的小變化就會導致損失函數較大的變化,意思是 這樣讓梯度變大,避免梯度消失問題產生,而且梯度變大意味著學習收斂速度快,能大大加快訓練速度。
但是接下來的問題是:如果都通過BN,那麼不就跟把非線性函數替換成線性函數效果相同了,意味著網路的非線性表達能力下降了, 所以BN為了保證非線性的獲得,對變換後的滿足均值為0方差為1的x又進行了scale加上shift操作(y=scale*x+shift), 每個神經元增加了兩個參數scale和shift參數,這兩個參數是通過訓練學習到的,意思是通過scale和shift把這個值從標准正態分布左移或者右移一點並長胖一點或者變瘦一點,每個實例挪動的程度不一樣,這樣等價於激活前的值經過標准正太分布歸一化後再從正中心周圍的線性區往非線性區動了動。核心思想應該是想找到一個線性和非線性的較好平衡點,既能享受非線性的較強表達能力的好處,又避免太靠非線性區兩頭使得網路收斂速度太慢
Batch Normalization 好處:(1)提高了訓練速度,收斂速度也大大加快(2)另外調參過程也簡單多了,對於初始化要求沒那麼高,而且可以使用大的學習率等 (3)可以防止梯度消失(4)BN類似於Dropout的一種防止過擬合的正則化表達方式,可以有效防止過擬合,不用太依賴dropou和正則化
以下情況最好不要使用BN:(1)數據不平衡(2)batch_size太小
batch_size是機器學習中的一個重要參數,決定了梯度下降的方向,如果數據集比較小,完全可以採用全數據集的形式計算梯度,由全數據集確定的梯度方向能夠更好地代表樣本總體,從而更准確地朝向極值所在的方向。對於大型數據集則需要使用mini-batch_size,因為隨著數據集的海量增長和內存限制,一次性載入所有的數據進來變得越來越不可行。
當batch_size=1,即在線學習,模型難以達到收斂 。
合理增加batch_size好處 :
(1)內存利用率提高了,大矩陣乘法的並行化效率提高
(2)跑完一次 epoch(全數據集)所需的迭代次數減少,對於相同數據量的處理速度進一步加快。
(3)在一定范圍內,一般來說 Batch_Size 越大,其確定的下降方向越准,引起訓練震盪越小
盲目增大 Batch_Size 壞處 :
(1)內存利用率提高了,但是內存容量可能撐不住了
(2)跑完一次 epoch(全數據集)所需的迭代次數減少,要想達到相同精度所需要的 epoch 數量越來越多,花費的時間越長
(3)大的batchsize收斂到sharp minimum,而小的batchsize收斂到flat minimum,後者具有更好的泛化能力。
總之batchsize在變得很大(超過一個臨界點)時,會降低模型的泛化能力。在這個臨界點之下,模型的性能變換隨batch size通常沒有學習率敏感
目標所在的真實框(ground truth) 與演算法預測的目標所在的框(bounding box)的交集與並集的比值,我們會用IOU閾值來判定預測的bounding box是否有效。一般閾值會設定在0.5,當IOU的值大於等於0.5時,我們會把這個預測的bounding box 歸為正類,而小於0.5的歸為負類。
牛頓法使用的是目標函數的二階導數,在高維情況下這個Hessian(n*n維度)矩陣非常大,計算復雜度是n*n,計算和存儲都是問題
(1) 通過控制卷積核個數實現升維或者降維,從而減少模型參數和計算量
(2) 用於不同channel上特徵的融合
(3)1x1的卷積相當於全連接層的計算過程,並且加入了非線性激活函數,從而增加了網路的非線性,使得網路可以表達更加復雜的特徵。
它能夠把輸入的連續實值變換為0和1之間的輸出,如果是非常大的負數,那麼輸出就是0;如果是非常大的正數,輸出就是1
缺點:
(1)函數的飽和區,導致梯度幾乎為0,造成梯度消失問題
(2)Sigmoid 的 output 不是0均值,具體解釋見 https://blog.csdn.net/tyhj_sf/article/details/79932893
(3)其解析式中含有冪運算,計算機求解時相對來講比較耗時。對於規模比較大的深度網路,這會較大地增加訓練時間。
它解決了Sigmoid函數的不是零均值輸出問題,然而,梯度消失(gradient vanishing)的問題和冪運算的問題仍然存在。
(1)在正區間解決了梯度消失的問題
(2)函數簡單,計算速度快,收斂速度遠快於sigmoid和tanh
缺點:
(1)Relu函數輸出不是0均值
(2)神經元壞死問題:指的是某些神經元可能永遠不會被激活,導致相應的參數永遠不能被更新,有兩個主要原因導致這種狀況發生
(1) 非常不幸的參數初始化,這種情況比較少見
(2) learning rate太高導致在訓練過程中參數更新太大,不幸使網路進入這種狀態。解決方法是可以採用Xavier初始化方法,以及避免將learning rate設置太大或使用adagrad等自動調節learning rate的演算法
為了解決ReLU函數帶來的神經元壞死問題 , 提出了將ReLU的前半段設為αx,α通常設為0.01,,另外一種直觀的想法是基於參數的方法PReLU函數, α可由方向傳播演算法學習出來。
ELU也是為解決ReLU存在的問題而提出,顯然,ELU有ReLU的基本所有優點,以及:(1)不會有神經元壞死現象(2)函數輸出均值接近於0
但是ELU的小問題就是計算量稍微有點大。
1、使用不同的激活函數,比如Relu,Leak-Relu,PRelu,elu等激活函數代替sigmoid函數
2、使用Batch Normalizaion(批量歸一化)
3、使用殘差網路
4、預訓練加微調
1、梯度裁剪
2、權重正則化
兩個3x3的卷積核的感受野比5x5的卷積核的感受野大,在保持相同感受野的同時,用3x3的卷積核可以提升網路的深度,可以很明顯的減少計算量。
1、局部連接
2、權值共享:減小參數量
3、池化操作:增大感受野
4、多層次結構:可以提取low-level以及high-level的信息
1、數據集太小,數據樣本不足時,深度學習相對其它機器學習演算法,沒有明顯優勢。
2、數據集沒有局部相關特性,目前深度學習表現比較好的領域主要是圖像/語音/自然語言處理等領域,這些領域的一個共性是局部相關性。圖像中像素組成物體,語音信號中音位組合成單詞,文本數據中單片語合成句子,這些特徵元素的組合一旦被打亂,表示的含義同時也被改變。對於沒有這樣的局部相關性的數據集,不適於使用深度學習演算法進行處理。舉個例子:預測一個人的健康狀況,相關的參數會有年齡、職業、收入、家庭狀況等各種元素,將這些元素打亂,並不會影響相關的結果。
作用 :對輸入的特徵圖進行壓縮,
一方面使特徵圖變小,簡化網路計算復雜度;
一方面進行特徵壓縮,提取主要特徵。
通常來講,max-pooling的效果更好,雖然max-pooling和average-pooling都對數據做了下采樣,但是 max-pooling感覺更像是做了特徵選擇,選出了分類辨識度更好的特徵,提供了非線性 。 pooling的主要作用一方面是去掉冗餘信息,一方面要保留feature map的特徵信息,在分類問題中,我們需要知道的是這張圖像有什麼object,而不大關心這個object位置在哪,在這種情況下顯然max pooling比average pooling更合適。在 網路比較深的地方,特徵已經稀疏了,從一塊區域里選出最大的,比起這片區域的平均值來,更能把稀疏的特徵傳遞下去 。
average-pooling更強調對整體特徵信息進行一層下采樣,在減少參數維度的貢獻上更大一點,更多的體現在 信息的完整傳遞這個維度 上,在一個很大很有代表性的模型中,比如說DenseNet中的模塊之間的連接大多採用average-pooling,在減少維度的同時,更有利信息傳遞到下一個模塊進行特徵提取。
average-pooling在 全局平均池化操作 中應用也比較廣,在ResNet和Inception結構中最後一層都使用了平均池化。有的時候在模型接近 分類器的末端使用全局平均池化還可以代替Flatten操作 ,使輸入數據變成一位向量。
CNN網路中另外一個不可導的環節就是Pooling池化操作,因為Pooling操作使得feature map的尺寸變化,假如做2×2的池化(步長也為2),假設那麼第l+1層的feature map有16個梯度,那麼第l層就會有64個梯度,這使得梯度無法對位的進行傳播下去。其實解決這個問題的思想也很簡單,就是把1個像素的梯度傳遞給4個像素,但是需要保證傳遞的loss(或者梯度)總和不變。根據這條原則,mean pooling和max pooling的反向傳播也是不同的
mean pooling的前向傳播就是把一個patch中的值求取平均來做pooling,那麼反向傳播的過程也就是把 某個元素的梯度等分為n份分配給前一層,這樣就保證池化前後的梯度(殘差)之和保持不變 ,圖示如下 :
(2) max pooling
max pooling也要滿足梯度之和不變的原則 ,max pooling的前向傳播是把patch中最大的值傳遞給後一層,而其他像素的值直接被舍棄掉。那麼 反向傳播也就是把梯度直接傳給前一層某一個像素,而其他像素不接受梯度,也就是為0。 所以max pooling操作和mean pooling操作不同點在於需要記錄下池化操作時到底哪個像素的值是最大,也就是max id,這個變數就是記錄最大值所在位置的,因為在反向傳播中要用到,那麼假設前向傳播和反向傳播的過程就如下圖所示 :
28、細粒度分類
29、LSTM&RNN
30、解釋LSTM結構(相對於RNN)的好處
31、RNN的梯度消失原因和解決辦法
32、Object Detection
33、Unet的介紹
34、FCN和Unet的區別
35、RCNN系列的演算法流程和區別
36、Fast RCNN中 bbox 回歸的損失函數什麼
37、解釋 ROI Pooling 和 ROI Align
38、Mask RCNN中 mask branch 如何接入 Faster RCNN中
39、解釋 FPN
40、解釋 ROI Align
41、簡述 YOLO 和 SSD
42、簡述 Hough 直線檢測、Sobel 邊緣檢測演算法流程
43、Mask RCNN中的anchors如何判定為正負樣本
44、簡述 NMS 演算法流程
45、attention起源是用在哪裡?pixel還是frame,是soft還是hard
46、anchor的正負樣本比是多少
47、演算法和激活函數等
48、BN的原理和作用
49、BN層反向傳播,怎麼求導
50、BN 的作用和缺陷,以及針對batch_size小的情況的改進(GN)
51、BN層,先加BN還是激活,有什麼區別
52、手推BP
53、優化演算法舉例和他們的區別(SGD、SGDM、RMSprop、Adam)
54、隨機梯度下降和梯度下降
55、訓練不收斂的原因有哪些
56、簡述 SVM 流程、核函數尋參及常見的核函數舉例
57、batch_size 和 learning rate 的關系(怎麼平衡和調整二者)
58、解釋過擬合和欠擬合,以及解決方法
59、激活函數有哪些,各自區別
60、損失函數有哪些
61、Sigmoid 和 ReLu 對比(各自優缺點)
62、為什麼不用sigmoid而用relu?做出了哪些改進?
63、梯度消失和梯度爆炸的原因和解決方法
64、Precision 和 Recall 的定義
65、精確率高、召回率低是為什麼
66、SVM,線性回歸和邏輯回歸的原理及區別
67、PCA原理,PCA和SVD的區別和聯系
68、正則化怎麼選擇,有哪些方式
69、L1、L2范數,區別
70、boost、Adaboost
71、dropout和batch normalization
72、講一下決策樹和隨機森林
73、講一下GBDT的細節,寫出GBDT的目標函數。 GBDT和Adaboost的區別與聯系
74、偏差、方差
75、距離度量公式哪些,區別
76、多標簽識別怎麼做
77、data argumentation怎麼處理的
78、數據不均衡怎麼處理、只有少量帶標簽怎麼處理
79、權重初始化方法都有哪些
80、權值衰減這個參數怎麼設置
81、分類問題有哪些評價指標?每種的適用場景。
82、無監督學習了解哪些
83、圖像處理Opencv
84、邊緣檢測運算元有哪些
85、霍夫變換
86、直方圖是什麼
87、canny運算元是怎麼做的
88、圖像的特徵提取有哪些演算法,適用范圍、優缺點
參考:
https://blog.csdn.net/bluesliuf/article/details/89389117
https://zhuanlan.hu.com/p/107279000
https://zhuanlan.hu.com/p/56475281