您的位置:首页 > 其它

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

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

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



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



前向传播:

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

计算

的所有输入:

,代入数据得:

;

计算

的输出: 

;

同样的方法得:



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

,代入数据得:


,计算o1的输出:
  


同样的方法得到: 


到这一步,就完成了前向传播的计算,为了引出反向传播,还需要引入误差这个概念:
在图2中,我们赋予了o1和o2初值分别为:0.01和0.99,此时就存在了误差,误差的定义为:



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



同样的: 


总误差为:


反向传播:

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


 
     (1)

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



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





为了减少误差,从当前的权重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为例:



图中的加法门将梯度相等地分给它的输入;取最大值门将梯度设定为较大的输入;乘法门它的局部梯度是输入值,然后根据链式法则乘以输出值的梯度。
后记:好多概念可能理解的还不是很深,不过感谢知乎上的大神,让我对公开课中的好多概念有了更好地理解。

参考:
http://cs231n.github.io/optimization-2/ https://zhuanlan.zhihu.com/p/21407711 https://www.cnblogs.com/charlotte77/p/5629865.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  深度学习公开课
相关文章推荐