天天看點

論文筆記:VarGNet: Variable Group Convolutional Neural Network for Efficient Embedded Computing

<div id="article_content" class="article_content clearfix">

        <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/ck_htmledit_views-163de54645.css" target="_blank" rel="external nofollow" >

                <div id="content_views" class="markdown_views prism-atom-one-light">

                    <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">

                        <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>

                    </svg>

                    <h3><a name="t0"></a><a id="_0"></a>中心思想:</h3> 

<ul><li><strong>固定group convolution中每個group的channel個數,而不是遵循現有的做法:固定group的個數</strong></li><li>各層之間的計算政策由于group channel個數的固定,使得模型在硬體端更容易優化</li></ul> 

<h3><a name="t1"></a><a id="_5"></a>設計滿足<a href="https://so.csdn.net/so/search?q=%E5%B5%8C%E5%85%A5%E5%BC%8F&amp;spm=1001.2101.3001.7020" target="_blank" rel="external nofollow" target="_blank" class="hl hl-1" data-report-view="{&quot;spm&quot;:&quot;1001.2101.3001.7020&quot;,&quot;dest&quot;:&quot;https://so.csdn.net/so/search?q=%E5%B5%8C%E5%85%A5%E5%BC%8F&amp;spm=1001.2101.3001.7020&quot;}" data-report-click="{&quot;spm&quot;:&quot;1001.2101.3001.7020&quot;,&quot;dest&quot;:&quot;https://so.csdn.net/so/search?q=%E5%B5%8C%E5%85%A5%E5%BC%8F&amp;spm=1001.2101.3001.7020&quot;}" data-tit="嵌入式" data-pretit="嵌入式">嵌入式</a>端上網絡的幾種思路:兩個方向</h3> 

<ul><li>設計出算力需求少的網絡(減少乘加次數,MAdds),如shufflenet v1/v2, mobilenet v1/v2</li><li>從FPGA(硬體)、編譯器方面入手,優化卷積等操作的計算方式<br> 但是上述的兩個發展方向,往往是背道而馳的。如果單純降低MAdds,整體的latency就會下降;而如果單獨對編譯器/硬體進行優化,則使得網絡的優化比較局限(因為硬體優化往往是針對性的)</li><li>這裡提出的VarGNet則從兩方面同時入手:最大程度地比對資料的layout,進而使得一次卷積操作中,所需的資料都在on-chip memory中,降低on-chip/ off-chip memory的通信時間開銷</li></ul> 

<h3><a name="t2"></a><a id="Vargnet_11"></a>Vargnet的改進思路</h3> 

<ul><li>一個現象:若在網絡中各層的計算量是平衡的,則網絡更容易優化</li><li>基于MobileNet中的可分離卷積,本文提出了固定每個group中的通道數,自動調整group個數的vargnet</li><li>這樣做的優勢有2方面: 

  <ul><li>便于編譯器優化(因為每組卷積操作具有更相似的資料layout)</li><li>MobileNet中,可分離卷積實際上group個數就等于輸入channel,與之相比,variable group convolution(指的是固定每個group中的channel個數的方式)能夠增大網絡容量,進而使得整體的網絡channel個數更少,緩解了off-chip memory的通信成本</li><li>對于MobileNet V2中的Inverted Residual Block,先将輸入的通道數通過pointwise卷積放大了6倍,然後進行depthwise。由于計算模式有限,這樣的操作對編譯器不友好。是以先将輸入通道為C的feature map通過group based conv将通道數變成2C,然後再通過depthwise變成C</li></ul> </li><li>具體思路來自于卷積操作中的2個重要性質: 

  <ul><li>卷積核在整個卷積過程中會被多次使用(Feature Map中的每個坐标都需要),而Feature Map隻會用一次</li><li>卷積核的記憶體占用遠比Feature Map小。一次卷積操作中,記憶體占用分别為:<span class="katex--inline"><span class="katex"><span class="katex-mathml">

            k

            2

           C

          k^2C

       </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.814108em; vertical-align: 0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.03148em;">k</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.814108em;"><span class="" style="top: -3.063em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right: 0.07153em;">C</span></span></span></span></span> vs <span class="katex--inline"><span class="katex"><span class="katex-mathml">

           2

           H

           W

           C

          2HWC

       </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.68333em; vertical-align: 0em;"></span><span class="mord">2</span><span class="mord mathdefault" style="margin-right: 0.08125em;">H</span><span class="mord mathdefault" style="margin-right: 0.13889em;">W</span><span class="mord mathdefault" style="margin-right: 0.07153em;">C</span></span></span></span></span>(因為要存結果)</li></ul> </li><li>是以要求:1. 各層的計算強度盡可能均衡,降低總延時;2. 輸入Feature Map盡可能少(減少記憶體的排程) 

  <ul><li>對于1. 可以增加可分離卷積中depthwise的比例</li><li>對于2. 可以減少Feature Map的channel個數</li></ul> </li><li>可變組卷積: 

  <ul><li>基于上述的2點要求,我們可以回顧Group卷積所需的乘法次數,參考<a href="https://blog.csdn.net/richard_che/article/details/106293337" target="_blank" rel="external nofollow" >Convolution &amp; DepthWise Conv</a>:<br> <span class="katex--display"><span class="katex-display"><span class="katex"><span class="katex-mathml">

               k

               2

              ∗

              h

              ∗

              w

              ∗

               c

                i

                n

              ∗

               c

                o

                u

                t

              g

              r

              o

              u

              p

              s

           \frac{k^2 * h * w * c_{in} * c_{out}}{groups}

        </span><span class="katex-html"><span class="base"><span class="strut" style="height: 2.37155em; vertical-align: -0.88044em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 1.49111em;"><span class="" style="top: -2.314em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.03588em;">g</span><span class="mord mathdefault" style="margin-right: 0.02778em;">r</span><span class="mord mathdefault">o</span><span class="mord mathdefault">u</span><span class="mord mathdefault">p</span><span class="mord mathdefault">s</span></span></span><span class="" style="top: -3.23em;"><span class="pstrut" style="height: 3em;"></span><span class="frac-line" style="border-bottom-width: 0.04em;"></span></span><span class="" style="top: -3.677em;"><span class="pstrut" style="height: 3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right: 0.03148em;">k</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.814108em;"><span class="" style="top: -3.063em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord mathdefault">h</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord mathdefault" style="margin-right: 0.02691em;">w</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord"><span class="mord mathdefault">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord"><span class="mord mathdefault">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.280556em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">o</span><span class="mord mathdefault mtight">u</span><span class="mord mathdefault mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.88044em;"><span class=""></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></span></li><li>在對比普通卷積的乘法次數:<br> <span class="katex--display"><span class="katex-display"><span class="katex"><span class="katex-mathml">

             k

              ′

              2

            ∗

            h

            ∗

            w

            ∗

             c

              i

              n

            ∗

             c

              o

              u

              t

           k'^2 * h * w * c_{in} * c_{out}

        </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.864108em; vertical-align: 0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.03148em;">k</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.864108em;"><span class="" style="top: -3.113em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span><span class="mord mtight">2</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 0.69444em; vertical-align: 0em;"></span><span class="mord mathdefault">h</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 0.46528em; vertical-align: 0em;"></span><span class="mord mathdefault" style="margin-right: 0.02691em;">w</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 0.61528em; vertical-align: -0.15em;"></span><span class="mord"><span class="mord mathdefault">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 0.58056em; vertical-align: -0.15em;"></span><span class="mord"><span class="mord mathdefault">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.280556em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">o</span><span class="mord mathdefault mtight">u</span><span class="mord mathdefault mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span></span></span></span></span></span></li><li>二者相除,比例為<span class="katex--inline"><span class="katex"><span class="katex-mathml">

            k

            2

           /

           g

           r

           o

           u

           p

           s

           ∗

            k

             ′

             2

          k^2 / groups * k'^2

       </span><span class="katex-html"><span class="base"><span class="strut" style="height: 1.06411em; vertical-align: -0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.03148em;">k</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.814108em;"><span class="" style="top: -3.063em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mord">/</span><span class="mord mathdefault" style="margin-right: 0.03588em;">g</span><span class="mord mathdefault" style="margin-right: 0.02778em;">r</span><span class="mord mathdefault">o</span><span class="mord mathdefault">u</span><span class="mord mathdefault">p</span><span class="mord mathdefault">s</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 0.814108em; vertical-align: 0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.03148em;">k</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.814108em;"><span class="" style="top: -3.063em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span></span></span>。如果用可分離卷積,一般k取3或5,而<span class="katex--inline"><span class="katex"><span class="katex-mathml">

            k

            ′

          k'

       </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.751892em; vertical-align: 0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right: 0.03148em;">k</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.751892em;"><span class="" style="top: -3.063em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span></span>一般取1,groups一般等于輸入Feature Map的大小,比如128,256,這就導緻這兩個卷積的計算量嚴重不平衡</li><li>是以可以減少group的個數,或者增加<span class="katex--inline"><span class="katex"><span class="katex-mathml">

           b

           a

           s

           e

           =

            c

             i

             n

           /

           g

           r

           o

           u

           p

          base = c_{in}/group

       </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.69444em; vertical-align: 0em;"></span><span class="mord mathdefault">b</span><span class="mord mathdefault">a</span><span class="mord mathdefault">s</span><span class="mord mathdefault">e</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord"><span class="mord mathdefault">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span><span class="mord">/</span><span class="mord mathdefault" style="margin-right: 0.03588em;">g</span><span class="mord mathdefault" style="margin-right: 0.02778em;">r</span><span class="mord mathdefault">o</span><span class="mord mathdefault">u</span><span class="mord mathdefault">p</span></span></span></span></span>這個值(對于可分離卷積來說,<span class="katex--inline"><span class="katex"><span class="katex-mathml">

            c

             i

             n

           =

           g

           r

           o

           u

           p

           ,

           b

           a

           s

           e

           =

           1

          c_{in} = group, base = 1

       </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.58056em; vertical-align: -0.15em;"></span><span class="mord"><span class="mord mathdefault">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.88888em; vertical-align: -0.19444em;"></span><span class="mord mathdefault" style="margin-right: 0.03588em;">g</span><span class="mord mathdefault" style="margin-right: 0.02778em;">r</span><span class="mord mathdefault">o</span><span class="mord mathdefault">u</span><span class="mord mathdefault">p</span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord mathdefault">b</span><span class="mord mathdefault">a</span><span class="mord mathdefault">s</span><span class="mord mathdefault">e</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.64444em; vertical-align: 0em;"></span><span class="mord">1</span></span></span></span></span>),這樣就可以實作上述的要求1</li><li>base增大,意味着卷積核容量加大,表達能力提升,也可以降低<span class="katex--inline"><span class="katex"><span class="katex-mathml">

            c

             i

             n

          c_{in}

       </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.58056em; vertical-align: -0.15em;"></span><span class="mord"><span class="mord mathdefault">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mord mathdefault mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span></span></span></span></span>,也可以實作上述要求2。<strong>固定Base,改變group個數的卷積,我們稱之為Variable Group Convolution</strong></li></ul> </li><li>基于Variable Group Conv. 本文針對性地設計了2種Block,如Fig. 1所示<br> <img src="https://img-blog.csdnimg.cn/2020060219053925.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JpY2hhcmRfY2hl,size_16,color_FFFFFF,t_70#pic_center" alt="在這裡插入圖檔描述"> 

  <ul><li>對于Normal Block而言,這樣設計的好處是,當channel數變大的時候,也可以同時Load一個depthwise(variable group conv)和一個pointwise的kernel,減少片上記憶體與片下記憶體的交換頻次</li><li>對于Downdsample BLock而言也是類似</li><li>Fig. 2為一個feature map中的一個點(k * k * c),經過Normal BLock的計算流程。總的來說優勢在于最頻繁使用的卷積核一隻放在SRAM中,而且中間的計算結果(第一個Variable的值也在),有效地利用SRAM,避免頻繁的記憶體交換<br> <img src="https://img-blog.csdnimg.cn/20200602190519409.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JpY2hhcmRfY2hl,size_16,color_FFFFFF,t_70#pic_center" alt="在這裡插入圖檔描述"></li></ul> </li></ul>

                </div><div data-report-view="{&quot;mod&quot;:&quot;1585297308_001&quot;,&quot;spm&quot;:&quot;1001.2101.3001.6548&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/richard_che/article/details/106502823&quot;,&quot;extend1&quot;:&quot;pc&quot;,&quot;ab&quot;:&quot;new&quot;}"><div></div></div>

                <link href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/markdown_views-3fd7f7a902.css" target="_blank" rel="external nofollow" rel="stylesheet">

                <link href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/style-49037e4d27.css" target="_blank" rel="external nofollow" rel="stylesheet">

        </div>

繼續閱讀