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进行数据科学工作的简单入门教程
Apr 01 Python
Django中的“惰性翻译”方法的相关使用
Jul 27 Python
学习python 之编写简单乘法运算题
Feb 27 Python
Python数据类型详解(二)列表
May 08 Python
利用Python暴力破解zip文件口令的方法详解
Dec 21 Python
python入门前的第一课 python怎样入门
Mar 06 Python
Python实现的序列化和反序列化二叉树算法示例
Mar 02 Python
用python给自己做一款小说阅读器过程详解
Jul 11 Python
Django中的用户身份验证示例详解
Aug 07 Python
Python 实现网课实时监控自动签到、打卡功能
Mar 12 Python
pycharm部署、配置anaconda环境的教程
Mar 24 Python
Python如何使用PIL Image制作GIF图片
May 16 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利用header函数实现文件下载时直接提示保存
2009/11/12 PHP
PHP用身份证号获取星座和生肖的方法
2013/11/07 PHP
destoon利用Rewrite规则设置网站安全
2014/06/21 PHP
PHP消息队列用法实例分析
2016/02/12 PHP
PHP7新增运算符用法实例分析
2016/09/26 PHP
PHP单例模式简单用法示例
2017/06/23 PHP
PHP实现一个轻量级容器的方法
2019/01/28 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
2020/08/17 PHP
如何重写Laravel异常处理类详解
2020/12/20 PHP
用 JavaScript 迁移目录
2006/12/18 Javascript
Javascript 匿名函数及其代码模式原理
2010/03/19 Javascript
JS控制阿拉伯数字转为中文大写示例代码
2013/09/04 Javascript
js模拟hashtable的简单实例
2014/03/06 Javascript
JavaScript中检查对象property的存在性方法介绍
2014/12/30 Javascript
require.js+vue开发微信上传图片组件
2016/10/27 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
基于JavaScript实现无限加载瀑布流
2017/07/21 Javascript
js生成word中图片处理方法
2018/01/06 Javascript
JS中的防抖与节流及作用详解
2019/04/01 Javascript
4 种滚动吸顶实现方式的比较
2019/04/09 Javascript
配置node服务器并且链接微信公众号接口配置步骤详解
2019/06/21 Javascript
vue.js 实现a标签href里添加参数
2019/11/12 Javascript
vue+element获取el-table某行的下标,根据下标操作数组对象方式
2020/08/07 Javascript
[03:03]DOTA2校园争霸赛 济南城市决赛欢乐发奖活动
2013/10/21 DOTA
Python批量按比例缩小图片脚本分享
2015/05/21 Python
Python导入oracle数据的方法
2015/07/10 Python
python+splinter实现12306网站刷票并自动购票流程
2018/09/25 Python
Python3 导入上级目录中的模块实例
2019/02/16 Python
15个Pythonic的代码示例(值得收藏)
2020/10/29 Python
Interhome丹麦:在线预订度假屋和公寓
2019/07/18 全球购物
什么是Remote Module
2016/06/10 面试题
销售人员自我评价怎么写
2013/09/19 职场文书
孩子教育的心得体会
2014/09/01 职场文书
pyqt5打包成exe可执行文件的方法
2021/05/14 Python
Spring Security动态权限的实现方法详解
2022/06/16 Java/Android
nginx sticky实现基于cookie负载均衡示例详解
2022/12/24 Servers