文章目录
第7章:神经网络:学习
7.1 代价函数 Cost function
初始作如下定义:
- L L L — 神经网络的总层数
- s l s_{l} sl — 第 l l l 层的激活单元数量(不包括偏置单元)
- K K K — 输出层的单元数量
- ( h θ ( x ) ) k (h_{\theta}(x))_{k} (hθ(x))k — 输出层第 k k k 个单元的输出值
- δ j ( l ) \delta_{j}^{(l)} δj(l) — 第 l l l 层的第 j j j 个单元的误差
在逻辑回归中,我们的代价函数为:
J
(
θ
)
=
−
1
m
∑
i
=
1
m
[
y
(
i
)
l
o
g
(
h
θ
(
x
(
i
)
)
)
+
(
1
−
y
(
i
)
)
l
o
g
(
1
−
h
θ
(
x
(
i
)
)
)
]
+
λ
2
m
∑
j
=
1
n
θ
j
2
J(\theta) = -\frac{1}{m}\sum_{i=1}^m[y^{(i)}log(h_\theta(x^{(i)}))+(1-y^{(i)})log(1-h_\theta(x^{(i)}))]+\frac{\lambda}{2m}\sum_{j=1}^n\theta_j^2
J(θ)=−m1i=1∑m[y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))]+2mλj=1∑nθj2其中,前一部分为
h
θ
(
x
)
h_\theta(x)
hθ(x)的代价,后一部分为正则化项(减少不重要的特征的权重,防止过拟合)。
而在神经网络中,代价函数可以定义为:
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) = -\frac{1}{m}\sum_{i=1}^m\sum_{k=1}^K[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_{i-1}^{s_l}\sum_{j=1}^{s_l+1}(\theta_{ji}^{(l)})^2
J(θ)=−m1i=1∑mk=1∑K[yk(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与逻辑回归相比,前一项中对输出层每一个单元进行了求和,后一项中对每一层的每一个
θ
\theta
θ 进行了平方求和(正则化项)。
7.2 反向传播 Back propagation
之前介绍了神经网络的前向传播(forward propagation),前向传播是从输入层开始,不断前进计算参数、激活函数,直到传播至输出层。
而神经网络的反向传播(back propagation)从输出层开始,不断计算误差值,反向传播,传播至输入层,修改神经网络中的参数,得出更好的效果。
假设给出一个4层的神经网络如下图所示:
对于输出层的误差,可以定义为
δ
j
(
4
)
=
a
j
(
4
)
−
y
j
\delta_j^{(4)}=a_j^{(4)}-y_j
δj(4)=aj(4)−yj,如果将其向量化,可以写成
δ
(
4
)
=
a
(
4
)
−
y
\delta^{(4)}=a^{(4)}-y
δ(4)=a(4)−y,计算反向传播的过程如下:
δ
(
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))其中,不存在
δ
(
1
)
\delta^{(1)}
δ(1),因为输入层不存在误差。如果忽略正则化项,可以近似为:
∂
∂
Θ
i
j
(
l
)
J
(
Θ
)
=
a
j
(
l
)
∗
δ
i
(
l
+
1
)
\frac{\partial}{ \partial\Theta_{ij}^{(l)}}J(\Theta)=a_j^{(l)}*\delta_i^{(l+1)}
∂Θij(l)∂J(Θ)=aj(l)∗δi(l+1)
7.3 梯度检测 Gradient checking
梯度检测采用的方法是在代价函数上的一点沿着切线方向选择两个非常近的点,然后计算这两个点的平均值用以估计梯度。
对于代价函数上的一点
J
(
θ
)
J(\theta)
J(θ),可近似认为:
∂
∂
θ
J
(
θ
)
≈
J
(
θ
+
ϵ
)
−
J
(
θ
−
ϵ
)
2
ϵ
\frac{\partial}{ \partial\theta}J(\theta)\approx\frac{J(\theta+\epsilon)-J(\theta-\epsilon)}{2\epsilon}
∂θ∂J(θ)≈2ϵJ(θ+ϵ)−J(θ−ϵ)其中,
ϵ
\epsilon
ϵ是一个非常小的值,通常选取 0.001。
考虑更为普遍的情况,当
θ
\theta
θ是n维向量时,我们可以用类似的思想来估算所有的偏导数项。
在Octave中实现如下:
通过此方法,验证上述的反向传播正确性。
注:当证明反向传播正确时,需关闭梯度检测,因梯度检测计算量巨大,时间复杂度高。
7.4 随机初始化 Random initialization
当我们设
Θ
i
j
(
l
)
=
0
\Theta_{ij}^{(l)}=0
Θij(l)=0 (for all
i
,
j
,
l
i,j,l
i,j,l)时,随着前向传播和反向传播的计算,所有激活单元的参数会是一致的,导致模型效果较差。
所以我们采用随机初始化,设
Θ
i
j
(
l
)
∈
[
−
ϵ
,
ϵ
]
\Theta_{ij}^{(l)}\in[-\epsilon,\epsilon]
Θij(l)∈[−ϵ,ϵ] ,
ϵ
\epsilon
ϵ为一很小的值。
7.5 前向传播和反向传播的结合
通过前向传播,可以由输入层传递信息至输出层,得到最终输出;再通过反向传播,从输出层传回至输入层,修改参数、优化模型。可以通过以下定义步骤:
其中,
∂
∂
θ
i
j
(
l
)
J
(
θ
)
=
D
i
j
(
l
)
\frac{\partial}{\partial\theta_{ij}^{(l)}}J(\theta)=D_{ij}^{(l)}
∂θij(l)∂J(θ)=Dij(l)。可继续使用梯度下降算法,对每一个神经单元间的
θ
\theta
θ 进行优化。
正规来说,误差定义如下:
δ
j
(
l
)
=
∂
∂
z
j
(
l
)
c
o
s
t
(
i
)
\delta_j^{(l)}=\frac{\partial}{\partial z_j^{(l)}}cost(i)
δj(l)=∂zj(l)∂cost(i)
c
o
s
t
(
i
)
=
y
(
i
)
l
o
g
(
h
θ
(
x
(
i
)
)
)
+
(
1
−
y
(
i
)
)
l
o
g
(
1
−
h
θ
(
x
(
i
)
)
)
cost(i)=y^{(i)}log(h_\theta(x^{(i)}))+(1-y^{(i)})log(1-h_\theta(x^{(i)}))
cost(i)=y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))注:在神经网络的计算中,
J
(
θ
)
J(\theta)
J(θ) 是非凸函数,理论上会收敛于局部最小值,但实际运用中,神经网络还是可以收敛于接近全局最小值的局部最小值。