动手学深度学习6.1 为什么需要卷积层 | 卷积公式推导

438 阅读4分钟

参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战


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

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

那我的输入就是一个6.4×1076.4×10^76.4e76.4e7)的向量,输出是一个one-hot的二维向量。

那我的参数就是2×6.4e72 × 6.4e7

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

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

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

猫还是狗。

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

那怎么办呢?

这就用到了卷积层。

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


卷积

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

image.png

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

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

平移不变性

看个公式:

hi,j=k,lwi,j,k,lxk,l=a,bvi,j,a,bxi+a,j+bh_{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×1=[w]m×n×[x]n×1[h]_{m \times 1}= [w]_{m \times n} \times [x]_{n \times 1}

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

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

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

  2. V 是 W 的重新索引 vi,j,a,b=wi,j,i+a,j+bv_{i, j, a, b}=w_{i, j, i+a, j+b}

    为什么要重新索引?

    image.png

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

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

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

所以到这里,我们上边复杂的公式就变成了:

hi,j=a,bva,bxi+a,j+bh_{i, j}=\sum_{a, b} v_{a, b} x_{i+a, j+b}

但是这个公式叫二维交叉。不是二维卷积。

那局部性呢?

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

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

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

a,b>Δ|a|,|b|>\Delta 时, 使得 va,b=0v_{a, b}=0

hi,j=a=ΔΔb=ΔΔva,bxi+a,j+bh_{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Δ×2Δ2\Delta \times 2\Delta的大小内运算。

image.png

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

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

a,b>Δ|a|,|b|>\Delta 时, 使得 va,b=0v_{a, b}=0

hi,j=a=ΔΔb=ΔΔva,bxi+a,j+bh_{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



  1. 《动手学深度学习》系列更多可以看这里:《动手学深度学习》专栏(juejin.cn)

  2. 笔记Github地址:DeepLearningNotes/d2l(github.com)

还在更新中…………