算法工程師日常,訓(xùn)練的模型翻車了怎么辦?
大家好,今天和大家聊一個(gè)算法工程師的職場日常——模型翻車。
我們都知道算法工程師的工作重點(diǎn)就是模型訓(xùn)練,很多人每天的工作就是做特征、調(diào)參數(shù)然后訓(xùn)練模型。所以對于算法工程師而言,最經(jīng)常遇到的問題就是模型翻車了,好容易訓(xùn)練出來的模型結(jié)果效果還很差。很多剛?cè)腴T的小白遇上這種情況都會(huì)一籌莫展,不知道究竟是哪里出了問題。
所以今天就和大家簡單分享一下,我個(gè)人總結(jié)出來的一點(diǎn)簡單經(jīng)驗(yàn),遇到這種情況的時(shí)候,我們應(yīng)該怎么處理。
檢查樣本
整個(gè)模型訓(xùn)練結(jié)果不好的排查過程可以遵守一個(gè)由大到小,由淺入深的順序。也就是說我們先從整體上、宏觀上進(jìn)行排查,再去檢查一些細(xì)節(jié)的內(nèi)容。
很多小白可能會(huì)有點(diǎn)愣頭青,上來就去檢查特征的細(xì)節(jié),而忽略了整體的檢查。導(dǎo)致后來花費(fèi)了很多時(shí)間,才發(fā)現(xiàn)原來是樣本的比例不對或者是樣本的數(shù)量不對這種很容易發(fā)現(xiàn)的問題。不僅會(huì)浪費(fèi)時(shí)間,而且給老板以及其他人的觀感不好。
所以我們先從整體入手,先檢查一下正負(fù)樣本的比例,檢查一下訓(xùn)練樣本的數(shù)量。和往常的實(shí)驗(yàn)相比有沒有什么變化,這種檢查往往比較簡單,可能幾分鐘就能有一個(gè)結(jié)果。如果發(fā)現(xiàn)了問題最好,沒發(fā)現(xiàn)問題也不虧,至少也算是排除了一部分原因。
檢查完了樣本的比例以及數(shù)量之后,我們接下來可以檢查一下特征的分布,看看是不是新做的特征有一些問題。這里面可能出現(xiàn)的問題就很多了,比如如果大部分特征是空的,那有兩種情況。一種是做特征的代碼有問題,可能藏著bug。還有一種是這個(gè)特征本身就很稀疏,只有少部分樣本才有值。根據(jù)我的經(jīng)驗(yàn),如果特征過于稀疏,其實(shí)效果也是很差的,甚至可能會(huì)起反效果,加了還不如不加。
另外一種可能出現(xiàn)的問題就是特征的值域分布很不均勻,比如80%的特征小于10,剩下的20%最多可以到100w。這樣分布極度不平衡的特征也會(huì)拉垮模型的效果,比較好的方式對它進(jìn)行分段,做成分桶特征。一般情況下特征的問題很容易通過查看分布的方法調(diào)查出來。
查看訓(xùn)練曲線
很多新手評判模型的標(biāo)準(zhǔn)就是最后的一個(gè)結(jié)果,比如AUC或者是準(zhǔn)確率,而忽略了模型在整個(gè)訓(xùn)練過程當(dāng)中的變化。這其實(shí)也不是一個(gè)很好的習(xí)慣,會(huì)丟失很多信息,也會(huì)忽略很多情況。
比較推薦的就是要習(xí)慣使用tensorboard來查看模型訓(xùn)練的過程,tensorboard基本上現(xiàn)在主流的深度學(xué)習(xí)框架都有。通過它我們可以看到一些關(guān)鍵指標(biāo)在訓(xùn)練過程當(dāng)中的變化,它最主要的功能就是幫助我們發(fā)現(xiàn)過擬合或者是欠擬合的情況。
我們經(jīng)常遇到的一種情況就是在原本的特征集當(dāng)中,模型沒有任何問題,但是我們一旦加入了一些新的特征之后,效果就開始拉垮。我們查看日志發(fā)現(xiàn)模型訓(xùn)練結(jié)束之前的這一段時(shí)間里AUC或者是其他指標(biāo)還是在上漲的,就誤以為沒有問題。其實(shí)很有可能模型在中途陷入過過擬合當(dāng)中,只是由于訓(xùn)練時(shí)間比較長,所以被忽視了。
很多人經(jīng)常吃這個(gè)虧,尤其是新手。浪費(fèi)了很多時(shí)間沒有發(fā)現(xiàn)問題,其實(shí)打開tensorboard一看就知道,模型中途過擬合或者是欠擬合了,那么我們針對性地就可以采取一些措施進(jìn)行補(bǔ)救。
參數(shù)檢查
除了上面兩者之外,還有一個(gè)排查的點(diǎn)就是參數(shù)。
這里的參數(shù)并不只局限于模型的訓(xùn)練參數(shù),比如學(xué)習(xí)率、迭代次數(shù)、batch_size等等。也包含一些模型本身的參數(shù),像是embedding初始化的方差,embedding的size等等。
舉個(gè)簡單的例子,很多人實(shí)現(xiàn)的embedding的初始化用的是默認(rèn)初始化,默認(rèn)的方式方差是1。這個(gè)方差對于很多場景來說其實(shí)是有些偏大了,尤其是一些深度比較大的神經(jīng)網(wǎng)絡(luò),很容易出現(xiàn)梯度爆炸,很多時(shí)候我們把它調(diào)到0.001之后,效果往往都會(huì)有所提升。
雖然說模型的結(jié)構(gòu)才是主體,參數(shù)只是輔助的,但這并不表示參數(shù)不會(huì)影響模型的效果。相反,有的時(shí)候影響還不小,我們不能忽視。當(dāng)然要做到這一點(diǎn),我們不僅需要知道每一個(gè)參數(shù)對應(yīng)的意義,也需要了解模型的結(jié)構(gòu),以及模型運(yùn)行的原理,這樣才能對參數(shù)起到的效果和意義有所推測。不然的話,只是生搬硬套顯然也是不行的。
場景思考
上面提到的三點(diǎn)都還算是比較明顯的,接下來和大家聊聊一點(diǎn)隱藏得比較深的,這也是最考驗(yàn)一個(gè)算法工程師功底的。
很多時(shí)候在某一個(gè)場景上效果很好的模型,換了一個(gè)場景效果就不好了,或者是一些很管用的特征突然就不管用了。這也許并不是因?yàn)橛须[藏的bug,可能只是單純地模型水土不服,對于當(dāng)前的場景不太適合。
拿推薦場景舉個(gè)例子,比如在首頁的推薦當(dāng)中,由于我們沒有任何額外輸入的信息,只能根據(jù)用戶歷史的行為偏好來進(jìn)行推薦。這個(gè)時(shí)候我們就會(huì)額外地關(guān)注用戶歷史行為和當(dāng)前商品的信息的交叉和重疊的部分,著重把這些信息做成特征。但如果同樣的特征遷移到商品詳情頁下方的猜你喜歡當(dāng)中去,可能就不是非常合適。
原因也很簡單,詳情頁下方的猜你喜歡召回的商品基本上都是同一類別甚至是同款商品,這就意味著這些商品本身的信息當(dāng)中有大部分都是一樣或者是高度相似的。既然這些信息是高度相似的,模型很難從這些差異化很小的特征當(dāng)中學(xué)到關(guān)鍵信息,那么自然也就很難獲得同樣的效果。這并非是特征或者是模型出了什么問題,可能就是單純地場景不合適。
對于場景與特征以及模型之間的理解和思考才是最考驗(yàn)一個(gè)算法工程師能力和經(jīng)驗(yàn)的部分,新人的注意力往往關(guān)注不到這個(gè)方面,更多地還是局限在特征和模型本身。有的時(shí)候,我們的思維不能順著一條線毫無阻礙地往下走,也需要經(jīng)常停下來反思一下,我這么思考有沒有忽略什么問題。
本文轉(zhuǎn)載自微信公眾號(hào)「TechFlow」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系TechFlow公眾號(hào)。