斯坦福大学深度学习公开课cs231n学习笔记(4)正向传播及反向传播

在cs231n反向传播这节课中,主要利用简单的函数讲了梯度的求解,梯度的链式求解法则,前向传播,后向传播等概念知识,其中对于梯度和链式求解方法,上过高数课的相信都比较了解,所以我主要对前向传播和后向传播作下学习笔记:

对于前向传播,为了方便,我继续使用知乎上的三层网络经典例子:

斯坦福大学深度学习公开课cs231n学习笔记(4)正向传播及反向传播_第1张图片

对于上图1中的权重W和偏置b,初始化为下图2所示的值:

斯坦福大学深度学习公开课cs231n学习笔记(4)正向传播及反向传播_第2张图片

前向传播:

下面展开计算前向传播过程,首先是对中间隐层:

  1. 计算的所有输入:,代入数据得:;
  2. 计算的输出: ;
  3. 同样的方法得:;

然后对输出层计算,此时第一步的隐层神经元的输出作为输出层的输入:

  ,代入数据得:

,计算o1的输出:

  。

同样的方法得到: 。

到这一步,就完成了前向传播的计算,为了引出反向传播,还需要引入误差这个概念:

在图2中,我们赋予了o1和o2初值分别为:0.01和0.99,此时就存在了误差,误差的定义为:


上面的例子中,把数值带入得到误差为:



同样的: 

总误差为:

反向传播:

下面可以对反向传播展开了,以输出层的权重参数w5为例,如果想知道权重w5对整体误差的影响,需要根据链式法则对整体误差求w5得偏导数:

       (1)

下图3更直观地展示了误差的反向传播过程:

对式(1)中的每项进行计算,然后链式相乘,便可以得到总的结果,具体推导过程请参见,这里摘录过程:

斯坦福大学深度学习公开课cs231n学习笔记(4)正向传播及反向传播_第3张图片

斯坦福大学深度学习公开课cs231n学习笔记(4)正向传播及反向传播_第4张图片

为了减少误差,从当前的权重w5减去求得的这个误差梯度(学习率选择0.5),得:


同样的,对隐层权重w1进行类似的计算:

      (2)
对链式中的每一项分别进行计算便可以得到式(2)的结果,然后根据结果进行w1的迭代:

上面的例子,比较清楚的解释了前向传播和后向传播的过程,反向传播可以看成是单元之间通过梯度相互通信,让它们的输入沿着梯度方向变化,使得最后的误差最小。下面是cs231n课中提到的其他几个概念:分段反向传播,回传流中的模式。

分段反向传播:

以下面的表达式(3)为例:
(3)
表达式(3)是一个包含输入x和权重w的2维神经元,该神经元使用sigmoid激活函数。计算过程如下:
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
程序中创建了一个中间变量dot:权重w和x的点乘结果,这样分段开使得反向传播更加简洁。另外,在反向传播时也可以计算出装着w和x等的梯度的对应的变量(ddot,dx和dw)。

回传流中的模式:

在大多数情况下,反向传播中的梯度可以被直观地解释。神经网络中常用加法、乘法和取最大值三个门单元,下图4为例:
斯坦福大学深度学习公开课cs231n学习笔记(4)正向传播及反向传播_第5张图片
图中的加法门将梯度相等地分给它的输入;取最大值门将梯度设定为较大的输入;乘法门它的局部梯度是输入值,然后根据链式法则乘以输出值的梯度。
后记:好多概念可能理解的还不是很深,不过感谢知乎上的大神,让我对公开课中的好多概念有了更好地理解。

参考:

http://cs231n.github.io/optimization-2/

https://zhuanlan.zhihu.com/p/21407711

https://www.cnblogs.com/charlotte77/p/5629865.html

你可能感兴趣的:(深度学习(deep,learning),深度学习公开课)