python中幾種自動微分庫解析
前言
簡單介紹下python的幾個自動求導工具,tangent、autograd、sympy;
在各種機器學習、深度學習框架中都包含了自動微分,微分主要有這么四種:手動微分法、數(shù)值微分法、符號微分法、自動微分法,這里分別簡單走馬觀花(hello world式)的介紹下下面幾種微分框架;
sympy 強大的科學計算庫,使用的是符號微分,通過生成符號表達式進行求導;求得的導數(shù)不一定為最簡的,當函數(shù)較為復雜時所生成的表達式樹異常復雜;
autograd自動微分先將符號微分用于基本的算子,帶入數(shù)值并保存中間結果,后應用于整個函數(shù);自動微分本質上就是圖計算,容易做很多優(yōu)化所以廣泛應用于各種機器學習深度學習框架中;
tangent 為源到源(source-to-source)的自動微分框架,在計算函數(shù)f微分時他通過生成新函數(shù)f_grad來計算該函數(shù)的微分,與目前所存在的所有自動微分框架都有所不同;由于它是通過生成全新的函數(shù)來計算微分所以具有非常搞的可讀性、可調式性這也是官方所說的與當前自動微分框架的重大不同;
sympy 求導
def grad(): # 定義表達式的變量名稱 x, y = symbols('x y') # 定義表達式 z = x**2 +y**2 # 計算z關于y對應的偏導數(shù) return diff(z, y) func = grad()
輸出結果表達式z的導函數(shù)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的偏導數(shù)
dy_dx = tangent.grad(fun)
輸出偏導數(shù)值為 8 ,z' = 2 * x,此處x傳任何值都是一樣的
df(4, y=1)
可通過使用wrt參數(shù)指定求關于某個參數(shù)的偏導數(shù),下面為求z關于y的偏導數(shù)
df = tangent.grad(funs, wrt=([1]))
輸出值為10 ,z' = 2 *y,此處x傳任何值都是一樣的
df(x=0, y=5)
上面說了那么多也沒體現(xiàn)出tangent的核心:源到源(source-to-source)
在生成導函數(shù)的時候加入verbose=1參數(shù),即可看到tangent為我們生成的用于計算導數(shù)的函數(shù),默認情況下該值為0所以我們沒感覺到tangent的求導與別的自動微分框架有什么區(qū)別;
def df(x): z = x**2 return z df = tangent.grad(df, verbose=1) df(x=2)
在執(zhí)行完上述代碼后,我們看到了tangent為我們所生成用于求導數(shù)的函數(shù):
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函數(shù)就是所生成的函數(shù),從中我們也可以看到表達式z的導函數(shù)z'=2 * x,tangent就是通過執(zhí)行該函數(shù)用于求得導數(shù)的;
sympy 中的自動微分只是它強大的功能之一,autograd 從名字也可知它就是為了自動微分而生的,tangent初出茅廬2017年底Google才發(fā)布的自動微分方法也比較新穎,從17年發(fā)v0.1.8版本后也沒見發(fā)版,源碼更新也不夠活躍;sympy、autograd比較成熟,tangent還有待觀察;
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Python基于pandas實現(xiàn)json格式轉換成dataframe的方法
這篇文章主要介紹了Python基于pandas實現(xiàn)json格式轉換成dataframe的方法,結合實例形式分析了Python使用pandas模塊操作json數(shù)據(jù)轉換成dataframe的相關操作技巧與注意事項,需要的朋友可以參考下2018-06-06Pandas數(shù)據(jù)類型轉換df.astype()及數(shù)據(jù)類型查看df.dtypes的使用
Python,numpy都有自己的一套數(shù)據(jù)格式,本文主要介紹了Pandas數(shù)據(jù)類型轉換df.astype()及數(shù)據(jù)類型查看df.dtypes的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07pandas 使用apply同時處理兩列數(shù)據(jù)的方法
下面小編就為大家分享一篇pandas 使用apply同時處理兩列數(shù)據(jù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04Django使用redis緩存服務器的實現(xiàn)代碼示例
這篇文章主要介紹了Django使用redis緩存服務器的實現(xiàn)代碼示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04利用Vscode進行Python開發(fā)環(huán)境配置的步驟
這篇文章主要給大家介紹了關于如何利用Vscode進行Python開發(fā)環(huán)境配置的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Python具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2020-06-06python3往mysql插入二進制圖片出現(xiàn)1064錯誤
這篇文章主要介紹了python3往mysql插入二進制圖片出現(xiàn)1064錯誤的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03