首页 > 生活

梯度是如何计算的

更新时间:2025-05-15 23:26:32 阅读: 评论:0

欢迎交流与转载,文章会同步发布在公众号:机器学习算法全栈工程师(Jeemy110)

引言

深度学习模型的训练本质上是一个优化问题,而常采用的优化算法是梯度下降法(GD)。对于GD算法,最重要的就是如何计算梯度。此时,估计跟多人会告诉你:采用BP(backpropagation)算法,这没有错,因为神经网络曾经的一大进展就是使用BP算法计算梯度提升训练速度。但是从BP的角度,很多人陷入了推导公式斐济是哪个国家的深渊。如果你学过微积分,我相信你一定知道如何计算梯度,或者说计算导数。对于深度网络来说,其可以看成多层非线性函数的堆积,即:

ou高度戒备tput=f_{n}(\theta _{n}, f_{n-1}(\theta _{n-1},...))

而我们知道深度学习模型的优化目标L一般是ou第一生产力tput的函数,如果要你求L关于各个参数的导数,你会不假思索地想到:链式法则。因为output是一个复合函数。在微洪战辉积分里面,求解复合函数的导数采用链式法则再合适不过了。其实本质上BP算法就是链式法则的一个调用。让我们先忘记BP算法,从链式法则开始说起。

链式法则

链式法则无非是将一个复杂的复合函数从上到下逐层求导,比如你要求导式子:f(x,y,z)=(x+y)(x+z)。当然这个例子是足够简单的,但是我们要使用链式法则的方式来求导。首先可以将f(x,y,z)看成两个函数p(x,y)=(x+y)与q(x,z)=(x+z)的复合:f=pq。假如你要求df/dz,首先我们先要求出df/dp与df/dq。很显然,df/dp=q,df/dq=p。然后要求d凤凰传奇解散p/dx与dq/dx,显然,dp/dx=1.0,dq/dx=1.0。这个时候已经求到最底层了,可以利用链式法则求出最终的结果了:df/dx=(df/dp)(dp/dx)+(df/dq)(dq/dx)=q笔记版+p。同样的方法,可以求出:df/dy=q,df/dz=p。如果大家细致观察的话,可以看到要求出最终的导数,你需要计算出中间结果:p与q。计算中间结果的过程一般是前向(forward)过程,然后再反向(backward)计算出最终的导数。过程如下:

# 输入x, y, z = -3, 2, 5# 执行前向过程p = x + y # p = -1q = x + z # q = 2# 执行反向过程计算梯度# 第一个层反向:f = pqdfdp = q # df/dp = 名古屋大学排名2dfdq = p # df/dq = -1# 第二个层反向,并累计第一层梯度:p = x + y, q = x +白驼山庄 zdfdx = 1.0 * dfdp + 1.0 * dfdq # df/dx = 1dfdy = 1.0 * dfdp # df/dy = 2dfdz = 1.0 * dfdq # df/dz = -1

上面的一个过程就是BP算法,包含两个过程:前向(forward)过程与反向(backword)过程。前向过程是从输入计算得富德生命人寿保险到输出,而反向过程就是一个梯度累积的过程,或者说是BP,即误差反向传播。这就是BP的思想。上面的例子应该是比较简单的,而对于深度学习模型来说,其只不过是函数复杂一点罢了,但是如果你严格按照链式法威士忌杯则来去推导,只要你会基本求导方法,应该都不是什么难事了。

矩阵运算

其实对于深度学习模型来说,其运算都是基于矩阵运算的。对于新手来说,矩阵运算的求导可能会是一件比较头疼的事。其实矩阵运算求导是一个纸老虎。对于元素级的矩阵运算来说,比如激活函数这种,你完全可以把看成普通的求导。但是对于矩阵乘法,你需要特别注意,这里先抛出例子:

import numpy as np# 前向过程W = np.random.randn(5, 10)X = np.random.randn(10, 3)D = W.dot(X)# 反向过程dD = np.random.randn(*D.shape) # 这里假定dD是后面传播过来的梯度项dW = dD.dot(X.T) dX = W.T.dot(dD)

如果你认真推导的话,是可以得到上面的结果的。但是这里有其它捷径。对于两个矩阵相乘的话,在反向传播时反正是另外一个项与传播过来的梯度项相乘。差别就在于位置以及翻转。这里有个小窍门,就是最后计算出梯度肯定要与原来毛果芸香碱的矩阵是同样的shape。那么这就容易了,反正定婚戒指组合不多。比如你要计算dW,你知道要用dD与X两个矩阵相乘就可以得到。W的shape是[5,10],而dD的shape是[5,3],X的shape是[10,3]。要保证dW与W的shape一致,好吧,此时只能用dD.dot(X.T),真的没有其它选择了,那这就是对了。

活学活用:实现一个简单的食品安全小报神经网络

上面泡学网我们讲了链式法则,也讲了BP的思想,并且也讲了如何对矩q245r钢板阵运算求梯度。下面我们基于Python中的Numpy库实现一个简单的神经网络模型,代码如下:

"""一个简单两层神经网络回归模型"""import numpy as np# batch sizeN = 32# 输入维度D = 100# 隐含层单元数H = 200# 输出维度O = 10# 训练样本(这里随机生成)X = np.random.randn(N, D)y = np.random.randn(N, O)# 初始化参数W1 = np.random.randn(D, H)b1 = np.zeros((H,))W2 = np.random.randn(H, O)b2 = np.zeros((O,))# 训练参数learning_rate = 1e-02iterations = 200# 训练过程for t in range(iterations): # 前向过程 h = X.dot(W1) + b1 h_relu = np.maximum(h, 0) 科隆大教堂pred = h_relu.dot(W2) + b2 # 定义loss,采用电动车淋雨均方差 loss = np.sum(np.square(y - pred)) print("Iteration %d loss: %f" % (t, loss)) # 反向过程计算梯度 dpred = 2.0 * (pred - y) db2 = np.sum(dpred, axis=0) dW2 = h_re梁博演唱会lu.T.dot(dpred) dh_relu = db2.dot(W2.T) dh = (h > 0) * dh_relu db1 = np.sum(dh, axis=0) dW1 = X.T.dot(dh) # SGD更新梯度 params = [W1, b1, W2, b2] grads = [dW1, db1, dW2, db2] for p, g in zip(params, grads): p += -learning_rate * g总结卧推

这里我们简单介绍了梯度下降法中最重要的一部分,就是如何计算易胜博官网梯度。相信通过本文,大家对BP算法以及链式法则有更深刻的理解。

参考资料

cs231n教程

欢迎交流与转载,文章会同步发布在公众号:机器学习算法全栈工程师(Jeemy110)

本文发布于:2023-05-31 22:36:20,感谢您对本站的认可!

本文链接:http://www.ranqi119.com/ge/85/166844.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:梯度
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 站长QQ:55-9-10-26|友情:优美诗词|电脑我帮您|扬州装修|369文学|学编程|软件玩家|水木编程|编程频道