ND4J自动微分

  一、前言
  
  ND4J从beta2开始就开始支持自动微分,不过直到beta4版本为止,自动微分还只支持CPU,GPU版本将在后续版本中实现。
  
  本篇博客中,我们将用ND4J来构建一个函数,利用ND4J SameDiff构建函数求函数值和求函数每个变量的偏微分值。
  
  二、构建函数
  
  构建函数和分别手动求偏导数
  
  给定一个点(2,3)手动求函数值和偏导,计算如下:
  
  f=2+3*4+3=17,f对x的偏导:1+2*2*3=13,f对y的偏导:4+1=5
  
  三、通过ND4J自动微分来求
  
  完整代码
  
  package org.nd4j.samediff;
  
  import org.nd4j.autodiff.samediff.SDVariable;
  
  import org.nd4j.autodiff.samediff.SameDiff;
  
  import org.nd4j.linalg.factory.Nd4j;
  
  /**
  
  *
  
  * x+y*x2+y
  
  *
  
  */
  
  public class Function {
  
  public static void main(String[] args) {
  
  //构建SameDiff实例
  
  SameDiff sd=SameDiff.create();
  
  //创建变量x、y
  
  SDVariable x= sd.var("x");
  
  SDVariable y=sd.var("y");
  
  //定义函数
  
  SDVariable f=x.add(y.mul(sd.math().pow(x, 2)));
  
  f.add("addY",y);
  
  //给变量x、y绑定具体值
  
  x.setArray(Nd4j.create(new double[]{2}));
  
  y.setArray(Nd4j.create(new double[]{3}));
  
  //前向计算函数的值
  
  System.out.println(sd.exec(null, "addY").get("addY"));
  
  //后向计算求梯度
  
  sd.execBackwards(null);
  
  //打印x在(2,3)处的导数
  
  System.out.println(sd.getGradForVariable("x").getArr());
  
  //x.getGradient(www.chengmingyuLe.com ).getArr()和sd.getGradForVariable("x").getArr()等效
  
  System.out.println(x.getGradient().getArr());
  
  //打印y在(2,3)处的导数
  
  System.out.println(sd.getGradForVariable("www.liwanxia.cn").getArr());
  
  }
  
  }
  
  四、运行结果
  
  o.n.l.f.Nd4jBackend - Loaded [CpuBackend] backend
  
  o.n.n.NativeOpsHolder - Number of threads used for NativeOps: 4
  
  o.n.n.Nd4jBlas - Number of www.guochengzy.com threads used for BLAS: 4
  
  o.n.l.a.o.e.DefaultOpExecutioner -www.zykuaican.com Backend used: [www.fdhhjyo.com CPU]; OS: [Windows 10]
  
  o.n.l.a.o.e.DefaultOpExecutioner - Cores: [8]; Memory: [3.2GB];
  
  o.n.l.a.o.e.DefaultOpExecutioner - Blas vendor: [MKL]
  
  17.0000
  
  o.n.a.s.SameDiff - Inferring output "addY" as loss variable as none were previously set. Use SameDiff.setLossVariables() to override
  
  13.0000
  
  13.0000
  
  5.0000
  
  结果为17、13、5和手动求出的结果完全一致。
  
  自动微分屏蔽了deeplearning在求微分过程中的很多细节,特别是矩阵求导、矩阵范数求导等等,是非常麻烦的,用自动微分,可以轻松实现各式各样的网络结构。

原文地址:https://www.cnblogs.com/qwangxiao/p/10921920.html

时间: 2024-11-09 07:27:48

ND4J自动微分的相关文章

附录D——自动微分(Autodiff)

本文介绍了五种微分方式,最后两种才是自动微分. 前两种方法求出了原函数对应的导函数,后三种方法只是求出了某一点的导数. 假设原函数是$f(x,y) = x^2y + y +2$,需要求其偏导数$\frac{\partial f}{\partial x}$和$\frac{\partial f}{\partial y}$,以便应用于梯度下降等算法. 1.手工求导 该方法比较简单,就是自备纸笔,应用基本的求导规则,以及链式求导法则,人工求导.缺点是对于复杂函数容易出错.幸运的是,这一计算过程可由计算机

PyTorch自动微分基本原理

序言:在训练一个神经网络时,梯度的计算是一个关键的步骤,它为神经网络的优化提供了关键数据.但是在面临复杂神经网络的时候导数的计算就成为一个难题,要求人们解出复杂.高维的方程是不现实的.这就是自动微分出现的原因,当前最流行的深度学习框架如PyTorch.Tensorflow等都提供了自动微分的支持,让人们只需要很少的工作就能神奇般地自动计算出复杂函数的梯度. PyTorch的autograd简介 Tensor是PyTorch实现多维数组计算和自动微分的关键数据结构.一方面,它类似于numpy的nd

(转)自动微分(Automatic Differentiation)简介——tensorflow核心原理

现代深度学习系统中(比如MXNet, TensorFlow等)都用到了一种技术——自动微分.在此之前,机器学习社区中很少发挥这个利器,一般都是用Backpropagation进行梯度求解,然后进行SGD等进行优化更新.手动实现过backprop算法的同学应该可以体会到其中的复杂性和易错性,一个好的框架应该可以很好地将这部分难点隐藏于用户视角,而自动微分技术恰好可以优雅解决这个问题.接下来我们将一起学习这个优雅的技术:-).本文主要来源于陈天奇在华盛顿任教的课程CSE599G1: Deep Lea

Autograd:自动微分

Autograd 1.深度学习的算法本质上是通过反向传播求导数,Pytorch的Autograd模块实现了此功能:在Tensor上的所有操作,Autograd都能为他们自动提供微分,避免手动计算导数的复杂过程. 2.autograd.Variable是Autograd中的核心类,它简单的封装了Tensor,并支持几乎所有Tensor操作:Tensor被封装为Variable之后,可以调用它的.backward()实现反向传播,自动计算所有的梯度. 3.Variable主要包含三个属性: data

【PyTorch深度学习60分钟快速入门 】Part2:Autograd自动化微分

在PyTorch中,集中于所有神经网络的是autograd包.首先,我们简要地看一下此工具包,然后我们将训练第一个神经网络. autograd包为张量的所有操作提供了自动微分.它是一个运行式定义的框架,这意味着你的后向传播是由你的代码运行方式来定义的,并且每一个迭代都可以是不同的. 下面,让我们使用一些更简单的术语和例子来解释这个问题. 0x01 变量(Variable) autograd.Variable是autograd包的核心类,它封装了一个张量,并支持几乎所有在该张量上定义的操作.一旦完

如何计算微分

Ceres为google开源非线性优化库. 计算微分方法 符号微分  Analytic Derivative 数值微分  Numeric Derivative Forward Difference Central Difference Ridders’ Method 自动微分Automatic Derivative 自动微分可以精确快速的算出微分值. 1 // Ceres Solver - A fast non-linear least squares minimizer 2 // Copyri

python中几种自动微分库

简单介绍下python的几个自动求导工具,tangent.autograd.sympy: 在各种机器学习.深度学习框架中都包含了自动微分,微分主要有这么四种:手动微分法.数值微分法.符号微分法.自动微分法,这里分别简单走马观花(hello world式)的介绍下下面几种微分框架: sympy 强大的科学计算库,使用的是符号微分,通过生成符号表达式进行求导:求得的导数不一定为最简的,当函数较为复杂时所生成的表达式树异常复杂: autograd自动微分先将符号微分用于基本的算子,带入数值并保存中间结

ML简史

原文地址:http://www.52ml.net/15427.html 图 1 机器学习时间线 在科学技术刚刚萌芽的时候,科学家Blaise Pascal和Von Leibniz就想到了有朝一日能够实现人工智能.即让机器拥有像人一样的智能. 机器学习是AI中一条重要的发展线,在工业界和学术界都异常火爆.企业.大学都在投入大量的资源来做机器学习方面的研究.最近,机器学习在很多任务上都有了重大的进步,达到或者超越了人类的水平(例如,交通标志的识别[1],ML达到了98.98%,已超越了人类). 图1

TensorFlow 101 | 原理与概念

"控制复杂性是计算机编程的本质" TensorFlow是当今主流的深度学习框架之一,开源社区也在不断推动着它的发展中.网上(包括官方网站)有大量的教程可供参考,而本系列更多尝试从底层和应用角度对TensorFlow框架进行下梳理,首先是原理与概念介绍. 使用TensorFlow框架实现神经网络计算的基本原理是将计算的定义与执行相互分离,其中计算通过数据流图定义,会话执行数据流图上的操作.数据流图定义了整个计算过程,具有节省计算资源.便于自动微分计算.以及CPU/GPU并行.可视化直观等