CS231N Lecture6 反向传播
Lecture6–反向传播
如何为神经网络计算梯度?
bad idea:在纸上推导
better:计算图
以svm loss举例
蓝色节点:x与W的矩阵乘法
红色节点:铰链损失(针对SVMloss)
绿色:正则化项
相加得到L(loss)

Backpropagation 反向传播
构成:
1.Forward pass “前向传递”计算输出值
2.backward pass “反向传递”计算每个参数的导数
下游梯度 = 局部梯度 x 上游梯度

优点:
将对梯度的计算模块化。不需要知道全局架构,只需要知道这个节点里对应的三个梯度数值(上游/本地/下游),从而推出全局梯度。

全局图be like:
(trick: 蓝色框内为sigmoid函数,可以直接计算其local gradient得到简单表达式,跳过中间步骤)

梯度流动时一些有趣的pattern:
加法:downstream gradient = upstream gradient
复制:downstream gradient = sum(upstream gradient)
乘法:“交换”downstream gradient = other diwnstream gradient * upstream
max:最大值downstream = upstream,其余downstream=0(不常见)

实际处理问题时,我们通常是对向量进行求梯度等操作(最后得到的loss仍然是标量)

由于只考虑upstream和downstream的关系,Jocobian矩阵将会是一个非常大的稀疏矩阵,只有对角线上元素可能不为0.所以在使用中,从来不会真正形成矩阵,而是对其隐式表达。
如下图,对RELU函数,可以理解为:
根据input符号,决定downstream是0还是具体值

当使用的是tensor,更复杂了.

简化求解反向传播
推导:分解问题,尝试对每个x的导数求解
如图,dL/dx1,1 = (dy/dx1,1)(dL/dy)
计算dy/dx1,1,发现其为第一行等于权重矩阵第一行,其余行为0的矩阵;
所以,dL/dx1,1等于权重第一行与dL/dy第一行的内积;
其他同理。

最后推得关系式如下:dL/dx = (dL/dy)wT
(详细证明:http://cs231n.stanford.edu/handouts/linear-backprop.pdf)

另一个观点:反向自动微分
反向自动微分
认为jacobian矩阵可以累乘,最后得到一个标量。(对于所有的与求导/微分相关的程序都有效,局限性小)

前向自动微分

缺点:前向不被大框架支持;不好用
反向传播另一个功能:求高阶导数
(比如计算hessian矩阵)
使用反向传播扩展计算图。在计算loss之后,使用f2’计算梯度相对于x1的损失,用f1’计算loss相对于x0的损失(f1’\f2’是f的反向传递)
再点积向量 v,就会得到v关于x的导数。
再Backprop,可以得到x关于v的导数。
(图中举例:二阶导数)

- Title: CS231N Lecture6 反向传播
- Author: Rongying Liu
- Created at : 2024-12-10 22:54:45
- Updated at : 2025-01-20 23:25:51
- Link: https://github.com/Roinnnn11/Roinnnn11.github.io/2024/12/10/CS231N/6 反向传播/
- License: This work is licensed under CC BY-NC-SA 4.0.