斯坦福大学深度学习公开课cs231n学习笔记(4)正向传播及反向传播
2017-12-04 22:34
465 查看
在cs231n反向传播这节课中,主要利用简单的函数讲了梯度的求解,梯度的链式求解法则,前向传播,后向传播等概念知识,其中对于梯度和链式求解方法,上过高数课的相信都比较了解,所以我主要对前向传播和后向传播作下学习笔记:
对于前向传播,为了方便,我继续使用知乎上的三层网络经典例子:
对于上图1中的权重W和偏置b,初始化为下图2所示的值:
计算
的所有输入:
,代入数据得:
;
计算
的输出:
;
同样的方法得:
;
然后对输出层计算,此时第一步的隐层神经元的输出作为输出层的输入:
,代入数据得:
,计算o1的输出:
。
同样的方法得到:
。
到这一步,就完成了前向传播的计算,为了引出反向传播,还需要引入误差这个概念:
在图2中,我们赋予了o1和o2初值分别为:0.01和0.99,此时就存在了误差,误差的定义为:
上面的例子中,把数值带入得到误差为:
同样的:
总误差为:
(1)
下图3更直观地展示了误差的反向传播过程:
对式(1)中的每项进行计算,然后链式相乘,便可以得到总的结果,具体推导过程请参见,这里摘录过程:
为了减少误差,从当前的权重w5减去求得的这个误差梯度(学习率选择0.5),得:
同样的,对隐层权重w1进行类似的计算:
(2)
对链式中的每一项分别进行计算便可以得到式(2)的结果,然后根据结果进行w1的迭代:
上面的例子,比较清楚的解释了前向传播和后向传播的过程,反向传播可以看成是单元之间通过梯度相互通信,让它们的输入沿着梯度方向变化,使得最后的误差最小。下面是cs231n课中提到的其他几个概念:分段反向传播,回传流中的模式。
(3)
表达式(3)是一个包含输入x和权重w的2维神经元,该神经元使用sigmoid激活函数。计算过程如下:
程序中创建了一个中间变量dot:权重w和x的点乘结果,这样分段开使得反向传播更加简洁。另外,在反向传播时也可以计算出装着w和x等的梯度的对应的变量(ddot,dx和dw)。
图中的加法门将梯度相等地分给它的输入;取最大值门将梯度设定为较大的输入;乘法门它的局部梯度是输入值,然后根据链式法则乘以输出值的梯度。
后记:好多概念可能理解的还不是很深,不过感谢知乎上的大神,让我对公开课中的好多概念有了更好地理解。
参考:
http://cs231n.github.io/optimization-2/ https://zhuanlan.zhihu.com/p/21407711 https://www.cnblogs.com/charlotte77/p/5629865.html
对于前向传播,为了方便,我继续使用知乎上的三层网络经典例子:
对于上图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
相关文章推荐
- 斯坦福大学深度学习公开课cs231n学习笔记(10)卷积神经网络
- 斯坦福大学深度学习公开课cs231n学习笔记(2)线性分类器及最优化
- 斯坦福大学深度学习公开课cs231n学习笔记(6)神经网路输入数据预处理(归一化,PCA等)及参数初始化
- 斯坦福大学深度学习公开课cs231n学习笔记(8)神经网络学习过程中的检查事项和参数调优
- 斯坦福大学深度学习公开课cs231n学习笔记(9)softmax分类和神经网络分类代码实现
- 斯坦福大学深度学习公开课cs231n学习笔记(3)最优化方法:梯度下降
- 神经网络与深度学习学习笔记:正向传播与反向传播(未完)
- 斯坦福大学深度学习公开课cs231n学习笔记(1)softmax函数理解与应用
- 斯坦福大学深度学习公开课cs231n学习笔记(7)神经网络防止数据过拟合:损失函数和正则化
- 深度卷积神经网络学习笔记2:步长不为1的卷积前向传播和反向传播
- 深度学习与计算机视觉系列(5)_反向传播与它的直观理解
- TensorFlow 深度学习框架 (2)-- 反向传播优化神经网络
- 【深度学习技术】python 反向传播求梯度
- 深度学习第三次课-梯度下降与反向传播
- 深度学习与计算机视觉系列(5)_反向传播与它的直观理解
- TensorFlow 深度学习框架 (2)-- 反向传播优化神经网络
- 深度学习与计算机视觉系列(5)_反向传播与它的直观理解
- TensorFlow 深度学习框架 (2)-- 反向传播优化神经网络
- 深度学习21天实战实战caffe学习笔记<11:Caffe 反向传播>
- TensorFlow 深度学习框架 (2)-- 反向传播优化神经网络