第九章
目录
9 - 1 - Cost Function
9 - 2 - Backpropagation Algorithm
9 - 3 - Backpropagation Intuition
9 - 4 - Implementation Note_ Unrolling Parameters
9 - 5 - Gradient Checking
9 - 6 - Random Initialization
9 - 7 - Putting It Together
9 - 8 - Autonomous Driving
9 - 1 - Cost Function
新标记方法:
假设神经网络的训练样本有?个,每个包含一组输入?和一组输出信号?,?表示神经网络层数,
S
l
S_l
Sl表示
l
l
l层神经元个数,
S
L
S_ L
SL代表最后一层神经元个数。
将神经网络的分类定义为两种情况:二类分类和多类分类,
二类分类:
S
L
S_ L
SL= 1, ? = 0 ?? 1表示哪一类;
?类分类:
S
L
S_ L
SL = ?,
y
i
y_i
yi = 1表示分到第i 类;(? > 2)
我们回顾逻辑回归问题中我们的代价函数为:
J
(
θ
)
=
−
1
m
Σ
i
=
1
m
[
y
×
l
o
g
(
h
θ
(
x
)
)
+
(
1
−
y
)
×
l
o
g
(
1
−
h
θ
(
x
)
)
]
J(\theta) = -\frac{1}{m}\Sigma_{i=1}^m[y ×log(h_\theta(x)) +(1 − y)× log(1 − ℎ_\theta(x))]
J(θ)=−m1Σi=1m[y×log(hθ(x))+(1−y)×log(1−hθ(x))]
在逻辑回归中,我们只有一个输出变量,也只有一个因变量?,但是在神经网络中,我们可以有很多输出变量,我们的
h
θ
(
x
)
h_\theta(x)
hθ(x)是一个维度为?的向量,并且训练集中的因变量也是同样维度的一个向量,因此我们的代价函数会比逻辑回归更加复杂一些,为:
h
θ
(
x
)
h_\theta(x)
hθ(x) ∈ ℝ
K
^K
K ,
h
θ
(
x
)
i
=
i
t
h
o
u
t
p
u
t
h_\theta(x)_i= i^{th}output
hθ(x)i=ithoutput
代价函数背后的思想和逻辑回归还是一样的,通过代价函数来观察算法预测的结果与真实情况的误差有多大,唯一不同的是,对于每一行特征,我们都会给出?个预测,基本上我们可以利用循环,对每一行特征都预测?个不同结果,然后在利用循环在?个预测中选择可能性最高的一个,将其与?中的实际数据进行比较。
正则化的那一项只是排除了每一层?
0
_0
0后,每一层的? 矩阵的和。最里层的循环?循环所有的行(由
S
l
+
1
S_{l+1}
Sl+1 层的激活单元数决定),循环?则循环所有的列,由该层(
S
l
S_l
Sl层)的激活单元数所决定。即:
h
θ
(
x
)
h_\theta(x)
hθ(x)与真实值之间的距离为每个样本每个类输出的加和,对参数进regularization 的bias 项处理所有参数的平方和。
9 - 2 - Backpropagation Algorithm
之前在计算神经网络预测结果的时候采用了一种正向传播方法,从第一层开始正向一层一层进行计算,直到最后一层的
h
θ
(
x
)
h_\theta(x)
hθ(x)。现在,为了计算代价函数的偏导数,需要采用一种反向传播算法,首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。
举例:
假设我们的训练集只有一个实例(
x
(
1
)
,
y
(
1
)
)
x^{(1)}, y^{(1)})
x(1),y(1)),我们的神经网络是一个四层的神经网络,其中? = 4,
S
L
S_L
SL = 4,? = 4:
前向传播算法如下图:
从最后一层的误差开始计算,误差是激活单元的预测(
a
k
(
4
)
a^{(4)}_k
ak(4) )与实际值(
y
k
y^k
yk)之间的误差。(k = 1: k)
我们用
δ
\delta
δ来表示误差,则:
δ
(
4
)
=
a
(
4
)
−
y
\delta^{(4)}=a^{(4)}-y
δ(4)=a(4)−y
其中 ?′(?
(
3
)
^{(3)}
(3))是 ? 形函数的导数,?′(?
(
3
)
^{(3)}
(3)) = ?
(
3
)
^{(3)}
(3) ∗ (1 − ?
(
3
)
^{(3)}
(3))。而(?
(
3
)
^{(3)}
(3))
T
^T
T?
(
4
)
^{(4)}
(4)则是权重导致的误差的和。
因为第一层是输入变量,所以不存在误差。用
Δ
i
j
l
\Delta_{ij}^{l}
Δijl来表示这个误差矩阵。第 ? 层的第 ? 个激活单元受到第 ?个参数影响而导致的误差。算法如下:
即首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的误差,然后利用该误差运用反向传播法计算出直至第二层的所有误差。
在求出了
Δ
i
j
l
\Delta_{ij}^{l}
Δijl之后,便可以计算代价函数的偏导数了,计算方法如下:
9 - 3 - Backpropagation Intuition
反向传播算法就好像一个黑箱,里面充满了复杂的步骤。如下图所示,反向传播由最后一层输出层层层向前迭代。
9 - 4 - Implementation Note_ Unrolling Parameters
实现过程中怎样把参数从矩阵展开成向量,以便在高级最优化步骤中的使用需要。
由图可知,对于参数Theta首先要将其展开作为一个一维的数组输入函数中,在使用时在将其转化为原来的的数组形状。
9 - 5 - Gradient Checking
当对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。为了避免这样的问题,我们采取一种叫做梯度的数值检验(Numerical Gradient Checking)方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。
对梯度的估计采用的方法是在代价函数上沿着切线的方向选择离两个非常近的点然后计算两个点的平均值用以估计梯度。即对于某个特定的
θ
\theta
θ ,我们计算出在
θ
\theta
θ -? 处和
θ
\theta
θ +? 的代价值(?是一个非常小的值,通常选取 0.001),然后求两个代价的平均,用以估计在 ?处的代价值。
gradApprox = (J(theta + eps) – J(theta - eps)) / (2*eps)
当?是一个向量时,我们则需要对偏导数进行检验。因为代价函数的偏导数检验只针对一个参数的改变进行检验,下面是一个只针对
θ
1
\theta_1
θ1进行检验的示例:
最后我们还需要对通过反向传播方法计算出的偏导数进行检验。根据上面的算法,计算出的偏导数存储在矩阵
D
i
j
(
l
)
D_{ij}^{(l)}
Dij(l) 中。检验时,我们要将该矩阵展开成为向量,同时我们也将
θ
\theta
θ 矩阵展开为向量,我们针对每一个
θ
\theta
θ 都计算一个近似的梯度1值,将这些值存储于一个近似梯度矩阵中,最终将得出的这个矩阵同
D
i
j
(
l
)
D_{ij}^{(l)}
Dij(l)进行比较。
9 - 6 - Random Initialization
任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果令所有的初始参数都为0,这将意味着第二层的所有激活单元都会有相同的值。同理,如果初始所有的参数都为一个非0 的数,结果也是一样的。
通常初始参数为正负?之间的随机值,假设我们要随机初始一个尺寸为10×11 的参数矩阵,代码如下:
Theta1 = rand(10, 11) * (2*eps) – eps
9 - 7 - Putting It Together
小结一下使用神经网络时的步骤:
网络结构:第一件要做的事是选择网络结构,即决定选择多少层以及决定每层分别有多
少个单元。第一层的单元数即训练集的特征数量。最后一层的单元数是训练集的结果的类的数量。
如果隐藏层数大于1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。真正要决定的是隐藏层的层数和每个中间层的单元数。
训练神经网络:
-
参数的随机初始化
-
利用正向传播方法计算所有的 h θ ( x ) h_\theta(x) hθ(x)
-
编写计算代价函数 J J J的代码
-
利用反向传播方法计算所有偏导数
-
利用数值检验方法检验这些偏导数
-
使用优化算法来最小化代价函数
9 - 8 - Autonomous Driving
用神经网络来实现自动驾驶
每秒钟ALVINN 生成12 次数字化图片,并且将图像传送给神经网络进行训练,多个神经网络同时工作,每一个网络都生成一个行驶方向,以及一个预测自信度的参数,预测自信度最高的那个神经网络得到的行驶方向。比如这里,在这条单行道上训练出的网络将被最终用于控制车辆方向,车辆前方突然出现了一个交叉十字路口,当车辆到达这个十字路口时,我们单行道网络对应的自信度骤减,当它穿过这个十字路口时,前方的双车道将进入其视线,双车道网络的自信度便开始上升,当它的自信度上升时,双车道的网络,将被选择来控制行驶方向,车辆将被安全地引导进入双车道路。
这就是基于神经网络的自动驾驶技术。