新聞 > 科教 > 正文

為什麼機器學習這麼難

最近幾年,在使機器學習更易接近方面已經取得了巨大進步。在線課程已經湧現出來,精寫的教科書把最尖端的研究收納為更易消化的格式,無數的框架出現來抽象化那些與建構機器學習系統相關的低級雜亂問題。在某些情況下,這些進步使得可以直接將已有的模型放入你的應用,只需要對算法的工作方式有基礎理解並用幾行代碼即可。

然而,機器學習仍然是一個相對『困難』的問題。毫無疑問,通過研究推進機器學習的科學是困難的。這需要創新性,實驗性和堅韌性。機器學習在實現已有的算法和模型使其適應你新的應用進行良好工作時,也是個困難的問題。在工作市場上,機器學習專業的工程師的薪水仍高過標準軟件工程師。

這個困難往往不在數學上-因為上述的框架,機器學習的實現並不需要深奧的數學。這個困難部分包括對使用何種工具來解決問題有一個直覺感。這需要理解可用的算法和模型,每一個的權衡和約束。單是這種技能就需要對這些模型(課程,教科書,論文)有透徹了解,甚至更多的需要嘗試自己實現並測試這些模型。然而,在計算機科學的所有領域都有這種知識建設,並不是機器學習獨有的。普通的軟件工程需要對各邊際框架,工具和技巧的權衡有透徹了解,並做出審慎的設計決定。

困難在於機器學習的基本上是一個極度困難的調試問題。機器學習的調試在兩種情況下進行:1)你的算法無法運作或2)你的算法運作不夠好。機器學習特殊之處在於,當事情並不像預想那樣進行時,找出問題出在哪裏會『指數級』的困難。加劇這調試困難的是,在實現修復或者升級和看到結果之間往往有着調試周期的延遲。很少有算法一次就能運作成功,所以這最後就導致在建構算法時,大部分時間都是花費在這裏。指數級困難性的調試

在標準軟件工程中,當你為一個問題找到一個解決方案,事情並不如你預期的時候,你的問題往往在兩個方向上出錯:算法問題或實現問題。比如,以一個簡單的遞歸算法為例:

我們可以列舉一些此代碼沒有如預期的那樣運作的失敗案例。在這個例子中,網格可能會展示像這樣:

在水平軸上,我們有一些可能我們在算法設計中犯錯的例子。在豎直軸上,我們有一些可能我們在算法實現中出錯的例子。我們可能會以其中一個維度有一個組合的問題(即多個實現過程中的bug),但是只有當算法和實現都正確的時候,我們才能有一個完美的解決方案。

調試過程就變成了將你對這個bug的了解(編譯器誤差信息,程序輸出等等)和你預感問題可能出在哪裏的直覺結合的過程。這些信號和經驗幫助你把可能的bug的搜索範圍修剪成可以管理的大小。

在機器學習流程的情況下,有兩個額外的維度可以發現常見的bug:實際模型和數據。為了解釋這些維度,最簡單的例子就是使用隨機梯度下降訓練邏輯回歸。這裏的算法正確性涵蓋了梯度下降更新方程的正確性。實現正確性包揚了特徵和參數更新的正確計算。數據中的bug通常涉及到標籤的噪聲,預處理中的錯誤,沒有正確的主導信號,甚至是數據不足。模型中的bug可能涉及到模型的實際限制。比如,當你的真正決策邊界是非線性的時候,你在使用線性分類器。

我們的調試過程從一個2D的網格變成一個4D的立方體(用上圖明確地畫出3個維度)。第四個數據維度可以被想像為這些立方體的序列(注意只有一個立方體是正確的)。

為什麼這會是『指數級』更困難是因為一個維度上有n種可能出錯的方法,那麼2D上可以有n x n種,4D上就有 n x n x n x n種。基於可得信號建構出錯誤可能在哪裏的直覺變得更加關鍵。幸運的是,對於機器學習算法,你還有更多的信號來找出消失在哪裏。例如,特別有用的信號可能是你在訓練和測試集上損失函數的圖表,你的算法在你的開發數據集上實際輸出,以及你的算法中間計算的總結統計。延遲調試周期

複合機器學習調試問題的第二個因素是長的調試周期。實現一個可能的修復和得到改變是否成功的信號之間,往往需要數小時乃至幾天。我們從網頁開發中知道,使得自動刷新可能的開發模式可以大幅度提升來開發者效率。這是因為你可以將中斷發展的流程降到最低。這在機器學習中經常是不可能的-在你的數據集上訓練一個算法可能需要幾小時或幾天的時間。在深度學習中的模型特別容易受到這種調試周期延遲的影響。長的調試周期使得『並行』實驗範例成必要。機器學習的開發者會運行多重實驗,因為瓶頸往往在算法的訓練上。通過並行開發,你希望運用指令流水線(對於開發者而不是處理器)。這種被迫以這種方式工作的重大弊端是你無法利用你聚積的知識順序調試或實驗。

機器學習常常歸結為,當事情可能會以許多方向出錯(或者可以更好)的時候,為何事情偏偏出錯在哪裏(或者哪裏可以做得更好)這樣一個本能。當你繼續建構機器學習項目的時候,你開始對哪裏可能存在問題的行為信號有更深的理解。在我自己的工作中,有很多這樣的例子。例如,最早在我訓練神經網絡時遇到的問題之一就是,在我的訓練損失函數中存在周期性。損失函數在處理數據時會衰減,但經常會跳回到一個更高的值。經過很多次試驗和錯誤後,我最後明白這通常是訓練集沒有被正確隨機化(這看上去是數據問題但實則是實現問題)的結果,這在你用每次處理小塊數據的隨機梯度算法時會成為問題。

總之,快速和有效的調試是實現現代機器學習流程最需要的技能。

責任編輯: 李冬琪  來源:煎蛋網 轉載請註明作者、出處並保持完整。

本文網址:https://hk.aboluowang.com/2024/0131/2011836.html