- 使用交叉熵损失函数
- 使用sigmod激活函数
- 输出层使用softmax函数
- 全连接,输出层没有sigmoid函数,使用softmax函数
- 推导前提条件下的四个反向传播方程
- Python实现手写数字识别(两个隐藏层,第一隐藏层192个神经元,第二个隐藏层30个神经元)
其中, w i j l w^{l}_{ij} wijl表示第 l l l层的第 j j j个神经元到第 l + 1 l+1 l+1层第 i i i个神经元的权重,可以将 w i j l w^{l}_{ij} wijl理解为 ( W l ) T (W^{l})^{T} (Wl)T对应的元素; b i l b^{l}_{i} bil表示第 l l l层到第 l + 1 l+1 l+1层第 i i i个神经元的偏置。
- 推导方式:从某个神经元 j j j拓展到整个层的神经元
- 引入中间变量:
δ
j
l
=
∂
E
∂
z
j
l
delta^{l}_{j}=frac{partial\E}{partial\z^{l}_{j}}
δjl=∂zjl∂E,表示第푙层第푗个神经元的误差。其中
E
E
E表示损失函数。
定义网络的输出层为第
L
L
L层,则由
s
o
f
t
m
a
x
softmax
softmax函数可得,第
L
L
L层第
j
j
j个神经元的输出为:
h
j
L
=
e
z
j
L
∑
j
=
1
d
L
e
z
j
L
h^{L}_{j}=frac{e^{z^{L}_{j}}}{sum_{j=1}^{d_{L}}e^{z^{L}_{j}}qquad}
hjL=∑j=1dLezjLezjL(1)
因为损失函数为交叉熵损失函数,则
E
=
∑
j
=
1
d
L
−
y
j
l
n
h
j
L
E=sum_{j=1}^{d_{L}}-y_{j}lnh^{L}_{j}qquad
E=∑j=1dL−yjlnhjL(2)
又因为标签
y
y
y是one-hot(
y
i
=
1
y_{i}=1
yi=1,其余项均为0),所以
E
=
−
l
n
h
j
L
E=-lnh^{L}_{j}
E=−lnhjL(3)
进一步地,由式(1)和式(3),可得
E
=
−
l
n
h
j
L
=
−
l
n
e
z
j
L
∑
j
=
1
d
L
e
z
j
L
=
−
z
i
L
+
l
n
∑
j
=
1
d
L
e
z
j
L
E=-lnh^{L}_{j}=-lnfrac{e^{z^{L}_{j}}}{sum_{j=1}^{d_{L}}e^{z^{L}_{j}}qquad}=-z^{L}_{i}+ln{sum_{j=1}^{d_{L}}e^{z^{L}_{j}}qquad}
E=−lnhjL=−ln∑j=1dLezjLezjL=−ziL+ln∑j=1dLezjL(4)
下面对
δ
j
l
=
∂
E
∂
z
j
l
delta^{l}_{j}=frac{partial\E}{partial\z^{l}_{j}}
δjl=∂zjl∂E进行分类讨论,当
j
=
i
j=i
j=i时,有
δ
i
l
=
∂
E
∂
z
i
l
=
−
1
+
h
i
L
delta^{l}_{i}=frac{partial\E}{partial\z^{l}_{i}}=-1+h^{L}_{i}
δil=∂zil∂E=−1+hiL(5)
当
j
≠
i
j{neq}i
j=i时,有
δ
j
l
=
∂
E
∂
z
j
l
=
0
+
h
j
L
delta^{l}_{j}=frac{partial\E}{partial\z^{l}_{j}}=0+h^{L}_{j}
δjl=∂zjl∂E=0+hjL(6)
联合式(5)和式(6)可得
δ
j
l
=
∂
E
∂
z
j
l
=
h
j
L
−
y
j
delta^{l}_{j}=frac{partial\E}{partial\z^{l}_{j}}=h^{L}_{j}-y_{j}
δjl=∂zjl∂E=hjL−yj(7)
扩展到矩阵运算,得到BP1:
δ
L
=
∂
E
∂
z
L
=
h
L
−
y
delta^{L}=frac{partial\E}{partial\z^{L}}=h^{L}-y
δL=∂zL∂E=hL−y,
δ
L
∈
R
d
L
×
1
delta^{L}{in}R^{d_{L}{times}1}
δL∈RdL×1(8)
BP2是整个反向传播方程最关键的一步。BP2寻找网络层与层之间的联系,即推导
δ
l
+
1
delta^{l+1}
δl+1和
δ
l
delta^{l}
δl之间的关系,又由
δ
l
+
1
delta^{l+1}
δl+1和
δ
l
delta^{l}
δl的定义是
E
E
E关于
z
l
+
1
z^{l+1}
zl+1和
z
l
z^{l}
zl的误差,最终转化为寻找
z
l
+
1
z^{l+1}
zl+1和
z
l
z^{l}
zl的联系。
由上图可得,第
l
+
1
l+1
l+1层的第
j
j
j个神经元
z
j
l
+
1
z^{l+1}_{j}
zjl+1接收由第
l
l
l层所有神经元发送的权重(多对一的关系),即
z
j
l
+
1
=
∑
k
=
1
d
l
w
j
k
l
h
k
l
+
b
j
l
z^{l+1}_{j}={sum_{k=1}^{d_{l}}{w^{l}_{jk}}{h_{k}^{l}}qquad}+b^{l}_{j}
zjl+1=∑k=1dlwjklhkl+bjl(9)
而第
l
l
l层第
j
j
j个神经元
z
j
l
z^{l}_{j}
zjl和
h
j
l
h^{l}_{j}
hjl之间的差别仅仅是一个sigmoid函数
h
j
l
=
σ
(
z
j
l
)
h^{l}_{j}=sigma(z^{l}_{j})
hjl=σ(zjl)(10)
联合式(9)和式(10)可以得到
z
l
z^{l}
zl和
z
l
+
1
z^{l+1}
zl+1的关系
z
j
l
+
1
=
∑
k
=
1
d
l
w
j
k
l
σ
(
z
k
l
)
+
b
j
l
z^{l+1}_{j}={sum_{k=1}^{d_{l}}{w^{l}_{jk}}sigma(z^{l}_{k})qquad}+b^{l}_{j}
zjl+1=∑k=1dlwjklσ(zkl)+bjl(11)
这里需要注意的是,第
l
l
l层的第
j
j
j个神经元向第
l
+
1
l+1
l+1层所有的神经元都发送了权重(一对多的关系),所以
δ
j
l
=
∂
E
∂
z
j
l
=
∑
k
=
1
d
l
+
1
∂
E
∂
z
k
l
+
1
∂
z
l
+
1
∂
z
j
l
=
∑
k
=
1
d
l
+
1
δ
k
l
+
1
w
k
j
l
σ
,
(
z
j
l
)
delta^{l}_{j}=frac{partial\E}{partial\z^{l}_{j}}={sum_{k=1}^{d_{l+1}}frac{partial\E}{partial\z^{l+1}_{k}}frac{partial\z^{l+1}}{partial\z^{l}_{j}}qquad}\={sum_{k=1}^{d_{l+1}}delta^{l+1}_{k}w^{l}_{kj}sigma^{,}(z^{l}_{j})qquad}
δjl=∂zjl∂E=∑k=1dl+1∂zkl+1∂E∂zjl∂zl+1=∑k=1dl+1δkl+1wkjlσ,(zjl)(12)
扩展到矩阵运算,其中
δ
l
+
1
∈
R
d
l
+
1
×
1
delta^{l+1}in{R^{d_{l+1}times1}}
δl+1∈Rdl+1×1;
W
l
∈
R
d
l
×
d
l
+
1
W^{l}in{R^{d_{l}times{d_{l+1}}}}
Wl∈Rdl×dl+1;
z
l
∈
R
d
l
×
1
z^{l}in{R^{d_{l}times1}}
zl∈Rdl×1,得到BP2:
δ
l
=
∂
E
∂
z
l
=
σ
,
(
z
l
)
⊙
(
W
l
δ
l
+
1
)
delta^{l}=frac{partial\E}{partial\z^{l}}=sigma^{,}(z^{l})odot(W^{l}delta^{l+1})
δl=∂zl∂E=σ,(zl)⊙(Wlδl+1),
δ
l
∈
R
d
l
×
1
delta^{l}in{R^{d_{l}times1}}
δl∈Rdl×1(13)
BP2比较复杂,字母下标很容易搞混淆,关键在于理解层与层之间多对多的关系。
得到BP2之后,开始正式推导
∂
E
∂
b
j
l
−
1
frac{partial\E}{partial\b^{l-1}_{j}}
∂bjl−1∂E(写成
∂
E
∂
b
j
l
−
1
frac{partial\E}{partial\b^{l-1}_{j}}
∂bjl−1∂E而不是
∂
E
∂
b
j
l
frac{partial\E}{partial\b^{l}_{j}}
∂bjl∂E的形式只是为了对应BP2),这是反向传播过程中真正需要更新的参数。
由上文中的式(9)
z
j
l
+
1
=
∑
k
=
1
d
l
w
j
k
l
h
k
l
+
b
j
l
z^{l+1}_{j}={sum_{k=1}^{d_{l}}{w^{l}_{jk}}{h_{k}^{l}}qquad}+b^{l}_{j}
zjl+1=∑k=1dlwjklhkl+bjl(9)
进行简单地变换得到
z
j
l
=
∑
k
=
1
d
l
−
1
w
j
k
l
−
1
h
k
l
−
1
+
b
j
l
−
1
z^{l}_{j}={sum_{k=1}^{d_{l-1}}{w^{l-1}_{jk}}{h_{k}^{l-1}}qquad}+b^{l-1}_{j}
zjl=∑k=1dl−1wjkl−1hkl−1+bjl−1(14)
推导可得
∂
E
∂
b
j
l
−
1
=
∂
E
∂
z
j
l
∂
z
j
l
∂
b
j
l
−
1
=
δ
j
l
frac{partial\E}{partial\b^{l-1}_{j}}=frac{partial\E}{partial\z^{l}_{j}}frac{partial\z^{l}_{j}}{partial\b^{l-1}_{j}}=delta^{l}_{j}
∂bjl−1∂E=∂zjl∂E∂bjl−1∂zjl=δjl
扩展到矩阵运算,得到BP3:
∂
E
∂
b
l
−
1
=
∂
E
∂
z
l
∂
z
l
∂
b
l
−
1
=
δ
l
frac{partial\E}{partial\b^{l-1}}=frac{partial\E}{partial\z^{l}}frac{partial\z^{l}}{partial\b^{l-1}}=delta^{l}
∂bl−1∂E=∂zl∂E∂bl−1∂zl=δl
BP4由式(14)推导
∂
E
∂
w
j
k
l
−
1
frac{partial\E}{partial\w^{l-1}_{jk}}
∂wjkl−1∂E
z
j
l
=
∑
k
=
1
d
l
−
1
w
j
k
l
−
1
h
k
l
−
1
+
b
j
l
−
1
z^{l}_{j}={sum_{k=1}^{d_{l-1}}{w^{l-1}_{jk}}{h_{k}^{l-1}}qquad}+b^{l-1}_{j}
zjl=∑k=1dl−1wjkl−1hkl−1+bjl−1(14)
对于具体的每一个参数
w
j
k
l
−
1
{w^{l-1}_{jk}}
wjkl−1,有
∂
E
∂
w
j
k
l
−
1
=
∂
E
∂
z
j
l
∂
z
j
l
∂
w
j
k
l
−
1
=
δ
j
l
h
k
l
−
1
frac{partial\E}{partial\w^{l-1}_{jk}}=frac{partial\E}{partial\z^{l}_{j}}frac{partial\z^{l}_{j}}{partial\w^{l-1}_{jk}}=delta^{l}_{j}h_{k}^{l-1}
∂wjkl−1∂E=∂zjl∂E∂wjkl−1∂zjl=δjlhkl−1
扩展到矩阵运算,
δ
l
∈
R
d
l
×
1
delta^{l}in{R^{d_{l}times1}}
δl∈Rdl×1;
h
l
−
1
∈
R
d
l
−
1
×
1
h^{l-1}in{R^{d_{l-1}times1}}
hl−1∈Rdl−1×1,得到BP4:
∂
E
∂
W
l
−
1
=
∂
E
∂
z
l
∂
z
l
∂
W
l
−
1
=
h
l
−
1
(
δ
l
)
T
frac{partial\E}{partial\W^{l-1}}=frac{partial\E}{partial\z^{l}}frac{partial\z^{l}}{partial\W^{l-1}}=h^{l-1}(delta^{l})^{T}
∂Wl−1∂E=∂zl∂E∂Wl−1∂zl=hl−1(δl)T,
∂
E
∂
W
l
−
1
∈
R
d
l
−
1
×
d
l
frac{partial\E}{partial\W^{l-1}}in{R^{d_{l-1}times{d_{l}}}}
∂Wl−1∂E∈Rdl−1×dl
- BP1: δ L = ∂ E ∂ z L = h L − y delta^{L}=frac{partial\E}{partial\z^{L}}=h^{L}-y δL=∂zL∂E=hL−y, δ L ∈ R d L × 1 delta^{L}{in}R^{d_{L}{times}1} δL∈RdL×1
- BP2: δ l = ∂ E ∂ z l = σ , ( z l ) ⊙ ( W l δ l + 1 ) delta^{l}=frac{partial\E}{partial\z^{l}}=sigma^{,}(z^{l})odot(W^{l}delta^{l+1}) δl=∂zl∂E=σ,(zl)⊙(Wlδl+1), δ l ∈ R d l × 1 delta^{l}in{R^{d_{l}times1}} δl∈Rdl×1(13)
- BP3: ∂ E ∂ b l − 1 = ∂ E ∂ z l ∂ z l ∂ b l − 1 = δ l frac{partial\E}{partial\b^{l-1}}=frac{partial\E}{partial\z^{l}}frac{partial\z^{l}}{partial\b^{l-1}}=delta^{l} ∂bl−1∂E=∂zl∂E∂bl−1∂zl=δl
- BP4: ∂ E ∂ W l − 1 = ∂ E ∂ z l ∂ z l ∂ W l − 1 = h l − 1 ( δ l ) T frac{partial\E}{partial\W^{l-1}}=frac{partial\E}{partial\z^{l}}frac{partial\z^{l}}{partial\W^{l-1}}=h^{l-1}(delta^{l})^{T} ∂Wl−1∂E=∂zl∂E∂Wl−1∂zl=hl−1(δl)T, ∂ E ∂ W l − 1 ∈ R d l − 1 × d l frac{partial\E}{partial\W^{l-1}}in{R^{d_{l-1}times{d_{l}}}} ∂Wl−1∂E∈Rdl−1×dl
- 如果输出层使用sigmoid函数,均方误差损失函数,BP方程会有什么变化?
答:仅BP1发生变化 - 如果改用Relu函数作为激活函数,BP方程会有什么变化?
答:仅BP2发生变化
- Python实现手写数字识别(两个隐藏层,第一隐藏层192个神经元,第二个隐藏层30个神经元)
- 输入图像像素为 28 × 28 = 784 28times28=784 28×28=784
# 明天再实现



