---
# System prepended metadata

title: 深度學習期中作業

---

# 深度學習期中作業
* **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。

## 結果與討論
	
儘管嘗試了各種方法，並想盡辦法改進程式碼，但仍然沒辦法取得良好的訓練成果，這次的作業讓我理解到選擇模型集參數調整的困難處，希望之後可以再向老師請教此份作業該以甚麼思考點出發，來選擇該如何建立模型集訓練等，雖然很遺憾沒辦法在這次作業中取得良好的表現，但下次學習了新東西以後，我一定會將作業做到最好最完美。
