我們知道深度學習是三個步驟,首先定義一個function set和structure,之後決定Loss function,接著就可以用Grandient Descent去做最佳化。
做完這三個步驟之後就會得到一個訓練好的Neural Network,然後你要去看這個Neuron Network在你的訓練資料上有沒有得到好的結果,如果沒有,就要回去三個步驟中做修改,讓你在訓練資料上得到好的結果。
接著就要去看你的模型在測試資料上有沒有得到好的結果,如果沒有,就代表發生了Overfitting,那就要回去三個步驟中做修改,要注意的是,修改完之後要再去看在訓練資料上得到的結果還是不是好的。
並不是所有在測試資料上得到不好的結果都是Overfitting,也有可能是因為在訓練的時候沒有訓練好才導致結果不理想,因此只要對模型有修改,就要回去看在訓練資料上是不是有得到好的結果。
用不同的方法來解決不同的問題,舉例來說Dropout方法是在測試結果不好的時候使用,如果是訓練結果不好的時候使用只會越訓練越不好。
假設我們是使用Sigmoid function,從圖中可以發現Deeper不一定代表better,當層數越來越多,準確率一開始持平最後往下掉,但這不是Overfitting,因為這是在訓練資料上得出的結果,所以是模型訓練壞了。
而會這樣的原因是當你的Network很深的時候,在靠近輸入的地方Gradient很小,而在靠近輸出的地方Gradient很大,如果設定同樣的Learning rate,靠近輸入的地方參數更新就會很慢,靠近輸出的地方參數更新則會很快,就會產生輸入還是幾乎隨機的時候,輸出已經收斂了,就會以為是找到Local minimum。
從直覺上來講,我們知道某一個參數 對total cost 的偏微分,可以理解成當我把某一個參數做小小的變化,它對這個cost的影響如何,以此決定這個參數的Gradient的值有多大。
於是我們就可以把第一個layer裡面的某一個參數加上 ,然後看它的輸出跟它的目標之間的Loss有甚麼影響。
從圖中可以看到,如果 很大,通過Sigmoid function之後輸出會變小。
也就是說在輸入的地方改參數,對輸出的變化其實是很小的,對cost的影響也很小。