【神经网络】{8} ——神经网络学习算法总体实现过程(学习笔记)

关于神经网络学习算法,还有许多需要补充的,此处只是做一个不完整的概括。
大体内容为神经网络学习算法总体回顾相互之间有怎样的联系,以及神经网络学习算法的总体实现过程


在训练一个神经网络时,要做的第一件事就是选择一种网络架构(神经元之间的连接模式):

在这里插入图片描述


我们该如何做出选择呢?

  1. 首先,我们已经定义了输入单元的数量,一旦确定了特征集x,输入单元的数量就等于特征x^(i)的维度,输入单元数目将会由此确定。

  2. 如果你正在进行多类别分类,那么输出层的单元数目将会由你分类问题中所要区分的类别个数确定。

提醒一下,对于多元分类问题,如果y的取值范围是在1到10之间,那么就有10个可能的分类,记得把输出y重新写成向量的形式。
第一类:
在这里插入图片描述
第二类:
在这里插入图片描述
如果其中一个样本被分到第五类,也就是说y=5,那么在神经网络中就不能直接用数值5来表达:
在这里插入图片描述
这里的输出层有十个输出单元,应该用一个向量来表示,这个向量的第五个位置值是1,其他的都是0:
在这里插入图片描述

  1. 对于隐藏层单元的个数以及隐藏层的数目,一个合理的默认选项是只使用单个隐藏层,或者如果你使用不止一个隐藏层的话,同样也有一个合理的默认选项,那就是每一个隐藏层通常都应有相同的单元数

但实际上通常来说,这个结构是较为合理的默认结构:
在这里插入图片描述

而对于隐藏单元的个数,通常情况下,隐藏单元越多越好,不过需要注意的是,如果有大量隐藏单元,计算量一般会比较大。

当然一般来说,隐藏单元还是越多越好,并且一般来说,每个隐藏层所包含的单元数量还应该和输入x的维度相匹配,即和特征的数目匹配

隐藏单元的数目可以和输入特征的数量相同,或者是它的二倍,或者三四倍,都是有效的。


训练神经网络需要实现的步骤:

  1. 第一步是构建一个神经网络,然后随机初始化权重。通常我们把权重初始化为很小的值,接近于零。

  2. 然后执行前向传播算法,也就是对于该神经网络的任意一个输入x^ (i),计算出对应的h(x^ (i))值,也就是一个输出值y的向量。

  3. 接下来通过代码计算出代价函数J(θ)

  4. 然后执行反向传播算法来算出这些偏导数项,也就是J(θ)关于参数θ的偏导数


具体来说,使用反向传播,我们要对所有训练样本使用一个for循环进行遍历:
在这里插入图片描述

有先进的向量化方法不需要使用for循环对m个训练样本进行遍历,但是第一次执行反向传播,最好还是使用一个for循环来完成程序。

  • 首先对每一个训练样本进行迭代,从(x^ (i), y^ (i))开始,对第一个样本进行前向传播运算和反向传播运算,以此类推,直到最后一个样本。

具体来讲,我们对所有的m个训练样本使用了for循环遍历,在这个for循环里,我们对这个样本执行前向和反向算法。

具体来说就是,我们把x^(i)喂到输入层,然后执行前向传播和反向传播,这样我们就能得到神经网络每一层中每一个单元对应的激励值和Δ项。

Octave代码:
在这里插入图片描述

  • 接下来,还是在for循环中,要计算出这些Δ项,这是之前给出的公式:
    在这里插入图片描述
  • 最后for循环外面的部分,通过计算出的这些Δ项、这些累加项,将用别的代码来计算出这些偏导数项:
    在这里插入图片描述
    这些偏导数项还应该把正则化项λ值考虑在内。

搞定所有这些内容,就应该已经得到了计算那些偏导数项的程序了。


衔接:训练神经网络需要实现的步骤

  1. 接下来要做的就是使用梯度检查来比较这些已经计算得到的偏导数项,把用反向传播算法得到的偏导数值与用数值方法得到的估计值进行比较。
    因此,通过进行梯度检查来确保两种方法得到基本接近的两个值,这能确保我们的反向传播算法得到的结果是正确的。

梯度检验的内容需要再写一篇文章补充一下

  1. 使用一个最优化算法

比如说梯度下降算法或者更加高级的优化方法(比如说LBFGS算法、共轭梯度法,或者其他内置到fminunc函数中的方法)

将这些优化方法和反向传播算法相结合,反向传播计算出这些偏导数项的值:
在这里插入图片描述

知道了如何去计算代价函数、如何使用反向传播算法来计算偏导数,就能使用某个最优化方法,来最小化关于θ的代价函数J(θ)


顺便提一下,对于神经网络,代价函数J(θ)是一个非凸函数。

因此理论上可能停留在局部最小值的位置。
实际上,梯度下降算法和其他一些高级优化方法,理论上都可能收敛于局部最小值。

但通常来讲,像梯度下降这类的算法,在最小化代价函数J(θ)的过程中,还是表现得很不错的,通常能够得到一个很小的局部最小值,尽管不一定是全局最优值。


最后,梯度下降算法似乎对于神经网络来说还是比较神秘,通过下面这幅图,我们能对梯度下降法在神经网络中的应用产生一个更直观的理解:
在这里插入图片描述
我们有某个代价函数,并且在我们的神经网络中有一系列参数值(这里只写下两个参数值,实际上在神经网络里可以有很多的参数值,Θ ^(1)、Θ ^(2)等等。这些都是矩阵,因此我们可以有高维参数)。

代价函数J(θ)度量的就是这个神经网络对训练数据的拟合情况。所以,如果你取一点:
在这里插入图片描述
这个点上,J(θ)的值是非常小的,这一点的位置所对应一组参数
在这里插入图片描述
对于大部分的训练样本,假设函数的输出会非常接近于y^(i)。


反过来,如果我们取这个值:
在这里插入图片描述
这个点对应的是,对于大部分的训练样本,该神经网络的输出远离y^ (i)的实际值,因此像这样的点对应的假设,对应的神经网络,在训练集上的输出值是远离y^ (i)的,也就是对训练集拟合得不好。


因此梯度下降算法的原理是:从某个随机的初始点开始,它将会不停地往下下降,那么反向传播算法的目的就是算出梯度下降的方向,而梯度下降的作用就是沿着这个方向一点点地下降,一直到我们希望得到的点,这个例子中就是局部最优点:
在这里插入图片描述
所以,当你在执行反向传播算法和梯度下降或者其他更高级的优化方法时,这幅图片解释了基本的原理,也就是试图找到某个最优的参数值使得神经网络的输出值与训练集中观测到的y^(i)的实际值尽可能地接近


此处我们整理了神经网络学习算法的大体内容,能对这些零散的神经网络知识如何有机地结合起来有一个更直观的认识。


神经网络学习和反向传播算法本身就是非常复杂的算法;如果你执行一下反向传播,执行其中的优化方法,会发现反向传播算法能够让更复杂、强大、非线性的函数模型跟你的数据很好地拟合,它的确是现下最为高效的学习算法之一。


参考资料:吴恩达机器学习系列课程

发布了15 篇原创文章 · 获赞 29 · 访问量 794

猜你喜欢

转载自blog.csdn.net/weixin_45961774/article/details/104439737