UMICH CV Neural Network
既然谈到神经网络,我们肯定要讨论在神经网络中是如何进行梯度的计算以及参数的优化的
传统的方法就是我们手动计算梯度,但是随着神经网络层数的增加,这种方法显然过于复杂
因此我们引入了计算图的概念,从一个简单的例子出发:
我们可以把一个(x+y)z的计算式拆分成上图所示,向前传播就是计算出我们的输出结果,一步步
而反向传播是为了计算梯度,比如说我们想要f对x,y,z的偏导
求f对y的偏导 我们可以根据链式法则来计算:
用专业的语言,我们要求下游梯度,现在我们在当前一个节点,可以很容易求出当前梯度,上游再将之前计算出的上游梯度传递给我们,我们就可以计算出下游梯度:
举一个更复杂的例子:
这里我们可以把中间sigmoid函数这一部分合并成为一个节点,直接用上游梯度,乘以计算得到的当前梯度,简化计算图的计算过程
计算图本身有些节点也存在着规律:
+节点,它们的下游节点梯度于上游节点梯度相等
*节点,它们下游节点梯度等于上游节点梯度乘以另一个下游节点的值
复制节点,下游节点梯度等于上游节点梯度之和
max节点,下游较大节点梯度于上游相等,较小节点为0
涉及到实际应用时,我们可以选择直接一步步实现前向传播钰反向:
也可以写成模块化的形式:
上面讨论的都是针对一个数的梯度计算过程,我们还需要把它推广到矩阵与向量,首先需要一点矩阵/向量之间的微分知识:
向量反向传播:
只有对角线上元素有关系,所以除了对角线其它元素均为0,在对角线上的元素,由于是max函数,所以大于0的和对y求导的值相等,小于0的值为0
注意到这个矩阵绝大多数的数均为0,所以我们在具体实现的时候不要直接用矩阵来进行乘法,可以直接应用我们的推理结果:
矩阵反向传播:
显然当地矩阵非常大,我们不可能直接去用矩阵来进行乘法运算:
我们根据定义去求dy/dx1,1,可以发现最终数值等于w矩阵的第一行,最终结果可以换成下图所示形式
我们也可以通过矩阵的形状去记忆,最终结果是一个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 = W1x+b1 也可以这样计算
反向传播也可以计算高阶导数,只需要把低阶导数作为计算图的一部分,然后反向传播即可
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容