96分的模型跑出69分的效果,誰該背鍋?
AI圈內流行著這麼一件事情:跑分。
所謂跑分,就是各家開發者拿著自己訓練出來的模型,在某個數據集(比較權威的包括人臉數據集FDDB、LFW等)上進行測試,獲得諸如準確率、召回率等一些性能指標,再綜合計算出一個分數來代表模型的性能。
在權威的數據集上跑出高分,既是一種榮譽,也是開發者實力的體現。各家的模型在跑分時,不時會出現諸如99.5、99.7這樣的高分,似乎這些模型的能力已經逆天,完全可以大顯神通了。
然而事實的情況是,在絕大多數實際場景下,開發出基本可用的模型已然是不小的挑戰,即便讓這些高分模型上場,表現沒準兒也不比「人工智障」好多少。
(很好的文章,建議看看)
#脫離數據集談性能是耍流氓#
上面的事實儘管詭異,但真相只有一個:數據集。
跑分所用的數據集一般都是標準數據集,即便開發者事先不知道其中到底有哪些測試數據,通過各種消息渠道與經驗分析,也能大概知道數據集的整體「風格」(更何況有些數據集本來就是公開的)。
所以,開發者們在訓練時選用的數據就會盡量去迎合測試數據的「風格」,跑出來的分數自然會好看。而在實際的任務中,可能遇到的數據比跑分的時候複雜得多,而且很難提前預知。
比如人臉識別,實際任務中可能會遇到不同人種不同年齡的人在不同環境(強光、昏暗等)不同狀態(表情、側身、移動等)下的圖像數據,而希望找到一個訓練數據集可以囊括如此多變的情況是很艱難的。在這樣的情況下測得的模型指標自然會大打折扣。
新司機說過,用單一性能指標的優秀證明模型的出色是在耍流氓(參考歷史文章《他說自己的識別演算法準確率98%,這話有什麼瑕疵?》)。而這樣的流氓還有另外一種耍法,就是脫離數據集談模型的性能。
一般來講,測試數據與訓練數據一致性高,模型就會擁有更好的性能表現;就好比考試題目和作業題目類似,大家都能考高分,而脫離了考試內容單純關注試卷分數並不能真正了解一個人的實力。
#訓練、驗證與測試#
在模型訓練的調參過程中(參考歷史文章《幫我做個Demo吧,5分鐘~》),會用不同的演算法參數訓練出多個不同的模型,然後採用一些性能指標來比較這些模型,從而確定最優的演算法參數。那麼問題來了,這些模型的性能指標又是基於什麼數據集來測出的?
訓練開始之前,我們會根據實際任務收集一批數據D。這批數據會被隨機分為兩部分D1與D2,D1(稱為「訓練集」)用來訓練模型,D2(稱為「驗證集」)則用來測試用D1訓練出的模型的一系列指標(稱為「驗證」)。調參所用到的就是基於驗證集所得出的模型性能指標。
在實踐中,往往把數據集D隨機分為10份D1~D10,選出其中一份作為驗證集,其餘作為訓練集(稱為「十折交叉驗證」)。如此輪流10次,依次將D1~D10作為驗證集,得到在某種演算法參數下訓練出的10個不同模型與其相應的性能,並記錄下這10個模型的性能指標的均值。對於不同的演算法參數,只需要比較它們所對應的性能均值即可做出優劣判斷。
(十次十折交叉驗證)
選定了演算法參數後,一般會用整個數據集D作為訓練集重新訓練得到最終的模型。對於最終的模型,會根據實際任務場景,選用一些D以外的數據作為測試集進行性能測試。這樣測試得到的性能往往是就是開發者所對外宣布的。
顯然,選用不同的測試集會得到不同的性能,測試集的數據是否真的能夠反映實際任務也決定了得到的性能指標的有效性。
#偏差、方差與數據錯配#
模型之不如意十之八九,辛辛苦苦訓練出來的模型放到實際任務中出鍋也是常事,關鍵在於如何解決問題。
然而決定一個模型性能的因素太多了,比如模型的類型是否合理、演算法是否合適、數據質量如何、數據量是不是足夠等等,漫無目的的嘗試就是一場災難。這就需要對模型的誤差進行分解。
模型的誤差可以分解為偏差、方差與雜訊三者之和。偏差刻畫了學習演算法本身的能力,方差刻畫了訓練數據的擾動所造成的影響,雜訊則刻畫了當前的學習任務本身的難度。
所以,模型的性能是由學習演算法的能力、數據的充分性以及學習任務本身的難度共同決定的。對於給定的學習任務,我們一般只關注偏差與方差。
在實踐中,一般用模型在訓練集上的性能代表偏差,用模型在驗證集上的性能與其在訓練集上性能的差別代表方差。
如果訓練出一個模型,在訓練數據上的性能都不好(偏差大),那說明選用的模型和演算法本身就沒戲,至少不符合當前任務,需要更換。
如果模型在訓練集上表現不錯,但在驗證集上的表現較差(方差大),即模型在「見過」的數據上性能不錯,但在「沒有見過」的同分布數據上性能較差,說明要麼沒有學到足夠多的數據背後的規律(欠擬合),要麼將訓練數據中一些局部的規律當作全部數據的整體規律(過擬合)。這時就需要增加訓練數據量(解決過擬合)並調整演算法的參數(解決欠擬合與過擬合)。
(過擬合與欠擬合)
即便一個模型在訓練集與驗證集上表現都不錯,它也完全有可能在實際場景的測試中表現很差。這是因為用於訓練和驗證的數據和實際場景中所遇到的數據的分布可能差別很大,二者屬於不同的「風格」(稱為「數據錯配」)。這時就需要重新研究任務場景,並收集與場景相符合的數據進行訓練。
#總結#
同樣的模型在不同數據集上進行測試,所得到的性能千差萬別,拋開數據集談模型的性能就是耍流氓。
模型的性能主要由演算法的能力以及訓練數據的充分性所決定,在實踐中還會受到數據錯配的影響。
如果說收集足夠的數據採用合適的演算法是研發人員的任務,那麼分析實際場景,為數據的收集給出最適合場景的建議來避免數據錯配,則是對AI產品經理的考驗。
最後,照例奉上一張圖作為總結。
歡迎關注微信公眾號「AI從入門到xx」,用一看就懂的語言分享AI知識與見解。
推薦閱讀: