自動(dòng)微分及Tensorflow實(shí)現(xiàn)

??幾乎所有機(jī)器學(xué)習(xí)算法在訓(xùn)練或預(yù)測(cè)時(shí)都可以歸結(jié)為最優(yōu)化問(wèn)題的求解燎窘,如果目標(biāo)函數(shù)可導(dǎo)浓瞪,該問(wèn)題轉(zhuǎn)換為訓(xùn)練函數(shù)駐點(diǎn)求解問(wèn)題渣慕。通常情況下無(wú)法得到駐點(diǎn)的解析解氮兵,因此只能采用數(shù)值優(yōu)化算法裂逐,如梯度下降法,牛頓法泣栈,擬牛頓法卜高。這些數(shù)值優(yōu)化算法都依賴(lài)于函數(shù)的一階導(dǎo)數(shù)值或二階導(dǎo)數(shù)值,包括梯度與Hessian矩陣南片。因此需要解決如何求一個(gè)復(fù)雜函數(shù)的導(dǎo)數(shù)問(wèn)題掺涛,本文講述的自動(dòng)微分技術(shù)是解決此問(wèn)題的一種通用方法,目前基本所有主流的深度學(xué)習(xí)框架都支持自動(dòng)微分疼进,如Tensorflo,Pytorch等薪缆。

??在介紹自動(dòng)微分之前,先介紹一下目前使用編程計(jì)算函數(shù)導(dǎo)數(shù)值的幾種方法:

  • 手動(dòng)微分

    ??手動(dòng)微分伞广,顧名思義就是在使用程序計(jì)算導(dǎo)函數(shù)值之前拣帽,手動(dòng)計(jì)算目標(biāo)函數(shù)的導(dǎo)函數(shù),對(duì)于表達(dá)式比較復(fù)雜的函數(shù)嚼锄,這顯然是比較容易出錯(cuò)的减拭,并且通用性和靈活性都較差,現(xiàn)在較少使用区丑。

  • 符號(hào)微分

    ??符號(hào)微分(Symbolic Differentiation)屬于符號(hào)計(jì)算的范疇拧粪,基于初等函數(shù)的求導(dǎo)公式和四則運(yùn)算法則及鏈?zhǔn)椒▌t搭建在計(jì)算搭建求導(dǎo)系統(tǒng)求出導(dǎo)函數(shù)再代入變量,即可求出某點(diǎn)的導(dǎo)數(shù)值沧侥。顯然可霎,只是將人工計(jì)算導(dǎo)數(shù)的過(guò)程進(jìn)行程序化。符號(hào)微分計(jì)算出的表達(dá)式需要用字符串或其他數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)宴杀,如表達(dá)式樹(shù)癣朗。常用數(shù)學(xué)軟件Mathematica,Maple旺罢,Matlab都使用了這種技術(shù)斯棒。對(duì)于深層復(fù)合函數(shù),如神經(jīng)網(wǎng)絡(luò)的映射函數(shù)主经,符號(hào)微分算法得到的導(dǎo)數(shù)計(jì)算公式將會(huì)非常冗長(zhǎng)荣暮。稱(chēng)為表達(dá)式膨脹(expression swell)。對(duì)于機(jī)器學(xué)習(xí)中的應(yīng)用罩驻,不需要得到導(dǎo)數(shù)的表達(dá)式穗酥,而只需計(jì)算函數(shù)在某一點(diǎn)處的導(dǎo)數(shù)值。因此存在計(jì)算上的冗余且成本高昂。

    ??以深度學(xué)習(xí)中最為常見(jiàn)的Sigmoid激活函數(shù)為例:S(x)=\frac{1}{1+e^{-x}},則有S'(x)=\frac{e^{-x}}{(1+e^{-x})^{2}}=S(x)(1-S(x)),神經(jīng)網(wǎng)絡(luò)本質(zhì)上他是一個(gè)函數(shù)逼近器砾跃,理論上可以以任意精度逼近任何函數(shù)骏啰。對(duì)于一個(gè)含有三個(gè)隱層的網(wǎng)絡(luò),假設(shè)三個(gè)隱層的激活函數(shù)都是Sigmoid激活函數(shù)抽高,網(wǎng)絡(luò)的輸入為x,輸入對(duì)應(yīng)標(biāo)簽為y,輸出為y',則有y'=S(S(S(wx+b))),損失函數(shù)\zeta(w,b)=F(y-y')=F(y - S(S(S(wx+b))))判耕,將S(x)的函數(shù)表達(dá)式帶入上式由鏈?zhǔn)椒▌t即可計(jì)算出導(dǎo)函數(shù),顯然,因?yàn)?img class="math-block" src="https://math.jianshu.com/math?formula=%5Cfrac%7Bdy'%7D%7Bdx%7D%3D%5Cfrac%7BdS(S(S(x)))%7D%7BdS(S(x))%7D%5Cfrac%7BdS(S(x))%7D%7Bd%7BS(x)%7D%7D%5Cfrac%7BdS(x)%7D%7Bd(wx%2Bb)%7D" alt="\frac{dy'}{dx}=\frac{dS(S(S(x)))}{dS(S(x))}\frac{dS(S(x))}{d{S(x)}}\frac{dS(x)}{d(wx+b)}" mathimg="1">可以預(yù)見(jiàn)的是翘骂,這個(gè)導(dǎo)函數(shù)一定不是一個(gè)形式比較簡(jiǎn)潔的函數(shù)壁熄,在此就不展開(kāi)計(jì)算,有興趣的讀者可以自行驗(yàn)證,而這也就是上文所說(shuō)的表達(dá)式膨脹碳竟。當(dāng)然草丧,可能有讀者會(huì)覺(jué)得,因?yàn)镾igmoid函數(shù)的表達(dá)式本身就不太簡(jiǎn)潔莹桅,復(fù)合之后的表達(dá)式肯定會(huì)更為復(fù)雜昌执,如果激活函數(shù)為三角函數(shù)和冪函數(shù)這類(lèi)函數(shù),其導(dǎo)函數(shù)還是較為簡(jiǎn)潔的诈泼。那為什么不能使用這類(lèi)函數(shù)作為激活函數(shù)呢懂拾,原因有二,首先铐达,一般來(lái)說(shuō)三角函數(shù)和冪函數(shù)這類(lèi)函數(shù)是不能用于網(wǎng)絡(luò)的激活函數(shù)的(這一點(diǎn)目前仍有爭(zhēng)議岖赋,不過(guò)在實(shí)際應(yīng)用中基本不會(huì)使用非單調(diào)非有界的函數(shù)作為單調(diào)函數(shù),這里有讀者肯定以Google的新型激活函數(shù)Swish反駁娶桦,但是不可否認(rèn)的是贾节,Swish目前仍有很大爭(zhēng)議并且被使用的較少)汁汗,這涉及到深度學(xué)習(xí)激活函數(shù)的深入討論衷畦,這里只簡(jiǎn)單提及一點(diǎn):三角函數(shù)不是單調(diào)函數(shù),冪函數(shù)不是有界函數(shù)知牌。其次祈争,對(duì)于一些有成千上萬(wàn)隱層的大型神經(jīng)網(wǎng)絡(luò),因?yàn)檫M(jìn)行了成千上萬(wàn)次的迭代角寸,其導(dǎo)函數(shù)必然會(huì)出現(xiàn)表達(dá)式膨脹(需要注意的是菩混,隱層的激活函數(shù)一般不可能取同一個(gè)函數(shù))。

    Swish是谷歌大腦團(tuán)隊(duì)提出的一種新型激活方法數(shù):f(x)=x*\sigma(x)=x*\frac{1}{1+e^{-x}}扁藕,并通過(guò)實(shí)驗(yàn)表明其在絕大多數(shù)環(huán)境中可以替代當(dāng)前比較流行的 ReLU 函數(shù)沮峡。不過(guò)在 Reddit 論壇上,該激活函數(shù)的性能與優(yōu)點(diǎn)還是有些爭(zhēng)議的亿柑,有的開(kāi)發(fā)者發(fā)現(xiàn)該激活函數(shù)很多情況下可以比標(biāo)準(zhǔn)的 ReLU 獲得更高的性能邢疙,而有些開(kāi)發(fā)者則認(rèn)為 Swish 激活函數(shù)并沒(méi)有什么新意,我們應(yīng)該關(guān)注于更加基礎(chǔ)的研究。

  • 數(shù)值微分

    ??符號(hào)微分用于求解數(shù)學(xué)中的公式解(也稱(chēng)解析解)疟游,得到解的表達(dá)式而非具體的數(shù)值呼畸。在實(shí)際應(yīng)用中還需進(jìn)一步代入數(shù)值得到數(shù)值解,需要經(jīng)過(guò)一次轉(zhuǎn)換颁虐。那么蛮原,有沒(méi)有一種方法能直接求出目標(biāo)函數(shù)的導(dǎo)數(shù),而不是求出導(dǎo)函數(shù)之后再帶入數(shù)值得到導(dǎo)數(shù)另绩。這種方法就是數(shù)值微分儒陨,我們先來(lái)看一下導(dǎo)數(shù)的定義:

    f'(x_0)=\lim_{x \to x_0}\frac{f(x)-f(x_0)}{x-x_0}=lim_{x \to x_0}\frac{f(x+\Delta x)-f(x)}{\Delta x}當(dāng)\Delta x足夠小時(shí),可將該點(diǎn)的導(dǎo)數(shù)可以近似為f'(x_0)\approx \frac{f(x_0+\Delta x)-f(x_0)}{\Delta x},在實(shí)際計(jì)算時(shí)板熊,一般使用它的變式f(x_0) \approx \frac{f(x_0+\Delta x)-f(x_0-\Delta x)}{2\Delta x},有著更小的誤差和更好的穩(wěn)定性框全。當(dāng)然,由于進(jìn)行了近似操作干签,得到的導(dǎo)數(shù)值肯定是有誤差的津辩,所幸誤差還在能接受的范圍內(nèi)。按上面推導(dǎo)的式子計(jì)算導(dǎo)數(shù)容劳,對(duì)每個(gè)自變量求導(dǎo)時(shí)都需要計(jì)算兩次函數(shù)值喘沿,因此也會(huì)導(dǎo)致計(jì)算量的問(wèn)題。所以竭贩,數(shù)值微分通常只用于檢驗(yàn)其他算法的結(jié)果的正確性蚜印,例如在實(shí)現(xiàn)反向傳播算法的時(shí)候用數(shù)值微分算法檢驗(yàn)反向傳播算法所求導(dǎo)數(shù)的正確性。

  • 自動(dòng)微分

    ??自動(dòng)微分是介于數(shù)值微分和符號(hào)微分之間的一種折中方案:數(shù)值微分直接帶入數(shù)值得到近似解留量,符號(hào)微分先求出解析式再帶入數(shù)值得到導(dǎo)數(shù)窄赋。而自動(dòng)微分將符號(hào)微分應(yīng)用于最基本的運(yùn)算(或稱(chēng)原子操作),如常數(shù)楼熄,冪函數(shù)忆绰,指數(shù)函數(shù),對(duì)數(shù)函數(shù)可岂,三角函數(shù)等基本初等函數(shù)错敢,代入自變量的值得到其導(dǎo)數(shù)值,作為中間結(jié)果進(jìn)行保留缕粹。然后再根據(jù)這些基本運(yùn)算單元的求導(dǎo)結(jié)果計(jì)算出整個(gè)函數(shù)的導(dǎo)數(shù)值稚茅。

    ??自動(dòng)微分的靈活性強(qiáng),可實(shí)現(xiàn)完全向用戶(hù)隱藏求導(dǎo)過(guò)程平斩,由于它只對(duì)基本函數(shù)或常數(shù)運(yùn)用符號(hào)微分法則亚享,因此可以靈活地結(jié)合編程語(yǔ)言的循環(huán)、分支等結(jié)構(gòu)绘面,根據(jù)鏈?zhǔn)椒▌t欺税,借助于計(jì)算圖計(jì)算出任意復(fù)雜函數(shù)的導(dǎo)數(shù)值糜芳。由于存在上述優(yōu)點(diǎn),該方法在現(xiàn)代深度學(xué)習(xí)庫(kù)中得到廣泛使用魄衅。自動(dòng)微分在實(shí)現(xiàn)時(shí)有前向模式和反向模式兩種實(shí)現(xiàn)方案峭竣,下面分別進(jìn)行介紹。

    前向模式(forward model):前向模式從計(jì)算圖的起點(diǎn)開(kāi)始晃虫,沿著計(jì)算圖邊的方向依次向前計(jì)算皆撩,直到到達(dá)計(jì)算圖的終點(diǎn)。它根據(jù)自變量的值計(jì)算出計(jì)算圖中每個(gè)節(jié)點(diǎn)的值 以及導(dǎo)數(shù)值 哲银,并保留中間結(jié)果扛吞。直到得到整個(gè)函數(shù)的值和其導(dǎo)數(shù)值。整個(gè)過(guò)程對(duì)應(yīng)于一元復(fù)合函數(shù)求導(dǎo)時(shí)從最內(nèi)層逐步向外層求導(dǎo)荆责。
    反向模式(reverse model):

  • Tensorflow使用自動(dòng)微分搭建模型

    待續(xù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末滥比,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子做院,更是在濱河造成了極大的恐慌盲泛,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件键耕,死亡現(xiàn)場(chǎng)離奇詭異寺滚,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)屈雄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)村视,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人酒奶,你說(shuō)我怎么就攤上這事蚁孔。” “怎么了惋嚎?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵杠氢,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我瘸彤,道長(zhǎng)修然,這世上最難降的妖魔是什么笛钝? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任质况,我火速辦了婚禮,結(jié)果婚禮上玻靡,老公的妹妹穿的比我還像新娘结榄。我一直安慰自己,他們只是感情好囤捻,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布臼朗。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪视哑。 梳的紋絲不亂的頭發(fā)上绣否,一...
    開(kāi)封第一講書(shū)人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音挡毅,去河邊找鬼蒜撮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛跪呈,可吹牛的內(nèi)容都是我干的段磨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼耗绿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼苹支!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起误阻,我...
    開(kāi)封第一講書(shū)人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤债蜜,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后究反,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體策幼,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年奴紧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了特姐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡黍氮,死狀恐怖唐含,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沫浆,我是刑警寧澤捷枯,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站专执,受9級(jí)特大地震影響淮捆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜本股,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一攀痊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拄显,春花似錦苟径、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蟆盐。三九已至,卻和暖如春遭殉,著一層夾襖步出監(jiān)牢的瞬間石挂,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工险污, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留倘零,地道東北人糯钙。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓斩箫,卻偏偏與公主長(zhǎng)得像含思,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子渤闷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容