版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系我們

[科普中國(guó)]-自動(dòng)微分

科學(xué)百科
原創(chuàng)
科學(xué)百科為用戶(hù)提供權(quán)威科普內(nèi)容,打造知識(shí)科普陣地
收藏

在數(shù)學(xué)和計(jì)算機(jī)代數(shù)中,自動(dòng)微分有時(shí)稱(chēng)作演算式微分,是一種可以借由計(jì)算機(jī)程序計(jì)算一個(gè)函數(shù)導(dǎo)數(shù)的方法。兩種傳統(tǒng)做微分的方法為:(1)對(duì)一個(gè)函數(shù)的表示式做符號(hào)上的微分,并且計(jì)算其在某一點(diǎn)上的值。(2)使用差分。使用符號(hào)微分最主要的缺點(diǎn)是速度慢及將計(jì)算機(jī)程序轉(zhuǎn)換成表示式的困難。此外,很多函數(shù)在要計(jì)算更高階微分時(shí)會(huì)變得復(fù)雜。 使用差分的兩個(gè)重要的缺點(diǎn)是舍棄誤差及數(shù)值化過(guò)程和相消誤差。此兩者傳統(tǒng)方法在計(jì)算更高階微分時(shí),都有復(fù)雜度及誤差增加的問(wèn)題。自動(dòng)微分則解決上述的問(wèn)題。

簡(jiǎn)介自動(dòng)微分使用這個(gè)事實(shí):任何實(shí)作一個(gè)向量函數(shù)y=F(x)的計(jì)算機(jī)程序,一般而言,可以被分解成由基本指定運(yùn)算所成的序列,而其中每一個(gè)都可以借由查表而輕易地微分。這些計(jì)算某一特定項(xiàng)的 "基本偏微分" 是依照微積分中的復(fù)合函數(shù)求導(dǎo)法則來(lái)合并成某個(gè) F 的微分資訊(如梯度、切線(xiàn)、雅可比矩陣等)。這個(gè)過(guò)程會(huì)產(chǎn)生確實(shí)(數(shù)值上準(zhǔn)確)的導(dǎo)數(shù)。因?yàn)橹辉谧罨A(chǔ)的層面做符號(hào)轉(zhuǎn)換,自動(dòng)微分避免了復(fù)雜的符號(hào)運(yùn)算的問(wèn)題。

復(fù)合函數(shù)求導(dǎo)法則自動(dòng)微分的基礎(chǔ)是,根據(jù)復(fù)合函數(shù)求導(dǎo)法則來(lái)合并微分值。以 為例,根據(jù)復(fù)合函數(shù)求導(dǎo)法則,我們有:

通常有兩個(gè)不同的模式:“前向積累”(或“前向模式”)和“反向積累”(或反向模式)。 前向積累由右到左地使用復(fù)合函數(shù)求導(dǎo)法則,即先計(jì)算 ,然后才 。 反向積累則是由左到右。

前向積累

前向積累式的自動(dòng)微分是最容易理解和實(shí)作的。 這個(gè)函數(shù)是可被電腦(或程序員) 解釋成一連串對(duì)變數(shù) 的運(yùn)算。 前向積累式自動(dòng)微分的工具則會(huì)增加相對(duì)應(yīng)的作用于第二項(xiàng)上的運(yùn)算。

計(jì)算 的導(dǎo)數(shù)需要初始化, 以區(qū)別是要對(duì) 來(lái)求導(dǎo)數(shù)。 上述表格則以 來(lái)初始化, 并且我們可以看到其結(jié)果 正是對(duì) 的導(dǎo)數(shù)。 注意,雖然表格列出了符號(hào)微分, 但以電腦的角度而言,電腦總是儲(chǔ)存數(shù)值。圖一則以圖形表明上述的敘述。

為了計(jì)算這個(gè)例子的導(dǎo)數(shù),其分別為 , 需要計(jì)算兩次,一次是以 做初始值, 另一次則以 做為初始值。

前向積累的計(jì)算復(fù)雜度則正比于原來(lái)程式的計(jì)算復(fù)雜度。

對(duì)于函數(shù) 來(lái)說(shuō), 前向積累只要計(jì)算一次,優(yōu)于需要計(jì)算m次的反向積累。1

前向式積累自動(dòng)微分的由來(lái)與二元數(shù)前向式積累自動(dòng)微分可借由擴(kuò)充實(shí)數(shù)中的代數(shù)并得到一個(gè)新的算術(shù)系統(tǒng)來(lái)達(dá)成。 每一個(gè)數(shù)都會(huì)新增另一數(shù),用來(lái)表示一函數(shù)在這數(shù)上導(dǎo)數(shù)的數(shù)。 而每一個(gè)算術(shù)運(yùn)算都被擴(kuò)充于此新的代數(shù)。 這個(gè)擴(kuò)充后的代數(shù)就是二元數(shù)的代數(shù)。

將每一個(gè)數(shù) 替換成數(shù) ,其中 是一個(gè)實(shí)數(shù),但 則只是一個(gè)據(jù)有 這個(gè)特性的符號(hào)。 使用這特性,我們可以有運(yùn)算

減法和除法則類(lèi)似。

我們可以計(jì)算多項(xiàng)式。 如果 ,則

其中 表示 對(duì)第一個(gè)參數(shù)的導(dǎo)數(shù)。 而 則稱(chēng)作“種子”,可以任意選擇。

新的算術(shù)是由有序?qū)?、?xiě)成 及對(duì)第一項(xiàng)的運(yùn)算和對(duì)第二項(xiàng)的第一階微分運(yùn)算所組成。 將上述結(jié)果應(yīng)用于多項(xiàng)式的解析函數(shù)上, 我們可以得到一系列關(guān)于基本算術(shù)和一些標(biāo)準(zhǔn)函數(shù)的新算術(shù):

并且,一般而言,對(duì)于一個(gè)函數(shù){\displaystyle g},我們會(huì)有

其中 分別是 對(duì)其第一項(xiàng)和第二項(xiàng)的導(dǎo)數(shù)。

對(duì)一個(gè)二元算術(shù)運(yùn)算作用于混合的參數(shù)時(shí)(數(shù)對(duì) 和實(shí)數(shù) ), 實(shí)數(shù)會(huì)先被轉(zhuǎn)成 。 函數(shù) 上的導(dǎo)數(shù) 則為以上述算術(shù)計(jì)算 ,其結(jié)果為 。

向量參數(shù)和函數(shù)借由采取方向?qū)?shù)的運(yùn)算, 多變數(shù)函數(shù)也可以同單變數(shù)函數(shù)的效率和機(jī)制來(lái)處理。 亦即,函數(shù)這點(diǎn), 和這個(gè)方向上的方向?qū)?shù), 可以使用上述相同的算術(shù)來(lái)計(jì)算而求得。

更高階微分以上的算術(shù)可以被一般化,以用于二階及三階導(dǎo)數(shù)。 然而,此算術(shù)的規(guī)則將會(huì)迅速變得復(fù)雜。 其復(fù)雜度將與最高階導(dǎo)數(shù)階數(shù)成平化。 取而代之的是使用限縮泰勒級(jí)數(shù)。 這是可行的,因?yàn)楹瘮?shù)的泰勒級(jí)數(shù)中的通項(xiàng)為己知系數(shù)和函數(shù)導(dǎo)數(shù)的乘積。 使用自動(dòng)微分來(lái)計(jì)算黑塞矩陣在某些最佳化已被證明是可行的。

前向式積累是由對(duì)程式的非標(biāo)準(zhǔn)化轉(zhuǎn)譯程序來(lái)實(shí)作。 即將實(shí)數(shù)替換成二元數(shù),常數(shù)則換成有第二項(xiàng)為零系數(shù)的二元數(shù)。 而數(shù)值上基本運(yùn)算則被換成二元數(shù)的運(yùn)算。 非標(biāo)準(zhǔn)化轉(zhuǎn)譯程序一般使用兩者策略之一:程式碼轉(zhuǎn)換和運(yùn)算符重載。

程式碼轉(zhuǎn)換一個(gè)函數(shù)的程式碼會(huì)被自動(dòng)產(chǎn)生的程式碼所替換, 新生成用來(lái)計(jì)算導(dǎo)數(shù)的程式碼則會(huì)插入原程式碼中。

程式碼轉(zhuǎn)換可實(shí)作在所有的編程語(yǔ)言上,且它對(duì)編譯器而言,是容易最佳化的。 然而,實(shí)作自動(dòng)微分的工具則是比較困難的。

運(yùn)算符重載如果所使用的編程語(yǔ)言支持,運(yùn)算符重載是個(gè)可行的方法。 實(shí)數(shù)的物件跟基本數(shù)學(xué)運(yùn)算必須重載以滿(mǎn)足上述 augmented 算術(shù)。 這不須要改變要被微分的函數(shù)的程式碼。

運(yùn)算符重載對(duì)前向積累是容易實(shí)作的,并且可能對(duì)反向積累亦如此。 然而,與前向積累相比,現(xiàn)有的編譯器在最佳化程式碼方面則是較為落后。2

本詞條內(nèi)容貢獻(xiàn)者為:

王偉 - 副教授 - 上海交通大學(xué)