九、神经网络的学习(Neural Networks: Learning)
9.1 代价函数
假设神经网络的训练样本有m个,每个包含一组输入x和一组输出信号y,L表示神经网络层数,表示每层的neuron(神经元)个数,代表最后一层中处理单元的个数。
将神经网络的分类定义为两种情况:二类分类和多类分类,
二类分类:表示哪一类;
K类分类:表示分到第i类;(k>2)
逻辑回归的代价函数为:
在神经网络中,一个K分类问题,我们可以有很多输出K个变量,即
即:
9.2 反向传播算法
在训练模型的时候,我们先用正向传播算出误差,再通过反向传播利用误差去更新参数,一正一反,一来一往,循环往复,直至训练完成。
在正向传播中,我们从第一层开始正向一层一层进行计算,直到最后一层的。
现在,为了计算代价函数的偏导数,我们需要采用一种反向传播算法,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。
四大公式:
9.3 反向传播算法的直观理解
这篇文章已经介绍的很详细了:
https://blog.csdn.net/li744831579/article/details/81915615
9.4 实现注意:展开参数
本节介绍一个细节——怎样把参数从矩阵展开成向量,以便我们在高级最优化步骤中的使用需要。
9.5 梯度检验
为了避免对复杂模型使用梯度下降算法时出错,而得不到最优解,引入梯度的数值检验(Numerical Gradient Checking)——通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。
估计梯度:在代价函数上,对于某个特定的 θ,我们计算出在 θ-ε 处和 θ+ε 的代价值(ε是一个非常小的值,通常选取 0.001),然后求两个代价的平均,用以估计在 θ 处的代价值。
Octave 中代码:
gradApprox = (J(theta + eps) – J(theta - eps)) / (2*eps)
当θ为向量——检验偏导数。因为代价函数的偏导数检验只针对一个参数的改变进行检验,下面是一个只针对进行检验的示例:
最后,对通过反向传播方法计算出的偏导数进行检验。
将计算出的偏导数存储在矩阵 中,将对每个 θ 计算的近似梯度值存在近似梯度矩阵中,比较两个矩阵。注,检验时,我们要将矩阵展开成为向量。
9.6 随机初始化
对于神经网络,我们通常用正负ε之间的随机值来初始参数,假设我们要随机初始一个尺寸为10×11的参数矩阵,代码如下:
Theta1 = rand(10, 11) * (2*eps) – eps
9.7 综合起来
神经网络结构:
第一层——特征数量
最后一层——类的数量(K分类就是K个)
隐藏层——每个隐藏层的单元个数相同,且单元的个数越多越好。
需要设计的结构——隐藏层的层数and单元个数
训练神经网络步骤:
(a)参数的随机初始化
(b)利用正向传播方法计算所有的h_θ (x)
(c)编写计算代价函数 J 的代码
(d)利用反向传播方法计算所有偏导数
(e)利用数值检验方法检验这些偏导数
(f)使用优化算法来最小化代价函数
9.8 自主驾驶
ALVINN (Autonomous Land Vehicle In a Neural Network)(基于神经网络,通过观察人类的驾驶来学习驾驶的智能系统)
详情略