Machine Learning第五讲[神经网络: 学习] --(二)实践中的BP算法

来源:互联网 发布:mysql mac 安装包下载 编辑:程序博客网 时间:2024/06/05 03:34

内容来自Andrew老师课程Machine Learning的第五章内容的Backpropagation in Practice部分。


一、Implementation Note: Unrolling Parameters(实现建议:参数展开)

1、优化算法的模板:



2、下面是怎样将矩阵转化成向量,以及怎样将向量转化成矩阵。

3、学习算法

为什么我们要进行矩阵和向量的相互转化呢?

使用矩阵表达式的好处是当参数以矩阵形式存储时,进行正向传播和反向传播时会更加方便。当参数存储为矩阵时,可以充分利用向量化的实现过程,

使用向量表达式的优点是如果有像thetaVec或者DVec这样的矩阵,当你使用一些高级的优化算法时,这些算法通常要求你所有的参数都要展开成一个长向量的形状。

二、Gradient Checking(梯度检测)

在使用神经网络算法时候,有时候会有很多bug,因此引入了梯度检测的概念,当我们使用前向传播时会使用到它,即使是其他比较复杂的
模型,做这种检验也是必要的。

在下图中,Θ点的导数类似于(J(Θ+ε)-J(Θ-ε))/2*ε的值,分析见下图,借助了导数就是该点处的斜率值。


当Θ向量中不止含有一个θ值时,其导数公式如下图:


将导数值的大概值使用上图公式求出后,将其值和该点的导数值DVec比较,若二者大致相等,则算法正确。

下面是使用梯度检测的注意点:

1、在BP中计算出J(θ)对θ的导数D,并组成vector(Dvec)
2、计算大概的梯度gradApprox=(JΘ+ε-JΘ-ε)/(2ε)

3、看看二者的值是否接近
4、强调强调:检验完毕后,就将其关闭,否则会使得程序非常非常慢


三、Random Initialization(随机初始化)

在梯度下降及一些其他的优化方法中,都需要初始化Θ的值,使用 optTheta = fminunc(@costFunction, initialTheta, options)
那如果我们使用initialTheta = zeros(n,1),即将矩阵初始化为0,是否可行呢?看下面的例子:

因此,若使用0作为初始值,则所有隐藏层的结果都是一样的,比较冗余,这样会使得神经网络的性能下降,无法进行更有意义的功能,因此,我们需要随机初始化。

随机初始化的目的就是为了打破对称,找到梯度下降算法或者其他优化算法的理想Θ值。

随机初始化方法:初始化每一个值使得所有的值都在[-ε, ε]之间,即
举例:

If the dimensions of Theta1 is 10x11, Theta2 is 10x11 and Theta3 is 1x11.
Theta1 = rand(10,11) * (2 * INIT_EPSILON) - INIT_EPSILON;(能保证结果在[-ε,ε]之间,注意这个ε只是一个符号,和梯度检验中的ε不同)
Theta2 = rand(10,11) * (2 * INIT_EPSILON) - INIT_EPSILON;
Theta3 = rand(1,11) * (2 * INIT_EPSILON) - INIT_EPSILON;

四、Putting It Together(整合)

训练一个神经网络,首先要选择一个网络架构,即网络的连接模式。


• No. of input units: Dimension of features 
• No. of output units: Number of classes

对于选择网络架构的建议:
(1)默认情况下,只有1层隐藏层。
(2)隐藏单元通常越多越好,但如果有大量隐藏单元,计算量一般会比较大,但是,我们还是说隐藏单元数越多越好。
(3)若有多个隐藏层,通常多个隐藏层的单元数目相同,即使不相同,一般隐藏层的单元个数和输入单元个数也有一定的对应关系,比如,隐藏层的单元个数是输入单元个数的二倍、三倍、四倍等。

训练一个神经网络的过程:
1、随机初始化权重,一般将权重初始化为很小的接近于0的值。
2、执行FP算法 ,对于每一个输入的,得到的值。(的值是输出值y的向量
3、计算代价函数J(Θ)
4、执行BP算法,求偏导项

 S1:代码

         for i = 1:m

              Perform forward propagation and backpropagation using example (x(i),y(i))

              (Get activations a(l) and delta terms d(l) for l = 2, 3, ...... , L),即

             (即按照的顺序执行FP和BP,最后得到

          end

S2:计算

5、使用梯度检验方法,将使用BP算法得到的偏导数与使用数值方法计算得到的值比较,若二者的值相接近,则BP代码正确。
    切记:执行完毕之后,disable gradient checking code。
6、使用梯度下降或者其他的优化算法计算,求minJ(Θ)对应的Θ值。



下面是具体过程,在最低点处




0 0
原创粉丝点击