我們可以將最佳實踐抽象為實際的設計模式嗎?機器學習
機器學習中的設計模式
根據其定義,設計模式是對常見問題的可重用解決方案。在軟件工程中,這一概念可以追溯到1987年,當時Beck和Cunningham開始將其應用到編程中。到2000年代,設計模式(尤其是面向OOP的SOLID設計原則)被認為是程序員的常識??爝M15年,我們進入了Software 2.0的時代:機器學習模型開始在越來越多的代碼位置取代經典功能。今天,我們將軟件視為傳統代碼,機器學習模型和基礎數據的融合。這種融合需要這些組件的無縫集成,考慮到這些領域通常不同的歷史和演變,這通常并非易事。
今天,我們將軟件視為傳統代碼,機器學習模型和基礎數據的融合。
但是,尚未擴展設計模式以應對這個新時代的挑戰。在Software 2.0中,常見的挑戰不僅出現在代碼級別,而且還出現在問題定義,數據表示,訓練方法,擴展以及支持AI的系統設計的道德方面。這為實踐機器學習反模式創造了沃土。不幸的是,今天,即使是博客文章和會議,有時也會采用反模式:被認為可以改善但實際上卻使情況更糟的做法。由于反模式也需要技能,因此其從業人員通常不會認識到這種技能。因此,在下文中,我將給出兩個常見的ML挑戰示例,但我將首先介紹其解決方案反模式,而不是從設計模式入手。
該模型在評估指標上顯示出較差的性能
在常見情況下,在收集,清理和準備數據之后,工程師會訓練第一個模型,并發現該模型在測試數據上顯示出較差的性能。常見的反模式是用更復雜的模式(例如,通常是梯度增強樹)替換第一個模型,并以此來提高性能。通過例如通過模型平均來組合多個模型,該反模式的變型可以跟隨該步驟。
這些方法的問題在于它們僅關注問題的一部分,即模型,并選擇通過增加模型的復雜性來解決問題。這一步迫使我們接受過度擬合的高風險,并以可解釋性換取其他預測能力。盡管有一些有效的方法可以減輕這種選擇的副作用(例如LIME),但我們無法完全消除它們。
設計模式是錯誤分析。實際上,這意味著通過評估模型在不同測試集上的擬合度,甚至通過查看模型錯誤的個別情況,來查看模型出錯的地方。盡管我們都聽到過“垃圾進,垃圾出去”的說法,但即使數據存在一點點不一致,也很少有人意識到這是正確的。標簽可能來自不同的評分者,每個評分者對標簽指南的解釋都略有不同。也許收集數據的方式已經隨著時間而改變。對于小數據問題,錯誤分析的效果尤其明顯。但是,我們還應記住,在大比例的大數據情況下,我們還會處理長尾事件(例如,通過入學考試確定稀有人才)。
錯誤分析的真正威力來自于這樣一個事實,即我們不通過應用它來交換可解釋性或過度擬合的風險,實際上僅應用它就可以得出有關數據分布的關鍵知識。此外,錯誤分析使我們能夠選擇以模型為中心的解決方案(例如,更復雜的模型)和以數據為中心的解決方案(例如,進一步的清潔步驟)。
部署模型的性能隨時間下降
該模型經過廣泛的驗證,并被部署到生產中。用戶很高興,并給出了積極的反饋。然后,一個月/一個季度/一年之后,就會出現有關預測缺陷的報告。這通常是概念漂移的體現,模型在輸入和輸出之間學習的聯系已隨時間而改變。在某些地方,這種概念漂移是眾所周知的(單詞語義,垃圾郵件檢測器),但“概念”漂移可能發生在任何領域。例如,口罩和社會疏遠法規也挑戰了許多先前部署的計算機視覺模型。
常見的反模式是將這些示例歸因于噪聲,并希望情況隨著時間的推移而趨于穩定。這不僅意味著缺乏行動,而且還包括錯誤的歸因,在數據驅動的業務中通常應避免這種歸因。稍微好一點的反模式是通過快速重新培訓和部署新模型來對報告做出反應。即使在團隊假設他們遵循敏捷軟件開發原則并因此選擇對變化做出快速反應的情況下,這也是一種反模式。問題在于該解決方案可以解決癥狀,但不能解決系統設計中的缺陷。
設計模式是對性能的連續評估,這意味著您預計會發生漂移,因此,請設計系統以使其盡快注意到。這是一種完全不同的方法,因為重點不是反應速度而是檢測速度。這使整個系統處于更加受控的過程中,從而為任何反應的優先級分配了更大的空間。持續評估意味著建立流程和工具,以不斷為一小部分新數據生成基本事實。在大多數情況下,這涉及手動標簽,通常使用眾包服務。但是,在某些情況下,我們可以使用其他更復雜的方法,但是在部署環境中,不可行的模型和設備會生成地面真相標簽。例如,在自動駕駛汽車的開發中,一個傳感器(例如LiDAR)的輸入可用于生成另一傳感器(例如攝像機)的地面真實情況。
機器學習的SOLID設計原則
我之所以寫設計模式,是因為該領域已經達到成熟水平,我們不僅應該分享我們的最佳實踐,而且還應該能夠將它們抽象為實際的設計模式。幸運的是,這項工作已經由多個小組開始。實際上,最近有兩本關于主題[ 1 ],[ 2 ]的書出版了。我很喜歡閱讀它們,但我仍然感到,盡管我們朝著正確的方向前進,但距離為ML從業人員制定SOLID設計原則還差幾步之遙。我相信,雖然已經掌握了基礎知識,并已用于構建當今的支持AI的產品,但設計模式和反模式的工作是邁向軟件2.0時代的重要一步。