【幹貨】AI芯片之卷積神經網絡原理

2018/9/19 下午 02:24:56 次瀏覽 分類:AI_人工智慧

 人工智能产业链联盟  

https://mmbiz.qpic.cn/mmbiz_jpg/7F3jKVibyJ1LBUJuQdicUyVR21Pv3znXbG7lVu5EDgpsreekbcGRq1g7byroF6unGU7AGcbdDVmowdq5Bm58DdFg/640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1



卷积神经网络(Convolutional Neural NetworkCNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。 它包括卷积层(convolutional layer)和池化层(pooling layer)

对比:卷积神经网络、全连接神经网络

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtuoNPEwTMdBricicsqMWSOXREw0lyPic6XNeODcBg1CZ2G10URFxB2CCTpQ/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

左图:全连接神经网络(平面),组成:输入层、激活函数、全连接层

右图:卷积神经网络(立体),组成:输入层、卷积层、激活函数、池化层、全连接层

在卷积神经网络中有一个重要的概念:深度

卷积层

卷积:在原始的输入上进行特征的提取。特征提取简言之就是,在原始输入上一个小区域一个小区域进行特征的提取,稍后细致讲解卷积的计算过程。

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtuGC1ib6ZicznA9hicwXNOW034puOpCLs3Wsy3yzje3VOQDC6jM7AfMabyQ/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

上图中,左方块是输入层,尺寸为32*323通道图像。右边的小方块是filter,尺寸为5*5,深度为3。将输入层划分为多个区域,用filter这个固定尺寸的助手,在输入层做运算,最终得到一个深度为1的特征图。

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtuOMDpnVB7p5El8QrvzoMsg6C1qZ2JCZaaqYoHZ5SibAjK7OOA9Se8vsA/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

上图中,展示出一般使用多个filter分别进行卷积,最终得到多个特征图。

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtuKcjJCibhEQSZP1D5HOxK04WWuoiakQJff9xbKKVCU4Fx9ia1WGDPXficIA/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

上图使用了6filter分别卷积进行特征提取,最终得到6个特征图。将这6层叠在一起就得到了卷积层输出的结果。

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtuAEDqicRIeE7AJ76AQkDCUKVxdwNfFo3uoXfpGBvTF1F7csUhrT1j5AQ/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

卷积不仅限于对原始输入的卷积。蓝色方块是在原始输入上进行卷积操作,使用了6filter得到了6个提取特征图。绿色方块还能对蓝色方块进行卷积操作,使用了10filter得到了10个特征图。每一个filter的深度必须与上一层输入的深度相等。

直观理解卷积

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtuoBp4uF9aBaj7ibHLfJbJvVfNSQwCxbJTcIibLaMgNZjymzvPPlgVSBSg/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

以上图为例:

第一次卷积可以提取出低层次的特征。

第二次卷积可以提取出中层次的特征。

第三次卷积可以提取出高层次的特征。

特征是不断进行提取和压缩的,最终能得到比较高层次特征,简言之就是对原式特征一步又一步的浓缩,最终得到的特征更可靠。利用最后一层特征可以做各种任务:比如分类、回归等。

卷积计算流程

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtucgOUXOqMfXGtGiav8GLWeOlAL8Y8ibhekicLDJbykRbnKx8yy7Qpbuheg/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

左区域的三个大矩阵是原式图像的输入,RGB三个通道用三个矩阵表示,大小为7*7*3

Filter W0表示1filter助手,尺寸为3*3,深度为3(三个矩阵);Filter W1也表示1filter助手。因为卷积中我们用了2filter,因此该卷积层结果的输出深度为2(绿色矩阵有2个)。

Bias b0Filter W0的偏置项,Bias b1Filter W1的偏置项。

OutPut是卷积后的输出,尺寸为3*3,深度为2

计算过程:

输入是固定的,filter是指定的,因此计算就是如何得到绿色矩阵。
第一步,在输入矩阵上有一个和filter相同尺寸的滑窗,然后输入矩阵的在滑窗里的部分与filter矩阵对应位置相乘:

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3Etu65ozNu9nGAzf9IpriaXkLWdcE7ibYkZ68CJBPEJSpkarvx6wiaQgaTgxg/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtufyCFGiajeEUVojibZwX5CuD8lXJ54tdDiceLxrOoMqqf1lIicwTibUA5Dqg/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1对应位置相乘后求和,结果为0

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtuGBkI7n3o0pib1SYTIJ5y6EGalhXlOcz3gPS6KtZISwvZX4blwyFxrsw/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtugEczlattshgnubQWOmJlDBwlOxict6PvuICCmjY6ic4k694yx6lu8wHw/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1对应位置相乘后求和,结果为2

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3Etu0ZoJDSozPHNsnOpZVCIC3lM6EtSLTjX8BVLAyp0VHZfyKUd5YbqAJw/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtunrNd9PicLZcibXgPfAdV87fmpicDTv7PiavlwicKYc4xPWibQORkCxQTT7yQ/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1对应位置相乘后求和,结果为0

第二步,将3个矩阵产生的结果求和,并加上偏置项,即0+2+0+1=3,因此就得到了输出矩阵的左上角的3

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtuqiavwVHLcc2xD9HFsRJ2NOLBcJ2OWvn81bBqDvMNdicLL4D2CQQiaD85g/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

第三步,让每一个filter都执行这样的操作,变可得到第一个元素:

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtuibhD5CNPYXSIBuCjQ10wjOKM2B8Z4dbL9IGUN7Db6iadMgTLrtkHRKMA/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

第四步,滑动窗口2个步长,重复之前步骤进行计算

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtuHCds7RibOR4ibzicS3LdtYAjbrsMLjS3U4jblGmnkkoC33gqFMBfqz3fw/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

第五步,最终可以得到,在2filter下,卷积后生成的深度为2的输出结果:

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtuYeq17XCewJ8W1uugF55ACqJxG6qxFgnWXzDrfqQ3ibjQysLKQVdBDZw/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

思考:

为什么每次滑动是2个格子?

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3Etur6ttjxicQ5tZ0mbLWXMbzgjTq7nYU7Ek6U5j9s19gzSgtkSmdwXe8zQ/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

滑动的步长叫stride记为SS越小,提取的特征越多,但是S一般不取1,主要考虑时间效率的问题。S也不能太大,否则会漏掉图像上的信息。

由于filter的边长大于S,会造成每次移动滑窗后有交集部分,交集部分意味着多次提取特征,尤其表现在图像的中间区域提取次数较多,边缘部分提取次数较少,怎么办?

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtuHSoiaqNCuOARj0rIXa8xHwibwUFXIquk5QJbcA3upLdehoU25CvzBUWw/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

一般方法是在图像外围加一圈0,细心的同学可能已经注意到了,在演示案例中已经加上这一圈0了,即+pad 1 +pad n表示加n0.

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtuzKibAbkvoHsYZ9NXlzwk9hcr9Fh2fzicsMO3Bw4fO7VsBTkdnpbpyEXQ/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

一次卷积后的输出特征图的尺寸是多少呢?

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtuJHQxbV1npkic6kH7FLJVTVdxYL6tpyDkvkOK9QpjcwhBWCuJjpEUYCw/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

请计算上图中Output=

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtuWCC7sWhKR8mCMSgBiaoTN1BbLFjCsCuycxIpV5s6niacr18f4OA1TibIA/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

注意:在一层卷积操作里可以有多个filter,他们是尺寸必须相同。

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtuCAkD6GnYG4NbhayRb7czgcZuA2zicWDSCcUxWdBdEgS8oASUSa99MXw/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

卷积参数共享原则

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3Etu5zeFQ6IAhj3MIqhvmOeMmyGia5c8EUr0hgEkabHxCB5TbcJq6ib1iboJw/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

在卷积神经网络中,有一个非常重要的特性:权值共享。

所谓的权值共享就是说,给一张输入图片,用一个filter去扫这张图,filter里面的数就叫权重,这张图每个位置是被同样的filter扫的,所以权重是一样的,也就是共享。

池化层

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtuYicxjHdsz4AeYxlUVSyCTRtXd9NAAkRUKZZxqCVSlNiahlUpAp1urI4w/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

上图显示,池化就是对特征图进行特征压缩,池化也叫做下采样。选择原来某个区域的maxmean代替那个区域,整体就浓缩了。下面演示一下pooling操作,需要制定一个filter的尺寸、stridepooling方式(maxmean):

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtuVzx22sCIk9ntfRNhAIzia5fPVd2fYKRWSe42L2YzqXzXiaIhiaiatPFGbQ/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

卷积神经网络的组成

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtumPtggvAPh9QshKiaAhlpj3paC5gYdDUuHubX5vEd540P3c5CVE5jdibw/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

卷积——激活——卷积——激活——池化——......——池化——全连接——分类或回归

前向传播与反向传播

之前已经讲解了卷积层前向传播过程,这里通过一张图再回顾一下:

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtuiaHybv9yjZHNhynAbosnBzxttFibve1BsaQZccZvibzq3BUbrp6EKaJHA/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

下面讲解卷积层的反向传播过程:

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3Etuk1BV51sYDDsOEBdiaSLj19BjCB2gyr36K5Rjqq3IYZOuocszxhYF5vA/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

反向传播的目的:更新参数w。因此要先算出dJ/dw。假设上一层会传过来一个梯度dJ/dout,根据链式求导法则,因此dJ/dw = dJ/dout * dout/dw =dJ/dout * x 。在计算机中方便为变量命名的缘故,将dJ/dout记为doutdJ/dw记为dw,即图中的情况。后面也用这个记号来讲。

首先要清楚:dw w 的尺寸是一样的。一个点乘以一个区域还能得到一个区域。那么反向传播过程就相当于:用dout中的一个元素乘以输入层划窗里的矩阵便得到一个dw矩阵;然后滑动滑窗,继续求下一个dw,依次下去,最后将得到的多个dw相加,执行 w = w - dw 就完成了反向传播的计算。

上面的反向传播可以更新一个filter中的参数,还要求其他的filter

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtulOSynabhYeV5T6D6SSYpMB204jmfp5ACIDbY64PkB7GdBDibZs1OvkA/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtuoIm6Ip4WpI1iaYOIOTZn15zslrEP48pnj9tyicc3YPFs6ExK5sZmaDUA/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

下面用图示来看一下2种不同的pooling过程——池化层的前向传播:

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtuT4HvmibUroichgJcfd983wQYv7qQRf0GUenwviaIYicaIvowVlYBN2QBsQ/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

在池化层进行反向传播时,max-poolingmean-pooling的方式也采用不同的方式。

对于max-pooling,在前向计算时,是选取的每个2*2区域中的最大值,这里需要记录下最大值在每个小区域中的位置。在反向传播时,只有那个最大值对下一层有贡献,所以将残差传递到该最大值的位置,区域内其他2*2-1=3个位置置零。具体过程如下图,其中4*4矩阵中非零的位置即为前边计算出来的每个小区域的最大值的位置

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtugTHHTLKglGZ0ZAIib7WYRaT8JVeQX3PiaNjcjGfnjez5He0TD7X4a2vQ/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

对于mean-pooling,我们需要把残差平均分成2*2=4份,传递到前边小区域的4个单元即可。具体过程如图:

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3Etu0HXD9xh6yaCFPDl05vibmVGql2y6RGAPEpPCib2VU9WQic55JRJfHFJnQ/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

卷积网络架构实例

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtuKkBUXCsGIXq3KuHHOd3q5iclELXHQPTkZcLDraMbicGXichnTKghuWWHg/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

VGGNet深度更多,有很多卷积层和池化层。一个版本有16层,另一个版本有19层(较常用)。

VGGNet的特点:

filter只有3*3的,意味着计算的特征较多,粒度更细。同时pooling的参数也有固定。

注意:传统的卷积神经网络层数越多并以意味着效果更好。而在2016年推出了深度残差网络达到了152层。后续讲介绍。

那么训练一个VGGNet有多少内存开销呢?

https://mmbiz.qpic.cn/mmbiz_png/XI99SwibmFntA6cO9rThFu0CYYR0G3EtuVkBWcRFsc5jOPKZib4guZ9kthmPqx6E1IU5f3U5JG5GmPqFMIRIygWQ/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

从图可得知,训练过程中一张224*224*3的图像会有138M个参数会占93MB的内存。因此每个batch中图像的数目应该受内存的约束,即 93*图像数目<内存总容量

 https://mmbiz.qpic.cn/mmbiz_gif/7F3jKVibyJ1L2QszcF42wwhW0PsKFxiaiaxrUkPA05x2icDaTJ4bJTIeiacNmnJXMibW8EI6RV72OYAicOmUiaibHvKht0w/640?wx_fmt=gif&wxfrom=5&wx_lazy=1



免責聲明:本文系網絡轉載,版權歸原作者所有。但因轉載眾多,無法確認真正原始作者,故僅標明轉載來源。如涉及作品版權問題,請與我們聯繫,我們將根據您提供的版權證明材料確認版權並按國家標準支付稿酬或刪除內容!本文內容為原作者觀點,並不代表本公眾號贊同其觀點和對其真實性負責。

相關資訊

    同類下暫無推薦的資訊...

共0條評論網友評論

    暫無評論,快來搶沙發吧!