1. 程式人生 > >訓練過程--訓練過程的指導性大綱

訓練過程--訓練過程的指導性大綱

訓練技巧

    1:準備資料:務必保證有大量、高質量並且帶有乾淨標籤的資料,沒有如此的資料,學習是不可能的	
    	
	2:預處理:這個不多說,就是0均值和1方差化		
	
	3:minibatch:建議值128,1最好,但是效率不高,但是千萬不要用過大的數值,否則很容易過擬合
			
	4:梯度歸一化:其實就是計算出來梯度之後,要除以minibatch的數量。這個不多解釋
			
	5:下面主要集中說下學習率		
	5.1:總的來說是用一個一般的學習率開始,然後逐漸的減小它		
	5.2:一個建議值是0.1,適用於很多NN的問題,一般傾向於小一點。		
	5.3:一個對於排程學習率的建議:如果在驗證集上效能不再增加就讓學習率除以2或者5,然後繼續,學習率會一直變得很小,到最後就可以停止訓練了。		
	5.4:很多人用的一個設計學習率的原則就是監測一個比率(每次更新梯度的norm除以當前weight的norm),如果這個比率在10-3附近,如果小於這個值,學習會很慢,如果大於這個值,那麼學習很不穩定,由此會帶來失敗。	
		
	6:使用驗證集,可以知道什麼時候開始降低學習率,和什麼時候停止訓練。		
	
	7:關於對weight初始化的選擇的一些建議:		
	7.1:如果你很懶,直接用0.02*randn(num_params)來初始化,當然別的值你也可以去嘗試		
	7.2:如果上面那個不太好使,那麼久依次初始化每一個weight矩陣用init_scale / sqrt(layer_width) * randn,init_scale可以被設定為0.1或者1		
	7.3:初始化引數對結果的影響至關重要,要引起重視。		
	7.4:在深度網路中,隨機初始化權重,使用SGD的話一般處理的都不好,這是因為初始化的權重太小了。這種情況下對於淺層網路有效,但是當足夠深的時候就不行了,因為weight更新的時候,是靠很多weight相乘的,越乘越小,有點類似梯度消失的意思(這句話是我加的)		
	
	8:如果訓練RNN或者LSTM,務必保證gradient的norm被約束在15或者5(前提還是要先歸一化gradient),這一點在RNN和LSTM中很重要。		
	
	9:檢查下梯度,如果是你自己計算的梯度。		
	
	10:如果使用LSTM來解決長時依賴的問題,記得初始化bias的時候要大一點		
	
	12:儘可能想辦法多的擴增訓練資料,如果使用的是影象資料,不妨對影象做一點扭轉啊之類的,來擴充資料訓練集合。		
	
	13:使用dropout		
	
	14:評價最終結果的時候,多做幾次,然後平均一下他們的結果		

訓練的思路

  1)使用調優過的預訓練網路
  「如果你的視覺資料和 ImageNet 相似,那麼使用預訓練網路會幫助你學習得更快」,機器學習公司 Diffbot 的 CEO Mike Tung 解釋說。低水平的卷積神經網路通常可以被重複使用,因為它們大多能夠檢測到像線條以及邊緣這些模式。將分類層用你自己的層替換,並且用你特定的資料去訓練最後的幾個層。

  2)Drop-path

  3)迴圈學習率
  自適應學習率在計算上可能是非常昂貴的,但是迴圈學習率不會這樣。使用迴圈學習率(CLR)時,你可以設定一組最大最小邊界,在邊界範圍內改變學習率。Smith 甚至還在論文《Cyclical Learning Rates for Training Neural Networks》中提供了計算學習率的最大值和最小值的方法。

  4)在有噪聲的標籤中使用 bootstrapping
  在現實中,很多資料都是混亂的,標籤都是主觀性的或者是缺失的,而且預測的物件可能是訓練的時候未曾遇到過的。

  5)採用有 Maxout 的 ELU,而不是 ReLU
  ELU 是 ReLU 的一個相對平滑的版本,它能加速收斂並提高準確度。與 ReLU 不同,ELU 擁有負值,允許它們以更低的計算複雜度將平均單位啟用推向更加接近 0 的值。

  6)歸一化實值資料。減去平均值,再除以標準差。