以下內容有任何不理解可以翻看我之前的博客哦:吳恩達deeplearning.ai專欄
學習曲線是一種圖形表示方法,用于展示模型在訓練過程中的學習表現,即模型的訓練集和驗證集上的性能如何隨著訓練時間的增加而變化。可以幫助我們了解模型的學習進度。
文章目錄
- 學習曲線
- 線性回歸方程為例
- 一個理想的學習曲線
- 高偏差時的學習曲線
- 高方差時的學習曲線
- 決定下一步做什么
- 大型神經網絡帶來對于偏方差的新解決方法
- 解決神經網絡過大問題
- 代碼實現
學習曲線
線性回歸方程為例
我們以以下方程為例:
f w , b ( x ) = w 1 x + w 2 x 2 + b f_{w,b}(x)=w_1x+w_2x^2+b fw,b?(x)=w1?x+w2?x2+b
一個理想的學習曲線
然后我們可以繪制其學習曲線,橫坐標為訓練集的大小(也可以理解為epoch的次數),縱坐標為training set以及validation set的價值函數值,你擬合出來的圖像很有可能是這樣子的:
可以看出,隨著training set的增大, J t r a i n J_{train} Jtrain?逐漸上升,而 J c v J_{cv} Jcv?逐漸減小,這其實是容易理解的。當數據的量很少時,我們的擬合曲線很容易通過所有的點,此時training set上的損失值就比較小甚至為0,但是此時模型的泛化程度就肯定很低了,因此在cv set上的損失就會很大。而隨著數據量的增加,擬合曲線就很難通過所有的點了,因此此時的 J t r a i n J_{train} Jtrain?
必然就會上升,而因為模型接受的數據多了, J c v J_{cv} Jcv?便漸漸減小,直到數據量足夠多時二者就都趨于穩定并且比較接近。
高偏差時的學習曲線
如果在你的算法的擬合下,最后的結果是高偏差的,那么它的學習曲線會具有一定的特點:
J c v J_cv Jc?v和 J t r a i n J_train Jt?rain二者的關系是不太變化的,但是于之前不同的是你的代價函數值會明顯高于你的預期值(如圖所示),而且隨著數據量的增加,最后的代價函數值仍然處于一個穩定的范圍,并不會隨著數據量的增加而使得模型的效果變好。因此,如果你的模型出現了高偏差的情況,不要著急著去增加數據量,此時更好的選擇應該是優化你的算法。
高方差時的學習曲線
如果在定義你的代價函數的時候, λ \lambda λ設置得過小,那么此時容易出現過擬合的現象,此時容易出現的情況就是低偏差高方差,難以泛化:
在這種情形之下,一開始的 J t r a i n J_{train} Jtrain?會極小(過擬合),甚至比人類表現的代價還要小。而模型的泛化能力極弱,最終會導致 J c v J_{cv} Jcv?很大,但這種情況有個好處,就是隨著數據量的增大,最后 J c v J_{cv} Jcv?會降低到合適的水平,接近于人類水平,雖然 J t r a i n J_{train} Jtrain?上升但是也不會超過人類水平很多。
總之,在訓練神經模型的時候,繪制其學習曲線能夠很好地幫助你直到下一步該如何調整模型,但是缺點就是你如果實驗多個模型,對算力是個很大的考驗,可能會非常昂貴。但即使你無法真實地繪制出這個曲線,你也可以利用這種思想在腦海中形成一個虛擬圖像,幫助你提高模型效果。
決定下一步做什么
在了解了以上這些概念之后,我們在模型遇到困難時應該了解了一些努力的方向了。現在我們還是用以前的例子,看看如何綜合利用之前的方法:
你已經完成了一個關于房價預測的線性回歸模型,代價函數如上圖,但是預測的時候出現了一些錯誤的預測,你下一步該做什么呢?
以下是一些常見的選擇:
——獲得更多的訓練數據
——嘗試使用更少的特征
——嘗試獲得更多的特征
——添加多項式特征
——嘗試增大 λ \lambda λ
——嘗試減小 λ \lambda λ
事實上,以上的六個方法都有可能減少偏差和方差,這取決于你具體的應用場景,我們來依次分析。
對于第一個方法:如果你的算法具有高方差,比如算法對于過小的數據集過度擬合,那么確實可以通過添加更多訓練數據對模型提供很大的幫助,但是如果是高偏差,那么這個方法幫助就很小了。
對于第二個方法:如果你的算法具有很多的特征,那么這將賦予算法很高的靈活性,從而無法適應更加復雜的模型。如果你懷疑你的算法具有很多意義不明的特征或者冗余的特征,可以嘗試采用這種方法。從而可以降低過擬合的發生(用于解決高方差的發生)。
對于第三個方法:這個就比較明顯了,可以用于解決高偏差的問題。
對于第四個方法:如果你是線性函數,三線可以很好地擬合訓練集,那么添加額外的多項式特征可以幫助你在訓練集做得更好,用于解決高偏差問題。
對于第五個方法:以前的博客詳細介紹過,用于解決高偏差問題。
對于第六個方法:同理,解決高方差問題。
總結如下:
大型神經網絡帶來對于偏方差的新解決方法
在上面我們提到了解決偏差與方差的一般方法,但是大型神經網絡與大數據為解決此類問題提供了新的思路。
在神經網絡出現之前,機器學習工程師經常需要考慮的問題就是偏差方差權衡,因為模型簡單,就會導致高偏差,而模型復雜,就會導致高方差,兩者是矛盾的,因此常常需要在二者之中找到一個平衡點:
但是,神經網絡和大數據的出現改變了這種情況。
事實證明,在小中規模的數據集上訓練大型神經網絡是低偏差機器,即只要你的神經網絡足夠大,那么就一定可以很好地擬合數據,因此我們可以根據需要來增加或減小偏差方差(水多加面面多加水法):
即你先訓練了一個神經網絡,如果在訓練集表現不佳,那么就構建更大的神經網絡,如果在cv表現不佳,那么就加更多的數據,直到達到你需要的平衡。這種方法的缺點就是對算力的要求很高,因此隨著近些年硬件的發展,神經網絡才能獲得足夠的算力從而長足發展。
解決神經網絡過大問題
如果你感覺你的神經網絡過大了,擔心會不會導致過度擬合,怎么辦勒。
事實證明,精心選擇的大型正則化網絡往往與較小的神經網絡一樣好甚至更好。因此如果模型大了,那就好好正則化吧,這樣也能夠達到你想要的效果。另一種說法是,只要你好好正則化,大型的神經網絡幾乎不會比小模型差。當然大型神經網絡要求的算力必然很高,會拖慢運算速度。
代碼實現
之前我們創建神經網絡的代碼是這樣的:
layer_1 = Dense(units=25, activation='relu')
layer_2 = Dense(units=15, activation='relu')
layer_1 = Dense(units=1, activation='sigmoid')
model = Sequential([layer_1, layer_2, layer_3])
如果要添加正則化項:
layer_1 = Dense(units=25, activation='relu', kernel_regularizer=L2(0.01))
layer_2 = Dense(units=15, activation='relu', kernel_regularizer=L2(0.01))
layer_1 = Dense(units=1, activation='sigmoid', kernel_regularizer=L2(0.01))
model = Sequential([layer_1, layer_2, layer_3])
為了給讀者你造成不必要的麻煩,博主的所有視頻都沒開僅粉絲可見,如果想要閱讀我的其他博客,可以點個小小的關注哦。