為什麼深度學習模型準確率不會提昇?
去年(2016)五月看到了一場由資料科學年會舉辦 李宏毅老師主講 一日搞懂深度學習 課程的投影片後,我就試著照上面的步驟透過 Keras 建構了我第一個深度學習模型。起初使用了 Sigmoid 作為激勵函數後獲得了 94% 左右的成果,但是當我改用理論上比較好 ReLU 後,卻發現 為什麼訓練出來的準確率(accuracy)都不會增加?
資料集(Dataset)
299.875 134.053 286.55 138.837 1 0 0 0 0 0 0 0 0
298.537 135.013 280.65 138.206 1 0 0 0 0 0 0 0 0
295.098 135.445 301.397 139.94 1 0 0 0 0 0 0 0 0
294.603 132.883 302.374 138.732 1 0 0 0 0 0 0 0 0
292.741 132.936 301.714 139.08 1 0 0 0 0 0 0 0 0
289.519 133.433 273.896 133.788 1 0 0 0 0 0 0 0 0
280.778 130.909 269.715 131.206 1 0 0 0 0 0 0 0 0
279.026 130.293 285.542 126.976 1 0 0 0 0 0 0 0 0
271.298 133.113 292.84 130.301 1 0 0 0 0 0 0 0 0
260.927 132.269 285.263 130.401 1 0 0 0 0 0 0 0 0
我使用的 資料集 是當初大學專題的內容,前面四項是來自四個不同的關節彎曲角度,後面則是分類成九個不同的類別。
模型(Model)
# input layer
model = Sequential()
model.add(Dense(input_dim=4, units=1000))
model.add(Activation('relu'))
# hidden layers
model.add(Dense(units=1000))
model.add(Activation('relu'))
model.add(Dense(units=1000))
model.add(Activation('relu'))
# output layer
model.add(Dense(units=9))
model.add(Activation('softmax'))
每層有 1000 個神經元,不含輸出層共三層,但是激勵函數使用 sigmoid 時可以有 94%準確率,而使用 ReLU 時卻只有 11%且不會提昇的準確率,這跟投影片上的狀況完全相反,到底是為什麼呢?
為什麼準確率不會提昇?
看了投影片以後其實還有許多不懂的地方,所以七月加開一次課程時,我就報名了那次課程,雖然課後找李老師請教了一下這問題,但是因為李老師當時趕時間沒辦法詳談,對於這問題他也不清楚為什麼會這樣。之後我又參加了一堂 手把手的深度學習實務 課程,在課程中講師提到了一點就徹底解決了我這個問題。
低維度的資料如果擴展到過多的神經元,其實這資料無法提供足夠多的細節,也因此造成了許多無用、重複的數據。
以這狀況來說,我只有輸入四個維度的資料,但是要擴展到每層 1000 個神經元中其實太過於勉強,所以我決定一個 Delete 按下去,把每層 1000 個神經元縮減到 16 個神經元。
# input layer
model = Sequential()
model.add(Dense(input_dim=4, units=16))
model.add(Activation('relu'))
# hidden layers
model.add(Dense(units=16))
model.add(Activation('relu'))
model.add(Dense(units=16))
model.add(Activation('relu'))
# output layer
model.add(Dense(units=9))
model.add(Activation('softmax'))
縮減後的結果非常驚人,不僅準確率會提昇、成果更好,更重要的是考試都考一百分了 。
總結
有時候不是模型大、模型深就是會比較好,甚至在資料量少的狀況下可能還比不上傳統的機器學習方法,因此根據不同的狀況做適當的設計才是最好的選擇。
另外有些人會誤認這種情形是 過擬合(Overfitting),但是 Overfitting 應該是訓練準確率提昇後,實際上驗證/測試的準確度卻是下降的,因為模型過度訓練到適合訓練資料集,反而不適合其他資料。而這個狀況中一開始準確率就沒有提昇,就是模型設計上有問題。
之前看過一個笑話,內容說訓練簡單的「深度學習」模型,很多時候只是在堆積木、試模型而已,但是背後還是有很多的東西需要學習。
最後附上 完整訓練程式