一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)

本文是我在学习反向传播时翻译的一篇文章。原文链接如下。
A Step by Step Backpropagation Example

实例学习
在这个例子里,我们将制作一个小型神经网络。它有两个输入,两个隐藏的神经元,两个输出神经元。
此外,隐藏和输出的神经元都包含了一个偏差(bias)。下图是这个神经网络的结构。
一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
下面我们给各个参数设定一些值。权重(w) , 偏差(b) 和用来训练的输入输出
一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
反向传播的目标是优化权重,以便神经网络能够学习如何正确地将任意输入映射到输出。
在这个例子里:给定输入0.05和0.10,我们希望神经网络输出0.01和0.99。

  • 正向计算
    我们假设这个神经网络的**函数是 logistic 回归函数。
    我们来计算一下隐藏层神经元h1
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    带入权重的和偏差的值
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    带入**函数计算得到h1的输出(这里套用了logistic回归的公式,不懂的同学请自行百度)
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    同样方法计算出h2的输出
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    根据神经网络图,我们把h1,h2的输出作为输出层神经元o1,o2的输入来同样计算。
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    带入数值
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    同样方法计算出o2
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    这时我们就会发现,得出的结果(o1:0.75 , o2:0.77)和我们想要的结果(o1:0.01 , o2:0.99)相去甚远。
    这时我们就需要调整权重(w)来得到我们想要的输出结果。
    在调整之前,我们先算出和想要的结果的误差(loss,也叫损失)。在这个例子中我们使用平均方差函数来作为误差函数。
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    我们分别算一下o1的误差
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    同样公式算出o2的误差
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    误差合计
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
  • 反向计算
    得到误差之后,我们就可以通过反向传播来更新权重,直到得到我们想要的输出。
    比如说,我们考虑一下w5,在w5上做出改变,会怎么样影响最后的误差?
    这个影响度,我们称之为误差对于w5的梯度(也叫对于w5的偏导数),算式为:
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    根据链式法则我们可以得到以下公式
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    也就是如下图所示
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    接下来我们一步一步把w5的梯度算出来。
    首先是我们之前计算误差的平均方差公式
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    先求总体误差对于o1输出的梯度,因为o1并不会影响o2的输出,所以对o2的梯度我们做为0处理。
    对于下面的公式不理解的同学,请自学一下偏导数的求解方法。概括来说,偏导数就是求一个变化率。
    也就是求out_o1的变化会影响E_total的变化率,所以,公式中的target_o1^2可以当一个常数来看,就是不会引起变化,所以舍去了。
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    然后,我们该求o1的输入对于o1的输出的偏导数了。先回忆一下o1的输出**函数
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    logistic**函数的偏导数函数比较规范,百度一下就可以找到。
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    最后,我们来计算w5对于o1的偏导数
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    偏导数公式
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    总结一下,可以得到我们想要的w5对于输出的梯度
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    最后结果如下
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    我们知道了梯度,就可以根据一定的比例来调整权重,而使得输出的误差减小。
    比如我们设定这个比例为梯度的0.5倍。这个比例被称为学习率。
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    同样,我们也可以调整w6,w7,w8的新的权重,经过计算,如下
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    类似于同样的梯度求解,我们也可以求出w1,w2,w3,w4的新的权重。
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    一步一步教你反向传播,求梯度(A Step by Step Backpropagation Example)
    我们通过这些更新后的权重,重新输入0.05和0.10计算得出 的误差为0.29102792.
    比我们之前计算的误差0.29837110要小一些。虽然减小幅度不大,但是这样的梯度下降经过几百次以后就会是误差无限接近于0.我们也就得到了最合适的权重值。完成了学习的目的。

注意:非常欢迎讨论,有意见或建议请留下评论,如转载请注明出处。