老饼讲解:一步一步上手深度学习
好了,这节我们深入来理解一下,CNN的卷积到底在干什么,池化又在干什么。其实玩CNN,主要就是在把卷积和池化这两把刷子,搞明白它们,CNN也就简单了。
卷积的生物意义就是眼睛逐块逐块的看,这就是在讲故事,这里我们抛开卷积的生物意义,从更本质的角度来看看卷积这家伙到底在干什么。如下,就是一个卷积运算:

可以看到,卷积就是把逐块逐块、来把每一块都映射为一个值。
好了,怎么理解卷积呢,其实我们完全可以把卷积看作输入的1对1映射,只不过映射时,会顺带把周边像素的信息一起综合过来而已,如下图所示:

所以单步幅的卷积呢,其实只是将输入的每个像素与周边信息进行融合而已,卷积核的大小就是信息融合的范围,卷积核的权重就是融合时各个像素的权重。至于多步幅的卷积,则是类似的,只是融合后顺便降维而已。
事实上,我们还可以认为,卷积就是将每个输入像素的信息,通过卷积传播到某一块输出中,如果经过多层卷积,一个单独的像素信息,将不断扩散到更大的范围中去,使得信息共享更加充分。
总的来说,不管从什么角度来看,卷积运算其实都是把输入每个像素来与周边像素的信息进行融合而已。
下面就是最常用的2×2、步幅为2的均值池化了:

可以看到,池化就就相当于将输入按2×2的大小进行合并,它不带任何参数,可以将输入进行降维,使得输入的高、宽都减半。从这个最常用的池化来看,池化的作用其实就是简单、粗暴的降维。
当然,池化也可以像卷积一样,加入步幅、加入填充、并修改合并时的规则,但这些更像是池化的拓展功能。事实上,大家就会发现,只要设置得当,卷积其实可以变成均值池化,同理,只要池化运算修改为"加权求和",就变成卷积运算了,也就是卷积和池化之间其实是可以部分替代的。
好了,卷积和池化到底在干什么呢,其实它们的整体目的很明确,就是对输入进行降维。只不过如果粗暴的降维,会导致降维后信息损失严重,所以,就用"卷积+池化"的方式,先用卷积进行信息融合,然后再用池化来粗暴降维,如此一来,降维后信息损失也就没那么严重了。

事实上,我们都知道,卷积和池化在运算上其实是差不多的、甚至可以相互替代的,但我们更习惯用卷积来把信息进行融合,而池化则用于纯粹的降维,把整体任务拆为两个明确的步骤,可以让卷积和池化各司其职,方便我们明确"融合到什么程度、降维到什么程度",从而更易于达到我们的目的。
所以,卷积和池化的区别不在于它们的运算,而是在于我们的使用目。我们习惯用卷积来信息融合,所以一般会把卷积设为keep Size,保持输入输出的维度一致,它只负责信息融合,而池化呢,则把步幅与窗口大小设为一致,这样可以更纯粹的进行降维。当然,也可以用"多步幅的卷积"一步到位,在信息融合的同时又进行降维,但这样相对更粗糙,往往只用在模型一些不太重要的地方中。
这一节里,我们又深入剖析了卷积和池化到底在干什么。池化的运算其实与卷积非常像,都是逐块逐块把整块映射为一个值。事实上,均值池化就是一个权重相等的卷积,所以把它们看为同一个东西也没什么不可。
而真正区分它们的,不是它们的功能,而是目的。卷积更多时候是为了把信息进行综合,而池化则是进行降维。将它们搭配起来一起用,其实就是为了降维,但为了减少降维所带来的信息损失,所以会先将信息进行融合再进行降维。
评论