原创博客,转载请注明出处!
1、代价函数
需要先理解些概念:
大写字母L表示神经网络结构的总层数,表示第L层的神经元数(其中不包括偏差单元),如果输出有K个单元,那么输出就是K维向量
神经网络的代价函数如下,表示第i个输出,是一个K维向量
2、反向传播算法
为了使用梯度下降法或者其它某种高级算法,我们需要获得输入参数Θ并计算J(Θ)的导数
首先应用前向传播方法来计算一下在给定输入的时候,假设函数是否会真的输出结果!
为了计算导数项,我们采用一种叫做反向传播的算法:
反向传播算法从直观上讲就是对每一个节点我们计算这样一项,下标j上标l ,代表第l层的第j个节点的误差,计算方式如下
如何实现传播算法,来计算这些参数的偏导数?如图
Octave代码:
thetaVec = [Theta1(:) ; Theta2(:) ; Theta3(:)]
...optimization using functions like fminuc...
Theta1 = reshape(thetaVec(1:110, 10, 11);
Theta2 = reshape(thetaVec(111:220, 10, 11);
Theta1 = reshape(thetaVec(221:231, 1, 11);
3、理解反向传播算法
前向传播算法:
反向传播算法:
4、使用注意:展开参数
把你的参数从矩阵展开成向量,以便我们在高级最优化步骤中的使用需要
5、梯度检查
当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。
为了避免这样的问题,我们采取一种叫做梯度的数值检验(Numerical Gradient Checking)方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。
在代价函数上沿着切线的方向选择离两个非常近的点然后计算两个点的平均值用以估计梯度,其实就是高数里说的导数的概念
Octave的代码:
gradApprox = (J(theta + eps) – J(theta - eps)) / (2*eps)
然后根据刚刚算的导数近似值跟反向传播算法算的做对比,理论上它们是约等的
具体的Octave你需要实现
整个过程总结:
①通过反向传播来计算DVec,
②实现数值上的梯度检验,计算出gradApprox
③确保DEvc和gradApprox能得到相似的值,确保它们只有几位小数的差距
④在使用你的代码进行学习或训练网络之前,重要的是要关掉梯度检验
6、随机初始化
任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始参数都为0,这将意味着我们第二层的所有激活单元都会有相同的值。同理,如果我们初始所有的参数都为一个非0的数,结果也是一样的。
通常初始参数为正负ε之间的随机值
假设我们要随机初始一个尺寸为10×11的参数矩阵,代码如下
Theta1 = rand(10, 11) * (2*eps) – eps
7、组合到一起
选择神经网络结构时,通常中间层越多越准确!但是默认是使用单个隐藏层!
训练神经网络需要的步骤:
①构建一个神经网络,然后随机初始化权重,通常把权重初始化为很小的值(接近零)
②执行前向传播算法,即对于输入的x,计算出,也就是输出值y的向量
③接下来通过代码计算机代价函数J(Θ)
④执行反向传播算法来算出这些导数项
⑤使用梯度检查来比较这些已经计算得到的偏导数项
⑥停用梯度检查
8、无人驾驶
基于神经网络的自动驾驶技术