今天的分享是面向極市開(kāi)發(fā)者們,分享中會(huì)相對(duì)偏向于實(shí)戰(zhàn),更像是一個(gè)如何調(diào)參的經(jīng)驗(yàn)方法論方面的分享。需要強(qiáng)調(diào)的是,因?yàn)椴簧賰?nèi)容缺少系統(tǒng)的數(shù)學(xué)和理論基礎(chǔ),所以必須稱之為淺談,比如邊際效用遞減曲線、特征空間復(fù)雜程度等自提概念都還需要進(jìn)一步提煉和完善,也希望能借此機(jī)會(huì)可以和大家展開(kāi)深入討論。
算力限制場(chǎng)景主要是指在嵌入式設(shè)備,也就是算力相對(duì)比較弱的芯片上面做實(shí)時(shí)或者準(zhǔn)實(shí)時(shí)的目標(biāo)檢測(cè)。這個(gè)問(wèn)題在學(xué)術(shù)和工業(yè)界一直都是備受關(guān)注,并且在深度學(xué)習(xí)越來(lái)越強(qiáng)調(diào)落地的大背景下,這個(gè)問(wèn)題也正變得越來(lái)越突出。
問(wèn)題
分享之前,先提出幾個(gè)問(wèn)題,我們帶著這幾個(gè)問(wèn)題來(lái)貫穿整個(gè)分享。第一組問(wèn)題,在實(shí)踐中,當(dāng)我們遇到一個(gè)具體的任務(wù)的時(shí)候,比如熱門(mén)的車輛檢測(cè)問(wèn)題,它屬于剛體檢測(cè)(被檢測(cè)物體內(nèi)部不會(huì)有形變的情況)。那么,一般需要多大的神經(jīng)網(wǎng)絡(luò)計(jì)算量,可以滿足一般場(chǎng)景下檢出絕大多數(shù)目標(biāo),同時(shí)保證出現(xiàn)盡量少的誤報(bào)?當(dāng)我們需要在嵌入式的低計(jì)算能力的硬件平臺(tái)上完成這個(gè)任務(wù)的時(shí)候,我們應(yīng)該怎么去完成這個(gè)任務(wù)?第二組問(wèn)題,如果現(xiàn)在我們面臨的新任務(wù)是手勢(shì)檢測(cè),也就是柔體檢測(cè)(被檢測(cè)物體內(nèi)部會(huì)發(fā)生形變的情況),剛體檢測(cè)任務(wù)中面臨的問(wèn)題顯然是同樣存在的。那么,因?yàn)槲覀冏鲞^(guò)了剛體檢測(cè)問(wèn)題,經(jīng)驗(yàn)直接借鑒過(guò)來(lái),適用嗎?第三組觸及靈魂的問(wèn)題來(lái)了,既然剛體柔體都搞過(guò)一遍了,那么能不能再隨便來(lái)一個(gè)新的任務(wù),都可以套用一套相同的方法來(lái)完成?也就是大家最關(guān)心的放之四海而皆準(zhǔn)的標(biāo)準(zhǔn)“煉丹”方法。更進(jìn)一步,學(xué)術(shù)上非常熱門(mén)的AutoML 與網(wǎng)絡(luò)結(jié)構(gòu)搜索Network Architecture Search,與這個(gè)所謂的同一套方法又有什么關(guān)系呢?
目標(biāo)檢測(cè)在算力限制場(chǎng)景下的特點(diǎn)
我們先看一下目標(biāo)檢測(cè)這個(gè)方法在算力限制場(chǎng)景下的基本特點(diǎn)。谷歌在2016年11月Speed/accuracy trade-offs for modern convolutional object detectors 論文中,有這樣一張coco 檢測(cè)問(wèn)題時(shí)所能達(dá)到的mAP結(jié)果圖。圖上有當(dāng)時(shí)最熱門(mén)的神經(jīng)網(wǎng)絡(luò)骨干網(wǎng)和檢測(cè)方法,他們?cè)诓煌木W(wǎng)絡(luò)大小下,有的方法能力強(qiáng),有的方法耗時(shí)短。可以發(fā)現(xiàn),所有方法都沒(méi)有超出作者在圖上沿左下右上的一條凸起的虛線,也就是說(shuō),在這里速度和精度是“魚(yú)和熊掌不可兼得”的。同樣,在谷歌2018年7月發(fā)表的MNasNet 論文中,對(duì)于MNasNet 和MobileNet-V2的對(duì)比,同樣也展示出來(lái)神似的一條曲線,不同的是橫軸從GPU時(shí)間換成了手機(jī)上的預(yù)測(cè)時(shí)間。
在這里,我們借用一個(gè)經(jīng)濟(jì)學(xué)中非常常用的概念,就是邊際效用遞減曲線來(lái)描述這條論文中常出現(xiàn)的曲線。舉一個(gè)大家都熟悉的陳佩斯被朱時(shí)茂忽悠吃面的例子,當(dāng)陳佩斯吃掉第一碗面的時(shí)候,他的幸福感可以從無(wú)到有提升到了七八成,吃完第二碗之后,可能幸福感就爆棚了,但是吃完第三碗和第四碗的時(shí)候,估計(jì)快要吐了,還談何幸福感。也就是說(shuō),每增加相同的一碗面,陳佩斯獲得的實(shí)際收益則越來(lái)越小,甚至變成負(fù)的了。
回到我們問(wèn)題上面,算力就是陳佩斯的面,我們每給目標(biāo)檢測(cè)方法多增加相同量的算力的時(shí)候,所能帶來(lái)的精度提升會(huì)越來(lái)越少,最后微乎其微,更有甚者,如果發(fā)生了過(guò)擬合,曲線還可能往下跌,也就是陳佩斯被撐吐了一樣。
這里就可以隨手畫(huà)出一條曲線進(jìn)行簡(jiǎn)單的展示了。需要說(shuō)明的是,實(shí)際的數(shù)據(jù)和曲線只會(huì)遵循大體的趨勢(shì),一定不會(huì)嚴(yán)格擬合。同時(shí),這條曲線既不是倒數(shù),也不是多項(xiàng)式或是對(duì)數(shù)曲線,它究竟是什么數(shù)學(xué)公式,以當(dāng)前深度學(xué)習(xí)的研究現(xiàn)狀來(lái)說(shuō)并不可以推導(dǎo)和求解的。
簡(jiǎn)單說(shuō),它只是一條輔助線,那它有什么用呢?首先,他可以幫助我們大體上去了解我們所探索的問(wèn)題邊界所在。其次,當(dāng)我們?cè)O(shè)計(jì)調(diào)參實(shí)驗(yàn)的時(shí)候,可以通過(guò)繪制或者在腦子里假裝繪制不同變量條件下的曲線,這條輔助線可以幫助我們來(lái)對(duì)比變量?jī)?yōu)劣。例如,我們可以在某個(gè)變量固定時(shí)調(diào)整它的算力,當(dāng)進(jìn)行少量的實(shí)驗(yàn)之后,就可以畫(huà)出這樣一條趨勢(shì)曲線出來(lái)了,同理,調(diào)整該變量的之后就可以再畫(huà)一條,兩條曲線的對(duì)比就可以幫助我們判斷該變量的優(yōu)劣。最重要的,它可以幫助我們明確我們的任務(wù)在這個(gè)曲線上所處的區(qū)間。首先,不同的區(qū)間內(nèi)解決問(wèn)題的方法也不盡相同,不同變量在指定區(qū)間內(nèi)的對(duì)比關(guān)系也不盡相同;同時(shí),當(dāng)你發(fā)現(xiàn)當(dāng)前問(wèn)題所處區(qū)間位于某個(gè)變量的曲線上升區(qū),那么這個(gè)變量絕對(duì)是一個(gè)值得發(fā)力重點(diǎn)研究的變量。
舉一個(gè)簡(jiǎn)單的例子,如圖所示,mobilenet-v1和mobilenet-v2,根據(jù)論文或者自己的實(shí)驗(yàn),我們只需要將寥寥幾個(gè)點(diǎn)繪制上去就可以繪制兩條曲線。這里需要解釋一下,為了演示方便,圖上的數(shù)據(jù)關(guān)系只是展示了趨勢(shì)。
這里需要特殊說(shuō)明的是,并不是所有方法對(duì)比圖都是理想的一上一下優(yōu)者恒優(yōu)的,例如,我們組18年發(fā)表的fast-downsampling mobilenet MobileNet 結(jié)構(gòu)簡(jiǎn)單微調(diào)的一點(diǎn)性能提升的方法(https://www.jianshu.com/p/681960b4173d),在100MFlops 以下的區(qū)間內(nèi),mAP 會(huì)高于mobilenet-v1,但是超過(guò)100MFlops 之后,就要弱于mobilenet-v1了。
因此,我們必須限定任務(wù)在曲線上所處的區(qū)間。
算力:硬件限制
算力限制場(chǎng)景本身就是限定任務(wù)在曲線上所處的區(qū)間的一個(gè)最常見(jiàn)的因素。眾所周知,硬件本身主要就是芯片的算力是有當(dāng)前芯片研發(fā)現(xiàn)狀,芯片的價(jià)格等等諸多因素決定的。并且,當(dāng)場(chǎng)景需求不同時(shí),相同的硬件條件下的情況也不盡相同。任務(wù)如果是實(shí)時(shí)的,就必須在30ms 左右計(jì)算完畢,當(dāng)然如果不是實(shí)時(shí)的,慢一些就沒(méi)關(guān)系了。同時(shí),在有些場(chǎng)景下還要求不能功耗滿載,那么我們就需要更快的時(shí)間算完,例如10ms 等等。
這里需要說(shuō)明計(jì)算量Flops(浮點(diǎn)運(yùn)算次數(shù))或者是MAC(加乘數(shù))與實(shí)際運(yùn)行時(shí)間之間的關(guān)系:首先,由于網(wǎng)絡(luò)結(jié)構(gòu)具有不同計(jì)算訪存比的特點(diǎn),導(dǎo)致硬件算力和網(wǎng)絡(luò)flops之間無(wú)法形成線性對(duì)比關(guān)系。這里可參考:Momenta王晉瑋:讓深度學(xué)習(xí)更高效運(yùn)行的兩個(gè)視角。比如,在輕量級(jí)網(wǎng)絡(luò)中很常見(jiàn)的depthwise 卷積中,單位取到的數(shù)據(jù)所支撐的計(jì)算量小于普通卷積,也就是計(jì)算訪存比小,因此對(duì)芯片的緩存訪存需求更大。
同時(shí),在目標(biāo)檢測(cè)問(wèn)題中,除了骨干神經(jīng)網(wǎng)絡(luò)花費(fèi)的時(shí)間,檢測(cè)頭和nms 也花費(fèi)了一些時(shí)間。例如nms 的數(shù)量是不固定的,這部分的時(shí)間開(kāi)銷和計(jì)算量更加無(wú)法準(zhǔn)確計(jì)算。
因此,如果在測(cè)試中直接使用時(shí)間對(duì)模型進(jìn)行速度衡量,則必須到設(shè)備進(jìn)行實(shí)測(cè),這里還涉及到設(shè)備端的如ARM/NOEN、定點(diǎn)算浮點(diǎn)、量化等優(yōu)化,是非常復(fù)雜的,所以一般情況下,我們都會(huì)使用Flops對(duì)計(jì)算能力進(jìn)行估算。
因此,截止目前,我們可以將問(wèn)題歸約為,通過(guò)曲線的輔助,找到最優(yōu)模型和參數(shù),并在有效范圍內(nèi)取最大值。最關(guān)鍵的問(wèn)題來(lái)了,這條曲線該怎么找到呢?這條曲線其實(shí)是沒(méi)法求的,我們會(huì)在后邊進(jìn)行調(diào)參舉例來(lái)進(jìn)行一定的說(shuō)明,接下來(lái)我們?cè)倩ㄐr(shí)間在我們的邊際效用遞減曲線上面。
首先,該曲線是廣泛存在的。
除去算力,當(dāng)橫軸是數(shù)據(jù)量的時(shí)候,往往情況下也是可以體現(xiàn)出來(lái)類似的邊際效用特點(diǎn)的,也就是說(shuō)當(dāng)我們?cè)跀?shù)據(jù)不足夠充分的時(shí)候,每次增加單位數(shù)量的同分布數(shù)據(jù)時(shí),相同模型相同參數(shù),所能提高的精度也是符合邊際效用遞減曲線的。
所以,如果在測(cè)試中,你發(fā)現(xiàn)增減數(shù)據(jù)對(duì)結(jié)果的影響非常大,那么極有可能你的問(wèn)題當(dāng)前處在數(shù)據(jù)量不夠的階段,需要想辦法增加數(shù)據(jù)。這也就是前面所說(shuō)的這條曲線可以幫助我們明確問(wèn)題所在的區(qū)間。此外,驗(yàn)證集和評(píng)價(jià)標(biāo)準(zhǔn)也不是一成不變的,在其他因素不變的情況下,相同方法在簡(jiǎn)單驗(yàn)證集下,結(jié)果的數(shù)值上顯然是要優(yōu)于復(fù)雜驗(yàn)證集的。關(guān)于訓(xùn)練集和驗(yàn)證集的問(wèn)題我們后邊會(huì)再展開(kāi)講解,我們這里看一下不同任務(wù)的情況下,邊際效用遞減曲線之間的對(duì)比關(guān)系是怎樣的?
通過(guò)實(shí)踐,我們了解到,相同算法下,任務(wù)的難度決定了曲線的走向。那么,在前文提到的車輛和手勢(shì)兩個(gè)任務(wù),我們能否把任務(wù)和曲線進(jìn)行如圖的對(duì)比關(guān)系呢?
先把車輛和手勢(shì)放一邊,先看:是什么決定了不同任務(wù)的區(qū)別呢?直接拋出一個(gè)小的直觀的感覺(jué):即特征空間的復(fù)雜程度,決定了任務(wù)的區(qū)別。暫時(shí)我還只能稱之為感覺(jué),而不是結(jié)論,這里還真不敢下結(jié)論。雖然是感覺(jué),但是建立這樣一種感覺(jué),可能對(duì)我們后續(xù)調(diào)參會(huì)有一些幫助。
那么什么是特征空間的復(fù)雜程度呢?這暫時(shí)還是一個(gè)無(wú)法定量描述,甚至無(wú)法準(zhǔn)確定義的概念。我們可以就看一下什么樣的空間復(fù)雜,什么樣的空間簡(jiǎn)單:我們都知道深度學(xué)習(xí)最核心的能力就是對(duì)數(shù)據(jù)特征的描述以及泛化,那么我們?cè)賮?lái)看一下數(shù)據(jù)特征具體長(zhǎng)什么樣子加深再這個(gè)理解。在Stanford cs231n課程中曾經(jīng)提到cifar10 的數(shù)據(jù)集中,如果對(duì)每一類圖的采樣并進(jìn)行平均化的話,可以得到如圖的平均圖,我們直觀的去觀察這個(gè)平均圖,會(huì)發(fā)現(xiàn)最容易辨認(rèn)的是第二類car。那么車輛檢測(cè)就是簡(jiǎn)單空間嗎?我們繼續(xù)看下一個(gè)例子。
這里是在100張城市數(shù)據(jù)集車輛尾部數(shù)據(jù)中采樣并得到一張平均圖。可以發(fā)現(xiàn)一整輛車的輪廓已經(jīng)出來(lái)了。再繼續(xù)深入去定性分析的話,因?yàn)檐囕v首先是剛體數(shù)據(jù),其次線條簡(jiǎn)單清晰,不同車型的部件基本相同,如后窗、尾燈、牌照、車輪還有車輪下方的陰影區(qū)域。這里面圖是隨機(jī)挑選的,感覺(jué)白車有點(diǎn)多哈,可能是因?yàn)榘总嚥蝗菀着K,買(mǎi)的人本來(lái)就多吧?
這里需要注意的是任務(wù)需求,這個(gè)需求到底是檢出來(lái)車屁股即可,還是說(shuō)必須分辨出來(lái)是顏色車型等具體信息,甚至需要車輛牌照信息。因?yàn)楫?dāng)任務(wù)需求發(fā)生變化時(shí),神經(jīng)網(wǎng)絡(luò)需要去描述的特征的量也會(huì)隨之發(fā)生變化。
再看一下貨車的。和轎車的大體相同。
好,我們?cè)倏匆幌氯四様?shù)據(jù)集的平均圖,和車輛差不多,人臉的平均圖也差不多出來(lái)了一個(gè)人,有鼻有嘴,就是看不清。但因?yàn)閿?shù)據(jù)中西方人男性居多,所以我們還能大概看出來(lái)是個(gè)西方男人的感覺(jué)。同理,如果任務(wù)需要區(qū)分人臉的情緒,也就是眼角、嘴型的細(xì)微變化,這個(gè)新的需求對(duì)神經(jīng)網(wǎng)絡(luò)所需要描述的特征量的要求也就變得非常大了,也就不簡(jiǎn)單了。
繼續(xù)看例子,手勢(shì),貌似隱隱約約能看出來(lái)一個(gè)勝利V的手勢(shì),但是,這個(gè)數(shù)據(jù)集顯然是需要能夠識(shí)別出這些手勢(shì)的基本含義。直觀看起來(lái),需要的基礎(chǔ)特征的形狀也是很多的。
特征空間的復(fù)雜程度
現(xiàn)在又要祭出這張經(jīng)典的特征可視化圖了,簡(jiǎn)單的說(shuō),就是淺層特征基本就是直線和點(diǎn),之后的每一層都是再對(duì)上一層特征進(jìn)行概率意義上的組合。回到特征空間復(fù)雜程度的問(wèn)題上面來(lái),我們?cè)倥e一個(gè)極端的例子,mnist 手寫(xiě)數(shù)據(jù)集中所需要的特征,直觀感覺(jué)上就是些直線折線和圈圈,而imagenet 是幾乎要應(yīng)對(duì)整個(gè)自然圖像中所能涉及到的方方面面的情況,需要的特征和特征的組合關(guān)系幾乎是無(wú)法想象的。而在實(shí)踐中,大家都知道可以讓兩者跑的好的神經(jīng)網(wǎng)絡(luò),容量相差甚遠(yuǎn)。好,我們直觀上現(xiàn)在知道了,對(duì)于一個(gè)特定問(wèn)題,其實(shí)一定程度上可以說(shuō)它所需要的特征量一般是確定的。當(dāng)然我們沒(méi)法準(zhǔn)確的得到具體的值,神經(jīng)網(wǎng)絡(luò)要基本上能匹配上這個(gè)量,才能盡可能的做到精準(zhǔn)。當(dāng)你減少網(wǎng)絡(luò)參數(shù)時(shí),勢(shì)必會(huì)削減網(wǎng)絡(luò)對(duì)某些情況的判斷能力,進(jìn)而減少精度。這里不得不提一下二八定律,即在正常概率的世界中,我們一般可能需要20%的精力去處理80%的情況,反之需要80%的精力去處理剩下20%的疑難雜癥。通過(guò)經(jīng)驗(yàn)我們認(rèn)為,神經(jīng)網(wǎng)絡(luò)大概也是用80%的特征組合關(guān)系去處理了那20%的疑難雜癥情況,所以如果拋棄部分甚至全部疑難雜癥,可能20%的特征組合關(guān)系就夠用了。也是為什么邊際效用遞減曲線畫(huà)出來(lái)是一條向左上方凸出的曲線的原因吧。
實(shí)戰(zhàn)中的實(shí)驗(yàn)設(shè)計(jì)
好了,虛的講完了。結(jié)果遺憾的是,前面所講的虛的東西,全部都是不能通過(guò)數(shù)學(xué)公式進(jìn)行推導(dǎo)的。
這咋整?
秀了半天虛的,其實(shí)也沒(méi)什么特別高明的方法,就是試。但是怎么設(shè)計(jì)實(shí)驗(yàn),也就是說(shuō)怎么試,每次試什么,試完之后改什么,還是很有文章可以做的。也就是這里所說(shuō)的通過(guò)實(shí)驗(yàn)設(shè)計(jì)逐步獲得最優(yōu)值。這也是本次報(bào)告要分享的核心點(diǎn)。其實(shí),最近研究界大熱的automl 或者是network architecture search 的方法,就是以替代掉人類的這部分調(diào)參過(guò)程為目標(biāo)的。但是本次報(bào)告我還是寄希望于完全通過(guò)手工方法來(lái)還原調(diào)優(yōu)過(guò)程,通過(guò)還原這個(gè)調(diào)優(yōu)過(guò)程,給大家展示調(diào)優(yōu)過(guò)程中的一些小的trick 和機(jī)理。這件事雖說(shuō)未來(lái)有可能要失業(yè),但是在automl和nas仍存在學(xué)術(shù)研究階段的情況下還是很重要的,也可能會(huì)幫助我們?nèi)フJ(rèn)識(shí)和研究automl吧。
先再放個(gè)虛的框架,然后一一展開(kāi)說(shuō)一下。
先說(shuō)數(shù)據(jù)集,數(shù)據(jù)集有可能是一個(gè)被忽略的因素。為什么這么說(shuō)呢,因?yàn)槲覀儗?duì)學(xué)術(shù)界論文的依賴度還是非常高的,而做論文的思路呢,一般都會(huì)使用公開(kāi)數(shù)據(jù)集和通用評(píng)價(jià)標(biāo)準(zhǔn),因?yàn)椴皇褂眠@些你怎么跟同行進(jìn)行比較呢?同理做比賽也有這樣的問(wèn)題,雖然比賽已經(jīng)比較貼近實(shí)際任務(wù)了,但是也必須有一個(gè)公平的評(píng)價(jià)標(biāo)準(zhǔn),不然排名靠前靠后憑什么呢?
但是在做實(shí)際任務(wù)的時(shí)候,數(shù)據(jù)集就必須需要適應(yīng)問(wèn)題本身的需求,首先是驗(yàn)證集。大家都知道,其實(shí)機(jī)器學(xué)習(xí)就好比訓(xùn)練小學(xué)生去應(yīng)付期末考試。驗(yàn)證集就是期末考試,日常小朋友練習(xí)的題目不管怎樣也得和期末考試差不多,不然一定懵逼。驗(yàn)證集做簡(jiǎn)單了,數(shù)據(jù)分布上可能沒(méi)有覆蓋到實(shí)際情況中的大部分情況,也有可能做難了,對(duì)于一些不會(huì)出現(xiàn)的情況上花費(fèi)了太多精力。還有一種情況就是驗(yàn)證集和訓(xùn)練集的重復(fù)關(guān)系,小心驗(yàn)證集達(dá)標(biāo)的時(shí)候其實(shí)有可能只是過(guò)擬合了訓(xùn)練集。所以這時(shí)候沒(méi)人給做驗(yàn)證集,只能靠自己。訓(xùn)練集數(shù)據(jù),根據(jù)前文所講的數(shù)據(jù)與mAP的邊際效用關(guān)系,這里肯定是能盡量搞定足夠多的數(shù)據(jù)才是王道。數(shù)據(jù)量不夠的情況下可能還需要使用一些遷移學(xué)習(xí)的方法來(lái)彌補(bǔ),這里因?yàn)闀r(shí)間關(guān)系就不展開(kāi)了。本文的最后還會(huì)對(duì)imagenet 等數(shù)據(jù)集對(duì)輕量級(jí)模型下的遷移學(xué)習(xí)進(jìn)行一些補(bǔ)充。評(píng)價(jià)標(biāo)準(zhǔn)的重要性在這里也就顯現(xiàn)出來(lái)了,一般情況下我們會(huì)用通用的目標(biāo)檢測(cè)評(píng)價(jià)標(biāo)準(zhǔn)(mAP)來(lái)描述我們的目標(biāo)檢測(cè)方法。必須承認(rèn),mAP 確實(shí)是綜合的描述了一個(gè)模型的基本和平均能力,但是它不能同時(shí)兼顧漏檢率和誤撿率。由于mAP 是一個(gè)隨著confidence 下降來(lái)同時(shí)加入tp和fp繪制曲線并計(jì)算總面積的,因此fp 也就是誤撿的sample 并不會(huì)很明顯的體現(xiàn)出來(lái),針對(duì)比較關(guān)注誤撿率的問(wèn)題,最好還是不要用mAP。
好,我們開(kāi)始跑了。一般的,我會(huì)花一些時(shí)間來(lái)建立baseline,這個(gè)下一頁(yè)詳解。然后開(kāi)始迭代,核心思路是使用對(duì)照實(shí)驗(yàn)(control experiment),只改變一個(gè)變量,固定其他所有變量。既然每次都只能調(diào)整一個(gè)參數(shù)與變量,那就最好沿著最有可能提高性能的方向調(diào)整,那么哪個(gè)是最大的變量呢?這需要熟悉神經(jīng)網(wǎng)絡(luò)的原理和研究現(xiàn)狀,等下我們具體舉例來(lái)說(shuō)明一下。這時(shí)我們前面講的輔助線可能就能用上了,幾次實(shí)驗(yàn)之后,你心目中大概可以形成一個(gè)或者多個(gè)邊際效用遞減曲線了,就可以估算一下某個(gè)變量在上面所處的位置。嗯,上升趨勢(shì)比較明顯的變量值得著重考慮。所有維度都嘗試之后再重頭逐一嘗試,因?yàn)楫吘姑看沃徽{(diào)整一個(gè)參數(shù)沒(méi)有考慮到參數(shù)和參數(shù)之間的相互作用關(guān)系。
什么時(shí)候停止呢?調(diào)參小能手一般是沒(méi)有止境的,yeah。不過(guò)一般也就是驗(yàn)證集達(dá)標(biāo),但是前面也提到了,手頭這個(gè)驗(yàn)證集符合實(shí)際情況嗎?要去實(shí)際情況跑一跑你的模型了。
舉例
剛剛是原則性的套路,現(xiàn)在我們來(lái)舉一個(gè)例子。要求如圖所示,根據(jù)我們前面對(duì)任務(wù)特征空間的描述,這個(gè)問(wèn)題應(yīng)該有可能能在這個(gè)量級(jí)下完成吧,我們來(lái)試試。
首先我需要一個(gè)baseline,雖然我現(xiàn)在要用的是10M 的網(wǎng)絡(luò),10M 的論文可能不多,但是我這時(shí)還是會(huì)先去復(fù)現(xiàn)mobilenet-v1,mobilenet-v2,shufflenet-v1/v2,以及各種坊間反饋還比較優(yōu)秀的所有輕量級(jí)網(wǎng)絡(luò)結(jié)構(gòu)。為什么要先做這件事呢,除了作為參考系方便進(jìn)行比較之外,最大的目的是可以最大限度的保證方法本身、你用的框架等等沒(méi)有問(wèn)題,如果這時(shí)不搞清楚,未來(lái)長(zhǎng)期在坑里待著,顯然完成不了任務(wù)了。同時(shí)這樣會(huì)很容易幫你發(fā)現(xiàn)論文中的細(xì)節(jié)部分,論文搞得多的同學(xué)都知道,論文不可以沒(méi)有創(chuàng)新性,所以很有可能一篇論文中號(hào)稱的自己最核心的算法點(diǎn)在實(shí)測(cè)中不是對(duì)性能提升最優(yōu)的點(diǎn),相反,可能論文中會(huì)有些很實(shí)用但是看起來(lái)不是很有創(chuàng)新性的東西,而你不真的去跑一下,是不知道的。另外,如果一篇論文已經(jīng)是一兩年前的,這一兩年之中有些其他論文會(huì)提出一些有趣的小trick 和小參數(shù)或者小調(diào)整,這些東西有的時(shí)候也可以在復(fù)現(xiàn)經(jīng)典論文和方法的時(shí)候一起揉進(jìn)去,例如何凱明提出的fan-in,fan-out參數(shù)初始化方法,就可以應(yīng)用到其前面就發(fā)表的論文或者項(xiàng)目中去??傊@是一個(gè)磨刀不誤砍柴工的工作,也是一個(gè)積累基礎(chǔ)經(jīng)驗(yàn)的過(guò)程。
由于不少論文是分類網(wǎng)的論文,或者是不同檢測(cè)頭做的檢測(cè)模型,比如faster-rcnn 兩階段方法,我們需要換成自己使用的檢測(cè)頭,比如Yolo。這時(shí)我就需要再做一個(gè)baseline,并獲得自有訓(xùn)練數(shù)據(jù)集下的檢測(cè)結(jié)果。首先,我會(huì)先固定骨干網(wǎng)參數(shù),直接檢測(cè)部分的參數(shù)進(jìn)行調(diào)優(yōu)。例如Yolo 和SSD 中如圖所示的這些參數(shù),簡(jiǎn)單說(shuō)原則還是迭代嘗試,每次只調(diào)整其中一個(gè)。這里多說(shuō)一嘴,不管是yolo 還是ssd ,他們的anchor 或者priority box 機(jī)制,其數(shù)量也是符合邊際效用遞減曲線的,如yolo v2 論文中的這幅圖。大家看,這曲線無(wú)處不在是吧。所以當(dāng)其數(shù)量適當(dāng)增加的時(shí)候?qū)忍嵘呛苡杏玫?,但是在算力有限?chǎng)景下也不能加太多,因?yàn)榭偟膒roposal 會(huì)太多,nms 也會(huì)變的很多。另外,這里anchor聚類出來(lái)的具體長(zhǎng)寬,只要大體符合數(shù)據(jù)分布,就可以了,不用很精確,每次增加了同分布數(shù)據(jù)的時(shí)候也不用重復(fù)做聚類,因?yàn)榛貧w器會(huì)自動(dòng)完成回歸過(guò)程的,不要離的太遠(yuǎn)就好。這里不展開(kāi)了。調(diào)整完檢測(cè)參數(shù)之后,還要再集中調(diào)整一次數(shù)據(jù)增量參數(shù)。數(shù)據(jù)增量也是非常重要的,其實(shí)同理,數(shù)據(jù)增量也是符合邊際效用遞減曲線的,做太多了也就沒(méi)啥用了,該增加數(shù)據(jù)還是增加數(shù)據(jù)吧。這里里其實(shí)是可以提出這樣一個(gè)問(wèn)題的,就是這部分參數(shù)為什么在這個(gè)階段做?為什么不在先裁剪出來(lái)一個(gè)10M 的骨干網(wǎng)再加檢測(cè)頭。這里我個(gè)人更加傾向于在后續(xù)調(diào)優(yōu)過(guò)程中的測(cè)試過(guò)程更加end2end,因?yàn)槟愕哪康木褪悄繕?biāo)檢測(cè)嘛。同時(shí),需要注意的是這時(shí)的參數(shù)并不是最優(yōu)參數(shù),只是一個(gè)起始baseline,未來(lái)骨干網(wǎng)確定之后還會(huì)再來(lái)迭代。
現(xiàn)在我們要開(kāi)始裁剪網(wǎng)絡(luò)結(jié)構(gòu)了,雖然這部分最前沿的研究工作表示完全可以有NAS來(lái)完成。比如Google 2017年的NasNet 和2018年的MNasNet,不過(guò)我倒是覺(jué)得一般情況下一般人可能也部署不起能快速進(jìn)行網(wǎng)絡(luò)結(jié)構(gòu)搜索的分布式搜索框架。右圖即為NasNet 搜索出來(lái)的網(wǎng)絡(luò)結(jié)構(gòu),確實(shí)看起來(lái)也不像是設(shè)計(jì)出來(lái)的。我們還是在baseline 的基礎(chǔ)上逐步手工調(diào)整吧,可能確實(shí)相比搜索達(dá)不到最優(yōu),但是因?yàn)橛雄E可循,有經(jīng)驗(yàn)的時(shí)候還是有可能會(huì)比nas 上使用強(qiáng)化學(xué)習(xí)學(xué)出來(lái)的過(guò)程快一點(diǎn)。不過(guò)這塊不敢說(shuō)大話,說(shuō)不好未來(lái)有可能就不行了。
根據(jù)mobilenet-v1 論文,有幾個(gè)方向可以調(diào)整:寬度、深度、分辨率。先說(shuō)寬度,這塊有兩篇比較相關(guān)的論文,主要是ADC和AMC,是同一個(gè)組做的。這兩篇論文可以做到逐層選擇最優(yōu)的層寬度,效果還不錯(cuò)。這里我們還是跟mobilenet-v1一樣進(jìn)行等比例的寬度壓縮,不過(guò)有的時(shí)候也可能會(huì)進(jìn)行一些相應(yīng)層的區(qū)別性調(diào)整。深度,就是加減層。這里的問(wèn)題是,既然是壓縮為什么還要加層,因?yàn)榭赡軐挾认聛?lái)了,計(jì)算量已經(jīng)大幅下來(lái)了,增加深度還可以在計(jì)算量和運(yùn)行時(shí)間上達(dá)標(biāo)。深度這里還有一個(gè)很重要的就是選擇幾個(gè)stage 的問(wèn)題,一般的分類網(wǎng)都是32x downsampling ,5個(gè)stage,曠視在2018年提出DetNet 中使用了16x downsampling ,4個(gè)標(biāo)準(zhǔn)stage。這樣的好處是,224x224 輸入下檢測(cè)頭的featuremap 是14x14 的,可以兼顧細(xì)節(jié)和語(yǔ)義,同時(shí)速度也不慢。對(duì)于語(yǔ)義信息和細(xì)節(jié)信息保持更好的檢測(cè)方法,F(xiàn)PN 是個(gè)不錯(cuò)的選擇,但是FPN 在算力限制的條件下略顯笨重,實(shí)時(shí)運(yùn)行壓力有點(diǎn)大。對(duì)于分辨率,我們則大膽的假設(shè)這是一個(gè)可以暫時(shí)忽略的維度,原因是高分辨率可能帶來(lái)的只是小目標(biāo)和邊框精度的提升。一般的,可以在一個(gè)可行的分辨率下面專注于其他超參數(shù)的調(diào)整。這里還會(huì)涉及一些其他微調(diào),例如使用其他形狀或者大小的卷積核,提升感受野等。例如有孔卷積和5x5 卷積。不過(guò)有孔卷積在移動(dòng)設(shè)備的性能一般般。
接下來(lái)就是在各種調(diào)整中找一個(gè)最優(yōu)的tradeoff 點(diǎn)了,如圖是我在mobilenet-v2 這個(gè)網(wǎng)絡(luò)結(jié)構(gòu)上嘗試的結(jié)果,嘗試了一些不同寬度、深度和微調(diào)結(jié)構(gòu)等調(diào)整。左半側(cè)的點(diǎn)基本是3/8這個(gè)寬度的,右半側(cè)的點(diǎn)是3/4這個(gè)寬度的。箭頭指向的是簡(jiǎn)單按stage裁剪完深度之后的baseline。舉個(gè)小例子,這里針對(duì)mobilenet-v2 有一個(gè)小的點(diǎn)是我著重去調(diào)整的,就是1/4 這個(gè)尺寸下,第一個(gè)bottleneck極小只有4,是否這個(gè)值太小會(huì)導(dǎo)致對(duì)特征的描述太弱,而調(diào)大它對(duì)網(wǎng)絡(luò)整體計(jì)算量影響并不大,則可以嘗試。這里總結(jié)一下,簡(jiǎn)單說(shuō)就是在當(dāng)前狀態(tài)找一個(gè)最需要調(diào)整的維度,有哪些維度就靠經(jīng)驗(yàn)和他山之石了。另外,一般情況下,如果某個(gè)變量會(huì)明顯提高,那么就著重優(yōu)化一下它唄,也就是前文所說(shuō)的在邊際效用遞減曲線上上升趨勢(shì)比較明顯的變量值得著重考慮。而哪一個(gè)是最需要調(diào)整的呢,如果靠經(jīng)驗(yàn)都想不出的時(shí)候,那就隨便挑一個(gè),因?yàn)檎娴目赡苡衅嫘?。其?shí)我的感覺(jué)是,這個(gè)人肉搜索過(guò)程其實(shí)完全可以看做是一個(gè)隨機(jī)梯度下降的過(guò)程,每次自己都是用自己的評(píng)價(jià)函數(shù)找到了一個(gè)最佳維度然后往最優(yōu)迭代。并且有的時(shí)候嘗試的調(diào)整可以超出預(yù)期的值一定范圍,例如裁窄網(wǎng)絡(luò)之后加深的時(shí)候可以超量多加一些層,看看趨勢(shì)。這個(gè)就可以好比是使用大的學(xué)習(xí)率或者時(shí)模擬退火算法了。而人肉調(diào)整的好處是,我不需要每次都按相同的學(xué)習(xí)率調(diào)整,有的時(shí)候可以走一大步,節(jié)省不少迭代次數(shù)。
好,好不容易找?guī)讉€(gè)模型,但是事情還沒(méi)完,現(xiàn)在需要翻回頭去在現(xiàn)在的結(jié)構(gòu)上,再次調(diào)整之前的參數(shù)了。而在這些參數(shù)確定之后,還要再次回頭把挑出來(lái)的網(wǎng)絡(luò)結(jié)構(gòu)再驗(yàn)證一次。因?yàn)檫@里存在多變量聯(lián)合作用影響結(jié)果的情況,以及評(píng)價(jià)標(biāo)準(zhǔn)缺陷或者訓(xùn)練過(guò)程隨機(jī)因素導(dǎo)致的偶然因素。不過(guò)這里的工作量相比之前已經(jīng)不大了,因?yàn)榍懊嬉呀?jīng)排除掉了一些明顯不行的選項(xiàng)嘛。最后還要通過(guò)任務(wù)本身的實(shí)際測(cè)試去根據(jù)實(shí)測(cè)問(wèn)題調(diào)整驗(yàn)證集。如果有問(wèn)題還要再回去前面某個(gè)點(diǎn)上再調(diào)一遍。
剛剛的例子暫時(shí)告一段落吧,現(xiàn)在拋出第二個(gè)問(wèn)題,畢竟預(yù)告里面提了要說(shuō)一說(shuō),其實(shí)答案相比大家心中已經(jīng)有了答案。
根據(jù)之前的背景,這兩個(gè)問(wèn)題中數(shù)據(jù)特征空間差異是巨大的,所以,其實(shí)兩個(gè)問(wèn)題不可能直接進(jìn)行遷移學(xué)習(xí),但是,這里方法論是適用的,這里偷個(gè)懶,就不再展開(kāi)介紹如何重新適配了一遍了,相信有了第一個(gè)任務(wù)的經(jīng)驗(yàn),這個(gè)任務(wù)做起來(lái)并不難,迭代次數(shù)也會(huì)大幅下降。而通過(guò)講解,相信開(kāi)篇的問(wèn)題也可以得到一定的解答。
總結(jié)
首先,基礎(chǔ)知識(shí)很重要,需要掌握大量的基礎(chǔ)性調(diào)參經(jīng)驗(yàn),這里強(qiáng)烈推薦大家去查閱學(xué)習(xí)曠視大神魏秀參的博客。其次,需要嚴(yán)格做到對(duì)比實(shí)驗(yàn)方法,幫助自己準(zhǔn)確獲得這一次調(diào)整帶來(lái)的性能提升,并就此思考這次調(diào)整所帶來(lái)改變的原因。因?yàn)橐坏┯卸嗑S參數(shù)發(fā)生變化,就很難確定到底是哪一維的問(wèn)題,不能準(zhǔn)確的確定原因。另外,這里雖然排除了多維參數(shù)交叉作用的成分,但是可以通過(guò)螺旋迭代方法進(jìn)行彌補(bǔ)。特別需要提醒大家的是,精細(xì)的實(shí)驗(yàn)設(shè)計(jì)會(huì)導(dǎo)致嘗試路徑和次數(shù)很長(zhǎng),非常需要耐心。這時(shí)是很有必要先大膽降維,避免多個(gè)因素不知從何下手;而遇到瓶頸時(shí)則可以大膽猜測(cè)并假設(shè)問(wèn)題,小心設(shè)計(jì)實(shí)驗(yàn)進(jìn)行驗(yàn)證,很大概率會(huì)有驚喜。最后,輔助性的工作/工具至關(guān)重要,是保證快速迭代的基礎(chǔ)。所以選擇一個(gè)方便上手的框架至關(guān)重要,維護(hù)框架的細(xì)節(jié)也非常重要。這里值得建議的是,能用多卡加速就用多卡加速,然后有必要關(guān)注一下硬盤(pán)讀寫(xiě)瓶頸,建議換SSD固態(tài)硬盤(pán)。不過(guò)有一點(diǎn)值得慶幸,小模型的單模型訓(xùn)練速度很快,多因素嘗試的時(shí)候,迭代速度還可以接受。最后,一個(gè)良好的筆記軟件以及使用習(xí)慣可以幫你梳理嘗試過(guò)程中的邏輯和細(xì)節(jié)。不然,間隔幾個(gè)小時(shí)的訓(xùn)練工作完成之后,只怕你已經(jīng)忘記上次調(diào)整的是什么了。
問(wèn)題回答
后邊回答環(huán)節(jié)問(wèn)題較多,回答的時(shí)間比較倉(cāng)促,這邊挑三個(gè)出來(lái)簡(jiǎn)單再說(shuō)一下。
第一是關(guān)于超參數(shù)方面的,也就是學(xué)習(xí)率batch size,iteration等等超參數(shù)的配置。這里也是需要嚴(yán)格的對(duì)比實(shí)驗(yàn)設(shè)計(jì)來(lái)嘗試的。同時(shí),超參數(shù)是一般情況下變化不大,總的嘗試次數(shù)(batchsize * iteration)基本是隨著數(shù)據(jù)集總量來(lái)的。所以一般確定了的超參數(shù),在數(shù)據(jù)量變化不大的時(shí)候可以保持不動(dòng)。第二是關(guān)于檢出率和召回率如何兼顧?這個(gè)問(wèn)題現(xiàn)場(chǎng)時(shí)候我理解錯(cuò)了,講的更多的是如何挑選一個(gè)好的評(píng)價(jià)標(biāo)準(zhǔn)。事實(shí)上,如果回到本文所最長(zhǎng)提到的邊際效用遞減曲線來(lái)說(shuō),兼顧檢出率和召回率,就是找到一個(gè)最靠上的模型和超參數(shù)。具體找到這個(gè)模型,就是文中所講的方法論來(lái)做了。第三是輕量級(jí)模型下,用imagenet預(yù)訓(xùn)練有沒(méi)有意義?回到特征空間的背景,因?yàn)檩p量級(jí)模型的網(wǎng)絡(luò)結(jié)構(gòu)容量本身較小,所能容納的特征量不大。但是imagenet的數(shù)據(jù)集特征空間非常大,遠(yuǎn)超了輕量級(jí)模型的能力。會(huì)導(dǎo)致預(yù)訓(xùn)練模型中對(duì)特征的描述和目標(biāo)問(wèn)題領(lǐng)域相距過(guò)大,預(yù)訓(xùn)練學(xué)出來(lái)的特征后邊都會(huì)被新問(wèn)題訓(xùn)練過(guò)程中覆蓋掉。所以,數(shù)據(jù)不夠時(shí)合理的解決方法是,可以使用特征相比比較相似的數(shù)據(jù)集進(jìn)行預(yù)訓(xùn)練,例如車輛檢測(cè)問(wèn)題中,數(shù)據(jù)量不夠,可以使用kitti、bdd100k等數(shù)據(jù)集進(jìn)行一定的遷移工作。
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4771瀏覽量
100766 -
嵌入式設(shè)備
+關(guān)注
關(guān)注
0文章
110瀏覽量
16963 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5503瀏覽量
121162
原文標(biāo)題:算力限制場(chǎng)景下的目標(biāo)檢測(cè)實(shí)戰(zhàn)淺談
文章出處:【微信號(hào):IV_Technology,微信公眾號(hào):智車科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論