链接:https://zhuanlan.zhihu.com/p/21407711
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
译者注:本文智能单元首发,译自斯坦福CS231n课程笔记Backprop Note,课程教师Andrej Karpathy授权翻译。本篇教程由杜客翻译完成,堃堃和巩子嘉进行校对修改。译文含公式和代码,建议PC端阅读。
原文如下:
内容列表:
- 简介
- 简单表达式和理解梯度
- 复合表达式,链式法则,反向传播
- 直观理解反向传播
- 模块:Sigmoid例子
- 反向传播实践:分段计算
- 回传流中的模式
- 用户向量化操作的梯度
- 小结
简介
目标:本节将帮助读者对反向传播形成直观而专业的理解。反向传播是利用链式法则递归计算表达式的梯度的方法。理解反向传播过程及其精妙之处,对于理解、实现、设计和调试神经网络非常关键。
问题陈述:这节的核心问题是:给定函数 ,其中
是输入数据的向量,需要计算函数
关于
的梯度,也就是
。
目标:之所以关注上述问题,是因为在神经网络中对应的是损失函数(
),输入
里面包含训练数据和神经网络的权重。举个例子,损失函数可以是SVM的损失函数,输入则包含了训练数据
、权重
和偏差
。注意训练集是给定的(在机器学习中通常都是这样),而权重是可以控制的变量。因此,即使能用反向传播计算输入数据
上的梯度,但在实践为了进行参数更新,通常也只计算参数(比如
)的梯度。然而
的梯度有时仍然是有用的:比如将神经网络所做的事情可视化便于直观理解的时候,就能用上。
如果读者之前对于利用链式法则计算偏微分已经很熟练,仍然建议浏览本篇笔记。因为它呈现了一个相对成熟的反向传播视角,在该视角中能看见基于实数值回路的反向传播过程,而对其细节的理解和收获将帮助读者更好地通过本课程。
简单表达式和理解梯度
从简单表达式入手可以为复杂表达式打好符号和规则基础。先考虑一个简单的二元乘法函数。对两个输入变量分别求偏导数还是很简单的:

解释:牢记这些导数的意义:函数变量在某个点周围的极小区域内变化,而导数就是变量变化导致的函数在该方向上的变化率。

注意等号左边的分号和等号右边的分号不同,不是代表分数。相反,这个符号表示操作符被应用于函数
,并返回一个不同的函数(导数)。对于上述公式,可以认为
值非常小,函数可以被一条直线近似,而导数就是这条直线的斜率。换句话说,每个变量的导数指明了整个表达式对于该变量的值的敏感程度。比如,若
,则
,
的导数
。这就说明如果将变量
的值变大一点,整个表达式的值就会变小(原因在于负号),而且变小的量是
变大的量的三倍。通过重新排列公式可以看到这一点(
)。同样,因为
,可以知道如果将
的值增加
,那么函数的输出也将增加(原因在于正号),且增加量是
。
函数关于每个变量的导数指明了整个表达式对于该变量的敏感程度。
如上所述,梯度是偏导数的向量,所以有
。即使是梯度实际上是一个向量,仍然通