神经网络的传播(权重更新)

本文重在阐述神经网络里的前向传播和反向传播。

上一篇文章构建了一个简单的网络,可以看出来它对于手写数字的识别率还是可以高达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的值,我们的数据会沿着我们构建的通道向前流动,逐步的求出每个节点。

l o s s = ( y p r e d i c t i o n ) 2 /   10 p r e d i c t i o n i = [ s o f t m a x ( w i x + b i ) ] = e v i j = 0 e v i v i = s o f t m a x ( w i x + b i )

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

网络前向传播示意图

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

loss函数3D图

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

斜率求极小值

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

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

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

z x   i   +   z y   j

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

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

l o s s p r e d i c t i o n i = 5 ( y i p r e d i c t i o n i ) p r e d i c t i o n i v i = ( j = 0 e v j ) e v i + ( e v i ) ( j = 0 e v j ) ( e v i j = 0 e v j ) 2 v i w k i = ( k = 0 748 w k i x k + b i ) = x k l o s s w k i = l o s s p r e d i c t i o n i p r e d i c t i o n i v i v i w k i

(说实话,这段公式码的我很辛苦,如果有错,请纠正)

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

  l o s s w k i

所以,我们有:

w k i = w k i α l o s s w k i

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

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

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

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

下山

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

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

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

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

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

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

参考
https://blog.csdn.net/lz0499/article/details/80212695 (权重更新)
CS231n课程
https://www.jianshu.com/p/ffa51250ba2e(求导)

猜你喜欢

转载自blog.csdn.net/weixin_41417982/article/details/81393917