神经网络的传播

上一篇文章构建了一个简单的网络,可以看出来它对于手写数字的识别率还是可以高达91%。但我们尚未对神经网络处理的过程做出太多解释。

    数据在网络中的传播有两种方式。一种是沿着输入到输出的路径,被称为前向传播。一种是从输出返回到输入,被成为反向传播(backprop)。

train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
sess.run(train_step, feed_dict={x: batch_xs, y: batch_ys})

前文代码节选

    当我们运行最小化loss的时候,为了求出loss的值,我们的数据会沿着我们构建的通道向前流动,逐步的求出每个节点。

求值示意图

    我们知道prediction是一个[1, 10]的矩阵,那么下标为i(即分类为i)的值是vi通过softmax函数之后得到的。vi为对应矩阵wi(形状为[784, 1])乘以x,再加上对应bi。

    

网络前向传播示意图

    

    而反向传播就是为了最小化loss求梯度的过程了。那什么是梯度?为什么选择梯度下降法来更新权重?首先让我们看下loss=f(w)可能的图像:

loss函数3D图

    想到了什么?或许山脉是跟这图像最相似的实体。那么如何求得使loss值最小的权重w?我们先联想一下我们是如何求出一元函数的极小值的。我们可以通过求导得出斜率,当斜率为0时,则为极小值(不是很严谨)。

    

    从一元函数进入多元函数,导数变成了偏导数,发生变化的方向不再只是平面上唯一的x轴,而是立体的多轴。而不同方向的变化都有不同的导数,称作方向导数。而梯度的定义:

    梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。

    假如有一个函数,z=f(x, y),那么z的梯度为:

   

梯度的求解

    我们需要注意的是,z函数梯度的方向是z增加最快的方向。我们在深度学习里,需要降低loss,因此我们是选择loss函数梯度的反方向!

    我们将loss对Wi(即W权重的某一个值)求导的过程:

    !!!但是我们是为了最小化loss,所以我们根据的应该是:

    

    所以,我们有:

    

    

    其中,α代表学习率。权重某个值的更新等于原来的值减去学习率乘以导数的值。梯度下降法的原理就是如此。可以看出来,如果靠我们自己去计算,那运算量是很大的。 

    

VGG-56 在 CIFAR-10 数据集上构建的损失函数的 3D 架构。

  

    如上图所示,loss函数是一个很错综复杂的结构,很多尖峰也很多低谷。

    CS231N(斯坦福公开课)这么描述过梯度下降。假设我们把loss对w的函数看成一个山谷。那么我们每次计算导数的操作就是在试探哪里是下降的方向,然后不断的往下走,一直走到山底得到最好的w。

    

    那么一旦试探到下降的方向后,我们该走多远,这就是学习率所决定的。

    学习率其实是很重要的一个参数。假如太小的话会导致训练时间过长,因为你需要很久才能走到山底。假如太大,那么你很有可能跳过极小值,无法获得较好的模型效果。

    

    来自:http://t.cn/RemjNXg

    

    三幅图形象的说明了小球如果根据不同的学习率容易遇到的场景。中间的小球陷入了极小值,但无法到达最小值。后面会讲到我们如何通过优化器来规避这种问题。

    所以很多时候我们都是先预设一个学习率,然后根据模型出来的效果如准确率等来调整。

    更详细的内容因为篇幅问题会分别讲解。如损失函数的选择,优化器(虽然都是梯度下降,但是方式不同)的选择,学习率,权重的初始化。

    PS:如果数学公式错了请指正。

猜你喜欢

转载自blog.csdn.net/qq_40213457/article/details/81988483