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