BP神经网络
往期内容
1. 单变量线性回归
2. 多变量线性回归
3. 逻辑回归
4. 正则化
神经网络的基本概念
神经网络模型是由许多逻辑单元按照不同层级组织起来的网络。如下图所示,神经网络通常分为输入层(layer1)、隐藏层(layer2) 和输出层(layer3) 三类。每一层的输出变量都是下一层的输入变量。
![](https://i-blog.csdnimg.cn/blog_migrate/8550d5ca4ba004d0174b57b571dbfda5.jpeg#pic_center)
其中,
a
i
(
j
)
a_i^{(j)}
ai(j) 表示第
j
j
j层的第
i
i
i个激活单元(activation unit)。用
θ
(
j
)
\theta^{(j)}
θ(j)代表从第
j
j
j层影射到第
j
+
1
j+1
j+1层时的权重矩阵,给每一层添加一个偏置单元(bias unit),可以得到激活单元的输出表达式如下:
a
1
(
2
)
=
g
(
Θ
10
(
1
)
x
0
+
Θ
11
(
1
)
x
1
+
Θ
12
(
1
)
x
2
+
Θ
13
(
1
)
x
3
)
a_1^{(2)}=g(\Theta^{(1)}_{10}x_0+\Theta^{(1)}_{11}x_1+\Theta^{(1)}_{12}x_2+\Theta^{(1)}_{13}x_3)
a1(2)=g(Θ10(1)x0+Θ11(1)x1+Θ12(1)x2+Θ13(1)x3)
a
2
(
2
)
=
g
(
Θ
20
(
1
)
x
0
+
Θ
21
(
1
)
x
1
+
Θ
22
(
1
)
x
2
+
Θ
23
(
1
)
x
3
)
a_2^{(2)}=g(\Theta^{(1)}_{20}x_0+\Theta^{(1)}_{21}x_1+\Theta^{(1)}_{22}x_2+\Theta^{(1)}_{23}x_3)
a2(2)=g(Θ20(1)x0+Θ21(1)x1+Θ22(1)x2+Θ23(1)x3)
a
3
(
2
)
=
g
(
Θ
30
(
1
)
x
0
+
Θ
31
(
1
)
x
1
+
Θ
32
(
1
)
x
2
+
Θ
33
(
1
)
x
3
)
a_3^{(2)}=g(\Theta^{(1)}_{30}x_0+\Theta^{(1)}_{31}x_1+\Theta^{(1)}_{32}x_2+\Theta^{(1)}_{33}x_3)
a3(2)=g(Θ30(1)x0+Θ31(1)x1+Θ32(1)x2+Θ33(1)x3)
h
Θ
(
x
)
=
g
(
Θ
10
(
2
)
a
0
(
2
)
+
Θ
11
(
2
)
a
1
(
2
)
+
Θ
12
(
2
)
a
2
(
2
)
+
Θ
13
(
2
)
a
3
(
2
)
)
h_{\Theta}(x)=g(\Theta^{(2)}_{10}a_0^{(2)}+\Theta^{(2)}_{11}a_1^{(2)}+\Theta^{(2)}_{12}a_2^{(2)}+\Theta^{(2)}_{13}a_3^{(2)})
hΘ(x)=g(Θ10(2)a0(2)+Θ11(2)a1(2)+Θ12(2)a2(2)+Θ13(2)a3(2))
像这样从左到右的算法称为前向传播算法(forword propagation)。我们可以把
a
i
(
j
)
a_i^{(j)}
ai(j)看成更高级的特征值,也就是
x
i
x_i
xi的进化体。
神经网络的代价函数
神经网络结构如下图所示:
其中,m — 训练样本数;
L — 神经网络层数;
S
I
S_I
SI — 每层的神经元个数,
S
L
S_L
SL即为最后一层中的输出单元个数;
类似于逻辑回归的代价函数,神经网络的代价函数可以表示如下:
J
(
Θ
)
=
−
1
m
[
∑
i
=
1
m
∑
k
=
1
k
y
k
(
i
)
l
o
g
(
h
Θ
(
x
(
i
)
)
)
k
+
(
1
−
y
k
(
i
)
)
l
o
g
(
1
−
(
h
Θ
(
x
(
i
)
)
)
k
)
]
+
λ
2
m
∑
l
=
1
L
−
1
∑
i
=
1
s
l
∑
j
=
1
s
l
+
1
(
Θ
j
i
(
l
)
)
2
J(\Theta)=-\frac1m[\sum^m_{i=1}\sum^k_{k=1}y_k^{(i)}log(h_{\Theta}(x^{(i)}))_k+(1-y_k^{(i)})log(1-(h_{\Theta}(x^{(i)}))_k)]+\frac{\lambda}{2m}\sum^{L-1}_{l=1}\sum^{s_l}_{i=1}\sum^{s_{l+1}}_{j=1}(\Theta^{(l)}_{ji})^2
J(Θ)=−m1[i=1∑mk=1∑kyk(i)log(hΘ(x(i)))k+(1−yk(i))log(1−(hΘ(x(i)))k)]+2mλl=1∑L−1i=1∑slj=1∑sl+1(Θji(l))2 这个代价函数虽然看起来复杂,但其背后的思想还是不变的。前面一部分累加是对每一组特征的K种预测结果与真实情况y进行比较;正则化那一项只是排除了每一行的
θ
0
\theta_0
θ0,最里层的循环
j
j
j循环的是权重矩阵的所有行;循环
i
i
i循环的是权重矩阵的所有列。
反向传播(back propagation)
在用神经网络进行预测的时候,我们采用的是正向传播算法,现在为了计算代价函数的偏导数
∂
∂
Θ
i
j
(
l
)
J
(
Θ
)
\frac{\partial}{\partial\Theta^{(l)}_{ij}}J(\Theta)
∂Θij(l)∂J(Θ)需要采用反向传播算法。
如上图4层的神经网络,
K
=
4
K=4
K=4,
S
L
=
4
S_L=4
SL=4,
L
=
4
L=4
L=4。前向传播过程如下:
a
(
1
)
=
x
a^{(1)}=x
a(1)=x
z
(
2
)
=
Θ
(
1
)
a
(
1
)
z^{(2)}=\Theta^{(1)}a^{(1)}
z(2)=Θ(1)a(1)
a
(
2
)
=
g
(
z
(
2
)
)
a^{(2)}=g(z^{(2)})
a(2)=g(z(2))
z
(
3
)
=
Θ
(
2
)
a
(
2
)
z^{(3)}=\Theta^{(2)}a^{(2)}
z(3)=Θ(2)a(2)
a
(
3
)
=
g
(
z
(
3
)
)
a^{(3)}=g(z^{(3)})
a(3)=g(z(3))
z
(
4
)
=
Θ
(
3
)
a
(
3
)
z^{(4)}=\Theta^{(3)}a^{(3)}
z(4)=Θ(3)a(3)
a
(
4
)
=
g
(
z
(
4
)
)
a^{(4)}=g(z^{(4)})
a(4)=g(z(4))
在计算误差时,需要从最后一层的误差开始计算,即:
δ
(
4
)
=
a
(
4
)
−
y
\delta^{(4)}=a^{(4)}-y
δ(4)=a(4)−y
δ
(
3
)
=
(
Θ
(
3
)
)
T
δ
(
4
)
∗
g
′
(
z
(
3
)
)
\delta^{(3)}=(\Theta^{(3)})^T\delta^{(4)}*g'(z^{(3)})
δ(3)=(Θ(3))Tδ(4)∗g′(z(3))
δ
(
2
)
=
(
Θ
(
2
)
)
T
δ
(
3
)
∗
g
′
(
z
(
2
)
)
\delta^{(2)}=(\Theta^{(2)})^T\delta^{(3)}*g'(z^{(2)})
δ(2)=(Θ(2))Tδ(3)∗g′(z(2))
现在用
Δ
i
j
(
l
)
\Delta_{ij}^{(l)}
Δij(l)来表示误差矩阵,那么最后可由以下两式计算代价函数的偏导数:
D
i
j
(
l
)
:
=
1
m
Δ
i
j
(
l
)
+
λ
Θ
i
j
(
l
)
i
f
j
≠
0
D_{ij}^{(l)}:=\frac1m\Delta_{ij}^{(l)}+\lambda\Theta_{ij}^{(l)}\ \ \ \ \ \ if\ \ j\neq0
Dij(l):=m1Δij(l)+λΘij(l) if j=0
D
i
j
(
l
)
:
=
1
m
Δ
i
j
(
l
)
i
f
j
=
0
D_{ij}^{(l)}:=\frac1m\Delta_{ij}^{(l)}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if\ \ j=0
Dij(l):=m1Δij(l) if j=0
梯度检验
对较复杂的模型使用梯度下降时,为了防止一些不易察觉的错误的发生,通常使用梯度数值检验(Numerical Gradient Checking) 对其梯度下降算法进行验算。当
θ
\theta
θ是一个向量时,需要使用偏导数进行计算,下面以
θ
1
\theta_1
θ1为例:
∂
∂
θ
1
=
J
(
θ
1
+
ϵ
1
,
θ
2
,
θ
3
.
.
.
θ
n
)
−
J
(
θ
1
,
θ
2
,
θ
3
.
.
.
θ
n
)
2
ϵ
\frac{\partial}{\partial\theta_1}=\frac{J(\theta_1+\epsilon_1,\theta_2,\theta_3...\theta_n)-J(\theta_1,\theta_2,\theta_3...\theta_n)}{2\epsilon}
∂θ1∂=2ϵJ(θ1+ϵ1,θ2,θ3...θn)−J(θ1,θ2,θ3...θn)根据上面的方法,对每一个
θ
\theta
θ都计算出一个近似的梯度值,并将其储存在近似梯度矩阵中,最终将得到的这个矩阵同
D
i
j
(
l
)
D_{ij}^{(l)}
Dij(l)进行比较。
小结
训练神经网络的步骤可以大致总结如下:
- 选择网络结构(决定隐藏层的层数和中间单元的神经元数量)
- 参数随机初始化
- 利用正向传播计算所有的 h θ ( x ) h_\theta(x) hθ(x)
- 利用反向传播计算所有的偏导数
- 进行梯度检验(检验一次,梯度下降函数检查无误后即可关闭)
- 利用算法最小化代价函数