算法在崗3年小結(jié):模型策略篇

極市導(dǎo)讀
?作者對(duì)自己的成長(zhǎng)和思路進(jìn)行了總結(jié),總共分了三個(gè)角度:模型策略、工作思路以及個(gè)人成長(zhǎng)來(lái)總結(jié)自己在算法崗位三年的心得體會(huì)。本文為第一篇:總結(jié)解決特定算法問(wèn)題下的模型和策略思路上的經(jīng)驗(yàn)。?>>加入極市CV技術(shù)交流群,走在計(jì)算機(jī)視覺(jué)的最前沿
模型策略篇:討論算法方案的思考。
工作思路篇:工作思維,結(jié)果導(dǎo)向。
個(gè)人成長(zhǎng)篇:如何讓自己更好地解決更多問(wèn)題。
這次給大家介紹的是自己在解決特定算法問(wèn)題下的模型和策略思路上的經(jīng)驗(yàn)。
懶人目錄:
從模型套用到方案設(shè)計(jì):模型的套用和調(diào)參是不能解決所有問(wèn)題的。 從單一指標(biāo)到綜合效果:優(yōu)化不能只盯著一成不變的指標(biāo)。 從實(shí)現(xiàn)本身到可拓展性:開(kāi)拓思路,思考戰(zhàn)勝更多問(wèn)題的方法。
預(yù)警,有些東西可能比較扎心,說(shuō)的是我自己的經(jīng)歷,大家有則改之無(wú)則加勉。
從模型套用到方案設(shè)計(jì)
在我剛學(xué)習(xí)機(jī)器學(xué)習(xí)的時(shí)候(大概是16、17年的時(shí)候吧),躊躇滿志,自以為拿到一把屠龍寶刀,自然是想霍霍一下,找到一個(gè)問(wèn)題,開(kāi)始張羅準(zhǔn)備數(shù)據(jù),然后就開(kāi)始整分類了,本以為效果非常好結(jié)果不行,手足無(wú)措的我開(kāi)始了效果調(diào)優(yōu)(當(dāng)時(shí)寫(xiě)的還是py2):
X_train,?X_test,?y_train,?y_test?=?train_test_split(textVectorList,?YUse,?test_size=0.33,?random_state=10)
maxDepthArrary=[10,20,30,40,50,80,100]
nEstimatorsArrary=[10,50,100,300,500]
learningRateArrary=[0.2,0.4,0.6,0.8,1,1.2,1.4,1.6,1.8,2.0]
paraResult=[]
startAllTime?=?datetime.datetime.now()
for?maxDepth?in?maxDepthArrary:
????for?nEstimators?in?nEstimatorsArrary:
????????for?learningRate?in?learningRateArrary:
????????????startTime?=?datetime.datetime.now()
????????????print?'maxDepth:'+str(maxDepth)+',nEstimators:'+str(nEstimators)+',learningRate:'+str(learningRate)
????????????clf?=?AdaBoostClassifier(DecisionTreeClassifier(max_depth=maxDepth),
?????????????????????????????????????algorithm="SAMME",
?????????????????????????????????????n_estimators=nEstimators,?learning_rate=learningRate)
????????????clf.fit(X_train,?y_train)
????????????score=clf.score(X_test,y_test)
????????????print?'計(jì)算精度:'+str(score)
????????????paraResultItem={}
????????????paraResultItem['maxDepth']=maxDepth
????????????paraResultItem['nEstimators']=nEstimators
????????????paraResultItem['learningRate']=learningRate
????????????paraResultItem['score']=score
????????????paraResult.append(paraResultItem)
????????????endTime?=?datetime.datetime.now()
????????????print?endTime?-?startTime
print?paraResult
endAllTime?=?datetime.datetime.now()
print?endAllTime?-?startAllTime
print?'程序真的結(jié)束了'
print?'程序結(jié)束'
沒(méi)錯(cuò),還是手動(dòng)調(diào)參,非常暴力。
運(yùn)氣好,找到一個(gè)比較不錯(cuò)的調(diào)參結(jié)果,但問(wèn)題是,后續(xù)可不是每次都這么好運(yùn)了。
這件事之后一直在反思一個(gè)點(diǎn),就是這種調(diào)參到底是否健康合理,于是逐步走的方向是,挖掘問(wèn)題、解決問(wèn)題的道路,從而逐步擺脫“調(diào)參師”、“調(diào)包俠”的流程,這里我要感謝很多工作中的導(dǎo)師,出于隱私的原因我這里就不說(shuō)名字了,懂得大家都懂。
那么正確的方式是什么呢,最簡(jiǎn)單的就是讓自己的思路從使用特定方法來(lái)解決問(wèn)題轉(zhuǎn)移到為了解決問(wèn)題設(shè)計(jì)特定方案,這點(diǎn)能讓自己從模型本身跳出,把模型當(dāng)做是自己解決問(wèn)題的工具(這個(gè)在哲學(xué)上應(yīng)該叫工具主義,不說(shuō)對(duì)不對(duì),至少這個(gè)思想更符合日常工作的需求),而不是我要去用這個(gè)模型。
舉個(gè)例子,收到一個(gè)需求,要做文本分類,那我就要去了解問(wèn)題,例如看數(shù)據(jù)、看文檔,充分了解數(shù)據(jù)后設(shè)計(jì)解決方案,來(lái)盡可能又好又快地解決問(wèn)題,我們的目標(biāo)就很明確,是一個(gè)特定的文本分類問(wèn)題,深度學(xué)習(xí)也好,規(guī)則詞典也罷,我們要解決問(wèn)題。
于是這里會(huì)引申出一個(gè)比較關(guān)鍵的能力:自己手里到底有多少方法。首先,方法不多,只知道上面的模型的話,是很難支持你為問(wèn)題設(shè)計(jì)方案的,因?yàn)樵O(shè)計(jì)方案是一個(gè)選擇的過(guò)程,沒(méi)有足夠的方法知識(shí)支撐,何來(lái)選擇。其次,這個(gè)階段我們了解問(wèn)題的核心是找方法,我們了解問(wèn)題的方向其實(shí)就是套用方法的方向,自己手里的方案是指導(dǎo)自己了解問(wèn)題一個(gè)重要方向標(biāo),如果簡(jiǎn)單規(guī)則這個(gè)方法你沒(méi)有掌握,你根本不會(huì)思考這個(gè)問(wèn)題是不是一個(gè)規(guī)則就能解決。第三,方法的多少和質(zhì)量決定了你能解決問(wèn)題的程度,這個(gè)和集思廣益思路一致,多人想,自然更容易想到更好的方法,更多的方法支撐你是否能想到足夠好的方法。
所以,很多人問(wèn)的一個(gè)問(wèn)題:為什么大家工作之后還要持續(xù)學(xué)習(xí)持續(xù)看論文,答案很明顯,就是擴(kuò)充自己的知識(shí)面,以便解決更多更多復(fù)雜的問(wèn)題,這個(gè)點(diǎn)放在很多領(lǐng)域都是正確的。
回到小標(biāo)題本身,大家在成長(zhǎng)的過(guò)程中,要逐步從模型套用解脫出來(lái),不糾結(jié)于模型本身,考慮問(wèn)題的解決方法,你會(huì)發(fā)現(xiàn)你成長(zhǎng)了一大截。
扎心的話來(lái)了:如果給定一個(gè)問(wèn)題,你張口就來(lái)一個(gè)方法,這時(shí)候記得反思自己是不是只會(huì)這個(gè)方法。
從單一指標(biāo)到綜合效果
指標(biāo)是評(píng)價(jià)一個(gè)問(wèn)題解決的重要手段,這點(diǎn)應(yīng)該是毋庸置疑的,但是評(píng)價(jià)一個(gè)問(wèn)題解決的手段能局限在幾個(gè)指標(biāo)里,而是應(yīng)該多看幾種甚至是為了觀測(cè)某些問(wèn)題情況去設(shè)計(jì)一些自己需要的指標(biāo)。
現(xiàn)在有1個(gè)病人,99個(gè)正常人,現(xiàn)在我手里有一個(gè)判斷人是否得病的手段,結(jié)果是所有人都正常,我們很容易算出準(zhǔn)確率是99%,明眼人很容易看出來(lái)這個(gè)99%里面充滿了水分,因?yàn)椴∪藟焊鶝](méi)檢測(cè)出來(lái),于是我們還要進(jìn)一步設(shè)計(jì)一些指標(biāo)來(lái)表達(dá)這個(gè)問(wèn)題,于是我們?cè)O(shè)計(jì)了召回率,召回率顯示我們能找到的病人占比為0%,于是輕松表達(dá)了這個(gè)問(wèn)題。
這個(gè)問(wèn)題的理解非常簡(jiǎn)單,但是道理卻很深刻,我們需要明白的是,指標(biāo)不是我們算法的目標(biāo),而是一個(gè)表達(dá)問(wèn)題的方法是,我們借助指標(biāo)來(lái)了解自己的問(wèn)題現(xiàn)狀如何,從而保證我們達(dá)到目標(biāo),我們最終追求的其實(shí)是一個(gè)比較模糊的東西——“綜合效果”。
綜合效果是什么?對(duì)于推薦系統(tǒng),可能是用戶的點(diǎn)擊率,停留時(shí)間等,對(duì)于對(duì)話系統(tǒng),可以是需求的滿足率,可以是和用戶的平均多輪次數(shù),可以是對(duì)話任務(wù)的完成率,我們是通過(guò)觀測(cè)這些指標(biāo),來(lái)判斷我們需要怎么優(yōu)化我們的方案,例如點(diǎn)擊率高停留時(shí)間低,可能就要評(píng)估是不是要處理一下標(biāo)題黨,點(diǎn)擊率本身就不高,是不是因?yàn)橥扑]的東西用戶不喜歡等,最終,其實(shí)我們的綜合效果是各種維度指標(biāo)的全面提升,當(dāng)然這不容易,但確實(shí)我們各個(gè)領(lǐng)域算法工程師所追求的。
另外需要討論的兩個(gè)關(guān)鍵點(diǎn),是指標(biāo)標(biāo)準(zhǔn)和評(píng)測(cè)集,這兩個(gè)點(diǎn)直接影響的是指標(biāo)的表達(dá)能力,最終影響我們對(duì)問(wèn)題的判斷。
首先是指標(biāo)標(biāo)準(zhǔn),舉個(gè)例子,文本分類,什么叫做“天氣”意圖,我們需要有一個(gè)盡可能明確清晰的邊界去劃定什么是天氣,或者什么不是天氣,只有這個(gè)判斷清楚了,指標(biāo)才可能正確,因此,這值得我們花費(fèi)很多時(shí)間來(lái)保證這個(gè)點(diǎn)。
然后是評(píng)測(cè)集,由于大部分指標(biāo)的計(jì)算來(lái)源于大量的數(shù)據(jù),即評(píng)測(cè)集,因此在這里談評(píng)測(cè)集,是希望大家關(guān)注評(píng)測(cè)集的數(shù)量、分布、質(zhì)量,這些方面的合理性才能支撐指標(biāo)的準(zhǔn)確,乃至對(duì)效果的評(píng)估。
因此回到問(wèn)題,單一指標(biāo)到綜合效果,我們作為一名算法,雖然面向的是指標(biāo)優(yōu)化,但是我們最終希望得到的是綜合效果比較好,這要求我們把思路打開(kāi),而又因?yàn)榫C合效果是依賴各種指標(biāo)來(lái)表現(xiàn)的,因此我們要關(guān)注指標(biāo)的構(gòu)成,關(guān)鍵就是指標(biāo)標(biāo)準(zhǔn)和評(píng)測(cè)集。
科研可能會(huì)讓很多學(xué)生都關(guān)注于指標(biāo),指標(biāo)的提升能帶來(lái)論文(真實(shí)),但實(shí)際應(yīng)用中太關(guān)注于指標(biāo)可能會(huì)把你帶到溝里去。
從實(shí)現(xiàn)本身到可拓展性
開(kāi)始我只是接受老師、領(lǐng)導(dǎo)給出的任務(wù),這個(gè)任務(wù)往往比較明確,問(wèn)題給到我,甚至把解決方案都告訴我了,然后按著寫(xiě)代碼就完事了,這個(gè)事情確實(shí)很簡(jiǎn)單,一般按部就班的就能完成,但逐步發(fā)現(xiàn),很多時(shí)候完成任務(wù)并不是任務(wù)本身,很多時(shí)候還包含了很多沒(méi)有在明面上。
代碼是否具備可讀性和可拓展性。這是每一位工程師,不局限于算法工程師。 思考方案是否具備通用性,是否可以用比較穩(wěn)定可靠的方式來(lái)完成相似的任務(wù),一方面可以平臺(tái)化中臺(tái)化,另一方面對(duì)自己則是可以把一些算法任務(wù)變成一個(gè)工程任務(wù),提升效率降低風(fēng)險(xiǎn),畢竟算法本身的項(xiàng)目風(fēng)險(xiǎn)較高,一不小心效果出問(wèn)題就會(huì)延期。
前者其實(shí)是比較基本的開(kāi)發(fā)能力,寫(xiě)代碼,為了團(tuán)隊(duì)合作,為了自己日后的維護(hù),代碼要規(guī)范,很多設(shè)計(jì)的細(xì)節(jié)需要考慮到:
命名、注釋是否具有可讀性。 函數(shù)意識(shí),很多重用的、結(jié)構(gòu)復(fù)雜的東西,需要構(gòu)造成類,這個(gè)能力對(duì)于面向過(guò)程入門的python同學(xué),是非常需要培養(yǎng)的。 工程服務(wù)的一些常見(jiàn)操作需要學(xué)習(xí)到,例如怎么向外提供服務(wù)、怎么熱更新、怎么打日志等。 服務(wù)性能的考慮,一些動(dòng)不動(dòng)上bert的同學(xué),需要考慮這些問(wèn)題哈~
至于后者,則是一個(gè)對(duì)解決問(wèn)題更高的要求,就是你能不能想出一個(gè)類似問(wèn)題都能解決的方案。
這一類的問(wèn)題都具有什么特點(diǎn)。 有沒(méi)有什么能夠相似問(wèn)題都用的模型、詞典。 在此基礎(chǔ)上,設(shè)計(jì)好構(gòu)造腳本,能快速完成。
不僅要學(xué)會(huì)打敗一個(gè)人的方法,還需要學(xué)習(xí)打敗一萬(wàn)個(gè)人的方法。
小結(jié)
洋洋灑灑快3千字了(em...有一大部分是代碼),是一些自己在算法策略上的一些新的思路和總結(jié),這些都有別于1年期、剛?cè)腴T的自己,這些是思維的提升和覺(jué)醒是非常有利于真實(shí)能力的提升,模型固然是要學(xué)習(xí)提升,但是今天聊的種種其實(shí)都在告誡我們,不能局限于模型,不能局限于模型,不能局限于模型。
如果覺(jué)得有用,就請(qǐng)分享到朋友圈吧!
公眾號(hào)后臺(tái)回復(fù)“transformer”獲取最新Transformer綜述論文下載~

#?CV技術(shù)社群邀請(qǐng)函?#

備注:姓名-學(xué)校/公司-研究方向-城市(如:小極-北大-目標(biāo)檢測(cè)-深圳)
即可申請(qǐng)加入極市目標(biāo)檢測(cè)/圖像分割/工業(yè)檢測(cè)/人臉/醫(yī)學(xué)影像/3D/SLAM/自動(dòng)駕駛/超分辨率/姿態(tài)估計(jì)/ReID/GAN/圖像增強(qiáng)/OCR/視頻理解等技術(shù)交流群
每月大咖直播分享、真實(shí)項(xiàng)目需求對(duì)接、求職內(nèi)推、算法競(jìng)賽、干貨資訊匯總、與?10000+來(lái)自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺(jué)開(kāi)發(fā)者互動(dòng)交流~

