在cs231n反向传播这节课中,主要利用简单的函数讲了梯度的求解,梯度的链式求解法则,前向传播,后向传播等概念知识,其中对于梯度和链式求解方法,上过高数课的相信都比较了解,所以我主要对前向传播和后向传播作下学习笔记:
对于前向传播,为了方便,我继续使用知乎上的三层网络经典例子:
对于上图1中的权重W和偏置b,初始化为下图2所示的值:
前向传播:
下面展开计算前向传播过程,首先是对中间隐层:
- 计算
的所有输入: ,代入数据得: ; - 计算 的输出: ;
- 同样的方法得:
;
然后对输出层计算,此时第一步的隐层神经元的输出作为输出层的输入:
,代入数据得:
,计算o1的输出:
。
同样的方法得到: 。
到这一步,就完成了前向传播的计算,为了引出反向传播,还需要引入误差这个概念:
在图2中,我们赋予了o1和o2初值分别为:0.01和0.99,此时就存在了误差,误差的定义为:
上面的例子中,把数值带入得到误差为:
同样的:
总误差为:
反向传播:
下面可以对反向传播展开了,以输出层的权重参数w5为例,如果想知道权重w5对整体误差的影响,需要根据链式法则对整体误差求w5得偏导数:
(1)
下图3更直观地展示了误差的反向传播过程:
为了减少误差,从当前的权重w5减去求得的这个误差梯度(学习率选择0.5),得:
同样的,对隐层权重w1进行类似的计算:
对链式中的每一项分别进行计算便可以得到式(2)的结果,然后根据结果进行w1的迭代:

分段反向传播:
(3)
w = [2,-3,-3] # assume some random weights and data
x = [-1, -2]
# forward pass
dot = w[0]*x[0] + w[1]*x[1] + w[2]
f = 1.0 / (1 + math.exp(-dot)) # sigmoid function
# backward pass through the neuron (backpropagation)
ddot = (1 - f) * f # gradient on dot variable, using the sigmoid gradient derivation
dx = [w[0] * ddot, w[1] * ddot] # backprop into x
dw = [x[0] * ddot, x[1] * ddot, 1.0 * ddot] # backprop into w
回传流中的模式:
参考:
http://cs231n.github.io/optimization-2/
https://zhuanlan.zhihu.com/p/21407711
https://www.cnblogs.com/charlotte77/p/5629865.html