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 相关文章推荐
Python2.5/2.6实用教程 入门基础篇
Nov 29 Python
使用PYTHON创建XML文档
Mar 01 Python
Python中map和列表推导效率比较实例分析
Jun 17 Python
Python编程中的异常处理教程
Aug 21 Python
听歌识曲--用python实现一个音乐检索器的功能
Nov 15 Python
python方向键控制上下左右代码
Jan 20 Python
Python实现性能自动化测试竟然如此简单
Jul 30 Python
Python3使用PySynth制作音乐的方法
Sep 09 Python
复化梯形求积分实例——用Python进行数值计算
Nov 20 Python
python使用配置文件过程详解
Dec 28 Python
新手学python应该下哪个版本
Jun 11 Python
Python中glob库实现文件名的匹配
Jun 18 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
基于文本的留言簿
2006/10/09 PHP
smarty模板中拼接字符串的方法
2014/02/14 PHP
php阻止页面后退的方法分享
2014/02/17 PHP
PHP使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
PHP会话处理的10个函数
2015/08/11 PHP
php生成4位数字验证码的实现代码
2015/11/23 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
2016/05/07 PHP
php日期操作技巧小结
2016/06/25 PHP
PHP编写daemon process详解及实例代码
2016/09/30 PHP
php获取flash尺寸详细数据的方法
2016/11/12 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
JavaScript.The.Good.Parts阅读笔记(一)假值与===运算符
2010/11/16 Javascript
基于jquery的设置页面文本框 只能输入数字的实现代码
2011/04/19 Javascript
js 三级关联菜单效果实例
2013/08/13 Javascript
jquery $(this).attr $(this).val方法使用介绍
2013/10/08 Javascript
javascript学习笔记(三)BOM和DOM详解
2014/09/30 Javascript
JS实现统计复选框选中个数并提示确定与取消的方法
2015/07/01 Javascript
jquery判断当前浏览器的实现代码
2015/11/07 Javascript
如何用JS判断两个数字的大小
2016/07/21 Javascript
Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)
2017/01/20 Javascript
JavaScript实现创建自定义对象的常用方式总结
2018/07/09 Javascript
详解Ant Design of React的安装和使用方法
2018/12/27 Javascript
vue组件中watch props根据v-if动态判断并挂载DOM的问题
2019/05/12 Javascript
基于JavaScript 实现拖放功能
2019/09/12 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
js实现点击上传图片并设为模糊背景
2020/08/02 Javascript
python使用rabbitmq实现网络爬虫示例
2014/02/20 Python
Python 3.9的到来到底是意味着什么
2020/10/14 Python
浅析HTML5:'data-'属性的作用
2018/01/23 HTML / CSS
KLOOK客路:发现更好玩的世界,预订独一无二的旅行体验
2016/12/16 全球购物
工艺员岗位职责
2014/02/11 职场文书
学习保证书范文
2014/04/30 职场文书
《水上飞机》教学反思
2016/02/20 职场文书
总结一些Java常用的加密算法
2021/06/11 Java/Android
Python访问Redis的详细操作
2021/06/26 Python
PyMongo 查询数据的实现
2021/06/28 Python