天天看点

机器学习之神经网络参数的反向传播算法#总体回顾

机器学习之神经网络参数的反向传播算法#总体回顾

#Cost function(代价函数)

机器学习之神经网络参数的反向传播算法#总体回顾
  • 我们不把bias term(偏差项)θ0正则化 
  • 神经网络现在输出了属于R^K的向量
  • 每个h(x)_i表示第i个输出
  • 求和项主要是k个输出单元之和
  • 第二项类似于在逻辑回归里面所用的正则化项

#Backpropagation algorithm(反向传播算法)

使代价函数最小化的算法。

机器学习之神经网络参数的反向传播算法#总体回顾

只含一个训练样本的情况:

机器学习之神经网络参数的反向传播算法#总体回顾

为了计算derivatives(导数项),将采用一种叫backpropagation(反向传播)的算法:

对每个结点,我们计算这样一项delta,它代表第i层的第j个结点的误差。

机器学习之神经网络参数的反向传播算法#总体回顾
  • “·*”代表dot time(点乘);
机器学习之神经网络参数的反向传播算法#总体回顾

当我们有一个非常大的训练样本时,如何实现反向传播算法来计算这些参数的偏导数?

#理解反向传播

前向传播的过程:

机器学习之神经网络参数的反向传播算法#总体回顾
机器学习之神经网络参数的反向传播算法#总体回顾
  • 这个代价函数扮演了一个类似方差的角色。可以将cost(i)类似地看作神经网络输出值与实际值的方差,所以cost(i)表示了神经网络预测样本值的准确程度,也就是输出值和实际观测值的接近程度。

反向传播的过程:

机器学习之神经网络参数的反向传播算法#总体回顾

*这些delta值都只关于隐藏单元,并不包括偏置单元,这取决于你对反向传播的定义以及你实现算法的方式,你也可以用其他方式来计算包含偏置单元的dlta值,偏置单位的输出总是“+1”。吴恩达老师通常最后会计算出它的值,但会丢掉它们不使用,因为它们最后并不会影响偏导数的计算。

#使用注意:展开参数

使用矩阵表达式的好处是当你的参数以矩阵的形式储存时,你在进行正向传播和反向传播时会觉得更加方便,当你将参数储存为矩阵时也更容易充分利用向量化实现。

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

#Gradient checking(梯度检测)

反向传播算法有一个不好的特性,即很容易产生一些微妙的bug,当它与梯度下降或是其他算法一同工作时,它看起来确实能够正常运行,并且代价函数J(θ)在每次迭代中也在不断减小,但是到了最后你得到的神经网络其误差将会比无bug的情况下高出一个量级,并且你可能不知道你得到的结果是由bug所导致的。

而梯度检测可以解决几乎所有这种问题。

机器学习之神经网络参数的反向传播算法#总体回顾
  • one-sided difference(单侧差分)【右边式子】
  • two-sided difference(双侧差分)【左边式子】,更精确
机器学习之神经网络参数的反向传播算法#总体回顾
机器学习之神经网络参数的反向传播算法#总体回顾

#如何实现数值上的梯度检验?

机器学习之神经网络参数的反向传播算法#总体回顾

1、通过反向传播来计算DVec(DVec可能是这些矩阵展开的形式)

2、实现数值上的梯度检验,计算出gradApprox

3、确保DVec和gradApprox都能得出相似的值,只有几位小数的差距

4、最重要的一步:在使用你的代码进行学习或说训练网络之前,需要关掉梯度检验,不要再去用导数计算公式来计算gradApprox(因为backprop计算得快很多)

*梯度检验代码比反向传播算法要慢得多,所以一旦你准备完毕,一旦你验证了反向传播的实现是正确的,就应当在训练之前关闭梯度检验,或者禁用梯度检验代码,否则程序会变得非常慢。

#Random initialization(随机初始化)

全零初始化:

机器学习之神经网络参数的反向传播算法#总体回顾

所以每次更新之后,这两个隐藏单元的每个参数输入都是相等的,也就是说,绿色的权值依然相等,红色的权值依然相等,蓝色的权值依然相等,这就意味着即使梯度下降进行了一次迭代,但这两个隐藏单元依然以相同的函数作为输入来计算,这就意味着这个神经网络计算不出来什么有趣的函数。

随机初始化能解决problem of symmetric weights(对称权值问题):即所有的权值都是一样的。

机器学习之神经网络参数的反向传播算法#总体回顾

总而言之,为了训练神经网络,首先要将权值随机初始化为一个接近0的范围在-E到E之间的数,然后进行反向传播,再进行梯度检验,最后使用梯度下降或者其他高级优化算法来最小化代价函数J,最后就能计算出θ的最优值。

#总体回顾

机器学习之神经网络参数的反向传播算法#总体回顾

当要训练一个神经网络时

选择一种网络架构(network architecture)

  • 定义输入单元的数量:特征值的维度
  • 输出层的单元数量由分类问题中的所要区分的类别个数确定(不要忘记把y重新写出向量的形式)
  • 一般只使用单个隐藏层,若使用多个隐藏层,则每个层通常应有相同的单元数(通常隐藏单元越多越好);隐藏单元的数量最好与输入特征数相匹配,或大几倍
机器学习之神经网络参数的反向传播算法#总体回顾
机器学习之神经网络参数的反向传播算法#总体回顾

1、构建一个神经网络,然后随机初始化权值

2、执行前向传播算法

3、计算出代价函数J(θ)

4、执行反向传播算法来算出这些偏导项

5、使用梯度检查来比较这些已经计算得到的偏导数项,把用反向传播算法得到的偏导数项与用数值方法得到的估计值进行比较,确保这两种方法得到基本接近的两个值,然后停用梯度检查

6、使用一个最优化算法,比如说梯度下降算法或者更加高级的优化方法比如说LBFGS算法、共轭梯度法,与反向传播算法相结合来最小化关于θ的代价函数J(θ)

PS.内容为学习吴恩达老师机器学习的笔记【https://study.163.com/course/introduction/1004570029.htm】

继续阅读