python中几种自动微分库解析


Posted in Python onAugust 29, 2019

前言

简单介绍下python的几个自动求导工具,tangent、autograd、sympy;

在各种机器学习、深度学习框架中都包含了自动微分,微分主要有这么四种:手动微分法、数值微分法、符号微分法、自动微分法,这里分别简单走马观花(hello world式)的介绍下下面几种微分框架;

sympy 强大的科学计算库,使用的是符号微分,通过生成符号表达式进行求导;求得的导数不一定为最简的,当函数较为复杂时所生成的表达式树异常复杂;

autograd自动微分先将符号微分用于基本的算子,带入数值并保存中间结果,后应用于整个函数;自动微分本质上就是图计算,容易做很多优化所以广泛应用于各种机器学习深度学习框架中;

tangent 为源到源(source-to-source)的自动微分框架,在计算函数f微分时他通过生成新函数f_grad来计算该函数的微分,与目前所存在的所有自动微分框架都有所不同;由于它是通过生成全新的函数来计算微分所以具有非常搞的可读性、可调式性这也是官方所说的与当前自动微分框架的重大不同;

sympy 求导

def grad():
   # 定义表达式的变量名称
   x, y = symbols('x y')
   # 定义表达式
   z = x**2 +y**2
   # 计算z关于y对应的偏导数
   return diff(z, y)
 func = grad()

输出结果表达式z的导函数z‘=2*y

print(func)

把y 等于6 带入计算 结果 为12

print(func.evalf(subs ={'y':3}))

Autograd求偏导

import autograd.numpy as np
 from autograd import grad
 #表达式 f(x,y)=x^2+3xy+y^2
 #df/dx = 2x+3y
 #df/dy = 3x+2y
 #x=1,y=2
 #df/dx=8
 #df/dy=7
 def fun(x, y):
  z=x**2+3*x*y+y**2
  return z
 fun_grad = grad(fun)
 fun_grad(2.,1.)

输出:7.0

tangent求导

import tangent
 def fun(x, y):
  z=x**2+3*x*y+y**2
  return z

默认为求z关于x的偏导数

dy_dx = tangent.grad(fun)

输出偏导数值为 8 ,z' = 2 * x,此处x传任何值都是一样的

df(4, y=1)

可通过使用wrt参数指定求关于某个参数的偏导数,下面为求z关于y的偏导数

df = tangent.grad(funs, wrt=([1]))

输出值为10 ,z' = 2 *y,此处x传任何值都是一样的

df(x=0, y=5)

上面说了那么多也没体现出tangent的核心:源到源(source-to-source)

在生成导函数的时候加入verbose=1参数,即可看到tangent为我们生成的用于计算导数的函数,默认情况下该值为0所以我们没感觉到tangent的求导与别的自动微分框架有什么区别;

def df(x):
   z = x**2
   return z
 df = tangent.grad(df, verbose=1)
 df(x=2)

在执行完上述代码后,我们看到了tangent为我们所生成用于求导数的函数:

def ddfdx(x, bz=1.0):
  z = x ** 2
  assert tangent.shapes_match(z, bz), 'Shape mismatch between return value (%s) and seed derivative (%s)' % (numpy.shape(z), numpy.shape(bz))
 # Grad of: z = x ** 2
 _bx = 2 * x * bz
 bx = _bx
 return bx

ddfdx函数就是所生成的函数,从中我们也可以看到表达式z的导函数z'=2 * x,tangent就是通过执行该函数用于求得导数的;

sympy 中的自动微分只是它强大的功能之一,autograd 从名字也可知它就是为了自动微分而生的,tangent初出茅庐2017年底Google才发布的自动微分方法也比较新颖,从17年发v0.1.8版本后也没见发版,源码更新也不够活跃;sympy、autograd比较成熟,tangent还有待观察;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python构造函数及解构函数介绍
Feb 26 Python
Python编程实现数学运算求一元二次方程的实根算法示例
Apr 02 Python
Python基于socket实现简单的即时通讯功能示例
Jan 16 Python
解决Python2.7中IDLE启动没有反应的问题
Nov 30 Python
浅谈python脚本设置运行参数的方法
Dec 03 Python
Python利用heapq实现一个优先级队列的方法
Feb 03 Python
详解Django+uwsgi+Nginx上线最佳实战
Mar 14 Python
关于keras中keras.layers.merge的用法说明
May 23 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
Jul 09 Python
Selenium及python实现滚动操作多种方法
Jul 21 Python
Visual Studio Code搭建django项目的方法步骤
Sep 17 Python
Python根据字典的值查询出对应的键的方法
Sep 30 Python
详解python中index()、find()方法
Aug 29 #Python
python同步两个文件夹下的内容
Aug 29 #Python
Python中 CSV格式清洗与转换的实例代码
Aug 29 #Python
详解如何在cmd命令窗口中搭建简单的python开发环境
Aug 29 #Python
python rsync服务器之间文件夹同步脚本
Aug 29 #Python
python-tornado的接口用swagger进行包装的实例
Aug 29 #Python
Python csv模块使用方法代码实例
Aug 29 #Python
You might like
编写PHP的安全策略
2006/10/09 PHP
php 批量生成html,txt文件的实现代码
2013/06/26 PHP
php通过Chianz.com获取IP地址与地区的方法
2015/01/14 PHP
PHP+JS实现大规模数据提交的方法
2015/07/02 PHP
php实现微信公众号无限群发
2015/10/11 PHP
Symfony2学习笔记之模板用法详解
2016/03/17 PHP
php数组函数array_walk用法示例
2016/05/26 PHP
Jquery选择器 $实现原理
2009/12/02 Javascript
概述jQuery中的ajax方法
2016/12/16 Javascript
JS+HTML5实现获取手机验证码倒计时按钮
2018/08/08 Javascript
jQuery 点击获取验证码按钮及倒计时功能
2018/09/20 jQuery
vue渲染方式render和template的区别
2020/06/05 Javascript
[36:33]完美世界DOTA2联赛循环赛 Matador vs Forest 第一场 11.06
2020/11/06 DOTA
pycharm 实现显示project 选项卡的方法
2019/01/17 Python
Python二叉搜索树与双向链表转换算法示例
2019/03/02 Python
Win10环境中如何实现python2和python3并存
2020/07/20 Python
梵蒂冈和罗马卡:Omnia Card Pass
2018/02/10 全球购物
万宝龙英国官网:Montblanc手表、书写工具、皮革和珠宝
2018/10/16 全球购物
什么是Rollback Segment
2013/04/22 面试题
介绍一下linux的文件权限
2012/02/15 面试题
路政管理专业个人自荐信范文
2013/11/30 职场文书
自我评价的范文
2014/02/02 职场文书
邻里守望志愿服务活动方案
2014/08/15 职场文书
自我管理的活动方案
2014/08/25 职场文书
2014副局长群众路线对照检查材料思想汇报
2014/09/22 职场文书
“向国旗敬礼”活动策划方案(4篇)
2014/09/27 职场文书
和谐家庭事迹材料
2014/12/20 职场文书
教师个人成长总结
2015/02/11 职场文书
公务员个人年终总结
2015/02/12 职场文书
2015年护士工作总结范文
2015/03/31 职场文书
捐款通知怎么写
2015/04/24 职场文书
瞿秋白纪念馆观后感
2015/06/10 职场文书
深入理解python协程
2021/06/15 Python
nginx结合openssl实现https的方法
2021/07/25 Servers
Python中基础数据类型 set集合知识点总结
2021/08/02 Python
vue+elementUI实现表格列的显示与隐藏
2022/04/13 Vue.js