本次习题来源于 神经网络与深度学习 pdf电子书的第142页(对应纸质版第127页)的习题5-2、5-3、5-4和5-7,具体内容详见 NNDL 作业7 。
水平有限,难免有误,如有错漏之处敬请指正。
证明宽卷积具有交换性,即公式 r o t 180 ( W ) ⊗ ~ X = r o t 180 ( X ) ⊗ W ~ rot180(\boldsymbol{W}) \tilde{\otimes} \boldsymbol{X} = rot180(\boldsymbol{X}) \otimes \tilde{\boldsymbol{W}} rot180(W)⊗~X=rot180(X)⊗W~
首先由宽卷积定义可得:
y = r o t 180 ( W ) ⊗ ~ X = r o t 180 ( W ) ⊗ X ~ y=rot180(\boldsymbol{W}) \tilde{\otimes} \boldsymbol{X} = rot180(\boldsymbol{W})\otimes\tilde{\boldsymbol{X}} y=rot180(W)⊗~X=rot180(W)⊗X~由卷积的交换律可得:
y = r o t 180 ( W ) ⊗ X ~ = X ~ ⊗ r o t 180 ( W ) y=rot180(\boldsymbol{W}) \otimes \tilde{\boldsymbol{X}} = \tilde{\boldsymbol{X}} \otimes rot180(\boldsymbol{W}) y=rot180(W)⊗X~=X~⊗rot180(W)这样计算得到的特征图矩阵中其中一个通道的其中一个值为:
y i j = X ~ ⊗ r o t 180 ( W ) = ∑ u = 1 U ∑ v = 1 V x i − 1 + u , j − 1 + v ⋅ w u , v y_{ij} = \tilde{\boldsymbol{X}} \otimes rot180(\boldsymbol{W}) = \sum_{u=1}^U \sum_{v=1}^V x_{i-1+u,j-1+v} \cdot w_{u,v} yij=X~⊗rot180(W)=u=1∑Uv=1∑Vxi−1+u,j−1+v⋅wu,v其中 U , V U,V U,V为 W \boldsymbol{W} W的行数和列数。(翻转180°后矩阵长宽不变)
同理可得 y i j ′ = r o t 180 ( X ) ⊗ W ~ = ∑ a = 1 A ∑ b = 1 B x a , b ′ ⋅ w i − 1 + a , j − 1 + b ′ y'_{ij}=rot180(\boldsymbol{X}) \otimes \tilde{\boldsymbol{W}} = \sum_{a=1}^A \sum_{b=1}^B x'_{a,b} \cdot w'_{i-1+a,j-1+b} yij′=rot180(X)⊗W~=a=1∑Ab=1∑Bxa,b′⋅wi−1+a,j−1+b′其中 A , B A,B A,B为 X \boldsymbol{X} X的行数和列数。
要使题给等式成立,则 y i j = y i j ′ y_{ij}=y'_{ij} yij=yij′
即 X ~ \tilde{\boldsymbol{X}} X~的行数为,列数为
在上列两个式子中,参数满足:
a = i − u + 1 b = j − v + 1 a=i-u+1 \\ b=j-v+1 a=i−u+1b=j−v+1则 u = a − i + 1 v = y − j + 1 u=a-i+1 \\ v=y-j+1 u=a−i+1v=y−j+1即
y i j = r o t 180 ( X ) ⊗ W ~ = ∑ a = i − u + 1 U + i − 1 ∑ b = j − v + 1 V + j − 1 x a , b ⋅ w a − i + 1 , b − j + 1 y_{ij}=rot180(\boldsymbol{X}) \otimes \tilde{\boldsymbol{W}} = \sum_{a=i-u+1}^{U+i-1} \sum_{b=j-v+1}^{V+j-1} x_{a,b} \cdot w_{a-i+1,b-j+1} yij=rot180(X)⊗W~=a=i−u+1∑U+i−1b=j−v+1∑V+j−1xa,b⋅wa−i+1,b−j+1根据宽卷积的性质,宽卷积仅是进行了X的零填充,可以发现该等式仍然成立,故宽卷积也符合可交换性。
分析卷积神经网络中用 1 × 1 1\times1 1×1的卷积核的作用。
1. 升降维
通过控制卷积核的通道数来对特征图的通道数进行控制,以此实现升降维。
2. 增加网络深度
保证特征图的尺寸相同的情况下用 1 × 1 1\times1 1×1卷积核可以多卷积一次,这样能再应用一次卷积函数,增加非线性。
对于一个输入为 100 × 100 × 256 100 \times 100 \times 256 100×100×256的特征映射组,使用 3 × 3 3 \times 3 3×3的卷积核,输出为 100 × 100 × 256 100 \times 100 \times 256 100×100×256的特征映射组的卷积层,求其时间和空间复杂度。
如果引入一个 1 × 1 1 \times 1 1×1卷积核,先得到 100 × 100 × 64 100 \times 100 \times 64 100×100×64的特征映射,再进行 3 × 3 3 \times 3 3×3的卷积,得到 100 × 100 × 256 100 \times 100 \times 256 100×100×256的特征映射组,求其时间和空间复杂度。
单个卷积层时间复杂度的计算
T i m e ∼ O ( M 2 ⋅ K 2 ⋅ C i n ⋅ C o u t ) \bold{Time} \sim O(M^2 \cdot K^2 \cdot C_{in} \cdot C_{out}) Time∼O(M2⋅K2⋅Cin⋅Cout) M M M:每个卷积核输出特征图的边长
K K K:每个卷积核的边长
C l C_l Cl:每个卷积核的通道数,即输入通道数,即上一层的输出通道数
C o u t C_{out} Cout:本卷积层具有的卷积核个数,即输出通道数
卷积神经网络整体时间复杂度的计算
T i m e ∼ O ( ∑ l = 1 D M l 2 ⋅ K l 2 ⋅ C l − 1 ⋅ C l ) \bold{Time} \sim O(\sum_{l=1}^D M^2_l \cdot K^2_l \cdot C_{l-1} \cdot C_l) Time∼O(l=1∑DMl2⋅Kl2⋅Cl−1⋅Cl) D D D:神经网络所具有的卷积层数,即网络的深度。
l l l:神经网络的第 l l l个卷积层
C l C_l Cl:神经网络第 l l l个卷积层的输出通道数 C o u t C_{out} Cout,即该层的卷积核个数
C o u t C_{out} Cout
对于第 l l l个卷积层而言,其输入通道数 C i n C_{in} Cin就是第 ( l − 1 ) (l-1) (l−1)个卷积层的输出通道数
空间复杂度计算
包括两个部分:总参数量和各层输出特征图
S p a c e ∼ O ( ∑ l = 1 D K l 2 ⋅ C l − 1 ⋅ C l + ∑ l = 1 D M 2 ⋅ C l ) \bold{Space} \sim O(\sum_{l=1}^D K^2_l \cdot C_{l-1} \cdot C_l + \sum_{l=1}^D M^2 \cdot C_l) Space∼O(l=1∑DKl2⋅Cl−1⋅Cl+l=1∑DM2⋅Cl)参数量( ∑ l = 1 D K l 2 ⋅ C l − 1 ⋅ C l \sum_{l=1}^D K^2_l \cdot C_{l-1} \cdot C_l ∑l=1DKl2⋅Cl−1⋅Cl):模型所有带参数的层的权重参数总量(即模型体积)
特征图( ∑ l = 1 D M 2 ⋅ C l \sum_{l=1}^D M^2 \cdot C_l ∑l=1DM2⋅Cl):模型再实时运行过程中每层所计算出的输出特征图大小
根据上述内容可以计算得出时间复杂度和空间复杂度。
①时间复杂度: 256 × 100 × 100 × 256 × 3 × 3 = 5 898 240 000 256×100×100×256×3×3=5\ 898\ 240\ 000 256×100×100×256×3×3=5 898 240 000
空间复杂度: 256 × 100 × 100 = 2 560 000 256×100×100=2\ 560\ 000 256×100×100=2 560 000
②时间复杂度: 64 × 100 × 100 × 256 + 256 × 100 × 100 × 64 × 3 × 3 = 1 638 400 000 64×100×100×256+256×100×100×64×3×3=1\ 638\ 400\ 000 64×100×100×256+256×100×100×64×3×3=1 638 400 000
空间复杂度: 64 × 100 × 100 + 256 × 100 × 100 = 3 200 000 64×100×100+256×100×100=3\ 200\ 000 64×100×100+256×100×100=3 200 000
忽略激活函数,分析卷积网络中卷积层的前向计算和反向传播是一种转置关系。
卷积层的前向计算和反向传播的公式如下:
δ ( l , d ) = f l ′ ( Z ( l , d ) ) ⊙ P ∑ P = 1 P ( r o t 180 ( W ( l + 1 , p , d ) ) ⊗ δ ( l + 1 , p ) ) \delta^ {(l,d)} = f_l'(\boldsymbol{Z}^{(l,d)}) \odot P \sum^P_{P=1} (rot180(\boldsymbol{W}^{(l+1,p,d)}) \otimes \delta^{(l+1,p)}) δ(l,d)=fl′(Z(l,d))⊙PP=1∑P(rot180(W(l+1,p,d))⊗δ(l+1,p))则:
第 l l l层的净输入为 z ( l + 1 ) = W ( l + 1 ) z ( l ) z^{(l+1)}=W^{(l+1)}z^{(l)} z(l+1)=W(l+1)z(l),反向传播的误差项为 δ ( l ) = ( W ( l + 1 ) ) T δ ( l + 1 ) \delta^{(l)}=(W^{(l+1)})^T\delta^{(l+1)} δ(l)=(W(l+1))Tδ(l+1)
第 l + 1 l+1 l+1层的净输入为 z ( l + 1 ) = ( W ( l + 1 ) ) T z ( l + 1 ) z^{(l+1)}=(W^{(l+1)})^Tz^{(l+1)} z(l+1)=(W(l+1))Tz(l+1),反向传播的误差项为 δ ( l + 1 ) = W ( l + 1 ) δ ( l ) \delta^{(l+1)}=W^{(l+1)}\delta^{(l)} δ(l+1)=W(l+1)δ(l)
显然,忽略激活函数下前向计算和反向传播是一种转置关系。
代码实现反向传播算子。
在前面实验里的卷积算子塞一个反向传播的函数就行了。
def backward(self, grad_sum):
grad_sum = grad_sum.transpose(1, 2, 3, 0).reshape(self.out_channels, -1)
grad_w = grad_sum.dot(self.X_col.T).reshape(self.W.shape)
grad_bias = np.sum(_grad_sum, axis=1, keepdims=True)
self.W = self.W_opt.update(self.W, grad_w)
self.bias = self.bias_opt.update(self.bias, grad_bias)
grad_sum = self.W_col.T.dot(grad_sum)
grad_sum = column2image(grad_sum,
self._input.shape,
self.kernel_size,
stride=self.stride,
output_shape=self.padding)
return grad_sum
总的来说,收益最大的是习题5-2。在思考过程中一直在考虑如何将问题一般化。思考很久没有进展,通过同学的讨论得到了突破。下次还是用归纳法做结论题吧。