python中几种自动微分库解析
作者:AiFly 发布时间:2022-12-20 18:24:02
前言
简单介绍下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还有待观察;
来源:https://www.cnblogs.com/softlin/p/11427390.html


猜你喜欢
- 爬虫是大家公认的入门Python最好方式,没有之一。虽然Python有很多应用的方向,但爬虫对于新手小白而言更友好,原理也更简单,几行代码就
- 前言学完语法和正在学习语法的时候,我们可以在空闲的时候,写几个简单的小项目,今天我们就用最基础的语法看两个实战语法练习猜数字游戏项目游戏说明
- 什么是SQL 指令植入式攻击?在设计或者维护Web网站时,你也许担心它们会受到某些卑鄙用户的恶意攻击。的确,如今的Web网站开发者们针对其站
- 在讲解 seek() 函数和 tell() 函数之前,首先来了解一下什么是文件指针。我们知道,使用 open() 函数打开文件并读取文件中的
- 获取单输入尺寸,该层只被使用了一次。import kerasfrom keras.layers import Input, LSTM, De
- 一、需求说明在Python程序的开发过程中,一些程序需要获取函数或程序的开始时间、结束时间和时间间隔等内容用来分析和处理内容二、需求分析涉及
- 本文实例讲述了JS实现运动缓冲效果的封装函数。分享给大家供大家参考,具体如下:之前经常写运动函数,要写好多好多,后来想办法封装起来。(运动缓
- 这篇文章主要介绍了python实现windows桌面截图代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 在access中进行时间的比较sql语句很简单,如select * from table where thetime>#\"
- 你不得不承认,今天网络发展之迅速,信息流动速度之快、量之大,是我们不曾考虑过的,但现在它就真真切切地摆在我们面前。如何接纳信息,怎么处理、消
- 语法糖内的defineProps及defineEmits1、defineProps获取组件传值<div :style="fo
- 第一步,下载依赖yarn add kindeditor第二步,建立kindeditor.vue组件<template> <
- 前言最近在使用Python的时候遇到浮点数运算,发现经常会碰到如下情况:出现上面的情况,主要还是因浮点数在计算机中实际是以二进制保存的,有些
- 一、PDF转为MP3 我们平常看到很多文件都是PDF格式,网上的各类书籍多为此格式。有时候不方便阅读,或者怕费眼睛伤颈椎,那么有没
- 临时表产生:A: SELECT INTO和B:CREATE TABLE + INSERT INTO1. A 要比B 快很多。但是A会锁定te
- 缘起最近实验课上需要重构以前写过的一个项目(垃圾堆),需要添加发生邮件提醒的功能,记得以前写过一个PHP版的实现,所以想把PHP写的功能整理
- 回文利用python 自带的翻转 函数 reversed()def is_plalindrome(string): return
- 多表查询分类分类1:等值连接 vs 非等值连接1. 等值连接SELECT employees.employee_id, employees.
- 本篇文章起源于在GCR MVP Open Day的时候和C# MVP张响讨论连接池的概念而来的。因此单独写一篇文章剖析一下连接池。 为什么需
- SQL Server的彻底卸载与再次安装可能大家已经有深刻体会,SQL Server的卸载十分繁琐。最让人头疼的是,出了问题的SQL Ser