天天看点

论文笔记: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>

继续阅读