深度学习之卷积神经网络(6)梯度传播
在完成手写数字图片识别实战后,我们对卷积神经网络的使用有了初步的了解。现在我们来解决一个关键问题,卷积层通过移动感受野的方式实现离散卷积操作,那么它的梯度传播是怎样进行的呢?
考虑一简单的情形,输入3×33×33×3的单通道矩阵,与一个2×22×22×2的卷积核,进行卷积运算,输出结果打平后直接与虚构的标注计算误差,如下图所示。我们来讨论这种情况下的梯度更新方式。
首先推导出张量O\boldsymbol OO的表达形式:
o00=x00w00+x01w01+x10w10+x11w11+bo01=x01w00+x02w01+x11w10+x12w11+bo10=x10w00+x11w01+x20w10+x21w11+bo11=x11w00+x12w01+x21w10+x22w11+bo_{00}=x_{00} w_{00}+x_{01} w_{01}+x_{10} w_{10}+x_{11} w_{11}+b\\
o_{01}=x_{01} w_{00}+x_{02} w_{01}+x_{11} w_{10}+x_{12} w_{11}+b\\
o_{10}=x_{10} w_{00}+x_{11} w_{01}+x_{20} w_{10}+x_{21} w_{11}+b\\
o_{11}=x_{11} w_{00}+x_{12} w_{01}+x_{21} w_{10}+x_{22} w_{11}+bo00=x00w00+x01w01+x10w10+x11w11+bo01=x01w00+x02w01+x11w10+x12w11+bo10=x10w00+x11w01+x20w10+x21w11+bo11=x11w00+x12w01+x21w10+x22w11+b
以w00w_{00}w00的梯度计算为例,通过链式法则分解:
∂L∂w00=∑i∈{00,01,10,11}∂L∂oi∂oi∂w00\frac{∂\mathcal{L}}{∂w_{00}}=\sum_{i\in\{00,01,10,11\}}{\frac{∂\mathcal{L}}{∂o_i}\frac{∂o_i}{∂w_{00}}}∂w00∂L=i∈{00,01,10,11}∑∂oi∂L∂w00∂oi
其中∂L∂oi\frac{∂\mathcal{L}}{∂o_i}∂oi∂L可直接由误差函数推导出来,我们直接来考虑∂oi∂w00\frac{∂o_i}{∂w_{00}}∂w00∂oi,例如:
∂o00∂w00=∂(x00w00+x01w01+x10w10+x11w11+bw00=x00\begin{aligned}\frac{∂o_{00}}{∂w_{00}}&=\frac{∂(x_{00} w_{00}+x_{01} w_{01}+x_{10} w_{10}+x_{11} w_{11}+b}{w_{00}} \\&=x_{00}\end{aligned}∂w00∂o00=w00∂(x00w00+x01w01+x10w10+x11w11+b=x00
同理:
∂o01∂w00=∂(x01w00+x02w01+x11w10+x12w11+bw00=x01\begin{aligned}\frac{∂o_{01}}{∂w_{00}}&=\frac{∂(x_{01} w_{00}+x_{02} w_{01}+x_{11} w_{10}+x_{12} w_{11}+b}{w_{00}} \\&=x_{01}\end{aligned}∂w00∂o01=w00∂(x01w00+x02w01+x11w10+x12w11+b=x01
∂o10∂w00=∂(x10w00+x11w01+x10w10+x21w11+bw00=x10\begin{aligned}\frac{∂o_{10}}{∂w_{00}}&=\frac{∂(x_{10} w_{00}+x_{11} w_{01}+x_{10} w_{10}+x_{21} w_{11}+b}{w_{00}} \\&=x_{10}\end{aligned}∂w00∂o10=w00∂(x10w00+x11w01+x10w10+x21w11+b=x10
∂o11∂w00=∂(x11w00+x12w01+x21w10+x22w11+bw00=x11\begin{aligned}\frac{∂o_{11}}{∂w_{00}}&=\frac{∂(x_{11} w_{00}+x_{12} w_{01}+x_{21} w_{10}+x_{22} w_{11}+b}{w_{00}} \\&=x_{11}\end{aligned}∂w00∂o11=w00∂(x11w00+x12w01+x21w10+x22w11+b=x11
可以观察到,通过循环移动感受野的方式并没有改变网络层的可导性,同时梯度的推导也并不复杂,知识当网络层数增大以后,人工梯度推导将变得十分繁琐。不过不需要担心,深度学习框架可以帮我们自动完成所有参数的梯度计算与更新,我们只需要设计好网络结构即可。