假设我现在要识别一个图片,看他是猫还是狗(两分类),我用的是小米手机,像素是6400w。

我用一个单层的全连接神经网络来识别。

那我的输入就是一个$6.4×10^7$($6.4e7$)的向量,输出是一个one-hot的二维向量。

那我的参数就是$2 × 6.4e7$。

一层肯定不可能识别出他是猫还是狗,那我给他多加一个隐藏层,隐藏层降到1000维。

那我现在的参数就是$1e3 \times 6.4e7 = 6.4e10$。

加了一个隐藏层,第一层参数就过亿了。为了识别一个图片大可不必。并且两层网络也不太可能识别出那是

猫还是狗。

所以随着网络加深,全连接层用到的参数量是无法估计的。

那怎么办呢?

这就用到了卷积层。

卷积层怎么用呢?就是我不整张图识别了。我分块识别。

卷积

全连接层直接计算整张图(左侧),卷积层就是是将图片分成小块块(右侧),从左到右从上到下慢慢扫描,每次只计算这一个小块块。

image.png

既然每次识别一个小块块了,那就要遵守两个规定:

  1. 局部性
  2. 平移不变性

平移不变性

看个公式:

$$
h{i, j}=\sum{k, l} w{i, j, k, l} x{k, l}=\sum{a, b} v{i, j, a, b} x_{i+a, j+b}
$$

先解释一下上边的公式:

  1. 为什么w是四维的:

    回想一下单层神经网络输入为向量的时候:

    $[h]{m \times 1}= [w]{m \times n} \times [x]_{n \times 1}$

    那输入为矩阵的时候就是这样:

    $[h]{i \times j} = [w]{i \times j \times k \times l} * [x]_{k \times l}$

    注意:我这里特意换了个乘号,因为这里执行的不是矩阵乘法,是矩阵元素按位相乘。并且讲道理不是这样的,但是我觉得这样说比较好接受为什么w变成四维了。

  2. V 是 W 的重新索引 $v{i, j, a, b}=w{i, j, i+a, j+b}$

    为什么要重新索引?

    image.png

    因为卷积核(黄块块,权重)大小是固定的,每次和x进行计算都是固定的方块大小,你也可以换个字母$a\times b$。也就是每次$a\times b$大小的x和$i\times j \times a\times b$大小的w进行运算。

    但是因为位置是变化的,而x是$k \times l$,其中的k和l是一直变化的,每次计算的x位置都不同。而x是在整个大图里的,可以用整张图的i,j推算出每次x的位置是$i+a$和$j+b$,因此将k和l进行转化。整个式子变为$[h]{i \times j} = [v]{i \times j \times a \times b} * [x]_{i+a \times j+b}$

    好了,现在再想一个问题,你x每次移动,但是我卷积核(黄块块)是平移不变的啊,不管你挪到哪里我都是固定大小,固定参数值,所以我为什么要有i和j? 花生,你发现了盲点。既然w和x的位置无关,那就完全可以扔掉在图中的相对位置啊。那就把i和j去掉就行了。然后整个式子变为$[h]{i \times j} = [v]{a \times b} * [x]_{i+a \times j+b}$

    综上所述,就是所谓的平移不变性

所以到这里,我们上边复杂的公式就变成了:
$$
h{i, j}=\sum{a, b} v{a, b} x{i+a, j+b}
$$
但是这个公式叫二维交叉。不是二维卷积。

那局部性呢?

上边那个公式本身就是符合局部性的。

因为w的大小是固定的。所以每次只和相同大小的x进行计算。只能计算黄框框覆盖的部分。

或者你可以把二维交叉转换成二维卷积:

当 $|a|,|b|>\Delta$ 时, 使得 $v{a, b}=0$:
$$
h
{i, j}=\sum{a=-\Delta}^{\Delta} \sum{b=-\Delta}^{\Delta} v{a, b} x{i+a, j+b}
$$

就是说给一个区间$\Delta$,现在ab从$-\Delta$开始计算,一直计算到$+\Delta$,超出范围v就变0。保证了只在$2\Delta \times 2\Delta$的大小内运算。

image.png

虽然两个公式可能看起来不一样,但是实际应用中都是一样的东西了,$a \times b$变为$2\Delta \times 2\Delta$,换汤不换药。

我们也成功的获得了卷积公式。

当 $|a|,|b|>\Delta$ 时, 使得 $v_{a, b}=0$:

$$
h{i, j}=\sum{a=-\Delta}^{\Delta} \sum{b=-\Delta}^{\Delta} v{a, b} x_{i+a, j+b}
$$


用上边的公式进行卷积计算,假设我的图是8×6的图,现在用一个3×3的卷积核进行卷积。

根据公式,两个3×3的矩阵进行计算之后求和,将数字填入卷积层的第一个格子。之后向右移,向右移不动了向下移,直到最后。移完整个图。
image.png

经过一次卷积之后,获得的结果相比如输入少了两行两列。因为下边这两种情况x和w不重合是不用计算的,只需要计算能完全覆盖的区域即可。所以经过3×3的卷积核会少两行两列。如果是经过5×5的卷积核会少四行四列。

image.png