CS231N Lecture6 反向传播

Rongying Liu 课程

Lecture6–反向传播

如何为神经网络计算梯度?

bad idea:在纸上推导

better:计算图

以svm loss举例

蓝色节点:x与W的矩阵乘法

红色节点:铰链损失(针对SVMloss)

绿色:正则化项

相加得到L(loss)

image

Backpropagation 反向传播

构成:

1.Forward pass “前向传递”计算输出值

2.backward pass “反向传递”计算每个参数的导数

下游梯度 = 局部梯度 x 上游梯度

image

优点:

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

image

全局图be like:

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

image

梯度流动时一些有趣的pattern:

加法:downstream gradient = upstream gradient

复制:downstream gradient = sum(upstream gradient)

乘法:“交换”downstream gradient = other diwnstream gradient * upstream

max:最大值downstream = upstream,其余downstream=0(不常见)

image

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

image

由于只考虑upstream和downstream的关系,Jocobian矩阵将会是一个非常大的稀疏矩阵只有对角线上元素可能不为0.所以在使用中,从来不会真正形成矩阵,而是对其隐式表达

如下图,对RELU函数,可以理解为:

根据input符号,决定downstream是0还是具体值

image

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

image

简化求解反向传播

推导:分解问题,尝试对每个x的导数求解

如图,dL/dx1,1 = (dy/dx1,1)(dL/dy)

计算dy/dx1,1,发现其为第一行等于权重矩阵第一行,其余行为0的矩阵;

所以,dL/dx1,1等于权重第一行与dL/dy第一行的内积;

其他同理。

image

最后推得关系式如下:dL/dx = (dL/dy)wT

(详细证明:http://cs231n.stanford.edu/handouts/linear-backprop.pdf)

image

另一个观点:反向自动微分

反向自动微分

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

image

前向自动微分

image

缺点:前向不被大框架支持;不好用

反向传播另一个功能:求高阶导数

(比如计算hessian矩阵)

使用反向传播扩展计算图。在计算loss之后,使用f2’计算梯度相对于x1的损失,用f1’计算loss相对于x0的损失(f1’\f2’是f的反向传递)

再点积向量 v,就会得到v关于x的导数。

再Backprop,可以得到x关于v的导数。

(图中举例:二阶导数)

image

  • 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.
Comments