9 神经网络的学习(Neural Networks: Learning)
9.1 代价函数(Cost Function)
假设神经网络的训练样本有 m m m个,每个包含一组输入 x x x和一组输出信号 y y y, L L L表示神经网络层数, S I S_I SI表示每层的neuron个数( S l S_l Sl表示输出层神经元个数), S L S_L SL代表最后一层中处理单元的个数。
将神经网络的分类定义为两种情况:二类分类和多类分类,
二类分类: S L = 0 , y = 0 o r 1 S_L=0, y=0\, or\, 1 SL=0,y=0or1表示哪一类;
K K K类分类: S L = k , y i = 1 S_L=k, y_i = 1 SL=k,yi=1表示分到第 i i i类; ( k > 2 ) (k>2) (k>2)
逻辑回归中代价函数为:
J ( θ ) = − 1 m [ ∑ i = 1 m y ( i ) log 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(θ)=−m1[∑i=1my(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))]+2mλ∑j=1nθj2
逻辑回归中只有一个输出变量,又称标量(scalar),也只有一个因变量 y y y,但在神经网络中,可以有很多输出变量, h θ ( x ) h_\theta(x) hθ(x)是一个维度为 K K K的向量,并且训练集中的因变量也是同样维度的一个向量,因此代价函数会比逻辑回归更加复杂,为: h θ ( x ) ∈ R K h_\theta\left(x\right)\in \mathbb{R}^{K} hθ(x)∈RK
( h θ ( x ) ) i = i t h output {\left({h_\theta}\left(x\right)\right)}_{i}={i}^{th} \text{output} (hθ(x))i=ithoutput
J ( Θ ) = − 1 m [ ∑ i = 1 m ∑ k = 1 k y k ( i ) log ( h Θ ( x ( i ) ) ) + ( 1 − y k ( i ) ) log ( 1 − ( h Θ ( x ( i ) ) ) ) ] + λ 2 m ∑ l = 1 L − 1 ∑ i = 1 s l ∑ j = 1 s l + 1 ( Θ j i ( l ) ) 2 J(\Theta) = -\frac{1}{m} \left[ \sum_{i=1}^{m} \sum_{k=1}^{k} {y_k}^{(i)} \log {(h_\Theta(x^{(i)}))} + \left( 1 - y_k^{(i)} \right) \log \left( 1- {\left( h_\Theta \left( x^{(i)} \right) \right)} \right) \right] + \frac{\lambda}{2m} \sum_{l=1}^{L-1} \sum_{i=1}^{s_l} \sum_{j=1}^{s_{l+1}} \left( \Theta_{ji}^{(l)} \right)^2 J(Θ)=−m1[i=1∑mk=1∑kyk(i)log(hΘ(x(i)))+(1−yk(i))log(1−(hΘ(x(i))))]+2mλl=1∑L−1i=1∑slj=1∑sl+1(Θji(l))2
可以利用循环,对每一行特征都预测 K K K个不同结果,然后利用循环在 K K K个预测中选择可能性最高的一个,将其与 y y y中的实际数据进行比较。
正则化的那一项只是排除了每一层 θ 0 \theta_0 θ0后,每一层的 θ \theta θ 矩阵的和。最里层的循环 j j j循环所有的行(由 s l + 1 s_{l+1} sl+1 层的激活单元数决定),循环 i i i则循环所有的列,由该层( s l s_l sl层)的激活单元数所决定。即: h θ ( x ) h_\theta(x) hθ(x)与真实值之间的距离为每个样本-每个类输出的加和,对参数进行regularization的bias项处理所有参数的平方和。
9.2 反向传播算法( Backpropagation algorithm)
为了计算代价函数的偏导数
∂
∂
Θ
i
j
(
l
)
J
(
Θ
)
\frac{\partial}{\partial\Theta^{(l)}_{ij}}J\left(\Theta\right)
∂Θij(l)∂J(Θ),需要采用反向传播算法,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。
9.3 反向传播算法的直观理解(Backpropagation intuition)
上图中的
δ
j
(
l
)
=
"
e
r
r
o
r
"
o
f
c
o
s
t
f
o
r
a
j
(
l
)
(
u
n
i
t
j
i
n
l
a
y
e
r
l
)
\delta^{(l)}_{j}="error" \ of cost \ for \ a^{(l)}_{j} \ (unit \ j \ in \ layer \ l)
δj(l)="error" ofcost for aj(l) (unit j in layer l) 相当于是第
l
l
l 层的第
j
j
j 单元中得到的激活项的“误差”,即”正确“的
a
j
(
l
)
a^{(l)}_{j}
aj(l) 与计算得到的
a
j
(
l
)
a^{(l)}_{j}
aj(l) 的差。而
a
j
(
l
)
=
g
(
z
(
l
)
)
a^{(l)}_{j}=g(z^{(l)})
aj(l)=g(z(l)) ,(g为sigmoid函数),更准确的说
δ
j
(
l
)
=
∂
∂
z
j
(
l
)
c
o
s
t
(
i
)
\delta^{(l)}_{j}=\frac{\partial}{\partial z^{(l)}_{j}}cost(i)
δj(l)=∂zj(l)∂cost(i)
9.4 使用注意:展开参数(Implementation note_ Unrolling parameters )
本节介绍从矩阵展开成向量,以便在高级最优化步骤中的使用需要。
9.5 梯度检验(Gradient checking)
当对一个较为复杂的模型(如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。为了避免这样的问题,采取梯度的数值检验(Numerical Gradient Checking)方法。这种方法的思想是通过估计梯度值来检验计算的导数值是否真的是要求的。
当
θ
\theta
θ是一个向量时,需要对偏导数进行检验。因为代价函数的偏导数检验只针对一个参数的改变进行检验,下面是只针对
θ
1
\theta_1
θ1进行检验的示例:
∂
∂
θ
1
=
J
(
θ
1
+
ε
1
,
θ
2
,
θ
3
.
.
.
θ
n
)
−
J
(
θ
1
−
ε
1
,
θ
2
,
θ
3
.
.
.
θ
n
)
2
ε
\frac{\partial}{\partial\theta_1}=\frac{J\left(\theta_1+\varepsilon_1,\theta_2,\theta_3...\theta_n \right)-J \left( \theta_1-\varepsilon_1,\theta_2,\theta_3...\theta_n \right)}{2\varepsilon}
∂θ1∂=2εJ(θ1+ε1,θ2,θ3...θn)−J(θ1−ε1,θ2,θ3...θn)
最后还需要对通过反向传播方法计算出的偏导数进行检验。
根据上面的算法,计算出的偏导数存储在矩阵
D
i
j
(
l
)
D_{ij}^{(l)}
Dij(l) 中。检验时要将该矩阵展开成为向量,同时也将
θ
\theta
θ 矩阵展开为向量,针对每一个
θ
\theta
θ 都计算一个近似的梯度值,将这些值存储于一个近似梯度矩阵中,最终将得出的这个矩阵同
D
i
j
(
l
)
D_{ij}^{(l)}
Dij(l) 进行比较。
9.6 随机初始化(Random initialization )
初始所有参数为0对于逻辑回归来说是可行的,但对于神经网络来说不可行。如果令初始参数都为0,第二层的所有激活单元都会有相同的值。同理如果初始所有的参数都为一个非0的数,结果也是一样的。通常初始参数为正负 ε 之间的随机值。
9.7 综合起来(utting it together)
使用神经网络时的步骤:
网络结构:第一件要做的事是选择网络结构,即决定选择多少层以及决定每层分别有多少个单元。
第一层的单元数即训练集的特征数量。
最后一层的单元数是训练集的结果的类的数量。
如果隐藏层数大于1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。
我们真正要决定的是隐藏层的层数和每个中间层的单元数。
训练神经网络:
-
参数的随机初始化
-
利用正向传播方法计算所有的 h θ ( x ) h_{\theta}(x) hθ(x)
-
编写计算代价函数 J J J 的代码
-
利用反向传播方法计算所有偏导数
-
利用数值检验方法检验这些偏导数
-
使用优化算法来最小化代价函数
9.8 自主驾驶(Autonomous driving)
使用神经网络来实现自动驾驶