神经网络与BP算法
最近在coursera上看Andrew Ng的machine learning,其中提到了BP算法,但没有给出具体的推导过程。因此想写一篇笔记,把这个算法的逻辑理清楚。
1. 神经网络
神经网络是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。
神经网络通常由输入层 x x x、隐层和输出层 h h h构成。输入层的每个神经元代表一个特征,输出层的每个神经元代表一个分类标签,而隐层的层数和神经元数目则由人工设定。
一个典型的3层神经网络如图所示:
设第 l l l层神经元个数为 s l s_l sl,其中第 i i i个神经元为 a i ( l ) a_i^{(l)} ai(l)。
相邻两层神经元的转移如下:
z ( l + 1 ) = Θ ( l ) ˉ a ( l ) ˉ , a ( l + 1 ) = g ( z ( l + 1 ) ) z^{(l+1)}=\bar{\Theta^{(l)}}\bar{a^{(l)}}, a^{(l+1)}=g(z^{(l+1)}) z(l+1)=Θ(l)ˉa(l)ˉ,a(l+1)=g(z(l+1))
其中:
- a ( l ) ˉ = [ 1 a ( l ) ] \bar{a^{(l)}}=\begin{bmatrix}1\\a^{(l)}\end{bmatrix} a(l)ˉ=[1a(l)]
- Θ ( l ) ∈ R s l + 1 × s l \Theta^{(l)}\in R^{s_{l+1}\times s_l} Θ(l)∈Rsl+1×sl为权重矩阵, Θ ( l ) ˉ = [ Θ 0 ( l ) Θ ( l ) ] \bar{\Theta^{(l)}}=\begin{bmatrix}\Theta_0^{(l)}&\Theta^{(l)}\end{bmatrix} Θ(l)ˉ=[Θ0(l)Θ(l)]。
- g ( z ) g(z) g(z)为激励函数,常用sigmoid函数 g ( z ) = 1 1 + e − z g(z)=\frac{1}{1+e^{-z}} g(z)=1+e−z1。
2. 目标函数
J ( Θ ) = − mean ( y log h + ( 1 − y ) log ( 1 − h ) ) + λ 2 m ∣ ∣ Θ ∣ ∣ 2 J(\Theta)=-\text{mean}(y\log h+(1-y)\log (1-h))+\frac{\lambda}{2m}||\Theta||^2 J(Θ)=−mean(ylogh+(1−y)log(1−h))+2mλ∣∣Θ∣∣2。
求 min Θ J ( Θ ) \min_\Theta J(\Theta) minΘJ(Θ)需要利用梯度下降法,这需要求出每一步的 ∂ ∂ Θ i j ( l ) J ( Θ ) \frac{\partial}{\partial \Theta_{ij}^{(l)}}J(\Theta) ∂Θij(l)∂J(Θ)。
直接求导比较麻烦,可以利用BP算法递推求解。
3. BP算法
第一步:求出 ∂ ∂ h J ( Θ ) \frac{\partial}{\partial h}J(\Theta) ∂h∂J(Θ)。
∂ ∂ h J ( Θ ) = h − y m h ∘ ( 1 − h ) \frac{\partial}{\partial h}J(\Theta)=\frac{h-y}{mh\circ (1-h)} ∂h∂J(Θ)=mh∘(1−h)h−y
第二步:从后往前依次求出 ∂ ∂ a ( l ) J ( Θ ) \frac{\partial}{\partial a^{(l)}}J(\Theta) ∂a(l)∂J(Θ)
∂ J ∂ a ( l ) ˉ = ∂ J ∂ a ( l + 1 ) ∂ a ( l + 1 ) ∂ z ( l + 1 ) ∂ z ( l + 1 ) ∂ a ( l ) ˉ = ∂ J ∂ a ( l + 1 ) ∘ g ′ ( z ( l + 1 ) ) Θ ( l ) ˉ \frac{\partial J}{\partial \bar{a^{(l)}}}=\frac{\partial J}{\partial a^{(l+1)}}\frac{\partial a^{(l+1)}}{\partial z^{(l+1)}}\frac{\partial z^{(l+1)}}{\partial \bar{a^{(l)}}}=\frac{\partial J}{\partial a^{(l+1)}}\circ g'(z^{(l+1)})\bar{\Theta^{(l)}} ∂a(l)ˉ∂J=∂a(l+1)∂J∂z(l+1)∂a(l+1)∂a(l)ˉ∂z(l+1)=∂a(l+1)∂J∘g′(z(l+1))Θ(l)ˉ
第三步:求出 ∂ ∂ Θ i j ( l ) J ( Θ ) \frac{\partial}{\partial \Theta_{ij}^{(l)}}J(\Theta) ∂Θij(l)∂J(Θ)。
∂ J ∂ Θ ( l ) = ∂ J ∂ a ( l + 1 ) ∂ a ( l + 1 ) ∂ z ( l + 1 ) ∂ z ( l + 1 ) ∂ Θ ( l ) ˉ = ∂ J ∂ a ( l + 1 ) ∘ g ′ ( z ( l + 1 ) ) a ( l ) ˉ \frac{\partial J}{\partial \Theta^{(l)}}=\frac{\partial J}{\partial a^{(l+1)}}\frac{\partial a^{(l+1)}}{\partial z^{(l+1)}}\frac{\partial z^{(l+1)}}{\partial \bar{\Theta^{(l)}}}=\frac{\partial J}{\partial a^{(l+1)}}\circ g'(z^{(l+1)})\bar{a^{(l)}} ∂Θ(l)∂J=∂a(l+1)∂J∂z(l+1)∂a(l+1)∂Θ(l)ˉ∂z(l+1)=∂a(l+1)∂J∘g′(z(l+1))a(l)ˉ