# 深度學習期中作業 * **MLP** 這份作業我採用的是多層感知器(Multilayer Perceptron)模型,,一開始我先做最基本的模型訓練,不添加任何額外的東西,並將預測答案存成submission.csv並繳交於kaggle中,最後得到的分數十分不理想。後續陸續添加了正則化以及train_test_split等,避免過度擬合的問題,但是仍然表現不是很好。 * **Drop out** 接著我嘗試加入drop out,但是經過多次嘗試,發現只要加入drop out,成績都會不太好,我認為是因為資料集本身只有8000筆,每筆數據都是很重要的,如果隨便drop out可能會把重要的資料丟掉,因此最後決定不加入drop out進行回歸預測。 * **ADAM & SGD** 因此我開始對參數的選用做了各種調整,首先先針對模型最後一層的優化器,先反覆比較adam和sgd兩種選擇,最後發現選擇adam會是比較好的,選擇sgd的話loss都會降不下來,可能是因為資料集很複雜,sgd每次蝶帶隨機選一個小範圍的樣本訓練來計算梯度,因此會卡在局部而無法收斂,相比之下,自適應的adam可以動態調整,所以效果上比sgd來的好很多。 * **損失函數 & linear** 因為這個題目是希望能夠預測y值,並不屬於分類或序列預測的問題,而是回歸問題,因此損失函數的選擇是使用均方誤差(MSE),而最後一層的神經網路也選用適合回歸預測的線性激活函數linear,因此接下來要做的就是比較其他層所使用的激活函數,以及神經元數量的調整。 * **激活函數的選用** 首先我先固定層數為4層並固定住神經元的數量,並調整不同層的參數進行比較,比較的成績用r_squred來判斷,並且每組數據嘗試五次,若是有離群值,則把離群值給丟掉並平均剩下的成績來做比較。 如果前三層都採用 tanh 的話,嘗試五次後,最後得到的平均Validation R^2只有 0.06,使用sigmoid時的結果為0,softmax值甚至是負的,完全不行,relu在這邊的表最好,達到了0.24的成績。另外還測試使用比較新型的elu函數的話可能會有更好的效果,但最後測出來的結果也沒有relu來的好,因此最後我選擇前面幾層都採用relu,最後一層使用linear。最後得到的成績雖然比最一開始隨便選用參數還好,但仍然不理想。 * **批次歸一化** 為了避免可能會有神經網路過深導致梯度不穩定,我試著每層結束後 加入BatchNormalization,看看會不會有更好的結果,結果加入之後反而成績變得非常差,甚至到負的。 * **殘差連接** 排除使用批次歸一化的方式後,我改成使用殘差連接的方式,將前一層的輸入添加到後一層的輸出,看看能不能解決梯度問題,最後確實得到了比原本還要好的結果,平均分數來到了0.27,但即使如此,也只是稍微改進,並不是真正的改善問題。 * **神經元數目** 最後我不斷嘗試各種各樣的神經元組合,並從中找出表現較為優異的一組如下: ![](https://i.imgur.com/f8THGAO.png) 並用該組多訓練幾次,將結果傳到kaggle。 ## 結果與討論 儘管嘗試了各種方法,並想盡辦法改進程式碼,但仍然沒辦法取得良好的訓練成果,這次的作業讓我理解到選擇模型集參數調整的困難處,希望之後可以再向老師請教此份作業該以甚麼思考點出發,來選擇該如何建立模型集訓練等,雖然很遺憾沒辦法在這次作業中取得良好的表現,但下次學習了新東西以後,我一定會將作業做到最好最完美。