神經網路模型無法正常工作時我們應該做什麼(系列)——資料預處理(Preprocess)
前言
當你進入深度學習領域,準備好深度神經網路,開始進行訓練時,遇到這樣一個大部分新手都會遇到的問題:你的神經網路沒法正常工作,而你不知道該如何去修正它。你去問你的老闆或者導師,他們也不知道該如何處理,因為在深度神經網路面前,他們和你一樣也是新手。那麼現在該如何來處理呢?
幸運的是我來啦!我列出了幾乎所有新手都會犯的錯誤,以及我自己和身邊一些學生在同樣情況下遇到過的問題:
- 沒有對資料進行標準化處理(Normalize)
- 沒有檢查結果(Results)
- 沒有對資料進行預處理(Preprocess)
- 沒有使用正則化方法(Regularlization)
- Batch Size 取值過大
- 學習率(Learning Rate)設定有誤
- 最後一層 Layer 使用了錯誤的啟用函式(Activation Function)
- 網路結構中包含了有害的梯度(Bad Gradient)
- 初始化網路權重(Network Weights)有誤
- 神經網路結構過深(Too Deep)
- 使用了錯誤數目的隱藏單元(Hidden Units)
資料預處理(Preprocess)
What?
大多數資料是難處理的,並且在我們看來大多數相同的資料可能有很多不同數字化表示方法(numerical representations)。以角色動畫研究(character animation)為例,如果我們使用角色關節相對於動作捕捉場景中心的三維位置來表示資料,那麼在不同位置面向不同方向做相同的一個動作就會得到不同的資料表示方法。而我們需要做的是以不同的方式來表示資料,例如在一個區域性座標系(local reference frame)中(比如相對於角色的中心),以便於相似的動作產生相差無幾的資料表示。
How?
仔細思考你的特徵(feature)代表了什麼——是否可以用簡單的轉換方式,使我們看起來相似的物體得到相似的資料表達。是否有一個區域性座標系,使資料在這個區域性座標系中表達起來更自然,可能是更好的色彩空間或不同的格式?
Why?
神經網路只對他們接收的資料做了一些假設——但這其中重要的假設之一就是,資料所在的空間是微連續(somewhat continuous),即處於兩個資料點中間個一個點,至少在某種程度上是兩個資料點的一種混合,並且相鄰的兩個點在某種意義上代表著“相似的”東西。資料空間中分佈著沒有連續性的資料,或者表示相同事物的資料是分離的,會使學習任務編的更加困難。
And?
另一種資料預處理的思考方式,嘗試減少所需要的資料複雜情況下的繁瑣的組合操作(combinatorial explosion of data variations)。例如,如果訓練角色動畫資料的神經網路必須為每個位置和方向的角色學習相同的一組動作,那麼網路中大量的能力就被浪費了,並且很多學習過程會被重複。