微軟資深研究員詳解基於交錯組卷積的高效DNN | 公開課筆記

做者 | 王井東
算法

整理 | 阿司匹林數組

出品 | AI科技大本營(公衆號ID:rgznai100)微信


卷積神經網絡在近幾年得到了跨越式的發展,雖然它們在諸如圖像識別任務上的效果愈來愈好,可是隨之而來的則是模型複雜度的不斷提高。愈來愈深、愈來愈複雜的卷積神經網絡須要大量存儲與計算資源,所以設計高效的卷積神經網絡是很是重要和基礎的問題,而消除卷積的冗餘性是該問題主要的解決方案之一。
網絡

如何消除消除卷積的冗餘性?咱們邀請到了微軟亞洲研究院視覺計算組資深研究員王井東博士,爲你們講解發表在 ICCV 2017 和 CVPR 2018 上基於交錯組卷積的方法。機器學習


回放地址:https://edu.csdn.net/huiyiCourse/detail/783性能


如下是公開課內容,AI科技大本營整理,略有刪減:學習



▌深度學習大獲成功的緣由優化


2006年《Science》上的一篇文章——Reducing the Dimensionality of Data with Neural Networks,是近十多年來促進深度學習發展很是重要的一篇文章。當時這篇文章出來的時候,不少機器學習領域的人都在關注這個工做,可是它在計算機視覺領域裏並無取得很是好的效果,因此並無引發計算機視覺領域的人的關注。ui

深度學習的方法在計算機視覺領域真正獲得關注是由於 2012 年的一篇文章——ImageNet Classification with Deep Convolutional Neural Networks。這個文章用深度卷積神經網絡的方法贏得了計算機視覺領域裏一個很是重要的 ImageNet 比賽的冠軍。在 2012 年以前的冠軍都是基於 SVM(支持向量機)或者隨機森林的方法。人工智能

2012年 Hinton 和他的團隊經過深度網絡取得了很是大的成功,這個成功大到什麼程度?比前一年的結果提升了十幾個百分點,這是很是可觀、很是了不得的提升。由於在 ImageNet 比賽上的成功,計算機視覺領域開始接受深度學習的方法。

比較這兩篇文章,雖然咱們都稱之爲深度學習,但實際上相差還挺大的。特別是 2012 年這篇文章叫「深度卷積神經網絡」,簡寫成 「CNN」。CNN 不是 2012 年這篇文章新提出來的,在九十年代,Yann LeCun 已經把 CNN 用在數字識別裏,並且取得很是大的成功,可是在很長的時間裏,你們都沒有拿 CNN 作 ImageNet 比賽,直到這篇文章。今天你們發現深度學習已經統治了計算機視覺領域。

爲何 2012 年深度學習可以成功?其實除了深度學習或者 CNN 的方法之外,還有兩個東西,一個是 GPU,還有一個就是 ImageNet。

這個網絡結構是 2012 年 Hinton 跟他學生提出的,其實這個網絡結構也就8層,好像沒有那麼深,但當時訓練這個網絡很是困難,須要一個星期才訓練出來,並且當時別人想復現它的結果也沒有那麼容易。

這篇文章之後,你們都相信神經網絡越深,性能就會變得越好。這裏面有幾個表明性的工做,簡單回顧一下。


深度網絡結構的兩個發展方向


▌愈來愈深



2014 年的 VGG,這個網絡結構很是簡單,就是一層一層堆積起來的,並且層與層之間很是類似。

同一年,Google 有一個網絡結構,稱之爲「GoogLeNet」,這個網絡結構看起來比 VGG 的結構複雜一點。這個網絡結構剛出來的時候看起來比較複雜,今天看起來就是多分支的一個結構。剛開始,你們廣泛的觀點是這個網絡結構是人工調出來的,沒有很強的推廣性。儘管 GoogLeNet 是一我的工設計的網絡結構,其實這裏面有很是值得借鑑的東西,包括有長有短多分支結構。

2015 年時出了一個網絡結構叫 Highway。Highway 這篇文章主要是說,咱們能夠把 100 層的網絡甚至 100 多層的網絡訓練得很是好。它爲何可以訓練得很是好?這裏面有一個概念是信息流,它經過 SkipConnection 能夠把信息很快的從最前面傳遞到後面層去,在反向傳播的時候也能夠把後面的梯度很快傳到前面去。這裏面有一個問題,就是這個 Skip Connection 使用了 gate function,使得深度網絡訓練困難仍然沒有真正解決。

同一年,微軟的同事發明了一個網絡,叫「ResNet」,這個網絡跟 Highway 在某種意義上很相像,相像在什麼地方?它一樣用了 Skip Connection,從某一層的 output 直接跳到後面層的 output 去。這個跟 Highway 相比,它把 gate function 扔掉了,緣由在於在訓練很是深的網絡裏 gate 不是一個特別好的東西。經過這個設計,它能夠把 100 多層的網絡訓練得很是好。後來發現,經過這招 1000 層的網絡也能夠訓練得很是好,很是了不得。

2016年,GoogLeNet、Highway、ResNet出現之後,咱們發現這裏面的有長有短的多分支結構很是重要,好比咱們的工做 deeply-fused nets,在多個 Branch 裏面,每一個分支深度是不同的這樣的好處在於,若是咱們把從這個結構當作一個圖的話,發現從這個輸入點到那個輸出點有多條路徑,有的路徑長,有的路徑短,從這個意義上來說,咱們認爲有長有短的路徑能夠把深度神經網絡訓練好。



同年,咱們發現有個相似的工做,叫 FractalNets,它跟咱們的 deeply-fused nets 很是相像。

這條路都是經過變深,但願把網絡結構訓練得很是好,使它的性能很是好,加上 Skip Connection 等等形式來使得信息流很是好。儘管咱們經過 Skip Connection 把深度網絡訓練得很不錯,但深度仍是帶來一些問題,就是並無把性能發揮得很好,因此有另一個維度,你們但願變得更寬一點。

除此以外,大的網絡用在實際中會遇到一些問題。好比部署到手機上時但願計算量不要太大,模型也不要太大,性能仍然要很好,因此識別率作的很是高的可是很龐大的網絡結構在實際應用裏面臨一些困難。


▌簡化結構的幾種方法



另一條路是簡化網絡結構,消除裏面的冗餘性。由於你們都認爲如今深度神經網絡結構裏有很強的冗餘性,消除冗餘性是我近幾年發現很是值得作的一個領域,由於它的實際用處很大。

卷積操做

CNN 裏面的卷積操做實際上對應的就是矩陣向量相乘,你們作的基本就是消除卷積裏的冗餘性。



咱們回顧一下卷積。右邊的圖:在 CNN 裏面有若干個通道,每一個通道其實是一個二維的數組,每一個位置都有一個數值,在這裏面咱們稱爲「響應值」。這裏面有四個通道,實際上就至關於三維的數組同樣。以這裏(每一個位置)爲中心,取一個 3×3 的小塊出來,3×34 個通道,那就有 3×3×4 這麼多個數值,而後咱們把這麼多個數值拉成一個 3×3×4=36 維向量。卷積有個卷積核,卷積覈對應一個橫向量,這個橫向量和列向量一相乘,就會獲得響應的值,這是第一個卷積核。經過第二個卷積核又會獲得第二個值,相似地能夠獲得第三個第四個值。

總結起來,卷積操做就是是矩陣和向量相乘,矩陣對應的是若干個卷積核,向量對應的是周圍方塊的響應值(ResponseValue)。

你們都知道矩陣跟向量相乘佔了很大的計算量。我在這裏舉的例子並無那麼大,但你們想想,若是輸入輸出 100個 通道,,假如這個卷積核是3×3×100,那就是 100×900 的計算量,這個計算量很是大,因此有大部分工做集中在解決這裏面(卷積操做)冗餘性的問題。


Low-precision kernels(低精度卷積核)


有什麼辦法解決冗餘性的問題呢?



由於卷積核一般是浮點型的數,浮點型的數計算複雜度要大一點,同時它佔得空間也會大一點。最簡單的一招是什麼?假設把卷積核變成二值的,好比 一、-1,咱們看看 一、-1轉成之後有什麼好處?這個向量 一、-1(使得)原本相乘的操做變成加減了,這樣一來計算量就減小了不少。除此之外,模型和存儲量也減小不少。



也有相似相關的工做,就是把浮點型的變成整型的,好比之前 32 位浮點數的變成 16 位的整型數,一樣存儲量會小,或者模型會小。除了卷積核進行二值化化之外或者進行整數化之外,也能夠把 Response 變成二值數或者整數。



還有一類研究得比較多的是量化。好比把這個矩陣聚類,好比 2.9一、3.0六、3.21,聚成一類,我用 3 來代替它量化有什麼好處?首先,你的存儲量減小了,不須要存儲原來的數值,只須要存量化之後的每一箇中心的索引值就能夠了。除此以外,計算量也變小了,你能夠想辦法讓它減小乘的次數,這樣就模型大小就會減小了。

Low-rank kernels(低秩卷積核)




另一條路,矩陣大怎麼辦?把矩陣變小一點,因此不少人作了這件事情, 100 個(輸出)通道,我把它變成 50 個,這是一招。另一招, input(輸入)不少, 100 個通道,變成了 50 個。


低秩卷積核的組合



把通道變少會不會下降性能?因此有人作了這件事情:把這個矩陣變成兩個小矩陣相乘,假如這個矩陣是 100×100 的,我把它變成 100×10 和10×100 兩個矩陣相乘,(相乘獲得的矩陣)也變成 100×100 的矩陣,近似原來 100×100 那個矩陣。這樣想一想,100×100 變成 100×10 跟 10×100,顯然模型變小了,變成五分之一。此外計算量也降到五分之一。


稀疏卷積核



另一條路,怎麼把矩陣跟向量相乘變得快一點、模型的參數少一點?能夠把裏面的有些數變成 0,好比 2.91 變成 0,3.06 變成 0,變成 0 之後就成了稀疏的矩陣,這個稀疏矩陣存儲量會變小,若是你足夠稀疏的話,計算量會小,由於直接是 0 就不用乘了。還有一種 Structured sparse(結構化稀疏),好比這種對角形式,矩陣跟向量相乘,能夠優化得很好。這裏 Structured sparse 對應我後面將要講的組卷積(Groupconvolution)。


稀疏卷積核的組合



咱們來看看這個矩陣能不能經過多個稀疏矩陣相乘來近似,這是我今天要講的重點,咱們的工做也是圍繞這一點在往前走。在咱們作這個方向以前,你們並無意識到一個矩陣能夠變成兩個稀疏矩陣相乘甚至多個稀疏矩陣相乘,來達到模型小跟計算量小的目標。


從IGCV1到IGCV3


▌IGCV1



首先我給你們介紹一下咱們去年在 ICCV 2017 年會議上的文章,交錯組卷積的方法。



這個卷積裏面有六個通道,經過卷積出來的也是六個小方塊(通道),假如 spatial kernel 的尺寸是5×5,對每一個位置來說,它的計算量是6×5×5×6。



我剛纔講了(一種結構化)稀疏的形式,對應的就是組卷積的形式,組卷積是什麼意思?我把這 6 個通道分紅上面 3 個通道和下面 3 個通道,分別作卷積,作完之後把它們拼在一塊兒,最後獲得的是6個通道。看看計算量,上面是 3×5×5×3,下面也是同樣的,整個計算複雜度跟前面的 6×5×5×6 相比就小了一半,但問題是參數利用率可能不夠。



咱們的工做是基於組卷積的,剛纔提到了上面的三個通道和這三個通道不相關,那有沒有辦法讓它們相關?因此咱們又引進了第二個組卷積,咱們把這6個通道從新排了序,一、4 放到這(第一個分支),二、5 放到這(第二個分支),三、6 放到那(第三個分支),這樣每一分支再作一次 1×1 的convolution,得出新的兩個通道、兩個通道、兩個通道,拼在一塊兒。經過交錯的方式,咱們但願達到每一個 output(輸出)的通道(綠色的通道或者藍色的通道)跟前面6個通道都相連。



有什麼好處?經過第二組的組卷積能夠達到互補的條件,或者使得任何一個 output(輸出通道)和任何一個 input(輸入通道)連起來。



這裏面咱們引進了一個嚴格的互補條件,直觀來說就是,若是有兩個通道在第一組卷積裏面,落在同一個 Branch(分支),我但願在第二組裏面落在不一樣的 Branch(分支)。第二組裏面好比一個 Branch(分支)裏面的若干個通道,要來自於第一個組卷積裏面的全部 Branches(分支),這個稱爲互補條件。這個互補條件帶來什麼?它會帶來(任何一對輸入輸出通道之間存在) path,也就是說相乘矩陣是密集矩陣。爲何稱之爲「嚴格的」?就是任何一個 input 和 output 之間有一條 path,並且有且只有一條path。



嚴格的準則引進來之後,參數量變小了、模型變小了,帶來什麼好處?這裏我給一個結論,L 是(第)一個組卷積裏面的 partitions(分支)的數目或者卷積的數目,M是第二組組卷積卷積的數目,S 是卷積核的大小,一般都是大於 1 的。這樣的不等式幾乎是恆成立的,這個不等式意味着什麼?結論是:若是跟普通標準的卷積去比,經過咱們的設計方式可讓網絡變寬。跟網絡變深相比起來,網絡變寬是另一個維度,變寬有什麼好處?會不會讓結果變好?咱們作了一些實驗。



這個實驗是跟標準的卷積去比,你們看看左下角的表格,這個表格是參數量,咱們設計的網絡幾乎是標準(卷積)參數量的一半。而後看看右下角這個網絡,咱們的的計算量幾乎也是一半。在 CIFAR-10 標準的圖像分類數據集裏(上面的表格),咱們的結果比前面的一種好。咱們甚至會發現越深越好,在 20 層有些提高並無那麼明顯,但深的時候能夠達到 1.43 的提升量。



後來 CIFRA-100 咱們也作了一樣的實驗,發現咱們提高仍然是一致的,甚至跟前面的比起來提升得更大,由於分 100 類比分 10 類困難一點,說明越困難的任務,咱們的優點越明顯。這個變寬了之後(性能)的確變好了,經過 IGC 實現,網絡結構變寬的確會帶來好處。



這是兩個小的數據集,其實在計算機視覺領域裏小數據集上的結果是不能(徹底)說明問題的,必定要作很是大的數據集。因此咱們當時也作了 ImageNet 數據集,跟 ResNet 比較了一下,參數量少了近五分之二,計算量小了將近一半了,錯誤率也下降了,這證實經過 IGC 的實現,讓模型變寬,在大的網絡模型上取得很是不錯的效果。



咱們大概是前年 八、9 月份開始作這個事情,10 月份發現 Google 有一個工做是 Xception,這個是它的結構圖,這個形式很是接近(咱們的結構),跟咱們前面所謂的 IGC 結構很是像,實際上就是咱們的一個特例。當時咱們以爲這個特例有沒有可能結果最好,因此咱們作了些驗證,總體上咱們結構好一點。



IGC 可能還有變體,好比我要是把這個 channel-wise 也變成組卷積,第二個是 1×1 的,這樣的結果會怎樣?咱們作了相似一樣的實驗,仍然發現咱們的方法是最好的。



當時咱們作的時候,但願在網絡結構上跟 state-of-the-arts 的方法去比較,咱們取得了很是不錯的結果,當時咱們的工做是但願經過消除冗餘性提升模型性能或者準確率。


▌IGCV2



後來咱們嘗試利用消除冗餘性帶來的好處,把這個模型部署到手機上去。咱們去年又沿着這個方向繼續往前走,把這個問題理解得更深,但願進一步消除冗餘性。



這個講起來比較直接或簡單一點,前面的網絡結構是兩個組卷積或者兩個矩陣相乘獲得的,咱們有沒有辦法變得多一點?實際上很簡單,如上圖所示。



這種方法帶來的好處很直接,就是但願參數量儘可能小,那怎麼才能(使)參數量儘可能小?咱們引進了所謂的平衡條件。雖然這裏面咱們有 L-1 個 1×1 的組卷積,但 L-1 個 1×1 的組卷積之間有區別嗎?誰重要一點、誰不重要一點?其實咱們也不知道。不知道怎麼辦?就讓它同樣。同樣了之後,咱們經過簡單的數學推導就會得出上面的數學結果。



如今再驗證一下,前面講了互補條件、平衡條件,那這個結果是否是最好的?或者是否是有足夠的優點?咱們作了些實驗,這個紅色的是對應知足咱們條件的,發現這個狀況下(L=4)結果是最好的。實際上是不是老是最好?不見得,由於實際問題跟理論分析仍是有點距離。但咱們整體發現基本上紅色的不是最好也排在第二,說明這種設計至少給了咱們很好的準則來幫助設計網絡結構。這個雖然不老是最好的,但和最好的是差很少的。



第二個問題,咱們究竟要設計多少個組卷積(L 設成多少)?一樣咱們的準則也是經過參數量最小來進行分析,之前是兩個組卷積,咱們能夠經過 3 個、4 個達到參數量更小,但其實最終的結論發現,並非參數量最優的狀況下性能是最好的。



▌IGCV3



後來咱們發現,若是遵循嚴格互補條件,模型的結構變得很是稀疏、很是寬,結果不見得是最好的。因此咱們變成了 Loose。Loose 是什麼意思?之前 output(輸出通道)和 input (輸入通道)之間是有且只有一個 path,咱們改得很是簡單,能不能多個path?多個 path 就沒那麼稀疏了,它好處在於每一個 output (輸出通道)能夠多條路徑從 input (輸入通道)那裏拿到信息,因此咱們設計了 Loose condition。



實際上很是簡單,咱們就定義兩個超級通道(super-channels)只能在一個 Branch 裏面同時出現,不能在兩個 Branch 裏同時出現,來達到 Loose condition。



後來咱們進一步往前走,把 structured sparse 和 low-rank 兩個組起來。咱們在 ImageNet 上比較,同時跟 MobileV2 去比,在小的模型咱們優點是愈來愈明顯的。比較結果,見下圖。



這就是今天的主要內容,這個工做是我跟不少學生和同事一塊兒作的,前面這5個是個人學生,Ting Zhang如今在微軟研究院工做,Bin Xiao 是個人同事,Guojun Qi 是美國的教授,咱們一塊兒合做了這篇文章。


講師簡介

王井東,微軟亞洲研究院視覺計算組資深研究員,國際模式識別學會會士,曾擔任CVPR、ICCV、ECCV、AAAI 等計算機視覺和人工智能會議的領域主席和高級程序委員會委員。在視覺、機器學習以及多媒體領域裏發表論文 100 餘篇,我的專著一本。


更多公開課

計算機視覺

格靈深瞳:一億ID的人臉識別訓練和萬億人臉對(Trillion Pairs)的人臉識別評測 

雲從科技:詳解跨鏡追蹤(ReID)技術實現及應用場景 

騰訊:朋友圈爆款背後的計算機視覺技術與應用 

曠視科技:計算機視覺如何賦能身份驗證場景 


NLP

思必馳NLP負責人:啓發式對話中的知識管理

達觀數據聯合創始人:NLP概述和文本自動分類算法詳解

阿里巴巴翻譯模型組負責人 :Transformer新型神經網絡在機器翻譯中的應用

微信高級研究員解析深度學習在NLP中的發展和應用 

相關文章
相關標籤/搜索