最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實現(xiàn)前向和反向自動微分的示例代碼

 更新時間:2022年12月29日 11:15:18   作者:orion-orion  
自動微分技術(shù)(稱為“automatic differentiation, autodiff”)是介于符號微分和數(shù)值微分的一種技術(shù),它是在計算效率和計算精度之間的一種折衷。本文主要介紹了Python如何實現(xiàn)前向和反向自動微分,需要的可以參考一下

1 自動微分

我們在《數(shù)值分析》課程中已經(jīng)學(xué)過許多經(jīng)典的數(shù)值微分方法。許多經(jīng)典的數(shù)值微分算法非???,因為它們只需要計算差商。然而,他們的主要缺點在于他們是數(shù)值的,這意味著有限的算術(shù)精度和不精確的函數(shù)求值,而這些都從根本上限制了求解結(jié)果的質(zhì)量。因此。充滿噪聲的、復(fù)雜多變的函數(shù)很難得到精準的數(shù)值微分。

自動微分技術(shù)(稱為“automatic differentiation, autodiff”)是介于符號微分和數(shù)值微分的一種技術(shù),它是在計算效率和計算精度之間的一種折衷。自動微分不受任何離散化算法誤差的約束,它充分利用了微分的鏈式法則和其他關(guān)于導(dǎo)數(shù)的性質(zhì)來準確地計算它們。

2 前向自動微分

我們先來計算簡單的前向自動微分。假設(shè)我們有兩個變量u和v,使用浮點數(shù)存儲。我們將變量u′=du/dt和v′=dv/dt和這些變量一起存儲,這里tt是獨立的變量。在一些程序設(shè)計語言(如Python)中,我們可以選擇定義一種新的數(shù)據(jù)類型來存儲[u,u′]和[v,v′]這類數(shù)對。我們可以在這些數(shù)對上定義一種代數(shù)運算,這些代數(shù)運算編碼了一些經(jīng)典的操作:

在進行前向自動微分之前,我們需要先將計算f(t)所產(chǎn)生的操作序列表示為計算圖。接著,采用自底向上的遞推算法的思想,從做為遞推起點的數(shù)對t≡[t0,1](因為dt/dt=1)開始,我們能夠按照我們上述編碼規(guī)則同時對函數(shù)f(t)和它的導(dǎo)數(shù)f′(t)進行求值。我們在編程語言中可以選擇令數(shù)對重載運算符,這樣額外的求導(dǎo)數(shù)運算就可以對用戶透明地執(zhí)行了。

例1 比如,對于函數(shù)f(x)=exp?(x2−x)/x,想要依次計算dyi/dx(這里yi為所有計算中間項)。則我們先從x開始將表達式分解為計算圖:

然后前向遞推地按照我們之前所述的編碼規(guī)則來進行求導(dǎo)

注意鏈式法則(chain rule)告訴我們:

(f(g(x)))′=f′(g(x))⋅g′(x)

所以我們對

yk=g(yi)

y′k=g′(yi)⋅yi

事實上,我們也能夠處理有多個輸入的函數(shù)g:

k=g(yi,?,yj)

多元微分鏈式法則如下:

比如,對于

我們有

下面展示了一個對二元函數(shù)模擬前向自動微分的過程。

例2 設(shè)(x1,x2)=x1⋅exp?(x2)−x1,模擬前向微分過程。

接下來我們看如何用Python代碼來實現(xiàn)單變量函數(shù)的前向自動微分過程。為了簡便起見,我們下面只編碼了幾個常用的求導(dǎo)規(guī)則。

import math

class Var:
    def __init__(self, val, deriv=1.0):
        self.val = val
        self.deriv = deriv
    
    def __add__(self, other):
        if isinstance(other, Var):
            val = self.val + other.val
            deriv = self.deriv + other.deriv
        else:
            val = self.val + other
            deriv = self.deriv
        return Var(val, deriv)
    
    def __radd__(self, other):
        return self + other

    def __sub__(self, other):
        if isinstance(other, Var):
            val = self.val - other.val
            deriv = self.deriv - other.deriv
        else:
            val = self.val - other
            deriv = self.deriv
        return Var(val, deriv)
    
    def __rsub__(self, other):
        val = other - self.val
        deriv = - self.deriv
        return Var(val, deriv)

    def __mul__(self, other):
        if isinstance(other, Var):
            val = self.val * other.val
            deriv = self.val * other.deriv + self.deriv * other.val
        else:
            val = self.val * other
            deriv = self.deriv * other
        return Var(val, deriv)
    
    def __rmul__(self, other):
        return self * other

    def __truediv__(self, other):
        if isinstance(other, Var):
            val = self.val / other.val
            deriv = (self.deriv * other.val - self.val * other.deriv)/other.val**2
        else:
            val = self.val / other
            deriv = self.deriv / other
        return Var(val, deriv)

    def __rtruediv__(self, other):
        val = other / self.val
        deriv = other * 1/self.val**2
        return Var(val, deriv)
    
    def __repr__(self):
        return "value: {}\t gradient: {}".format(self.val, self.deriv)
        

def exp(f: Var):
    return Var(math.exp(f.val), math.exp(f.val) * f.deriv)

例如,我們?nèi)魢L試計算函數(shù)f(x)=exp?(x2−x)/x在x=2.0處的導(dǎo)數(shù)f′(2.0)如下:

fx = lambda x: exp(x*x - x)/x
df = fx(Var(2.0))
print(df) 

打印輸出:

value: 3.694528049465325         deriv: 9.236320123663312

可見,前向過程完成計算得到f(2.0)≈3.69, f′(2.0)≈9.24。

3 反向自動微分

我們前面介紹的前向自動微分方法在計算y=f(t)的時候并行地計算f′(t)。接下來我們介紹一種“反向”自動微分方法,相比上一種的方法它僅需要更少的函數(shù)求值,不過需要以更多的內(nèi)存消耗和更復(fù)雜的實現(xiàn)做為代價。

同樣,這個技術(shù)需要先將計算f(t)所產(chǎn)生的操作序列表示為計算圖。不過,與之前的從dt/dt=1開始,然后往dy/dt方向計算不同,反向自動求導(dǎo)算法從dy/dy=1開始并且按與之前同樣的規(guī)則往反方向計算,一步步地將分母替換為dt。反向自動微分可以避免不必要的計算,特別是當y是一個多元函數(shù)的時候。例如,對f(t1,t2)=f1(t1)+f2(t2),反向自動微分并不需要計算f1關(guān)于t2的微分或f2關(guān)于t1的微分。

例3 設(shè)f(x1,x2)=x1⋅exp(x2)−x1,模擬反向自動微分過程。

可見若采用反向自動微分,我們需要存儲計算過程中的所有東西,故內(nèi)存的使用量會和時間成正比。不過,在現(xiàn)有的深度學(xué)習(xí)框架中,對反向自動微分的實現(xiàn)進行了進一步優(yōu)化,我們會在深度學(xué)習(xí)專題文章中再進行詳述。

4 總結(jié)

自動微分被廣泛認為是一種未被充分重視的數(shù)值技術(shù), 它可以以盡量小的執(zhí)行代價來產(chǎn)生函數(shù)的精確導(dǎo)數(shù)。它在軟件需要計算導(dǎo)數(shù)或Hessian來運行優(yōu)化算法時顯得格外有價值,從而避免每次目標函數(shù)改變時都去重新手動計算導(dǎo)數(shù)。當然,做為其便捷性的代價,自動微分也會帶來計算的效率問題,因為在實際工作中自動微分方法并不會去化簡表達式,而是直接應(yīng)用最顯式的編碼規(guī)則。

到此這篇關(guān)于Python實現(xiàn)前向和反向自動微分的示例代碼的文章就介紹到這了,更多相關(guān)Python自動微分內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python文件操作及內(nèi)置函數(shù)flush原理解析

    Python文件操作及內(nèi)置函數(shù)flush原理解析

    這篇文章主要介紹了Python文件操作及內(nèi)置函數(shù)flush原理解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • Python獲取任意xml節(jié)點值的方法

    Python獲取任意xml節(jié)點值的方法

    這篇文章主要介紹了Python獲取任意xml節(jié)點值的方法,涉及Python操作XML節(jié)點的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-05-05
  • 詳解Pycharm與anaconda安裝配置指南

    詳解Pycharm與anaconda安裝配置指南

    這篇文章主要介紹了詳解Pycharm與anaconda安裝配置指南,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • pytorch實現(xiàn)Tensor變量之間的轉(zhuǎn)換

    pytorch實現(xiàn)Tensor變量之間的轉(zhuǎn)換

    今天小編就為大家分享一篇pytorch實現(xiàn)Tensor變量之間的轉(zhuǎn)換,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • python與sqlite3實現(xiàn)解密chrome cookie實例代碼

    python與sqlite3實現(xiàn)解密chrome cookie實例代碼

    這篇文章主要介紹了python與sqlite3實現(xiàn)解密chrome cookie實例代碼,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Python手動實現(xiàn)Hough圓變換的示例代碼

    Python手動實現(xiàn)Hough圓變換的示例代碼

    Hough圓變換的原理相信大家都非常清楚了,但是手動實現(xiàn)的比較少。這篇文章將為大家介紹手動實現(xiàn)Hough圓變換的示例代碼,需要的可以了解一下
    2022-01-01
  • Python實現(xiàn)將絕對URL替換成相對URL的方法

    Python實現(xiàn)將絕對URL替換成相對URL的方法

    這篇文章主要介紹了Python實現(xiàn)將絕對URL替換成相對URL的方法,涉及Python字符串操作及正則匹配的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • 最小公倍數(shù)Python實現(xiàn)的方法例子

    最小公倍數(shù)Python實現(xiàn)的方法例子

    這篇文章介紹了兩種計算最小公倍數(shù)的方法:輾轉(zhuǎn)相除法(歐幾里德法)和相減法(更相減損法),這兩種方法分別基于求最大公約數(shù)的不同原理,需要的朋友可以參考下
    2024-11-11
  • 詳解Python使用simplejson模塊解析JSON的方法

    詳解Python使用simplejson模塊解析JSON的方法

    這篇文章主要介紹了Python使用simplejson模塊解析JSON的方法,實例代碼基于Pyhton2.x版本,文中最后還附了關(guān)于simplejson模塊的一些性能放面的討論,需要的朋友可以參考下
    2016-03-03
  • Python速成篇之像selenium一樣操作電腦詳解

    Python速成篇之像selenium一樣操作電腦詳解

    這篇文章為大家介紹了在Python中如何像selenium一樣操作電腦,本文主要使用的是pyautogui庫,文中的示例代碼講解詳細,感興趣的可以了解一下
    2022-08-08

最新評論

信丰县| 呼伦贝尔市| 景谷| 甘孜县| 洪江市| 峨山| 赫章县| 上蔡县| 临猗县| 丽水市| 盐源县| 阿坝县| 北辰区| 元江| 建昌县| 肥乡县| 辛集市| 施秉县| 肥东县| 石林| 肃北| 申扎县| 辽宁省| 江油市| 高邮市| 大竹县| 乌海市| 基隆市| 赣榆县| 自贡市| 陇南市| 化州市| 寻乌县| 澜沧| 平乡县| 金湖县| 鄢陵县| 凌云县| 西乡县| 定襄县| 昌平区|