姓名:閆偉? 學(xué)號(hào):15020150038
轉(zhuǎn)載自:https://zhuanlan.zhihu.com/p/45072374
【嵌牛導(dǎo)讀】:深度學(xué)習(xí)這種技術(shù)可謂是多才多藝窜觉、強(qiáng)大無比尺栖,但運(yùn)行神經(jīng)網(wǎng)絡(luò)又對(duì)計(jì)算力誉尖、能耗和磁盤空間要求很高。這對(duì)于運(yùn)行在有大型硬盤和多個(gè) GPU 的云應(yīng)用來說龙誊,通常這不是個(gè)問題。
【嵌牛鼻子】:深度學(xué)習(xí) GPU 云應(yīng)用
【嵌牛提問】:如何使神經(jīng)網(wǎng)絡(luò)在手機(jī)上更加方便的運(yùn)行?
【嵌牛正文】:
讓神經(jīng)網(wǎng)絡(luò)更小更快的方法
基本上,我們對(duì)三個(gè)指標(biāo)很感興趣:模型的準(zhǔn)確率氨距,運(yùn)行速度和在手機(jī)中所占空間大小。
因?yàn)樘煜聸]有免費(fèi)的午餐棘劣,所以我們必須要做出一些取舍俏让。
對(duì)于大部分方法,我們會(huì)著眼于這三個(gè)指標(biāo),尋找滿足我們需求的“飽和點(diǎn)”(saturation point)首昔。所謂“飽和點(diǎn)”就是一個(gè)指標(biāo)中的收益無法再通過其它指標(biāo)中的損失來實(shí)現(xiàn)寡喝。在達(dá)到“飽和點(diǎn)”之前保持優(yōu)化值,我們就可以在這兩類指標(biāo)上取得最佳結(jié)果勒奇。
圖:在這個(gè)例子中拘荡,我們可以在不增加誤差的情況下大幅縮減代價(jià)高昂的運(yùn)算。然而撬陵,圍繞“飽和點(diǎn)”,誤差就會(huì)很高网缝,這是不可接受的巨税。
記住這個(gè)方法,我們開始吧粉臊!
避免全連接層
全連接層時(shí)神經(jīng)網(wǎng)絡(luò)中最常見的組成部分之一草添,它們的效果也確實(shí)很好。然而扼仲,由于全連接層中的每個(gè)神經(jīng)元都和之前層的所有神經(jīng)元相連远寸,因而需要存儲(chǔ)和更新大量的參數(shù)。這對(duì)運(yùn)行速度和磁盤空間非常不利屠凶。
卷積層是充分利用輸入(通常是圖像)中局部連貫性的層驰后。在卷積層中,每個(gè)神經(jīng)元不再和之前層的所有神經(jīng)元相連矗愧,使用它能夠在維持高準(zhǔn)確度的同時(shí)灶芝,減少連接/權(quán)重的數(shù)量。
圖:和卷積層相比唉韭,全連接層有更多的連接和權(quán)重
使用很少或不使用全連接層夜涕,可縮減模型的大小,也能保持很高的準(zhǔn)確度属愤。這樣既能提高速度女器,也能減少磁盤空間使用。
在上面的配置中住诸,一個(gè)有著1024個(gè)輸入和512個(gè)輸出的全連接層會(huì)有大概50萬個(gè)參數(shù)驾胆。而一個(gè)有著同樣特征和32個(gè)特征圖譜的卷積層,則只有5萬個(gè)參數(shù)只壳,足足優(yōu)化了10倍俏拱!
縮減通道數(shù)量和內(nèi)核大小
這一步的操作非常直截了當(dāng),就是在模型復(fù)雜度和運(yùn)行速度之間做一個(gè)權(quán)衡吼句。卷積層中有很多通道能讓神經(jīng)網(wǎng)絡(luò)提取很多的相關(guān)信息锅必,但是代價(jià)很高。去掉一些特征圖譜,能很容易地節(jié)省空間搞隐,讓模型運(yùn)行更快驹愚。
我們可以用卷積操作中的感受域(receptive field)來做同樣的事情×痈伲縮減內(nèi)核大小后逢捺,雖然卷積對(duì)局部特征的感受度下降,但涉及的參數(shù)數(shù)量也會(huì)減少癞季。
圖:更小的感受域/內(nèi)核尺寸耗費(fèi)更少的計(jì)算力劫瞳,但傳遞的信息也更少
這兩種情況下,我們通過尋找“飽和點(diǎn)”來選擇特征圖譜數(shù)量/內(nèi)核大小绷柒,這樣以來模型的準(zhǔn)確度也不會(huì)大幅下降志于。
優(yōu)化降采樣
對(duì)于固定數(shù)量的層,和固定數(shù)量的池化操作废睦,神經(jīng)網(wǎng)絡(luò)的表現(xiàn)會(huì)大不相同伺绽。這是因?yàn)閿?shù)據(jù)的表示以及計(jì)算負(fù)荷取決于池化操作所處的時(shí)間點(diǎn):
如果很早執(zhí)行池化操作,數(shù)據(jù)的維度就會(huì)降低嗜湃。更少的維度意味著神經(jīng)網(wǎng)絡(luò)的處理速度更快奈应,但也意味著更少的信息和更低的準(zhǔn)確度。
如果很晚才執(zhí)行池化操作购披,就會(huì)保存大部分信息杖挣,模型就有很高的準(zhǔn)確度。然而刚陡,這也意味著計(jì)算對(duì)象有很多維度程梦,需要耗費(fèi)大量計(jì)算力。
在神經(jīng)網(wǎng)絡(luò)中均勻進(jìn)行降采樣是一種非常高效的結(jié)構(gòu)橘荠,而且能在模型準(zhǔn)確度和運(yùn)算速度之間取得良好的平衡屿附。也就是我們所說的“飽和點(diǎn)”。
圖:早期池化模型會(huì)很快哥童。晚期池化模型會(huì)更準(zhǔn)挺份,均勻池化則兼得兩者優(yōu)點(diǎn)
剪切權(quán)重
在訓(xùn)練后的神經(jīng)網(wǎng)絡(luò)中,有些權(quán)重對(duì)神經(jīng)元的激活影響很大贮懈,而其余權(quán)重則和很少影響結(jié)果匀泊。不過,我們?nèi)匀粫?huì)計(jì)算這些較弱的權(quán)重朵你。
剪切權(quán)重就是我們將那些影響量級(jí)最小的連接完全移除的過程各聘,這樣我們就可以略過關(guān)于它們的計(jì)算。這樣做雖然會(huì)降低模型的準(zhǔn)確度抡医,但是能讓模型更輕便躲因、運(yùn)行更快早敬。我們需要找到一個(gè)“飽和點(diǎn)”,移除盡可能多的連接大脉,但又不會(huì)導(dǎo)致準(zhǔn)確度大幅下降搞监。
圖:移除最弱的連接來節(jié)省計(jì)算時(shí)間和空間
將權(quán)重量化
為了能將神經(jīng)網(wǎng)絡(luò)保存在磁盤,我們需要記錄神經(jīng)網(wǎng)絡(luò)中每個(gè)權(quán)重的值镰矿。這意味著要保存每個(gè)參數(shù)的浮點(diǎn)值琐驴,這會(huì)大量占用磁盤空間。舉個(gè)例子秤标,在C語言中绝淡,一個(gè)浮點(diǎn)數(shù)占用4字節(jié),即32-bit苍姜。一個(gè)有著數(shù)億參數(shù)的網(wǎng)絡(luò)(比如Google-Net或VGG-16)輕松就能占據(jù)上百兆字節(jié)的空間够委,而這在移動(dòng)設(shè)備上是不可接受的。
如果想讓神經(jīng)網(wǎng)絡(luò)的內(nèi)存占用量盡可能的小怖现,一個(gè)方法就是通過量化權(quán)重來降低它們的精度。在這個(gè)過程中玉罐,我們會(huì)修改數(shù)字的表示使其不再取用任意值屈嗤,而是一些值的子集。這能讓我們只需存儲(chǔ)一次經(jīng)過量化處理的值吊输,然后將它們參考為神經(jīng)網(wǎng)絡(luò)的權(quán)重饶号。
圖:量化權(quán)重,存儲(chǔ)索引而非浮點(diǎn)值
我們通過再次尋找“飽和點(diǎn)”來確定使用多少值季蚂。值越多茫船,準(zhǔn)確度就越高,但也意味著更大的數(shù)字表示扭屁。例如算谈,使用256個(gè)量化后的值,每個(gè)權(quán)重僅用1個(gè)字節(jié)即8-bit就能表示料滥。和之前相比(32-bit)然眼,我們將大小縮小了4倍!
編碼模型的表示
我們已經(jīng)對(duì)權(quán)重做了很多處理葵腹,但是尚未優(yōu)化神經(jīng)網(wǎng)絡(luò)高每!第6種方法是應(yīng)對(duì)權(quán)重分布不均的問題。模型的權(quán)重量化以后践宴,我們并沒有相同數(shù)量的權(quán)重來支撐每個(gè)量化后的值鲸匿。這意味著在模型的表示中,某些索引的出現(xiàn)頻率相對(duì)更高阻肩,我們可以充分利用這一點(diǎn)带欢!
霍夫曼編碼時(shí)解決這個(gè)問題的絕佳方案。它會(huì)給最常用的值分配最小索引、給最不常用值分配最大索引洪囤,這樣就能縮小設(shè)備上的模型大小徒坡,最妙的是不會(huì)造成準(zhǔn)確度下降。
圖:頻率最高的符號(hào)只占用1-bit的空間瘤缩,而頻率最低的占用了3-bit空間喇完。這是因?yàn)楹笳咴跀?shù)據(jù)表示中出現(xiàn)的次數(shù)很少,從而達(dá)到一種空間上的平衡剥啤。
這種簡(jiǎn)單技巧能讓我們進(jìn)一步縮小神經(jīng)網(wǎng)絡(luò)占用的內(nèi)存空間锦溪,通常能縮小30%。
注意:神經(jīng)網(wǎng)絡(luò)中每一層的量化和編碼操作可以是不同的府怯,從而提供更多的靈活性刻诊。
修正準(zhǔn)確度損失
使用我們上面列舉的方法后,我們幾乎“大修”了手頭的神經(jīng)網(wǎng)絡(luò):移除了弱連接(剪切權(quán)重)牺丙,甚至修改了權(quán)重(量化操作)则涯。這樣能讓神經(jīng)網(wǎng)絡(luò)超級(jí)輕便,運(yùn)行飛快冲簿,但準(zhǔn)確度也會(huì)發(fā)生變化粟判。
為了修正這個(gè)問題,我們需要在每一步迭代地重新訓(xùn)練神經(jīng)網(wǎng)絡(luò)峦剔,意思就是在剪切或量化權(quán)重后档礁,我們?cè)俅斡?xùn)練神經(jīng)網(wǎng)絡(luò),這樣它就能適應(yīng)變化吝沫,不斷重復(fù)這個(gè)過程直到權(quán)重不再大幅變化為止呻澜。
結(jié)語
雖然智能手機(jī)并沒有電腦那樣的磁盤空間、計(jì)算力或續(xù)航能力惨险,但仍然是深度學(xué)習(xí)應(yīng)用的極佳運(yùn)行平臺(tái)羹幸。借助一些技巧,再犧牲一點(diǎn)準(zhǔn)確度辫愉,我們就能在移動(dòng)設(shè)備上運(yùn)行強(qiáng)大的神經(jīng)網(wǎng)絡(luò)睹欲。這將為數(shù)以千計(jì)的激動(dòng)人心的 App 敞開大門。
參考資料:
https://heartbeat.fritz.ai/how-smartphones-manage-to-handle-huge-neural-networks-269debcb243d