当前位置: 首页 > news >正文

郑州网站推广外包深圳怎么注册公司

郑州网站推广外包,深圳怎么注册公司,网站seo优化价格,共享办公wework2.1 计算梯度的数值方法第一次实验我留的一个课后作业里问你是否能够想出一个求解梯度的办法#xff0c;其实不难想到一种简单的办法就是使用“数值法”计算梯度。办法很简单#xff0c;就是对于损失函数中的一个初始取值为a0的参数a,先计算当前的损失函数值J0,再保持其他参数…2.1 计算梯度的数值方法第一次实验我留的一个课后作业里问你是否能够想出一个求解梯度的办法其实不难想到一种简单的办法就是使用“数值法”计算梯度。办法很简单就是对于损失函数中的一个初始取值为a0的参数a,先计算当前的损失函数值J0,再保持其他参数不变而使a改变一个很小的量比如变成a00.000001,再求改变之后的损失函数值J1。然后(J1-J0)/0.000001就是J对于a的偏导的近似值。我们对每一个参数采用类似的方法求偏导最后将偏导的值组成一个向量即为梯度向量。这个办法看上去很简单但却无法应用在实际的神经网络当中。一方面的原因是我们很难知道对参数的改变有多小才算足够小即我们很难保证最后求出的梯度是准确的。另一方面的原因是这种方法计算量太大现在的神经网络中经常会有上亿个参数而这里每求一个分量的偏导都要把所有参数值代入损失函数求两次损失函数值而且每个分量都要执行这样的计算。相当于每计算一次梯度需要2x1亿x1亿次计算而梯度下降算法又要求我们多次(可能是上万次)计算梯度。这样巨大的计算量即使是超级计算机也很难承受(世界第一的“神威·太湖之光”超级计算机峰值性能为12.5亿亿次/秒每秒也只能计算大概6次梯度)。所以我们需要更加高效准确的算法来计算梯度而反向传播算法正好能满足我们的需求。2.2 “计算图(compute graph)”与链式法则其实如果你已经理解了链式法则那么可以说你几乎已经学会反向传播算法了。让人感到很愉快对不对好像什么都还没做我们就已经掌握了一个名字看起来有些吓人的算法。为了帮助我们真正理解反向传播算法我们先来看一下什么是“计算图”我们以第一次实验提到的sigmoid函数为例:它的计算图是这样的此处输入图片的描述我们将sigmoid函数视为一个复合函数并将其中的每一个子函数都视为一个节点每个节点按照复合函数实际的运算顺序链接起来最终得到的F其实就是sigmoid函数本身。根据求导法则我们可以求得每一个节点对它直接子节点的导函数此处输入图片的描述最重要的地方来了再根据求导链式法则我们现在可以轻易写出图中任意一个高层节点对其任意后代节点的导函数只需要把连接它们的路径上的所有部分导函数都乘起来就可以了。比如dF/dC(dF/dE)(dE/dC)(-1/E^2)1-1/E^2dF/dA(dF/dE)(dE/dC)(dC/dB)(dB/dA)(-1/E^2)(1)(e^B)(-1)e^B/E^22.3 反向传播算法到这里反向传播算法已经呼之欲出了对于一个具体的参数值我们只需要把每个节点的值代入求得的导函数公式就可以求得导数(偏导数)进而得到梯度。这很简单我们先从计算图的底部开始向上逐个节点计算函数值并保存下来。这个步骤叫做前向计算(forward)。然后我们从计算图的顶部开始向下逐步计算损失函数对每个子节点的导函数代入前向计算过程中得到的节点值得到导数值。这个步骤叫做反向传播(backward)或者更明确一点叫做反向梯度传播。我们来具体实践一下对于上图中的sigmoid函数计算x0时的导数前向计算A0, B0, C1, D1, E2, F-1/4反向传播dF/dE-1/E^2-1/2^2-1/4dF/dCdF/dEdE/dC-1/4dF/dBdF/dCdC/dB-1/4e^B-1/41-1/4dF/dAdF/dBdB/dA-1/4(-1)1/4以上就是反向传播算法的全部内容。对于有1亿个参数的损失函数我们只需要2*1亿次计算就可以求出梯度。复杂度大大降低速度将大大加快。2.4 将sigmoid视为一个整体sigmoid函数中没有参数在实际的神经网络中我们都是将sigmoid函数视为一个整体来对待没必要求它的内部节点的导函数。sigmoid函数的导函数是什么呢你可以自己求导试试实际上sigmoid(x)sigmoid(x)*(1-sigmoid(x))。2.5 反向传播算法--动手实现激动人心的时刻到了我们终于要开始用python代码实现深度神经网络的过程这里我们打算对第一次实验中的神经网络示例图中的“复合函数”编写反向传播算法。不过为了循序渐进我们考虑第一层(输入层)只有两个节点第二层只有一个节点的情况即如下图此处输入图片的描述注意我们将sigmoid函数图像放在了b1节点后面代表我们这里对b1运用sigmoid函数得到了最终的输出h1。如果你对自己比较有信心可以不看接下来实现的代码自己动手试一试。我们可以先把图中包含的函数表达式写出来方便我们之后写代码参考b1w11a1w12a2bias1h1sigmoid(b1)h1sigmoid(w11a1w12a2bias1)现在我们创建bp.py文件开始编写代码。先来编写从第一层到第二层之间的代码import numpy as npclass FullyConnect:def init(self, l_x, l_y): # 两个参数分别为输入层的长度和输出层的长度self.weights np.random.randn(l_y, l_x) # 使用随机数初始化参数self.bias np.random.randn(1) # 使用随机数初始化参数def forward(self, x):self.x x # 把中间结果保存下来以备反向传播时使用self.y np.dot(self.weights, x) self.bias # 计算w11*a1w12*a2bias1return self.y # 将这一层计算的结果向前传递def backward(self, d):self.dw d * self.x # 根据链式法则将反向传递回来的导数值乘以x得到对参数的梯度self.db dself.dx d * self.weightsreturn self.dw, self.db # 返回求得的参数梯度注意这里如果要继续反向传递梯度应该返回self.dx注意在神经网络中我们将层与层之间的每个点都有连接的层叫做全连接(fully connect)层所以我们将这里的类命名为FullyConnect。上面的代码非常清楚简洁我们的全连接层完成了三个工作随机初始化网络参数根据x计算这层的输出y并前向传递给下一层运用求导链式法则将前面的网络层向后传递的导数值与本层的相关数值相乘得到最后一层对本层参数的梯度。注意这里如果要继续反向传递梯度(如果后面还有别的层的话)backward()应该返回self.dx然后是第二层的输入到最后的输出之间的代码也就是我们的sigmoid层class Sigmoid:def init(self): # 无参数不需初始化passdef sigmoid(self, x):return 1 / (1 np.exp(x))def forward(self, x):self.x xself.y self.sigmoid(x)return self.ydef backward(self): # 这里sigmoid是最后一层所以从这里开始反向计算梯度sig self.sigmoid(self.x)self.dx sig * (1 - sig)return self.dx # 反向传递梯度由于我们要多次使用sigmoid函数所以我们单独的把sigmoid写成了类的一个成员函数。我们这里同样完成了三个工作。只不过由于Sigmoid层没有参数所以不需要进行参数初始化。同时由于这里需要反向传播梯度所以backward()函数必须返回self.dx把上面的两层拼起来就完成了我们的总体的网络结构def main():fc FullyConnect(2, 1)sigmoid Sigmoid()x np.array([[1], [2]])print weights:, fc.weights, bias:, fc.bias, input: , x# 执行前向计算y1 fc.forward(x)y2 sigmoid.forward(y1)print forward result: , y2# 执行反向传播d1 sigmoid.backward()dx fc.backward(d1)print backward result: , dxif name main:main()请你自行运行上面的代码并修改输入的x值。观察输出的中间值和最终结果并手动验证我们计算的梯度是否正确。此处输入图片的描述如果你发现你不知道如何手动计算验证结果那说明你还没有理解反向传播算法的原理请回过头去再仔细看一下之前的讲解。这里给出完整代码的下载链接但我还是希望你能尽量自己尝试写出代码至少自己动手将上面的代码重新敲一遍。这样学习效果会好得多。完整代码文件下载上面的代码将每个网络层写在不同的类里并且类里面的接口都是一致的(forward 和 backward)这样做有很多好处一是最大程度地降低了不同模块之间的耦合程度如果某一个层里面的代码需要修改则只需要修改该层的代码就够了不需要关心其他层是怎么实现的。另一方面可以完全自由地组合不同的网络层(我们最后会介绍神经网络里其他种类的网络层)。实际上目前很多用于科研和工业生产的深度学习框架很多都是采用这种结构你可以找一个深度学习框架(比如caffe)看看它的源码你会发现里面就是这样一个个写好的网络层。三、实验总结本次实验我们完全地掌握了梯度下降算法中的关键--反向传播算法。至此神经网络中最基本的东西你已经全部掌握了。你现在完全可以自己尝试构建神经网络并使用反向传播算法优化网络中的参数。如果你把到此为止讲的东西差不多都弄懂了那非常恭喜你你应该为自己感到骄傲。如果你暂时还有些东西没有理解不要气馁回过头去仔细看看到网上查查资料如果实在无法理解问问我们实验楼的助教我相信你最终也能理解。本次实验我们学习了使用计算图理解反向传播算法层次化的神经网络结构四、课后作业[选做]请你自己尝试将我们上面实现的第二层网络的节点改为2个(或多个)注意这里涉及到对矩阵求导如果你没学过相关知识可能无法下手。
http://www.huolong8.cn/news/147036/

相关文章:

  • 网站建设和托管哪家好电商网站 支付
  • 视频播放类网站建设费用微信公众平台小程序登录
  • 网站seo置顶免费公司logo设计
  • 企查查在线查询入口南昌seo计费管理
  • 重庆网领网站建设公司千华网鞍山门户网站
  • 北京正规网站建设比较传扬互动网站建设公司
  • 天津本地网站网站改成自适应
  • 企业网站备案审核需要多长时间河北省城乡住房和建设厅网站
  • 怎么做淘客的网站做家政有什么网站做推广好
  • 360网站图标怎么做的昆明做网站费用
  • 域名跟网站的区别网站收录少的原因
  • 广州建站公司有哪些怎么做自己网站
  • 做产品网站建设企业网站 seo怎么做
  • 网站模版建设工具大学网页设计作业
  • 甘肃网站备案网络服务商在哪咨询
  • 网站建设需要精通什么知识汝阳建设局网站
  • jquery做网站浏览量徐州企业建站系统模板
  • 做样子的网站河源新闻最新消息
  • 做家务的男人们在哪个网站播出开发一个平台
  • 怎样提高网站打开速度慢做做同城网站好还是做垂直网站好
  • 哪个汽车网站好泸县城乡住房建设厅网站
  • 关于成立网站建设项目小组的通知黄岩网站制作
  • 网站项目团队介绍深圳企业电话黄页
  • 个人 备案 多个网站吗做任务赚佣金的平台
  • 怎么用esc服务器做网站手机网站打不开是什么原因造成的
  • 哪个网站做系统好江苏推广网站建设业务
  • 濮阳网站建设哪家好wordpress如何加视频
  • 网站找人做备案的价格注册建设通网站
  • 建设安全协会网站如何用wordpress建一个网站
  • 网站域名被黑wordpress isset