吴恩达机器学习第十章---神经网络参数的反向传播算法

代价函数

代价函数                 吴恩达机器学习第十章---神经网络参数的反向传播算法_第1张图片 

          我们在上面定义,如同右上角所设置的一样,我们用L来表示总层数,sl表示对应的层数的神经元的个数。如上图中左上角所示,我们得知s1=3,s2=s3=5,s4= 4,同时它的输出只有1或者0(一个典型的分类问题)。

                                          吴恩达机器学习第十章---神经网络参数的反向传播算法_第2张图片

      同样我们在使用神经网络时一样要面对它的代价函数。在看神经网络的代价函数之前我们先来观测一下逻辑回归对应的代价函数,逻辑回归对应的代价函数如上图上方所示,y(i)表示实际值,h(x(i))表示预测值。我们在后面再加上正则项这样就构成了逻辑回归的代价函数。

     我们同样使用神经网络进行分类算法,而神经网络的代价函数也如同,逻辑回归一样,只是增加了累加项,同样后面的正则化项同样需要累加。

反向传播算法

                                                          吴恩达机器学习第十章---神经网络参数的反向传播算法_第3张图片

          我们假设对应的数据集只有一个如上面所示(x,y)我们将其按照前向传播的方式向该网络中的每一层进行数据传播。首先输入对应的两个特征值,得到结果a(1),然后通过第二层将a(1)作为新的输入得到a(2),其中g(x)是一个激活函数。以此类推,最后得到一个输出值,这就是正向传播最终得到的结果。

                                               吴恩达机器学习第十章---神经网络参数的反向传播算法_第4张图片

             我们使用代价函数是为了求得对应的参数,但实际上我们求得过程格外复杂,我们需要对每一个参数进行求偏导,这样的话计算量会变得很大,我们提出反向传播算法帮助我们完成对每一参数的求导。具体的等式为

。那我们现在先来讨论一下反向传播,反向传播是指从输出层反向传递给第一个隐藏层。我们通过如上图中左下角的公式可知,我们使用输出层的预测值减去输出层的真实值,然后得到其差值。根据对应的差值,我们让其与第三层的转制参数矩阵相乘同时与g(z(3))的倒数相乘得到第三层的差值,以此类推得到第二层。我们不用考虑第一层,因为第一层已经是我们输入的特征不用求其差值。

                                              吴恩达机器学习第十章---神经网络参数的反向传播算法_第5张图片

                 反向传播的具体运算过程如上图所示,给出的数据集是共有m个。我们将其放入对应的for循环使用for开始计算,(注意:实际上这里的三角形就是δ的大写。)

                我们首先计算出最后一层的误差,然后根据最后一层的误差再推导出前面一层的误差项,以此类推直至我们到达第二层,不需要对输入层考虑误差项。最后在使用Δ将其对应的项累加起来。我们最后得出一个如上图中右下角所示的式子,我们可以根据这个式子对参数进行梯度下降,求得我们需要的参数。(我们一旦完成Δ的累加,它就正好是对应的关于每一个参数的求偏导)。

理解反向传播

                                                    吴恩达机器学习第十章---神经网络参数的反向传播算法_第6张图片

             反向传播的过程较为复杂,我们在理解它之前,先来考虑一下前向传播。对于前向传播来说其过程正如上图所述。我们在刚开始时将对应的(x(i),y(i))放到输入层。当传播到第一个隐藏层时,我们计算出z(2)_1和z(2)_2。他们属于第二层的输入单元。然后我们使用第二层的激活函数可以得出a(2)1和a(2)2这属于第二层计算后得出的结果,同时也是要传递给第三层的值,以此类推直至最后我们得出a(4)1,即为最终结果。我们由最下面的计算公式可以得出对应的值。其实反向传播和这个十分相似,只是传播的方向发生改变不再是由前到后而是由后向前。

                                                       吴恩达机器学习第十章---神经网络参数的反向传播算法_第7张图片

        我们不可避免的要讨论到反向传播,但在我们讨论反向传播之前我们先来考虑一下代价函数,如上图中最上面的式子所表现的一样,这是一个典型的单变量对应的代价函数,同时后面又加上了正则项,我们不考虑正则项,那么就可以看到一个传统的代价函数。而下面则是对应于神经网络的代价函数,看起来很复杂,那我们不如将其看作是某种方差函数,表示神经网络预测样本的准确度,也就是网络的输出值,和实际观测值之间的方差。

                                                     吴恩达机器学习第十章---神经网络参数的反向传播算法_第8张图片

       那么真实的反向传播的过程应该是什么样的那?简单来说我们输出层的δ为例,我们想要实现反向传播必然是从输出层开始的。我们在输出层求得实际值与神经网络预测的值之间的差值,我们称之为δ(4)1,而这是起点,接着我们使用δ(4)1乘以对应的权值得出倒数第二层的δ值如上图中右上角所示。然后以此类推我们最后即可得出所有的δ值。但有一点需要注意的是,求得所有的δ值,必定只是关于隐藏层的,因为输入层和输出层都有实际的,真实的值,还有一点要注意的是对于偏执项。偏执单元输出的总是“1”,我们无法对其进行改变。

                                                          

使用注意:展开参数

                                             吴恩达机器学习第十章---神经网络参数的反向传播算法_第9张图片

       我们在执行代价函数时,输入参数θ,返回对应的代价值以及导数值。然后我们将返回值传递给高级最优化算法fminunc(不唯一),它的功能是取出这些参数的初始值。在之前的线性计算中,我们将其当作是一个参数向量,n或者n+1维。同时代价函数的第二个返回值,即梯度值也是n或者n+1维向量。

                                   吴恩达机器学习第十章---神经网络参数的反向传播算法_第10张图片

         如上图所示,我们现在有一个3层的神经网络,它们对应的矩阵分别如上图所示,我们要做的就是将其变为对应的1维。如θ1是一个10*11我们将其变为1维后就变为1*110。同时我们还要保持原有的矩阵,这样无论是我们要做前向传播还是反向传播都有对应的参数。当你的参数以矩阵的形式存储时,你进行正向传播和反向传播都会更加的方便。但你还要使用一些优化算法,这些优化算法要求输入的参数为长向量的形式。

梯度检测

         当反向传播与其他神经网络还有梯度下降或者其他复杂的算法一起工作时,总会产生这样或者那样的BUG,这些BUG并不会导致我们的程序完全错误,但会导致最终的运行结果会导致代价函数最终会比没有BUG的要高一个量级。为了检测这种情况我们提出梯度检测。这种方法很好的使得我们实现前向传播和后向传播。

                                       吴恩达机器学习第十章---神经网络参数的反向传播算法_第11张图片

                我们在正式开始讨论之前,先讨论一下导数。我们熟知的导数是如何来的那?对于线上的某一个点来说它的导数为对应的两点的y的差值除以x的差值。如上图中红色部分列出的。

                                             吴恩达机器学习第十章---神经网络参数的反向传播算法_第12张图片

       我们之前讨论的是当θ是一个实数时我们应该怎么做,正如上面那张图表示出来的一样,直接就可以求出。但是实际上神经网络中参数θ更多的时候是一个向量如上图所示,那这个θ对应的偏导数项是什么那?正如上图所示,原理是一样的。它的代价函数正如上图中,我们求得的偏导。通过这些偏导让我们能够从数值上估算代价函数J所关于的任何的参数的偏导数。而反向传播就是计算代价函数关于所有参数的导数或者偏导数的一种有效方法。

    到此我们可以得出一个梯度确认或者说梯度检测的定义:即通过比较数值微分和误差反向传播法的结果,可以确认误差反向传播法的实现是否正确。

随机初始化

             当你运行梯度下降或者其他的一些高级优化算法时,你需要为你的算法的参数选定一些初始值(高级优化算法默认你会这么做)。

                                                 吴恩达机器学习第十章---神经网络参数的反向传播算法_第13张图片

          一种想法是我们将所有的初始值都设置为0,这在逻辑回归上是允许的,但在实际训练网络时是不被允许的。因为这样会导致实际在训练网络时,所有的偏导数相同,而我们知道梯度下降实际上就是学习率乘以对应的导数。而学习率我们本身设置的是相同的。这样就会导致参数相同。这样即使迭代多次最后也依旧是以相同的函数来计算。假使你的网络有很多层,但这样做的结果会使得每一层都以相同的函数来进行计算。这样最后这能得到一个特征训练出来的结果。(这也被成为对称权重问题)

        为了避免这种现象,我们提出随机初始化的概念。初始化就是将我们的参数设置为在一个区间内取随机的一个数。一般来说我们取得的数字都接近于0。我们称这个区间为

组合到一起

                                               吴恩达机器学习第十章---神经网络参数的反向传播算法_第14张图片

      我们要训练神经网络,第一步就是选择一种网络架构。那如何选择那?对于隐藏层而言,默认使用只含有一个隐藏层的网络结构。这最为常见。如果使用隐藏层不止一个,那么默认每一个隐藏层神经元的数目应当是一样的。那么隐藏层的数量是如何确定的那?一般来说隐藏层的数量默认越多越好,但隐藏层的数量越多就会导致计算量的增大。同时,每一个隐藏层包含的单元数量还应该和输入的特征的维度相一致,或者是它的二倍三倍均可。

   1.构建一个神经网络并随机初始化权重,通常我们通过使用随机初始化的方法将权重初始化为一个很小的值,接近于零。

   2.执行前向传播算法,也就是对于任意给定的一个x的特征向量计算出对应的h(x),即一个输出值y的向量。

   3.通过计算得出代价函数J(θ)

   4.执行反向传播算法计算出偏导数项,也就是代价函数关于θ特征向量的偏导数。(注意,由于我们给定的参数是一个向量,因此对于参数θ的偏导数也有很多)

       具体来说就是对于给定的特征向量,我们先使用正向传播,再使用反向传播,分别计算出由激活函数对应的激励值和delta项。当然不要忘记正则化

   5.梯度检查,通过比较数值微分和误差反向传播法的结果,可以确认误差反向传播法的实现是否正确。在得出结果后,停用梯度检查,因为它会导致计算非常的慢。

   6,最后我们可以使用一个优化算法,梯度下降或者其他的高级优化算法。将这些优化算法和反向传播算法结合,反向传播算法计算出这些偏导数项的值。然后就可以最小化代价函数J(θ)。通过最小化代价函数得出对应的参数。得出拟合情况很好的参数。如果还以下山来论的话,那么误差反向传播实际上就是计算出下山的路径的方法。而梯度下降就是沿着这个方向一点点的下降。一直到我们希望到达的点即局部最优点。

 

无人驾驶

你可能感兴趣的:(吴恩达,机器学习笔记,笔记,机器学习)