CS231n学习笔记--1.Backpropagation

1. 反向传播能够对数据X和权重W都求导,但是在机器学习领域只考虑对W的导数,但是在一些场合对数据X的导数也有意义(如解释和可视化神经网络在做什么);

2. 深度学习中常见函数的导数:

CS231n学习笔记--1.Backpropagation

CS231n学习笔记--1.Backpropagation

CS231n学习笔记--1.Backpropagation

3.复合函数求导链式法则例子:

f(x,y,z) = (x+y)z

q=x+y, f=qz ==>df/dx=(df/dq)*(dq/dx)  注:实际中这些都是数字相乘

CS231n学习笔记--1.Backpropagation

代码实现:

CS231n学习笔记--1.Backpropagation

 

4. circuit中的每个gate在拿到输入后会立即得到两个结果:1.gate的输出;2.gate相对于input的local gradient;这里2非常重要,有了2当拿到最终输出后,只要把链路上的所有local gradient乘回来就得到最终输出相对于输入的梯度了。

5.模块化:将前向阶段拆分成能够容易反向求导的模块,例如:

CS231n学习笔记--1.Backpropagation

如果直接老老实实的把每个运算都进行拆分,将产生如下比较长的复杂链路:

CS231n学习笔记--1.Backpropagation

但是如果看出最外层是一个sigmoid函数,将e的幂看成一个整体,则链路就会大大简化,sigmoid= sigmoid * (1 - sigmoid),代码实现也非常简单:

CS231n学习笔记--1.Backpropagation

下面是一个更极端的例子:

CS231n学习笔记--1.Backpropagation

如果求f对于x,y导数的解析解计算和代码都会相当复杂,这里分别将分子,分母,分子中的两个算子,分母中的两个算子看成一个整体(staged computation):

CS231n学习笔记--1.Backpropagation

CS231n学习笔记--1.Backpropagation

两个重要的tip:1.将前向过程中的中间变量进行保存(因为反向过程中要用,就不用再算一遍了);2. 多个链路返回到同一个变量要用+=,如图所示;

6. 反向传播中各个门的模式:add(将gradient相等的分配到输入上), multiply(local gradient就是交换的输入)。下面这段话尤其要注意:

CS231n学习笔记--1.Backpropagation