算法工程師日常,訓練的模型翻車了怎麼辦?

大家好,今天和大家聊一個算法工程師的職場日常——模型翻車

我們都知道算法工程師的工作重點就是模型訓練,很多人每天的工作就是做特徵、調參數然後訓練模型。所以對於算法工程師而言,最經常遇到的問題就是模型翻車了,好容易訓練出來的模型結果效果還很差。很多剛入門的小白遇上這種情況都會一籌莫展,不知道究竟是哪裏出了問題。

所以今天就和大家簡單分享一下,我個人總結出來的一點簡單經驗,遇到這種情況的時候,我們應該怎麼處理。

檢查樣本

整個模型訓練結果不好的排查過程可以遵守一個由大到小,由淺入深的順序。也就是說我們先從整體上、宏觀上進行排查,再去檢查一些細節的內容。

很多小白可能會有點愣頭青,上來就去檢查特徵的細節,而忽略了整體的檢查。導致後來花費了很多時間,才發現原來是樣本的比例不對或者是樣本的數量不對這種很容易發現的問題。不僅會浪費時間,而且給老闆以及其他人的觀感不好。

所以我們先從整體入手,先檢查一下正負樣本的比例,檢查一下訓練樣本的數量。和往常的實驗相比有沒有什麼變化,這種檢查往往比較簡單,可能幾分鐘就能有一個結果。如果發現了問題最好,沒發現問題也不虧,至少也算是排除了一部分原因。

檢查完了樣本的比例以及數量之後,我們接下來可以檢查一下特徵的分佈,看看是不是新做的特徵有一些問題。這裏面可能出現的問題就很多了,比如如果大部分特徵是空的,那有兩種情況。一種是做特徵的代碼有問題,可能藏着bug。還有一種是這個特徵本身就很稀疏,只有少部分樣本纔有值。根據我的經驗,如果特徵過於稀疏,其實效果也是很差的,甚至可能會起反效果,加了還不如不加。

另外一種可能出現的問題就是特徵的值域分佈很不均勻,比如80%的特徵小於10,剩下的20%最多可以到100w。這樣分佈極度不平衡的特徵也會拉胯模型的效果,比較好的方式對它進行分段,做成分桶特徵。一般情況下特徵的問題很容易通過查看分佈的方法調查出來。

查看訓練曲線

很多新手評判模型的標準就是最後的一個結果,比如AUC或者是準確率,而忽略了模型在整個訓練過程當中的變化。這其實也不是一個很好的習慣,會丟失很多信息,也會忽略很多情況。

比較推薦的就是要習慣使用tensorboard來查看模型訓練的過程,tensorboard基本上現在主流的深度學習框架都有。通過它我們可以看到一些關鍵指標在訓練過程當中的變化,它最主要的功能就是幫助我們發現過擬合或者是欠擬合的情況。

我們經常遇到的一種情況就是在原本的特徵集當中,模型沒有任何問題,但是我們一旦加入了一些新的特徵之後,效果就開始拉胯。我們查看日誌發現模型快訓練結束之前的這一段時間裏AUC或者是其他指標還是在上漲的,就誤以爲沒有問題。其實很有可能模型在中途陷入過過擬合當中,只是由於訓練時間比較長,所以被忽視了。

很多人經常喫這個虧,尤其是新手。浪費了很多時間沒有發現問題,其實打開tensorboard一看就知道,模型中途過擬合或者是欠擬合了,那麼我們針對性地就可以採取一些措施進行補救。

參數檢查

除了上面兩者之外,還有一個排查的點就是參數。

這裏的參數並不只侷限於模型的訓練參數,比如學習率、迭代次數、batch_size等等。也包含一些模型本身的參數,像是embedding初始化的方差,embedding的size等等。

舉個簡單的例子,很多人實現的embedding的初始化用的是默認初始化,默認的方式方差是1。這個方差對於很多場景來說其實是有些偏大了,尤其是一些深度比較大的神經網絡,很容易出現梯度爆炸,很多時候我們把它調到0.001之後,效果往往都會有所提升。

雖然說模型的結構纔是主體,參數只是輔助的,但這並不表示參數不會影響模型的效果。相反,有的時候影響還不小,我們不能忽視。當然要做到這一點,我們不僅需要知道每一個參數對應的意義,也需要了解模型的結構,以及模型運行的原理,這樣才能對參數起到的效果和意義有所推測。不然的話,只是生搬硬套顯然也是不行的。

場景思考

上面提到的三點都還算是比較明顯的,接下來和大家聊聊一點隱藏得比較深的,這也是最考驗一個算法工程師功底的。

很多時候在某一個場景上效果很好的模型,換了一個場景效果就不好了,或者是一些很管用的特徵突然就不管用了。這也許並不是因爲有隱藏的bug,可能只是單純地模型水土不服,對於當前的場景不太適合。

拿推薦場景舉個例子,比如在首頁的推薦當中,由於我們沒有任何額外輸入的信息,只能根據用戶歷史的行爲偏好來進行推薦。這個時候我們就會額外地關注用戶歷史行爲和當前商品的信息的交叉和重疊的部分,着重把這些信息做成特徵。但如果同樣的特徵遷移到商品詳情頁下方的猜你喜歡當中去,可能就不是非常合適。

原因也很簡單,詳情頁下方的猜你喜歡召回的商品基本上都是同一類別甚至是同款商品,這就意味着這些商品本身的信息當中有大部分都是一樣或者是高度相似的。既然這些信息是高度相似的,模型很難從這些差異化很小的特徵當中學到關鍵信息,那麼自然也就很難獲得同樣的效果。這並非是特徵或者是模型出了什麼問題,可能就是單純地場景不合適。

對於場景與特徵以及模型之間的理解和思考纔是最考驗一個算法工程師能力和經驗的部分,新人的注意力往往關注不到這個方面,更多地還是侷限在特徵和模型本身。有的時候,我們的思維不能順着一條線毫無阻礙地往下走,也需要經常停下來反思一下,我這麼思考有沒有忽略什麼問題。

今天的文章就到這裏,衷心祝願大家每天都有所收穫。如果還喜歡今天的內容的話,請來一個三連支持吧~(點贊、關注、轉發

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章