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

本文详细解析了CS231n课程中的反向传播原理,通过实例介绍了前向传播、后向传播的过程及误差计算方法,并探讨了分段反向传播和回传流中的模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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


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


前向传播:

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

  1. 计算h_{1} 的所有输入:net_{h_{1} } =w_{1}\ast i_{1}  +w_{2}\ast i_{2}+b_{1}\ast 1,代入数据得:net_{h_{1} } =0.15\ast 0.05  +0.2\ast 0.1+0.35\ast 1=0.3775;
  2. 计算h_{1} 的输出: out_{h_{1} }=\frac{1}{1+e^{-net_{h_{1} } } }  =\frac{1}{1+e^{-0.3775}  }=0.593269992;
  3. 同样的方法得:out_{h_{2} }=0.596884378

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

  net_{o_{1} } =w_{5}\ast out_{h_{1} }  +w_{6}\ast out_{h_{2} }+b_{2}\ast 1,代入数据得:

net_{o_{1} } =0.4\ast 0.593269992  +0.45\ast 0.596884378+0.6=1.105905967,计算o1的输出:

  out_{o_{1} }=\frac{1}{1+e^{-net_{o_{1} } } }  =\frac{1}{1+e^{-1.105905967}  }=0.75136507

同样的方法得到: out_{o_{2} }=0.772928465

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

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

E_{total} =\sum_{}^{}{\frac{1}{2}(target - output)^{2}  }

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

E_{o_{1} } =\sum_{}^{}{\frac{1}{2}(0.01 - 0.75136507)^{2}  }=0.298371109

同样的: E_{o_{2} } =0.023560026

总误差为:

反向传播:

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

\frac{d E_{total} }{d w_{5} }=\frac{d E_{total} }{d out_{o_{1} } }\ast\frac{d out_{o_{1} } }{d net_{o_{1} } }\ast \frac{d net_{o_{1} } }{d w_{5} }          (1)

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

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



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

w_5^+=w_5-\eta \frac{\partial {E_{total}}}{\partial {w_5}}
同样的,对隐层权重w1进行类似的计算:

\frac{\partial {E_{total}}}{\partial {w_1}}=\frac{\partial {E_{total}}}{\partial {out_{h_1}}}\frac{\partial {out_{h_1}}}{\partial {net_{h_1}}}\frac{\partial {net_{h_1}}}{\partial {w_1}}      (2)
对链式中的每一项分别进行计算便可以得到式(2)的结果,然后根据结果进行w1的迭代:
w_1^+=w_1-\eta \frac{\partial{E_{total}}}{\partial{w_1}}

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

分段反向传播:

以下面的表达式(3)为例:
\displaystyle f(w,x)=\frac{1}{1+e^{-(w_0x_0+w_1x_1+w_2)}}(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

深度学习-面向视觉识别的卷积神经网络,2016斯坦福大学公开课。课程介绍: 计算机视觉在社会中已经逐渐普及,并广泛运用于搜索检索、图像理解、手机应用、地图导航、医疗制药、无人机和无人驾驶汽车等领域。而这些应用的核心技术就是图像分类、图像定位和图像探测等视觉识别任务。近期神经网络(也就是“深度学习”)方法上的进展极大地提升了这些代表当前发展水平的视觉识别系统的性能。 本课程将深入讲解深度学习框架的细节问题,聚焦面向视觉识别任务(尤其是图像分类任务)的端到端学习模型。在10周的课程中,学生们将会学习如何实现、训练和调试他们自己的神经网络,并建立起对计算机视觉领域的前沿研究方向的细节理解。最终的作业将包括训练一个有几百万参数的卷积神经网络,并将其应用到最大的图像分类数据库(ImageNet)上。我们将会聚焦于教授如何确定图像识别问题,学习算法(比如反向传播算法),对网络的训练和精细调整(fine-tuning)中的工程实践技巧,指导学生动手完成课程作业和最终的课程项目。本课程的大部分背景知识和素材都来源于ImageNet Challenge竞赛。 主讲人: 李飞飞,斯坦福大学计算机科学系副教授。担任斯坦福大学人工智能实验室和视觉实验室主任,主要研究方向为机器学习、计算机视觉、认知计算神经学。她在TED上的演讲,如何教计算机理解图片。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值