第九章 神经网络:学习(二)
第2节 反向传播实践(Backpropagation in practice)
9.4 实现注意:展开参数
参考视频:9 - 4 - Implementation Note_ Unrolling Parameters (8 min).mkv
为了在高级优化算法的使用需要,我们需要把参数从矩阵转化为向量。以下为高级优化代码,
function [jVal, gradient] = costFunction(theta)
...
end
optTheta = fminunc(@costFunction, initialTheta, options)
对于四层的神经网络,根据之前的叙述,我们会有矩阵Θ(1),Θ(2),Θ(3)Θ(1),Θ(2),Θ(3)和D(1),D(2),D(3)D(1),D(2),D(3),需要把它们转化为多维一列的向量。
上图中包含了矩阵和矩阵相互转换的Matlab代码。在优化算法前,我们把矩阵转化为向量;优化算法优化之后,我们再把返回的向量转化为矩阵。另外,优化算法优化代价函数costFunction,其参数也应该是向量,在函数内将向量转化为矩阵。
总结如下图:
9.5 梯度检验
参考视频:9 - 5 - Gradient Checking (12 min).mkv
当我们对一个较为复杂的模型(如神经网络)使用梯度下降算法是,可能会存在一些不容易察觉的错误。这意味着虽然代价看上去在不断减小,但最终的结果可能并不是最优解。
为了避免这样的问题,我们采取一种叫做数值梯度检验(Numerical Gradient Checking)方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否符合我们的要求。
对梯度的估计采用切线法:在需要计算梯度的点ΘΘ的两边取两个非常近的点,用函数值之差除以两点之差来估计梯度。梯度估计:∂∂ΘJ(Θ)≈J(Θ+ϵ)−J(Θ−ϵ)2ϵ∂∂ΘJ(Θ)≈J(Θ+ϵ)−J(Θ−ϵ)2ϵ。如下图,
当ΘΘ是一个向量时,我们则需要对偏导数进行检验。因为代价函数的偏导数检验只针对一个参数的改变进行检验:∂∂ΘjJ(Θ)≈J(Θ1,…,Θj+ϵ,…,Θn)−J(Θ1,…,Θj−ϵ,…,Θn)2ϵ∂∂ΘjJ(Θ)≈J(Θ1,…,Θj+ϵ,…,Θn)−J(Θ1,…,Θj−ϵ,…,Θn)2ϵ
代码如下:
epsilon = 1e-4;
for i = 1:n,
thetaPlus = theta;
thetaPlus(i) += epsilon;
thetaMinus = theta;
thetaMinus(i) -= epsilon;
gradApprox(i) = (J(thetaPlus) - J(thetaMinus))/(2*epsilon)
end
我们之前看到了如何计算deltavector。所以一旦我们计算了我们的gradApprox向量,我们就可以检查gradApprox是否约等于deltavector。
另外,如果验证了反向传播算法是正确的,你就可以把梯度检验的代码禁用掉。不需要再次计算gradApprox了,而且计算gradApprox的代码非常慢。
9.6 随机初始化
参考视频:9 - 6 - Random Initialization (7 min).mkv
任何优化算法都需要一些初始的参数。我们一般初始化所有参数为0,但这对神经网络不可行。如果这样做,那么第二层的所有激活单元都会有相同的值。同理,我们将所有参数初始化为其他相同的值也是不可以的。
我们通常初始化参数为[−ϵ,+ϵ][−ϵ,+ϵ]之间的随机值(该ϵϵ和梯度检查中的没有关系)。假设我们要初始化一个尺寸为10*11的参数矩阵,Matlab代码为:
Theta1 = rand(10, 11) * (2*eps) – eps
9.7 综合起来
参考视频:9 - 7 - Putting It Together (14 min).mkv
小结一下使用神经网络的步骤。首先,确定网络结构,决定选择多少层神经网络以及每个层有多少单元:
- 第一层(输入层)的单元的数量等于训练数据集的特征数量
- 最后一层(输出层)的单元数等于数据集中类的数量
- 隐藏层默认为一层。如果隐藏层层数大于1,每层的单元数最好相同,通常情况下隐藏层的单元数越多越好(需要与计算成本相平衡,因为它增加了计算量)
- 真正需要决定的是隐藏层的层数和隐藏层的单元个数
接下来是训练神经网络:
- 随机初始化权重矩阵
- 利用正向传播算法计算所有的hθ(x)hθ(x)
- 实现代价函数J
- 用反向传播算法计算所有偏导数
- 使用数值梯度检查检验这些偏导数,确保反向传播正确,然后禁用梯度检查
- 使用梯度下降或内建优化函数来最小化权重矩阵的代价函数
最后是使用神经网络算法。
第3节 神经网络的应用(Application of Neural Networks)
9.8 自动驾驶
参考视频:9 - 8 - Autonomous Driving (7 min).mkv
在这段视频中,我想向你介绍一个具有历史意义的神经网络学习重要例子——用神经网络来实现自动驾驶,也就是说使汽车通过学习来自己驾驶。