如何快速提高機器學習模型的性能

前言

本篇文章主要介紹,如何針對機器學習模型的在訓練集和開發集(驗證集)上的評估指標來使用不同的技巧快速提高模型的評估性能。針對機器學習模型的性能優化我們有很多種方式,如增大數據集、增大模型的複雜度、使用更復雜的模型架構、修改激活函數、正則化等,面對不同情況只有選擇正確的方法才能有效提高模型的性能,否則可能會造成時間的浪費,從而影響項目的開發進度。本篇文章的主要內容來至於deeplearning.ai視頻教程。

相關概念介紹

貝葉斯最優誤差(Bayes optimal error):有時候也被稱為貝葉斯誤差,是指x映射到y的理論最優函數,永遠也不可能被超越。

可避免偏差(aviodable bias):是指貝葉斯誤差與訓練誤差之間的差值。

優化策略

為什麼是人類表現?

我們經常看到很多新聞說,某個模型在圖像識別、語音識別的表現水平已經超越人類,為什麼大家都喜歡用模型與人類的表現水平做比較呢?主要有兩個原因,第一是因為隨著機器學習的發展,模型也越來越複雜,算法的表現也越來越好,在很多機器學習的應用領域可以發現算法的表現已經威脅到人類了。第二是我們使用算法構造系統的最終目的是為了代替人類的工作,讓機器能夠代替人類工作,所以拿算法和人類的表現比也就很正常了。

上圖展示的是機器學習模型準確率時間的變化的表現,其中藍色水平虛線表示的是人類的水平,綠色虛線表示的是貝葉斯最優誤差即理論上模型能達到的最優表現。在模型的訓練過程中我們發現,在模型開始訓練階段,要提升模型的準確率是比較容易的,而且提升的速度也是比較快的,當模型的性能接近或超過人類表現的時候,模型的性能就難以提升,而且提升速度也是比較慢的。

機器學習模型到後期提升速度變慢主要有兩個原因,第一,在很多任務中如圖像識別、語音識別等領域這些都是人類非常擅長的,所以人類的表現水平已經與貝葉斯的最優誤差相當接近了,所以當超過人的表現之後模型性能也沒有多大的提升空間了。第二,當模型的性能在人類水平以下的時候很多的技巧都非常有效,所以提升速度會比較快,當超過人類水平以後,這些技巧都不適用了從而導致模型的性能的提升速度變慢。

當模型表現水平低於人類的時候,通常有以下三種優化方式

增大數據集,給模型提供更多的數據人工分析誤差,當算法的表現比人類低的時候,就可以讓人來觀察模型標記錯的,分析這些錯誤的例子為什麼人的判斷是正確的而機器是錯誤的。分析模型的偏差和方差

通過與人類的表現做比較來選擇優化策略

前面介紹了,通過分析模型的偏差和方差可以用來提升模型的性能,這裡我們介紹什麼時候應該優化偏差什麼時候應該優化方差,在這裡我們用人類水平誤差來估計貝葉斯誤差。

上圖展示的是一個在一個貓狗分類的系統中,人類的誤差是1%,而系統在訓練集上的誤差是8%,在開發集(驗證集)上的誤差是10%

通過上面的數據可以發現我們的系統與人類水平還存在7%(可避免偏差)的差距,而訓練集與開發集(驗證集)只有2%(方差)的差距。可以發現,系統在可避免偏差上還存在較大的提升空間,說明模型在訓練集上還沒能很好的擬合,這時候應該考慮使用更復雜的模型,或者讓模型在訓練集上使用梯度下降在多迭代一段時間試試。

如果系統中人類的誤差不是1%而是7.5%,此時我們又該如何優化呢?

有時候可能是因為圖片本身就比較模糊,而導致人類水平的誤差是7.5%。通過計算發現,可避免偏差只有0.5%,而方差有2%。這時候我們發現,模型在方差上還有較大的提升空間,應該考慮是正則化等手段來減少系統的誤差。你可能一直想提升模型在訓練集上的表現,直到系統在訓練集上的表現接近貝葉斯誤差甚至超過,理論上是不可能超過貝葉斯誤差,除非你的模型過擬合。在本例中,從模型的提升空間考慮,我們應該先考慮減少模型的方差。

人類水平誤差

通過人類水平誤差來估計貝葉斯誤差,從而來選擇我們的優化策略中,那麼我們究竟應該如何定義人類水平誤差?

根據放射性圖片來判斷患者的病例,普通人類的錯誤率是3%,普通醫生的錯誤率是1%,而經驗豐富的醫生錯誤率只有0.7%,對於一個優秀的醫生團隊而言,當他們打成共識時錯誤率只有0.5%。那麼此時我們應該如何定義人類水平誤差呢?

在定義人類水平誤差的時候,我們應該考慮的是,我們是想利用人類水平誤差來估計貝葉斯誤差。因為我們不知道,在這個行業中是否還存在經驗更豐富的醫生或者團隊,也許他們的誤差比0.5%還要低,所以貝葉斯最優誤差不會高於0.5%。所以在這裡,我們可以選擇0.5%的誤差作為貝葉斯最優誤差,也就是人類水平誤差。有時候也許我們根本不需要把目標定的這麼高,對於商用水平可能達到普通醫生的水平就可以了,對於不同的場景可以選擇不同的人類誤差水平。

建議

最後提供一些常用減少可避免偏差和方差的方法。

減少可避免偏差:使用規模更大的模型、使用更好的算法(RMSprop、Momentum、adam)、訓練的更久、尋找更好的架構、尋找更好的參數、改變激活函數、改變隱藏層數等。

減少方差:增加更多的數據、正則化(L2、dropout)、數據增強、嘗試不同的網絡架構等。

最後,給大家推薦一個非常好的學習人工智能相關知識的平臺——微信小程序“八斗問答”,有不懂的問題可以在上面進行免費提問,還有大咖會進行詳細解答,還可以與大咖一對一諮詢。我現在也已經入駐了“八斗問答”,以後的文章在上面也會同步更新,有不懂的地方歡迎來諮詢。