识别手写数字的网络结构是这样的:
每一层网络都和相邻层全部连接。但是这样并没有考虑到图片中像素的空间分布,不管两个像素离的很近还是非常远都一视同仁,显然这样做是不合理的。
所以卷积神经网络就出现了,它考虑到了输入值的(像素的)空间分布,(再加上一些人工设定的特性 例如共享权重等)使得它非常容易训练。也就可以做出更深层的网络结构,拥有更好的识别效果。
卷积神经网络主要概念有:local receptive fields , shared weights , and pooling。下面一个个解释。
【 local receptive fields 】
输入是 28x28的像素值:
对于第一个隐藏层,每一个隐藏层神经元 与 输入层中 5x5的神经元有连接。
这个5x5的区域就叫做 感受视野( local receptive field),表示 一个隐藏层神经元在输入层的感受区域。这5x5=25个连接对应有25个权重参数w,还有一个全局共用的基值b。
当 local receptive field 沿着 整个输入照片向右(向下)滑动时,每一个 local receptive field 在第一个隐藏层都 对应一个隐藏神经元。
图1: 第一个 local receptive field
图2:第二个 local receptive field (向右滑动一个像素)
不断的向右(向下)滑动就可以得到第一个隐藏层。
28x28 的输入照片 (W=28)
5x5的local receptive fields(滑窗,也叫卷积核 ) (K=5)
滑动步长(( stride )为1 (S = 1)
可以得到 24x24的隐藏层神经元。
假如现在 W=15,K=5, S=2 对应的隐藏神经元是多少?
蓝色表示 左上角的5x5感受视野,绿色是其向右滑动 轨迹。
因为 W=15,K=5, S=2
一次向右滑动对应 6个隐藏神经元 =>
= 5次滑动 + 1个原始感受视野
= 10个绿色区域/步长2 + 1个原始感受视野
= (W-K)/S + 1
得到隐藏层对应的计算公式: 隐藏层边长 = (W-K)/S + 1 。
(不过有时候为了控制输出的隐藏层空间分布 会在 输入层外围做零填充,假设填充 P个像素, 此时:边长= (W - K + 2P)/S + 1 ,特别的 当S=1时, 设置零填充为
可以保证 输入层与输出层有相同 的空间分布 )
零填充示意图
【Shared weights and biases】
上文提到 每一个隐藏层神经元 对应 5x5=25个权重参数w和一个基值参数b,实际上 我们规定 每一个隐藏层神经元的这些25个权值w 和 b都共享。 也就是说隐藏层神经元共享权值。
大大减少参数个数:
如此一来 上图的 隐藏层 只有 5x5+1 = 26 个参数 ,而如果时全部连接则需要 28x28xN (N代表隐藏神经元个数) 将远远多于26个参数,共享权值 就大大减小了参数个数 。
用数学化的语言描述一下(大致了解即可)对于第j,k个隐藏神经元 对应的值为
平移不变性:
这种做法有着很直观的意义: 上图第一个隐藏层的神经元 都在 检测 同一个特征(或模式)是否出现。(相同的权值自然就是在检测同一个特征)。例如 每一个神经元都在 检测是否出现 “垂直边”,无论这个垂直边在图片中的那个位置上都可以被卷积核扫描到。 这就是 卷积神经网络的 平移不变特性 ( translation invariance)。