天天看點

作為一個算法攻城獅,你訓練的算法翻車了該怎麼辦?

前言

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

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

檢查樣本

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

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

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

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

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

檢視訓練曲線

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

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

作為一個算法攻城獅,你訓練的算法翻車了該怎麼辦?

我們經常遇到的一種情況就是在原本的特征集當中,模型沒有任何問題,但是我們一旦加入了一些新的特征之後,效果就開始拉垮。我們檢視日志發現模型訓練結束之前的這一段時間裡AUC或者是其他名額還是在上漲的,就誤以為沒有問題。其實很有可能模型在中途陷入過過拟合當中,隻是由于訓練時間比較長,是以被忽視了。

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

參數檢查

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

這裡的參數并不隻局限于模型的訓練參數,比如學習率、疊代次數、batch_size等等。也包含一些模型本身的參數,像是embedding初始化的方差,embedding的size等等。

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

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

場景思考

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

很多時候在某一個場景上效果很好的模型,換了一個場景效果就不好了,或者是一些很管用的特征突然就不管用了。這也許并不是因為有隐藏的bug,可能隻是單純地模型水土不服,對于目前的場景不太适合。

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

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

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

繼續閱讀