Ng | 神经网络参数的反向传播算法

代价函数

Ng | 神经网络参数的反向传播算法_第1张图片

Ng | 神经网络参数的反向传播算法_第2张图片

反向传播算法

让代价函数最小化的算法

Ng | 神经网络参数的反向传播算法_第3张图片

Ng | 神经网络参数的反向传播算法_第4张图片

Ng | 神经网络参数的反向传播算法_第5张图片

Ng | 神经网络参数的反向传播算法_第6张图片

理解反向传播

Ng | 神经网络参数的反向传播算法_第7张图片

Ng | 神经网络参数的反向传播算法_第8张图片

Ng | 神经网络参数的反向传播算法_第9张图片

使用注意 展开参数

上一节 我们学会了如何计算反向传播,计算代价函数的导数。本结我想快速想你介绍一个细节的实现过程。

怎样把你的参数,从矩阵展开成向量, 以便高级最优化步骤中的使用需要。

Ng | 神经网络参数的反向传播算法_第10张图片

Ng | 神经网络参数的反向传播算法_第11张图片

梯度检测

之前视频已经讲了如何使用前向传播和后向传播,来计算导数。但是反向传播算法,含有很多细节,因此实现起来比较困难,并且它有一个不好的特性,很容易产生一些微妙的bug:当它与梯度下降,或是其他算法一同工作时,看起正常运行,并且代价函数J(theta)在每次梯度下降的迭代中,也在不断减小。虽然在反向传播的实现中,存在一些bug,但运行情况看起来确实不错。虽然J(theta)在不断减小,但是到了最后,你得到的神经网络,其误差将会比无bug的情况下,高出一个量级,并且不可能不知道,你得到的结果是由bug所导致的。那我们应该如何应对呢?

有一种思想叫做梯度检验,它能解决几乎所有这种问题,现在我每次在神经网络,或者其他复杂模型中,实现反向传播,或者类似梯度下降的 我都会做梯度实验。如果你这样做,它将会完全保证你的前向传播,以及后向传播,都是百分百正确。

在我看来,这种问题之所以出现,绝大多数,都和反向传播的错误实现有关。希望你能相信,我之前视频给出的关于delta的计算公式 以及关于d的等等。希望你们能相信,这些确实能够计算出,代价函数的梯度。当你自己实现,也就是梯度检验的时候,你可以自己去验证。你所写的代码确实能正确计算出,代价函数J的导数。

现在具体来讲下 梯度检验。

Ng | 神经网络参数的反向传播算法_第12张图片

双侧差分能得到更准确的结果。

Ng | 神经网络参数的反向传播算法_第13张图片

Ng | 神经网络参数的反向传播算法_第14张图片

Ng | 神经网络参数的反向传播算法_第15张图片

随机初始化

当你在执行一个算法, 如梯度下降算法 或者 高级优化算法时,我们需要为变量theta 选取一些初始值。对于高级优化算法,它默认你会为变量theta提供一些初始值,对于梯度下降法,同样地,我们也需要,对theta进行初始化,初始化完毕之后,我们就可以一步一步通过梯度下降来最小化代价函数J。那么应该如何对theta设初始值呢?
Ng | 神经网络参数的反向传播算法_第16张图片

Ng | 神经网络参数的反向传播算法_第17张图片

不能全为0,也不能平均。如果平均,隐藏神经元 的值都是相同的了。

Ng | 神经网络参数的反向传播算法_第18张图片

组合在一起

Ng | 神经网络参数的反向传播算法_第19张图片

Ng | 神经网络参数的反向传播算法_第20张图片

Ng | 神经网络参数的反向传播算法_第21张图片

Ng | 神经网络参数的反向传播算法_第22张图片

你可能感兴趣的:(ML)