[机器学习实战] - 笔记 - BP后向传播神经网络
BP 神经网络结构原理
-
神经网络结构
用ProcessOn软件画的,神经网络结构中变量非常多,部分标注便于理解。
-
定义变量
n l n_l nl : 网络层数,即输入层+隐藏层 + 输出层 (有些参考书不计算输入层)
S l S_{l} Sl:第 l l l层神经元的个数
ω i j ( l ) \omega^{(l)}_{ij} ωij(l) : 第 l l l+1层的第 i i i个神经元和第 l l l层的第 j j j个神经元连接的权重weight
b i ( l ) b^{(l)}_{i} bi(l) :第 l l l层第 i i i个神经元的偏置bias
z i ( l ) z^{(l)}_{i} zi(l) :第 l l l层第 i i i个神经元的权重累计 z i ( l ) = ∑ j = 1 n l ω i j ⋅ a j ( l ) + b i ( l ) z^{(l)}_{i} = \sum_{j=1}^{n_l} \omega_{ij}\cdot a_j^{(l)} + b_i^{(l)} zi(l)=∑j=1nlωij⋅aj(l)+bi(l)
a i ( l ) a^{(l)}_{i} ai(l) :第 l l l层第 i i i个神经元的激活函数后的值(常见激活函数 Sigmoid,ReLu 等)
h ω , b ( x ) h_{\omega,b}(x) hω,b(x):最终输出值,例如输出层神经元个数为 n,则为 (n,1) 向量
α \alpha α :学习率 learning rate
BP 神经网络公式推导
- 对于单个样本,代价函数 cost function是误差平方和MSE:
J ( ω , b ) = 1 2 ∣ ∣ h ω , b ( x ) − y ∣ ∣ 2 J(\omega,b) = \frac{1}{2} ||h_{\omega,b}(x) - y||^2 J(ω,b)=21∣∣hω,b(x)−y∣∣2 - 对于全部样本,代价函数如下,后项是正则项,每层所有连接神经元的权重平方和:
J ( ω , b ) = [ 1 m ∑ i = 1 m J ( ω , b ; x i , y i ) ] + λ 2 ∑ l = 1 n l − 1 ∑ i = 1 S l ∑ j = 1 S l + 1 ( ω j i ( l ) ) 2 J(\omega,b) = [\frac{1}{m}\sum^m_{i=1}J(\omega,b;x_i,y_i)] + \frac{\lambda}{2}\sum^{n_l-1}_{l=1}\sum^{S_l}_{i=1}\sum^{S_l+1}_{j=1}(\omega_{ji}^{(l)})^2 J(ω,b)=[m1i=1∑mJ(ω,b;xi,yi)]+2λl=1∑nl−1i=1∑Slj=1∑Sl+1(ωji(l))2 - 一般通过 梯度下降法求得最优解
ω
i
j
(
l
)
\omega_{ij}^{(l)}
ωij(l) 和
b
i
(
l
)
b_i^{(l)}
bi(l) 当代价函数
J
(
ω
,
b
)
J(\omega,b)
J(ω,b) 取得最小值时。局部下降最快的方向为梯度的负方向。
ω i j ( l ) = ω i j ( l ) − ∂ ∂ ω i j ( l ) J ( ω , b ) \omega_{ij}^{(l)} = \omega_{ij}^{(l)} - \frac{\partial}{\partial \omega_{ij}^{(l)}} J(\omega,b) ωij(l)=ωij(l)−∂ωij(l)∂J(ω,b) b i ( l ) = b i ( l ) − ∂ ∂ b i ( l ) J ( ω , b ) b_i^{(l)} = b_i^{(l)} - \frac{\partial}{\partial b_i^{(l)}} J(\omega,b) bi(l)=bi(l)−∂bi(l)∂J(ω,b) - 如果神经网络层数以及变量非常多,普通梯度下降法不适用于该情况,改用后向传播实现梯度下降,只针对前一层求偏导。
∂ ∂ ω i j ( l ) J ( ω , b ) = 1 m ∑ i = 1 m ∂ ∂ ω i j ( l ) J ( ω , b ; x i , y i ) + λ ω i j ( l ) \frac{\partial}{\partial \omega_{ij}^{(l)}} J(\omega,b) = \frac{1}{m}\sum^m_{i=1}\frac{\partial}{\partial \omega_{ij}^{(l)}} J(\omega,b;x_i,y_i) + \lambda\omega_{ij}^{(l)} ∂ωij(l)∂J(ω,b)=m1i=1∑m∂ωij(l)∂J(ω,b;xi,yi)+λωij(l) ∂ ∂ b i ( l ) J ( ω , b ) = 1 m ∑ i = 1 m ∂ ∂ b i ( l ) J ( ω , b ; x i , y i ) \frac{\partial}{\partial b_i^{(l)}} J(\omega,b) = \frac{1}{m}\sum^m_{i=1}\frac{\partial}{\partial b_i^{(l)}} J(\omega,b;x_i,y_i) ∂bi(l)∂J(ω,b)=m1i=1∑m∂bi(l)∂J(ω,b;xi,yi) - 最后一层,其中用到 chain rule 链式法则,展开推导,打公式太累了,歇了歇了,后期传一张手写的。
∂ ∂ ω i j ( n l − 1 ) J ( ω , b ) \frac{\partial}{\partial \omega_{ij}^{(n_l-1)}} J(\omega,b) ∂ωij(nl−1)∂J(ω,b) - 倒数第二层
∂ ∂ ω i j ( n l − 2 ) J ( ω , b ) \frac{\partial}{\partial \omega_{ij}^{(n_l-2)}} J(\omega,b) ∂ωij(nl−2)∂J(ω,b) - 归纳误差偏导 σ \sigma σ
❗ 步骤总结:
① 前向传播,计算每层的激活函数值
z
i
z_i
zi ->
a
i
a_i
ai
② 最后
n
l
n_l
nl层,计算误差
σ
(
n
l
)
\sigma^{(n_l)}
σ(nl)
σ
i
(
n
l
)
=
−
(
y
i
−
a
i
(
n
l
)
)
⋅
f
′
(
z
i
(
l
)
)
\sigma_i^{(n_l)} = - (y_i - a_i^{(n_l)})\cdot f^{'}(z_i^{(l)})
σi(nl)=−(yi−ai(nl))⋅f′(zi(l))
③ 对于其他层
σ
i
(
l
)
=
−
∑
j
=
1
S
l
+
1
⋅
ω
[
j
i
]
(
l
)
f
′
(
z
i
(
l
)
)
\sigma_i^{(l)} = - \sum_{j=1}^{S_l+1}\cdot \omega_[ji]^{(l)} f^{'}(z_i^{(l)})
σi(l)=−j=1∑Sl+1⋅ω[ji](l)f′(zi(l))
④ 结论:权重和偏置更新
ω
i
j
(
l
)
=
ω
i
j
(
l
)
−
α
⋅
a
j
(
l
)
σ
i
(
l
)
\omega_{ij}^{(l)} = \omega_{ij}^{(l)} - \alpha\cdot a_j^{(l)}\sigma_i^{(l)}
ωij(l)=ωij(l)−α⋅aj(l)σi(l)
b
i
(
l
)
=
b
i
(
l
)
−
α
⋅
σ
i
(
l
)
b_i^{(l)} = b_i^{(l)} - \alpha\cdot \sigma_i^{(l)}
bi(l)=bi(l)−α⋅σi(l)
代码分享
代码采用随机梯度下降批量算法,缺点是没有用矩阵运算而全部向量运算,不推荐。如果感兴趣,搜吴恩达的深度学习课程,参考其代码。
链接: https://pan.baidu.com/s/1CbxEAx047i3t8MkAekxhKA
提取码: i1n6
Reference
书籍:
神经网络与深度学习 - Michael Nielsen
B站视频:
深度学习之神经网络的结构 Part 1 ver 2.0
深度学习之梯度下降法 Part 2 ver 0.9 beta
深度学习之反向传播算法 上/下 Part 3 ver 0.9 beta