神经网络参数的反向传播算法
神经网络
假设神经网络的训练样本有m个,每个包含一组输入x和一组输出信号y,L表示神经网络层数,SI表示每层的neuron个数(Sl表示输出层神经元个数),SL代表最后一层中处理单元的个数。
将神经网络的分类定义为两种情况:二类分类和多类分类,
二类分类:SL=0,y=0or1表示哪一类;
K类分类:SL=k,yi=1 表示分到第i类;(k>2)
我们回顾逻辑回归问题中我们的代价函数为:
在逻辑回归中,我们只有一个输出变量,又称标量(scalar),也只有一个因变量yy,但是在神经网络中,我们可以有很多输出变量,我们的 hθ(x)是一个维度为K的向量,并且我们训练集中的因变量也是同样维度的一个向量,因此我们的代价函数会比逻辑回归更加复杂一些,
**神经网络代价函数为:
这个看起来复杂很多的代价函数背后的思想还是一样的,我们希望通过代价函数来观察算法预测的结果与真实情况的误差有多大,唯一不同的是,对于每一行特征,我们都会给出KK个预测,基本上我们可以利用循环,对每一行特征都预测KK个不同结果,然后在利用循环在KK个预测中选择可能性最高的一个,将其与yy中的实际数据进行比较。
正则化的那一项只是排除了每一层θ0后,每一层的θ 矩阵的和。最里层的循环j循环所有的行(由sl +1 层的**单元数决定),循环i则循环所有的列,由该层(sl层)的**单元数所决定。即:hθ(x)与真实值之间的距离为每个样本-每个类输出的加和,对参数进行regularization的bias项处理所有参数的平方和。
9.2 反向传播算法
之前我们在计算神经网络预测结果的时候我们采用了一种正向传播方法,我们从第一层开始正向一层一层进行计算,直到最后一层的hθ(x)hθ(x)。
现在,为了计算代价函数的偏导数,我们需要采用一种反向传播算法,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。
以一个例子来说明反向传播算法。
假设我们的训练集只有一个实例(x(1),y(1))(x(1),y(1)),我们的神经网络是一个四层的神经网络,其中K=4,SL=4,L=4:
前向传播算法:
神经网络代价函数最小化算法
反向传播算法:(从输出项开始返回到上一层,相当于把输出层的误差传到了上一层)
重要的是清楚地知道上面式子中上下标的含义:
l 代表目前所计算的是第几层。
j 代表目前计算层中的**单元的下标,也将是下一层的第jj个输入变量的下标。
i 代表下一层中误差单元的下标,是受到权重矩阵中第ii行影响的下一层中的误差单元的下标。
如果我们考虑正则化处理,并且我们的训练集是一个特征矩阵而非向量。在上面的特殊情况中,我们需要计算每一层的误差单元来计算代价函数的偏导数。在更为一般的情况中,我们同样需要计算每一层的误差单元,但是我们需要为整个训练集计算误差单元,此时的误差单元也是一个矩阵,我们用来表示这个误差矩阵。第 l 层的第 i 个**单元受到第 j 个参数影响而导致的误差。
我们的算法表示为:
理解反向传播
前向传输:
反向传输:
(反向传播是计算代价函数关于所有参数的导数或者偏导数的一样有效方法 )
展开参数 (矩阵-->向量)
在上一段。我们谈到了怎样使用反向传播算法计算代价函数的导数。在这段中,我想快速地向你介绍一个细节的实现过程,怎样把你的参数从矩阵展开成向量,以便我们在高级最优化步骤中的使用需要。
矩阵---->向量 ; 向量---->矩阵 函数
例子:
向量和矩阵的优点
一些高级算法通常要把所有的参数展成一个长向量形式。
而矩阵用于正向,反向传输以及储存时会更加的方便。
梯度检验(保证前向传输和反向传输是正确的)
前面用前向传输和反向传输计算了导数。
当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。
为了避免这样的问题,我们采取一种叫做梯度的数值检验(Numerical Gradient Checking)方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。
对梯度的估计采用的方法是在代价函数上沿着切线的方向选择离两个非常近的点然后计算两个点的平均值用以估计梯度。即对于某个特定的 θ,我们计算出在 θ-ε 处和 θ+ε 的代价值(ε是一个非常小的值,通常选取 0.001),然后求两个代价的平均,用以估计在 θ 处的代价值。
当θ为实数时,梯度可以这么算:
当θ为向量时
Octave的代码:
步骤总结:
1.通过反向传播来计算DVec(D1,D2,D3矩阵的展开形式)
2.计算出gradApprox
3.确保DVec和gradApprox具有相似的值(只有几位小数的差距)
4.在用代码进行学习或训练网络之前,关掉梯度检验(计算量大)。
随机初始化
如果初始化为0,则a都会相等
初始化方法:
总结
训练神经网络步骤**
1.构建神经网络 然后初始化权重
2.进行前向传播。即用任意的计算出对应的
3.通过代码,计算出相应的代价函数J(θ)
4.执行反向传播来计算偏导数
具体来说:
5.使用梯度检查已经算到的偏导数项,把它与用数值方法算出的估计值进行比较。记得然后停用梯度检查
6.然后使用一个最优的算法,比如梯度下降算法或者更加高级的优化算法(或其他内置到fminunc函数中的方法)。
将这些优化方法和反向传播算法相结合。 反向传播计算出偏导值---->计算代价函数 然后用最优化的方法使代价函数最小。 (通常能得到一个较好的局部最小值,尽管可能不是全局最优值)
对于梯度下降算法来说。反向传播方法的目的就是算出 梯度下降的方向