umich cv-3-2

UMICH CV Neural Network

既然谈到神经网络,我们肯定要讨论在神经网络中是如何进行梯度的计算以及参数的优化的
传统的方法就是我们手动计算梯度,但是随着神经网络层数的增加,这种方法显然过于复杂
因此我们引入了计算图的概念,从一个简单的例子出发:
img
我们可以把一个(x+y)z的计算式拆分成上图所示,向前传播就是计算出我们的输出结果,一步步
而反向传播是为了计算梯度,比如说我们想要f对x,y,z的偏导
求f对y的偏导 我们可以根据链式法则来计算:
img
用专业的语言,我们要求下游梯度,现在我们在当前一个节点,可以很容易求出当前梯度,上游再将之前计算出的上游梯度传递给我们,我们就可以计算出下游梯度:
img

举一个更复杂的例子:
img
这里我们可以把中间sigmoid函数这一部分合并成为一个节点,直接用上游梯度,乘以计算得到的当前梯度,简化计算图的计算过程

计算图本身有些节点也存在着规律:
img
+节点,它们的下游节点梯度于上游节点梯度相等
*节点,它们下游节点梯度等于上游节点梯度乘以另一个下游节点的值
复制节点,下游节点梯度等于上游节点梯度之和
max节点,下游较大节点梯度于上游相等,较小节点为0

涉及到实际应用时,我们可以选择直接一步步实现前向传播钰反向:
img
也可以写成模块化的形式:
img

上面讨论的都是针对一个数的梯度计算过程,我们还需要把它推广到矩阵与向量,首先需要一点矩阵/向量之间的微分知识:
img

向量反向传播:
img
img
只有对角线上元素有关系,所以除了对角线其它元素均为0,在对角线上的元素,由于是max函数,所以大于0的和对y求导的值相等,小于0的值为0
注意到这个矩阵绝大多数的数均为0,所以我们在具体实现的时候不要直接用矩阵来进行乘法,可以直接应用我们的推理结果:
img

矩阵反向传播:
img
显然当地矩阵非常大,我们不可能直接去用矩阵来进行乘法运算:
img
img
img
我们根据定义去求dy/dx1,1,可以发现最终数值等于w矩阵的第一行,最终结果可以换成下图所示形式
img
我们也可以通过矩阵的形状去记忆,最终结果是一个ND的矩阵,所以要乘以一个MD的矩阵,就是W的转置

在作业中我们要实现两层神经网络的前向传播与反向传播,前向传播比较简单直接计算即可,反向传播分为两步
score = W2h1+b2
根据softmax损失函数的定义梯度,我们可以计算出dL/dscore,再根据之前推导,dL/dw2 = dL/dscore * dscore/dw2 = h1.t() * dL/dscore
dL/dh1 = dL/dscore * w2.t()
dL/db2 = dL/dscore,偏置项这里的梯度计算就是累和,注意维度一致
同样h1 = W1
x+b1 也可以这样计算

反向传播也可以计算高阶导数,只需要把低阶导数作为计算图的一部分,然后反向传播即可
img

posted @ 2023-10-14 16:40  dyccyber  阅读(36)  评论(0编辑  收藏  举报