CS231n简介
详见 CS231n课程笔记1:Introduction。
注:斜体字用于注明作者自己的思考,正确性未经过验证,欢迎指教。
课程作业
关于BP实现的实例请参考 CS231n作业笔记1.3:SVM的误差函数以及反向传播(非向量及向量算法)。
1. 计算图 VS 微积分
如果可以直接使用微积分得到gradient,使用BP则会显得效率低下。但是通常情况下我们需要计算多层的神经网络,其中设计很多不可求导的计算,这就使得直接求导工程巨大,甚至难以实现。同时BP算法容易实现,易于拓展,容易纠错。
2. BP计算方法
前向计算的时候同时计算local gradient,反向计算的时候把传播回来的global gradient与local gradient相乘即可得到需要向前一层节点传播的global gradient。
一个例子如下:
具体的,
- 最后一层节点(一般为Loss)所接受到的global gradient为1。
- 加法运算符是把输出的gradient传播到所有的输入链接中。
- max运算符是传播到较大的输入链接中。
- 乘法运算符是乘以其他输入乘积和到输入链接中。
- 如果节点有多个输出连接,那么他的输出global gradient是所有输出连接之和。
- 可以把多个运算符合并为一个运算符,以简化计算,提高效率。
3. 向量化算法
大多数情况,输入输出都是向量,则local gradient为两者的Jacobian矩阵,然后仍然是global gradient与local gradient相乘。
对于max等运算节点,因为相应的Jacobian矩阵非常稀疏,可以直接采用向量元素相乘的形式。
一般深度学习网络的API中,为如何进行前向后向传播都留出了很大的余地,供使用者自由发挥。