100天搞定机器学习(Day1-34)100天搞定机器学习|Day35深度学习神经网络结构[](http:///mp.weixin.qq.com/s?__b...100天搞定机器学习|Day36深度学习的梯度下降算法集合中提到我们需要找到特定的权重和偏差来最小化成本函数。我们需要得到costfunction的负梯度,告诉我们如何改变连接上的weightbias,让cost下降最快。反向传播算法就是用来求这个复杂的爆炸性梯度的。上一集讲到,一个13000维的梯度向量是难以想象的,换个思路,梯度向量每一项的大小就是说代价函数对每个参数有多敏感。如下图,我们可以理解为影响第一卫成本函数上的gight是second的32倍。让我们忽略反向传播算法和一堆公式。当我们真正理解了这个算法之后,这里的每一步都会非常清晰。让我们考虑一个未经训练的网络。我们不能直接改变这些激活值,只能改变权重和偏置值。但是请记住,我们查看输出层如何变化仍然很有用。我们希望图像最终的分类结果是2,我们期望第三个输出值变大,剩下的输出值变小,变化的大小应该和当前值一样目标值与它们之间的差值成正比。例如,增加2号神经元的激活值应该比减少8号神经元的激活值更重要,因为后者已经非常接近它的目标了。更进一步,来关注2号神经元,想让它的激活值变大,而这个激活值是前一层所有激活值的加权和加上一个偏置值。要增加激活值,我们有3种方法,一是增加偏置,二是增加权重,三是改变前一层的激活值。我们先来看看如何调整权重。每个重量的影响是不同的。连接到前一层的最亮神经元的权重具有相同的影响。最大,因为这些权重乘以大激活。增加这几个权重对最终成本函数的影响比增加连接变暗神经元的权重大很多倍。请记住,当涉及到梯度下降时,我们不只是看每个参数是增加还是减少,我们还要看改变哪个参数最划算。第三种可以增加神经元激活值的方法是改变上一层如果所有正权重链接的神经元都更亮,所有负权重链接的神经元都更暗,那么2号神经元会激发得更强烈。我们还要根据相应权重的大小,按比例改变激活值。我们不能直接改变激活值,只能改变最后一层。记住我们期望的变化也很有帮助。但是不要忘记,从全局的角度来看,这只是2号神经元所期望的变化,我们还需要最后一层剩余的每个输出神经元,每个神经元都有自己的想法如何改变倒数第二层。我们将把2号神经元的期望和其他输出神经元的期望相加,作为如何更改倒数第二层的指示。这些预期变化不仅是相应权重的倍数,而且是每个神经元激活值变化的倍数。这实际上是在实现反向传播的概念。我们把所有的预期变化加起来得到倒数第二层变化的一系列变化,然后重复这个过程来改变倒数第二层神经元的激活值之间的相关性。参数,一直循环到第一层。对于其他的训练样本,我们也经过反向传播,记录每个样本想怎么修改权重和偏差,最后得到一个平均值。这里的一系列权重偏差的平均微调大小,笼统地说就是成本函数的负梯度,至少是其标量值的倍数。太棒了,对吧?如果梯度下降的每一步都用每一个训练样例来计算,时间会太长。在实际操作中,我们一般是这样做的:先将训练样本打乱,然后分成多组minibatch,每个minibatch应该包含100个训练样本。然后你计算这个minibatch的下降步长,这不是costfunction真正的梯度,但是每个minibatch都会给出一个很好的近似,计算量会减少很多。可以这样类比:沿着成本函数的曲面下山,minibatch方法就像一个酒鬼漫无目的的从山上滑下来,但是速度很快。之前的方法就好像是一个心细的人,事先准确的计算好了下山的方向,然后慢慢的小心翼翼的走着。这就是随机梯度下降的总结:反向传播算法计算的是单个训练样本如何改变权重和偏差,不仅是每个参数应该变大或变小,还包括这些变化的比例能以最快的代价降低到多大.真正的梯度下降是对数以万计的训练样例进行操作,然后对这些变化进行平均。这个计算太慢了。我们需要将所有样本划分为minibatch,计算每个minibatch的梯度,并调整参数。不断循环,最终收敛到代价函数的局部最小值。理解是一回事,如何表达又是另一回事。下一期我们将以微积分的形式推导反向传播算法,敬请期待!
