原創 | 算法工程師平常,訓練的模型翻車了怎麼辦?

,關注並星標,node




你們好,今天和你們聊一個算法工程師的職場平常——模型翻車web

咱們都知道算法工程師的工做重點就是模型訓練,不少人天天的工做就是作特徵、調參數而後訓練模型。因此對於算法工程師而言,最常常遇到的問題就是模型翻車了,好容易訓練出來的模型結果效果還不好。不少剛入門的小白趕上這種狀況都會束手無策,不知道到底是哪裏出了問題。算法

因此今天就和你們簡單分享一下,我我的總結出來的一點簡單經驗,遇到這種狀況的時候,咱們應該怎麼處理。微信


檢查樣本


整個模型訓練結果很差的排查過程能夠遵照一個由大到小,由淺入深的順序。也就是說咱們先從總體上、宏觀上進行排查,再去檢查一些細節的內容。網絡

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

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

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

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


查看訓練曲線


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

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

咱們常常遇到的一種狀況就是在本來的特徵集當中,模型沒有任何問題,可是咱們一旦加入了一些新的特徵以後,效果就開始拉垮。咱們查看日誌發現模型訓練結束以前的這一段時間裏AUC或者是其餘指標仍是在上漲的,就誤覺得沒有問題。其實頗有可能模型在中途陷入過過擬合當中,只是因爲訓練時間比較長,因此被忽視了。

不少人常常吃這個虧,尤爲是新手。浪費了不少時間沒有發現問題,其實打開tensorboard一看就知道,模型中途過擬合或者是欠擬合了,那麼咱們針對性地就能夠採起一些措施進行補救。


參數檢查


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

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

舉個簡單的例子,不少人實現的embedding的初始化用的是默認初始化,默認的方式方差是1。這個方差對於不少場景來講實際上是有些偏大了,尤爲是一些深度比較大的神經網絡,很容易出現梯度爆炸,不少時候咱們把它調到0.001以後,效果每每都會有所提高。

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


場景思考


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

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

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

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

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

今天的文章就到這裏,衷心祝願你們天天都有所收穫。若是還喜歡今天的內容的話,請來一個三連支持吧~(點贊、在看、轉發


本文分享自微信公衆號 - TechFlow(techflow2019)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索