深度神经网络在图像识别应用中的演化【笔记】
深度神经网络在图像识别应用中的演化
【dropout】、【batchnormalization】
【black magic】
但有一件事没有本质性的改变,这个网络结构还是属于 black magic。但是本质上还是实验出来。实验出来得到一些比较好的结构、功能,然后再反过来给大家解释一下,它总是会有一些道理。
【LeNet5】【AlexNet】【GoogLeNet】【Residual Net】【】
LeNet5,2012
年 AlexNet 能突破性地把图像识别的错误率降了 10%。再之后谷歌 GoogLeNet 能够把网络结构的复杂程度突破大家的想象。在那之前,大家还是按照 LeCun 的方式去做。微软的 Residual Net也是一个很好的工作,可以让网络结构变得更深,效果也更好。
卷积神经网络有两个角度的改进。
【局部连接】【权值共享】
第一个是下一层的节点并不是连接上一层的所有节点,它只连接一个区域的几个节点。比如说如果你第 1 层有 10 个节点,第 2 层有 10 个节点,那么第 2 层一个节点连接一个小区域,一个局部的小区域,比如 3 个节点。在图像中就意味着你可能只是连接图像中一个小区域,一个小 patch。
第二个改进是连接这个小区域中,你的这个小区域跟连接的下个小区域的所有的连接的 weight 是一样的,这个叫做 weight sharing(权重共享)。或者说你有一个线性的卷积核(convolutional kernel)。这个卷积核,比如说 3×3 的卷积核,有 9 个数,这 9 个数拍在这个空间上去算一个卷积,平均一下再拍到另一个空间,也算一个卷积。这几个卷积中的卷积核本身是一样的。所以从原来最开始那个 MLP 向下发展到 CNN,定义出了一个卷积的概念。就是这两点不同。
第一,下一个节点,就是第二层节点只连接上一层的局部的几个输入。第二,这几个局部输入位置在空间上是共享的、固定的。你有一个输入之后可能会有几个卷积核。如果你有一个卷积,一个 filter,然后通过扫描方式,或者放一个点,乘加一次就算出一个数来,就会得到这边的一个点。你有一个卷积函数的话,就可以得到这边的一个区域,叫 feature map。如果你有六个卷积的话就是 6 ×28×28,那就是你做了 6 个卷积把输入图像从 32×32 变成了 28×28,那是第一层的卷积操作。然后你需要一些降采样。
当时 LeCun 为了计算量比较小,立刻就降采样了。降采样之后还是 6 个 feature map。之后他在 C3 层定义了 10 个 feature map。这 10 个 feature map,每一个卷积核在这 6 个卷积核的 6 个 feature map 上,上一层的 6 个 feature map 上也进行卷积。空间上不断地移动。卷积了之后把结果线性组合一下。线性组合本身的所有参数都是学习到的。线性组合得到下一个层的 feature map。你有 10 个,那么就重复 10 次这个过程,就把这 6 个 feature map 变成了 10 个。
事实上,LeCun 在处理这个工作的时候是处理不了这么多的。就是说 6 个 feature map 对应 10 个 feature map,他其实是随机选了一下。可能只有一个 C3 层的一个 feature map 是对应于 6 个,其他几个是对应之前的 3 个或 4 个。
当时 LeCun 的文章解释说是为了破坏对称性,就说不要完全对称。
但我觉得主要还是计算量的原因。最后类似地你可以再把规模降小一点,进行降采样,然后做一些全连接。全连接就是指每个输入跟下一层每个输出全连接在一起,这不是一种卷积形式。
当时这个结构有大概是 6 万个参数,能识别手写体的数字或者是邮编。LeCun 他们把这做完之后还真的实现产品化了。当时它发展到可以处理美国 1/3 的邮件的手写体识别,这应该是八九十年代最巅峰的工作了。
到了 2012 年的 AlexNet,结构本身没有本质性的提高,但是规模大了很多。
【AlexNet】
LeNet-5 是 6 万个参数,那么 AlexNet 是 6000 万个参数。
分成上下两层,输入的是 224×224 的图像,之后第一层是 11×11 卷积,也是一个 11×11 的卷积的滤波器,放到图像上去,开始平移,乘加,平移一次,算出一个点,算出来之后做一次采样。
【average pooling】【Max pooling】
采样是指你有几个点,你挑一个点使用。这个采样叫 pooling。比如你有 4 个点,取 1 个最大的,那就叫 Max pooling。如果说有 4 个点,平均一下就是一个值,那就是 average pooling。只要能够把多个点变成一个点,那么这种某种方式就叫 pooling。
做完 Max Pooling 之后,继续卷积,去做 Pooling。
【dropout】
本质上结构跟原来是一样的,只是大了很多,以至于当时的 GPU,用一块是训练不了的,所以同时用两块去训练。当时一个 GPU 的内存可能是 3G。训练的时候开始对输入进行一些归一化,要加一些 dropout,就是随机的在训练过程中把一些节点设置为
0。
在神经网络中,很多连接、很多节点,每个节点可能都会输出一个值,做一个
Activation,输给下一层。那么本来是说每个节点都会对最终结果有贡献,那么 dropout 就是在这过程中随机性把 50% 或者 40% 的节点的输出置为 0,让它没有贡献,那这样你训练得到的分类结果,就不能依赖于所有节点都正常工作,或者所有的信息都能收集到。这种情况下,如果还要得到一个好结果,那么你在测试的时候,就不会非常依赖于这些数据要跟之前的数据很像,或者是见过的数据,这样的话你就能处理一些未知的数据。这是当时就是 AlexNet 的改进,但是本质网络结构本身还是相当。
【VGG】