深度學習模型設計經驗分享

2021-09-11 09:06:03 字數 3407 閱讀 7086

suo.im/5o3jws

本次演講將從資料準備、模型結構、優化方法、計算效能這四個方面,來**深度學習模型設計的一些經驗。

以個人經驗來看,一般性的研發流程大致可分為8步。

問題分析,確定需求

資料分析,確定現有資料的價值(主要依據特徵及分布)

特徵抽取,根據資料的價值和需要解決的問題,確定特徵

資料準備,在前三步都完成的情況下,準備訓練集、測試集合、驗證集合

模型分析,根據問題的輸入和輸出,確定選擇的模型

引數訓練,不斷迭代模型直至收斂

驗證調優,驗證模型的各項指標,使模型達到最佳狀態

整個流程中,模型設計的動機和目標非常重要。其中包括需求與問題的定義、建立問題的數學模型、確定資料與求解問題之間的關係、探索問題解的可能性、目標的可實現性與可評估性。

對於模型設計首先要有充分的資料,分為兩個層面。第一是資料特徵,用於確定能否達成模型設計的目標,特徵應當具備一定的「因果關係」,分布要有「導向性」。第二資料集應當盡可能多,dnn需要大量的資料,而且模型在小的資料集上容易過擬合。建議如果條件允許可以嘗試擴充套件原始的資料集合。

資料預處理對很多業內人員來說是個令人頭疼的問題,針對不同場景有不同的解決方案。

簡單介紹幾種常見的方式。首先是去均值處理,即用原始資料減去全部資料的均值,把輸入資料各個維度的資料都中心化為0。去均值處理後,特徵雖然明顯了,但是特徵之間的相互比較性尚未明確,因此要用到歸一化處理,把每個維度上的資料都除以這個維度上的資料的標準。另外還有一種適使用於影象處理的方式pca/whiteing(白化),影象中相鄰畫素點之間的特徵極為相似,無法輕易做到收斂。而pca可以去除這些相鄰特徵的相關性,達到快速收斂的目的。

每次epoch的時候都會有很多的batch,一般情況下這些batch都是相同的,但理想狀態是每次epoch都有不同的batch。因此如果條件允許就應該在每次epoch的時候shuffle(隨機化)一次,以獲取不同的batch。

bp神經網路對於單層的感知器網路新增了隱藏層,隱藏層數量的選擇目前還不具備理論支援。

在多層感知器中,確定的是輸入和輸出層中的節點數量,隱藏層節點數量是不確定的,並對神經網路的效能有影響。對此我們可以使用經驗公式來計算

h表示隱藏層數量,m是輸入層,n是輸出層,a為取值1~10的範圍值。最後h的結果也在乙個範圍值內,一般建議取該範圍中為2的n次方的值。

權重合理初始化能夠提公升效能並加快訓練速度,對於權重而言,建議統一到一定區間內。

線性模型區間建議為[-v, v],v=1/sqrt(輸入層尺寸),sprt表示開根號。卷積神經網路的區間和公式同樣類似,不過最後的輸入層尺寸要改為卷積核的寬度*卷積核的高度*輸入深度。

sigmoid以及tanh函式的代價非常昂貴,容易飽和從而導致梯度消失,並且可能會停止方向傳播。實際上,網路模型的層級結構越深,就越應避免使用sigmoid和tanh函式。可以使用更簡單而且更高效的relu和prelu的啟用函式。

relu是非常有用的非線性函式,可以解決很多問題。不過由於relu阻礙反向傳播,初始化不好,所以用它微調模型的時候,沒法得到任何微調效果。建議使用prelu以及乙個非常小的乘數(通常為0.1),這樣收斂會更快,而且不會像relu那樣在初始化階段被卡住。此外elu也很好,但成本較高。

實際上relu是maxout的一種特例。maxout是乙個可以學習的啟用函式,主要工作方式是選擇每組中最大的數作為輸出值。如下圖,以兩個元素為一組,5和7,-1和1,最終得到7和1。

模型過擬合相信很多人都遇到過,也由此引出了很多問題,不過從另乙個及角度來看過擬合是有必要存在的——可以用它來做模型的驗證。因為複雜模型下大規模樣本的訓練需要耗費大量的時間,從而導致開發成本上公升。

我們可以在使用全量資料集上訓練之前,先在隨機抽樣的子集上進行過擬合驗證,如果過擬合現象發生,則可以推斷網路模型收斂的可能性較高。

loss的設計要注重其合理性,簡單直接的體現模型的終極目標,有合理的梯度,能夠被求解。另外不要過於關注accuracy(評測指標),而忽視了訓練過程中loss的設計。

已知調節學習速率也能帶來效果的提公升,上圖是不同速率下loss曲線的情況,很明顯最優的速率應該是讓loss曲線平滑向前(紅色曲線)。在對學習速率進行調參的時候可以參考這張圖。

幾個小的卷積核疊加在一起,相比乙個大的卷積核,與原圖的連通性不變,但卻大大降低了引數的個數以及計算複雜度。因此我們推薦「小而深」的模型,避免「大而短」。小的卷積核還能代替大的卷積核,比如乙個5*5的卷積核可以用兩個3*3的卷積核代替,乙個7*7的卷積核可以用三個3*3的卷積核代替。

學習率與訓練步驟、batch大小和優化方法都有耦合關係,常見的優化方案是自適應學習速率(rmsprob、momentum、adam等),使用自適應優化演算法,自動更新學習速率。也可以使用sgd手動選擇學習率和動量引數,此時隨著時間的推移學習率會降低。實際使用中,自適應優化傾向於比sgd更快收斂,最終表現通常相對較差。

一般而言,對於高效能訓練較好的做法是從adam切換到sgd。不過由於訓練的早期階段是sgd對引數調整和初始化非常敏感的時候,因此可以使用adam進行最初的訓練,這樣不僅節約時間,且不必擔心初始化和引數調整。當adam執行一段時間後,再切換到sgd加動量優化,以達到最佳效能。

當然對於稀疏資料,建議應盡量使用學習可自適應的優化方法。

通常卷積神經網路的卷積層的weight視覺化出來會具備smooth的特性。下面兩者圖都是將乙個神經網路的第一層卷積層的filter weight視覺化出來的效果。如果出現左邊的這種情況,可能就需要考慮下模型有哪些地方設計的有問題。

計算平台有兩個重要的指標,算力和頻寬。算力表示計算平台的效能上限,指的是乙個計算平台傾盡全力每秒鐘所能完成的浮點運算數,單位是flop/s。頻寬指的是計算平台傾盡全力每秒鐘所能完成的記憶體交換量,單位是byte/s。算力除以頻寬可得到計算平台的強度上限,即單位記憶體交換最多用來進行多少次計算,單位是flop/byte。

模型同樣有兩個重要指標,計算量和訪存量。計算量指的是輸入單個樣本,模型進行一次完整的前向傳播所發生的浮點運算個數,也即模型的時間複雜度,單位是flops。訪問量指的是輸入單個樣本,完成一次前向傳播過程中發生的記憶體交換量,即模型的空間複雜度,資料型別通常為float32。

我們來看乙個模型計算效能示例。假設有兩個矩陣a、b,它們均是1000*1000,資料型別為float32,計算c=a*b。則該計算會進行1000*1000*1000的浮點乘、加,約2g flops的計算量。該過程中會讀a、b兩個矩陣,寫c矩陣,至少要訪問三次儲存器,約12mb。

這樣簡單的1000*1000的矩陣就要花費12mb,可以想象更複雜的模型會耗費多少資源。正是基於這種對計算效能的考慮,在選擇模型的時候不一定非要選深度學習的,空間和時間的複雜度對模型也有很大的影響。在模型選擇上,可以先嘗試線性模型、樹相關的模型,不適合的話再使用傳統機器學習中的經典模型,最後才是神經網路模型。

根據我們的經驗,在單層節點數量大於256個時,無論是全連線層或卷積層都建議使用dropout。

以個人接觸過的開發者來看,很多人並不是特別重視分布式訓練,大部分情況都是單機執行高效能顯示卡,但分布式的訓練效率可能會更高些,可以考慮向這方面靠攏。

深度學習baseline模型 深度學習模型訓練流程

工作中訓練了很多的深度學習模型,目前到了上公升到方 的角度來看了。日常工作中有的人可能已經在遵循方 做事,可能自己沒有注意,有的人可能沒有遵循方 在做事,雖然可能最後的結果差不多,但花費的時間和精力應該會差別很大,當然這是我自己的感受。我們不必完全按照方 來做,但基本流程跟方 應該一致。下面的具體步...

遊戲建模師經驗分享 模型學習方法

最近通過很多師弟的交流,我發現遊戲建模初學者大多存在三個大問題,一是工具的使用不夠熟練,甚至有些功能還不知道,二是對佈線的規範沒有太大的要求和了解,三是對遊戲製作流程不清晰和板繪下的功力不夠,對貼圖製作用工少,甚至有些人還處於一直做白膜的階段 那麼對大多說想要要學遊戲建模的學習者想要學什麼 低模,高...

分享UI設計模型

ui設計模型是可重用的介面設計解決方案,可以讓開發人員少走彎路,節約不少開發時間。下面慧都小編跟大家分享6個很有用的ui設計模型資源,希望對你有用 由乙個丹麥人開發的ui模型庫,這個 不僅有很多漂亮的設計例項,還提供對ui設計中已解決問題的歸納總結,非常清晰。是由著名介面控制項開發商infragis...