写在前面的一些内容
本次习题来源于 神经网络与深度学习 pdf电子书的第142页(对应纸质版第127页)的习题5-2、5-3、5-4和5-7,具体内容详见 NNDL 作业7 。
水平有限,难免有误,如有错漏之处敬请指正。
习题5-2
证明宽卷积具有交换性,即公式 r o t 180 ( W ) ⊗ ~ X = r o t 180 ( X ) ⊗ ~ W rot180(\boldsymbol{W}) \tilde{\otimes} \boldsymbol{X} = rot180(\boldsymbol{X}) \tilde{\otimes} \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的零填充,可以发现该等式仍然成立,故宽卷积也符合可交换性。
习题5-3
分析卷积神经网络中用 1 × 1 1\times1 1×1的卷积核的作用。
1. 升降维
通过控制卷积核的通道数来对特征图的通道数进行控制,以此实现升降维。
2. 增加网络深度
保证特征图的尺寸相同的情况下用 1 × 1 1\times1 1×1卷积核可以多卷积一次,这样能再应用一次卷积函数,增加非线性。
习题5-4
对于一个输入为 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
习题5-7
忽略激活函数,分析卷积网络中卷积层的前向计算和反向传播是一种转置关系。
卷积层的前向计算和反向传播的公式如下:
δ
(
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)
显然,忽略激活函数下前向计算和反向传播是一种转置关系。
EX
代码实现反向传播算子。
在前面实验里的卷积算子塞一个反向传播的函数就行了。
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。在思考过程中一直在考虑如何将问题一般化。思考很久没有进展,通过同学的讨论得到了突破。下次还是用归纳法做结论题吧。