




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
§6-1參數(shù)初始化§6-2超參數(shù)尋優(yōu)算法§6-3基于梯度的自適應(yīng)學(xué)習(xí)算法§6-4生成對(duì)抗神經(jīng)網(wǎng)絡(luò)GAN及實(shí)例§6-5遷移學(xué)習(xí)及實(shí)例§6-6強(qiáng)化學(xué)習(xí)§6-7模型優(yōu)化的局限性
深度學(xué)習(xí)模型優(yōu)化本章簡(jiǎn)介我們已經(jīng)在上面章節(jié)中介紹了處理不同類型數(shù)據(jù)的深度學(xué)習(xí)模型,例如能夠處理圖像數(shù)據(jù)的卷積神經(jīng)網(wǎng)絡(luò),能夠處理序列數(shù)據(jù)的一維卷積網(wǎng)絡(luò)以及長(zhǎng)短期記憶網(wǎng)絡(luò),同時(shí)在Keras中實(shí)現(xiàn)了這些模型。我們也討論了一些提升模型性能的方法,但是還沒(méi)有討論在實(shí)際工程中如何去優(yōu)化模型。本章將系統(tǒng)地介紹幾種常見(jiàn)的深度學(xué)習(xí)模型的優(yōu)化方法,同時(shí)討論影響深度學(xué)習(xí)模型優(yōu)化的因素。§6-1參數(shù)初始化
深度學(xué)習(xí)模型的訓(xùn)練算法通常是迭代的,需要一步一步地更新,因此要設(shè)置一些初始點(diǎn)。初始點(diǎn)的選擇很大程度地決定了算法是否收斂,以及收斂速度是否達(dá)到期望。有一些初始點(diǎn)使模型表現(xiàn)得十分不穩(wěn)定,致使訓(xùn)練完全失敗。
當(dāng)初始化點(diǎn)靠近一個(gè)局部最優(yōu)點(diǎn)時(shí),它有更大的概率收斂至相距最近的局部最優(yōu)點(diǎn)。這一點(diǎn)可以通過(guò)圖6.3來(lái)理解。圖6-3初始點(diǎn)的梯度與模型收斂至最近局部最優(yōu)點(diǎn)有關(guān)目前存在的一些初始化策略是簡(jiǎn)單的、啟發(fā)式的,并沒(méi)有一個(gè)對(duì)于參數(shù)初始化的成熟理論。而有些初始點(diǎn)從優(yōu)化的觀點(diǎn)看或許是有利的,但是從泛化的觀點(diǎn)看是不利的。雖然如此,但是有一個(gè)初始化原則確是很明確的,那就是初始化參數(shù)時(shí)需要在有相同輸入的不同單元間“破壞相似性”。也就是說(shuō),如果有同一個(gè)輸入連接到具有相同激活函數(shù)的兩個(gè)不同的隱藏單元時(shí),這些隱藏單元必須具有不同的初始參數(shù)。如果它們具有相同的初始參數(shù),后面在計(jì)算模型的確定性損失和更新參數(shù)時(shí)都將一直以相同的方式處理這兩個(gè)單元。通常情況下,我們將每個(gè)單元的偏置設(shè)置為常數(shù),僅隨機(jī)初始化權(quán)重。有些啟發(fā)式方法可用于選擇權(quán)重的初始大小。例如使用標(biāo)準(zhǔn)初始化(NormalizedInitialization)。初始化m個(gè)輸入和n個(gè)輸出的全連接層權(quán)重的啟發(fā)式方法滿足式6.3所示的分布。(6-3)另一種方法是初始化為隨機(jī)正交矩陣,這時(shí)需要仔細(xì)挑選每一層的非線性縮放或增益(Gain)因子。這種初始化方案也是受啟發(fā)于不含非線性的矩陣相乘序列的深度網(wǎng)絡(luò)。在該模型下,這個(gè)初始化方案保證了達(dá)到收斂所需的訓(xùn)練迭代總次數(shù)獨(dú)立于深度。換句話說(shuō)在這種初始化方案下,深度學(xué)習(xí)模型的深度不再對(duì)訓(xùn)練所需的迭代總次數(shù)產(chǎn)生影響。該方法的一個(gè)重要觀點(diǎn)是,在前饋網(wǎng)絡(luò)中,激活和梯度會(huì)在每一步前向傳播或反向傳播中增加或減小,由于前饋網(wǎng)絡(luò)在每一層使用了不同的權(quán)重矩陣,因此遵循隨機(jī)游走行為。如果該隨機(jī)游走調(diào)整到保持范數(shù),那么前饋網(wǎng)絡(luò)能夠很大程度地避免相同權(quán)重矩陣用于每層的梯度消失與爆炸問(wèn)題。有一種被稱為稀疏初始化(SparseInitialization)的替代方案,它令每個(gè)單元初始化有個(gè)非零權(quán)重。這個(gè)想法是將該單元輸入的數(shù)量獨(dú)立于單元所在層總的輸入數(shù)目,保證了不使權(quán)重的大小隨著標(biāo)準(zhǔn)化(除以)而變得極小。簡(jiǎn)單來(lái)說(shuō)非零權(quán)重的個(gè)數(shù)是固定的,與每一層的具體規(guī)模無(wú)關(guān)。所以稀疏初始化有助于實(shí)現(xiàn)單元之間初始化時(shí)的多樣性,避免了由于層規(guī)模過(guò)大而造成的權(quán)重變小的現(xiàn)象。但是,由于獲得較大取值的權(quán)重相當(dāng)于被加了較強(qiáng)的先驗(yàn),因此需要長(zhǎng)時(shí)間的梯度下降才能夠修正較大的目標(biāo)函數(shù)偏離值。本節(jié)討論了權(quán)重初始化對(duì)模型性能的影響,并介紹了幾種常用的權(quán)重與偏置的初始化方法,如標(biāo)準(zhǔn)化權(quán)重初始值、稀疏初始化等。但是深度學(xué)習(xí)模型的參數(shù)不僅僅只是權(quán)重與偏置,它還擁有許多超參數(shù),諸如學(xué)習(xí)率、動(dòng)量系數(shù)等。下一節(jié)將介紹這些超參數(shù)的尋優(yōu)算法。大部分深度學(xué)習(xí)算法都包含許多超參數(shù),從不同方面或多或少地影響著算法的性能。例如,有些超參數(shù)會(huì)影響算法運(yùn)行的時(shí)間和存儲(chǔ)成本,有些超參數(shù)會(huì)影響模型的質(zhì)量,有些會(huì)影響推斷正確結(jié)果的能力。這些超參數(shù)包括前面提到的學(xué)習(xí)率(影響學(xué)習(xí)速度)、模型深度(影響模型的泛化能力)等。有兩種選擇超參數(shù)的基本方法:手動(dòng)選擇和自動(dòng)選擇。手動(dòng)選擇超參數(shù)需要了解這些超參數(shù)是要完成什么工作,以及機(jī)器學(xué)習(xí)模型如何通過(guò)這些參數(shù)才能取得良好的泛化。自動(dòng)選擇超參數(shù)算法可以從很大程度上減少人為工作量,但是往往需要更高的計(jì)算成本?!?-2超參數(shù)尋優(yōu)算法手動(dòng)搜索超參數(shù)通常是當(dāng)我們受限于運(yùn)行時(shí)間和內(nèi)存大小的時(shí)候采取的最小化泛化誤差的方式。在此我們不去探討如何確定各種超參數(shù)對(duì)運(yùn)行時(shí)間和內(nèi)存的影響,因?yàn)檫@高度依賴于平臺(tái)硬件或網(wǎng)絡(luò)模型的框架。手動(dòng)搜索超參數(shù)的主要目標(biāo)是調(diào)整模型的有效容量以匹配任務(wù)的復(fù)雜性。6.2.1手動(dòng)超參數(shù)尋優(yōu)當(dāng)泛化誤差是以某個(gè)超參數(shù)為變量的函數(shù)時(shí),通常會(huì)表現(xiàn)為一條U形曲線,如圖6-4所示。在某個(gè)極端情況下,超參數(shù)對(duì)應(yīng)著低容量,并且泛化誤差由于訓(xùn)練誤差較大而很高,如當(dāng)模型的深度過(guò)低的時(shí)候所對(duì)應(yīng)欠擬合的情況。另一種極端情況就是超參數(shù)對(duì)應(yīng)著高容量,并且泛化誤差由于訓(xùn)練誤差和測(cè)試誤差之間的差距較大而很高,如模型的深度過(guò)深,雖然模型能夠很好地學(xué)習(xí)輸入數(shù)據(jù)但是會(huì)發(fā)生過(guò)擬合。最優(yōu)的模型容量應(yīng)該位于這個(gè)U型曲線中間的某個(gè)位置,能夠達(dá)到最低可能的泛化誤差。圖6-4超參數(shù)與模型性能關(guān)系并非每個(gè)超參數(shù)與損失之間的關(guān)系都能對(duì)應(yīng)著完整的U形曲線。很多超參數(shù)與性能之間的對(duì)應(yīng)是離散的,如中間層單元的數(shù)目,這種情況下只能離散地探索一些點(diǎn)的性能。有些超參數(shù)是二值化的,通常這些超參數(shù)用來(lái)指定是否使用學(xué)習(xí)算法中的一些可選部分,如前面介紹的門控制是否參與計(jì)算的深度學(xué)習(xí)模型(這些超參數(shù)只能探索曲線上的兩點(diǎn),即“是”=1或“否”=0)。還有一些超參數(shù)可能會(huì)有最小值或最大值,可以限制其探索曲線的其他范圍(例如權(quán)重衰減系數(shù)的最小值是0。當(dāng)其為0時(shí)意味著約束項(xiàng)不起作用)。手動(dòng)調(diào)整超參數(shù)時(shí)不要忘記最終目標(biāo),就是提升測(cè)試集性能。加入正則化方法只是我們實(shí)現(xiàn)這個(gè)目標(biāo)的一種方式。當(dāng)然也可以通過(guò)收集更多的訓(xùn)練數(shù)據(jù)來(lái)減少模型的泛化誤差。實(shí)踐中能夠確保訓(xùn)練有效的“暴力”方法就是不斷提高模型容量和訓(xùn)練集的大小,直到解決問(wèn)題。但是這種做法增加了訓(xùn)練的計(jì)算代價(jià),所以只有在擁有足夠計(jì)算機(jī)資源時(shí)才是可行的,同時(shí)要注意數(shù)據(jù)資源的質(zhì)量。如前所述,當(dāng)我們做過(guò)相同類型的應(yīng)用或具有相似網(wǎng)絡(luò)結(jié)構(gòu)建模經(jīng)驗(yàn)的話,就可以適當(dāng)?shù)刈孕写_定初始值和調(diào)整超參數(shù)。但現(xiàn)在越來(lái)越需要的是通過(guò)自動(dòng)算法找到合適的超參數(shù),因?yàn)榇蠖鄶?shù)情況下已經(jīng)無(wú)法手動(dòng)尋找大型網(wǎng)絡(luò)較優(yōu)的初始值了。下面介紹兩種自動(dòng)超參數(shù)優(yōu)化(HyperparameterOptimization)算法,分別是網(wǎng)格搜索(GridSearch)和隨機(jī)搜索(RandomSearch)。6.2.2超參數(shù)尋優(yōu)算法一、網(wǎng)格搜索算法當(dāng)有三個(gè)或更少的超參數(shù)存在時(shí),常見(jiàn)的超參數(shù)搜索方法就是網(wǎng)格搜索。對(duì)于每個(gè)超參數(shù)都選擇一個(gè)較小的有限值集去探索,最后挑選使驗(yàn)證集誤差達(dá)到最小的超參數(shù)。那么應(yīng)該如何選擇搜索集合的范圍呢?在超參數(shù)是數(shù)值有序的情況下,每個(gè)列表中的最小和最大元素可以先提取出來(lái),以確保在所選范圍內(nèi)尋找最優(yōu)解。通常,網(wǎng)格搜索會(huì)在對(duì)數(shù)尺度(LogarithmicScale)下挑選合適值,例如,一個(gè)學(xué)習(xí)率的取值集合可以是,或者隱藏單元數(shù)目的取值集合可以為。二、隨機(jī)搜索算法與網(wǎng)格搜索算法相比,隨機(jī)搜索算法能更快地收斂到超參數(shù)的較優(yōu)取值。算法如下所示。(1)首先為每個(gè)超參數(shù)定義一個(gè)邊緣分布,例如,Bernoulli分布或者對(duì)數(shù)尺度上的均勻分布,對(duì)應(yīng)著正實(shí)值超參數(shù)。例如: (6-4) (6-5)其中,表示區(qū)間在上均勻采樣的樣本。(2)然后搜索算法從聯(lián)合的超參數(shù)空間中采樣并運(yùn)行每一個(gè)樣本,逐個(gè)比較目標(biāo)函數(shù)值,將壞的點(diǎn)拋棄,保留好的點(diǎn),最后便得到近似的最優(yōu)解?!?-3基于梯度的自適應(yīng)學(xué)習(xí)算法通過(guò)對(duì)深度學(xué)習(xí)算法的討論,我們可以很清楚地看出幾乎所有的學(xué)習(xí)過(guò)程都離不開(kāi)梯度。模型中幾乎所有的權(quán)重與偏置參數(shù)的學(xué)習(xí)過(guò)程都需要梯度的參與。前面介紹的梯度下降算法,雖然是一種能讓模型自動(dòng)學(xué)習(xí)的方法,但又不可避免地引出了一個(gè)新的超參數(shù),即學(xué)習(xí)率。學(xué)習(xí)率是一個(gè)非常重要的超參數(shù),因?yàn)樗鼘?duì)模型的性能有顯著的影響。太小的學(xué)習(xí)率會(huì)使模型的學(xué)習(xí)緩慢,而太大的學(xué)習(xí)率有可能導(dǎo)致跨過(guò)希望得到的較優(yōu)點(diǎn),如圖6-5所示,無(wú)法達(dá)到損失值的最小點(diǎn)。損失值通常是高度敏感于參數(shù)空間中某些方向的,也就是梯度下降的方向,它不能漫無(wú)目的地迭代。雖然前面所說(shuō)的帶動(dòng)量的梯度下降學(xué)習(xí)算法可以在一定程度上緩解這些問(wèn)題,但這樣做的代價(jià)是引入了另一個(gè)超參數(shù),即動(dòng)量參數(shù),這又增加了工作量。圖6-5損失函數(shù)6.3.1AdaGrad算法AdaGrad算法流程如圖6-6所示,學(xué)習(xí)率η獨(dú)立地應(yīng)用于模型所有的參數(shù)。在損失函數(shù)上,擁有最大偏導(dǎo)數(shù)的參數(shù)相應(yīng)地?fù)碛幸粋€(gè)較大的學(xué)習(xí)率使之能夠快速地下降,而具有小偏導(dǎo)值的參數(shù)就獲得一個(gè)小學(xué)習(xí)率。值得注意的是,算法中為了數(shù)值計(jì)算的穩(wěn)定增加了一個(gè)平滑值。該參數(shù)避免了計(jì)算過(guò)程中分母可能為零的情況發(fā)生。圖6-6AdaGrad算法流程RMSProp算法優(yōu)化了AdaGrad,改變梯度積累為指數(shù)加權(quán)的移動(dòng)平均。AdaGrad旨在應(yīng)用于凸問(wèn)題時(shí)快速收斂(關(guān)于凸優(yōu)化的知識(shí)超出了本書(shū)的范圍,讀者可以參考凸優(yōu)化的相關(guān)書(shū)籍)。AdaGrad根據(jù)平方梯度的整個(gè)歷史收縮學(xué)習(xí)率,會(huì)使得學(xué)習(xí)率在達(dá)到較優(yōu)結(jié)果前就變得太小了。而RMSProp使用指數(shù)衰減平均以丟棄遙遠(yuǎn)過(guò)去的歷史值,從而避免了過(guò)大衰減的問(wèn)題,使其能夠找到較優(yōu)值,并且快速收斂。RMSProp的標(biāo)準(zhǔn)算法形式如圖6-7所示,結(jié)合了Nesterov動(dòng)量的算法形式如圖6-8所示。相比于AdaGrad,RMSProp引入了一個(gè)新的超參數(shù),用來(lái)控制指數(shù)衰減的程度。結(jié)合了Nesterov動(dòng)量的RMSProp算法對(duì)梯度計(jì)算了指數(shù)衰減平均。這種做法有利于進(jìn)一步消除擺動(dòng)幅度大的方向,用來(lái)修正擺動(dòng)幅度,使得各個(gè)維度的擺動(dòng)幅度都較小,進(jìn)而使得網(wǎng)絡(luò)函數(shù)收斂更快。6.3.2AMSProp算法圖6-7標(biāo)準(zhǔn)RMSProp算法流程圖6-8含動(dòng)量RMSProp算法流程6.3.4Adam算法Adam是另一種學(xué)習(xí)率自適應(yīng)優(yōu)化算法。“Adam”這個(gè)名字來(lái)自于“AdaptiveMoments”。Adam優(yōu)化算法是隨機(jī)梯度下降算法的擴(kuò)展,廣泛用于深度學(xué)習(xí),尤其是計(jì)算機(jī)視覺(jué)和自然語(yǔ)言處理等任務(wù)。Adam算法和傳統(tǒng)的隨機(jī)梯度下降不同。隨機(jī)梯度下降利用單一的學(xué)習(xí)率更新所有的權(quán)重,學(xué)習(xí)率在訓(xùn)練過(guò)程中并不會(huì)改變。而Adam通過(guò)計(jì)算梯度的一階矩估計(jì)和二階矩估計(jì)為不同的參數(shù)設(shè)計(jì)獨(dú)立的自適應(yīng)學(xué)習(xí)率。圖6-9Adma算法流程Adam算法具有如下優(yōu)點(diǎn):①為每一個(gè)參數(shù)保留了一個(gè)學(xué)習(xí)率來(lái)提升在稀疏梯度(即自然語(yǔ)言和計(jì)算機(jī)視覺(jué)問(wèn)題)上的性能;②基于權(quán)重梯度最近量級(jí)的均值為每一個(gè)參數(shù)適應(yīng)性地保留學(xué)習(xí)率(避免了AdaGrad的過(guò)度收縮),在非穩(wěn)態(tài)問(wèn)題上有著較優(yōu)秀的性能??偟膩?lái)說(shuō),Adma綜合了AdaGrad與RMSProp的優(yōu)點(diǎn),并在實(shí)際的工程應(yīng)用中表現(xiàn)出了不錯(cuò)的性能。前面已經(jīng)提到,循環(huán)性狀態(tài)h在時(shí)間上向前傳播信息,而循環(huán)性狀態(tài)g在時(shí)間上向后傳播信息。因此在每個(gè)時(shí)間步t,輸出單元o(t)都可以接收到輸入h(t)中關(guān)于過(guò)去的相關(guān)信息以及輸入g(t)中所包括的關(guān)于未來(lái)的相關(guān)要素。值得注意的是,雖然我們一直使用時(shí)間步來(lái)進(jìn)行說(shuō)明,但是RNN也可以應(yīng)用于非時(shí)間序列的序列數(shù)據(jù),此時(shí)時(shí)間步索引就變成了序列數(shù)據(jù)的位置索引。例如,上述的雙向RNN也可以應(yīng)用于處理圖像數(shù)據(jù):由四個(gè)RNN組成,每一個(gè)網(wǎng)絡(luò)沿著四個(gè)方向中的一個(gè)計(jì)算:上、下、左、右。相比卷積網(wǎng)絡(luò),應(yīng)用于圖像的RNN計(jì)算成本通常更高,但允許同一特征圖的特征之間存在長(zhǎng)期橫向的相互作用?!?-4生成對(duì)抗神經(jīng)網(wǎng)絡(luò)GAN及實(shí)例實(shí)驗(yàn)中我們發(fā)現(xiàn),當(dāng)在識(shí)別精度達(dá)到人類水平的神經(jīng)網(wǎng)絡(luò)上有意地在樣本中增加人類難以被干擾(或人類難以發(fā)現(xiàn)變化)的數(shù)據(jù)時(shí),網(wǎng)絡(luò)的誤差率可以接近100%。簡(jiǎn)單來(lái)說(shuō)就是有意地在原始數(shù)據(jù)中稍微增加些擾動(dòng),從人類角度來(lái)看并不會(huì)對(duì)分類結(jié)果產(chǎn)生影響,但是對(duì)于深度學(xué)習(xí)來(lái)說(shuō)卻是一個(gè)致命的問(wèn)題。這種稍微增加了擾動(dòng)的樣本,我們稱之為對(duì)抗樣本(AdversarialExample)如圖6-10所示,人類實(shí)際上很難通過(guò)眼睛識(shí)別出原始圖像和對(duì)抗樣本圖像之間區(qū)別的。但是對(duì)抗樣本是給原始圖像增加了微小擾動(dòng)的圖像后得到的,因此在訓(xùn)練網(wǎng)絡(luò)時(shí),原始圖像和對(duì)抗樣本的數(shù)值是明顯不同的。圖6-10對(duì)抗樣本生成與分類結(jié)果抽象地講,模型在對(duì)抗樣本圖像上某點(diǎn)的輸出與原始圖像同一點(diǎn)的輸出可能具有很大的差異。但是在許多情況下,人類通過(guò)肉眼難以察覺(jué)到差異,而網(wǎng)絡(luò)卻會(huì)作出非常不同的預(yù)測(cè)。如何實(shí)現(xiàn)對(duì)抗訓(xùn)練呢,就是使用生成對(duì)抗神經(jīng)網(wǎng)絡(luò)(GenerativeAdversarialNetworks,GAN)。生成對(duì)抗網(wǎng)絡(luò)分為如下兩步:①生成模型;②鑒別模型。原理如圖6.11所示,生成模型從無(wú)到有地不斷生成數(shù)據(jù),而鑒別模型不斷地鑒別輸入進(jìn)來(lái)的究竟是生成模型產(chǎn)生的數(shù)據(jù)還是原始數(shù)據(jù),兩者不斷產(chǎn)生對(duì)抗。生成模型努力生成不讓鑒別模型可以識(shí)別出來(lái)的數(shù)據(jù),而鑒別模型則盡力地鑒別數(shù)據(jù)的來(lái)源,二者不斷成長(zhǎng),從而得到最好的生成模型和鑒別模型。生成對(duì)抗神經(jīng)網(wǎng)絡(luò)GAN是從學(xué)習(xí)數(shù)據(jù)的分布出發(fā),最終得到兩個(gè)一樣的數(shù)據(jù)分布模型,。圖6-11生成對(duì)抗網(wǎng)絡(luò)原理我們希望鑒別模型能判斷出輸入樣本是否來(lái)自于真實(shí)的原始數(shù)據(jù)。如果來(lái)自于真實(shí)數(shù)據(jù)則模型輸出1,否則輸出為0??梢詫㈣b別模型定義為:(6-6)這里,將原始數(shù)據(jù)的數(shù)學(xué)分布定義為,而為輸入判斷為真實(shí)樣本的概率。這樣我們就證明了生成對(duì)抗神經(jīng)網(wǎng)絡(luò)的理論可行性。下面通過(guò)TensorFlow來(lái)實(shí)現(xiàn)GAN,我們還是使用手寫(xiě)數(shù)字?jǐn)?shù)據(jù)集進(jìn)行訓(xùn)練。#導(dǎo)入tensorflowimporttensorflowastf#導(dǎo)入手寫(xiě)數(shù)字?jǐn)?shù)據(jù)集fromtensorflow.examples.tutorials.mnistimportinput_data#導(dǎo)入numpyimportnumpyasnp#plt是繪圖工具,在訓(xùn)練過(guò)程中用于輸出可視化結(jié)果importmatplotlib.pyplotasplt#gridspec是圖片排列工具,在訓(xùn)練過(guò)程中用于輸出可視化結(jié)果importmatplotlib.gridspecasgridspec#導(dǎo)入osimportos#保存模型的save函數(shù)defsave(saver,sess,logdir,step):#模型名前綴model_name='model'#保存路徑
checkpoint_path=os.path.join(logdir,model_name)#保存模型
saver.save(sess,checkpoint_path,global_step=step)print('Thecheckpointhasbeencreated.')#初始化參數(shù)時(shí)使用的xavier_init函數(shù)defxavier_init(size):in_dim=size[0]#X表示真的樣本(即真實(shí)的手寫(xiě)數(shù)字)X=tf.placeholder(tf.float32,shape=[None,784])#表示使用xavier方式初始化的判別器的D_W1參數(shù),是一個(gè)784行128列的矩陣D_W1=tf.Variable(xavier_init([784,128]))#表示全零方式初始化的判別器的D_1參數(shù),是一個(gè)長(zhǎng)度為128的向量D_b1=tf.Variable(tf.zeros(shape=[128]))#表示使用xavier方式初始化的判別器的D_W2參數(shù),是一個(gè)128行1列的矩陣D_W2=tf.Variable(xavier_init([128,1]))#表示全零方式初始化的判別器的D_1參數(shù),是一個(gè)長(zhǎng)度為1的向量D_b2=tf.Variable(tf.zeros(shape=[1]))#theta_D表示判別器的可訓(xùn)練參數(shù)集合theta_D=[D_W1,D_W2,D_b1,D_b2]#Z表示生成器的輸入(在這里是噪聲),是一個(gè)N列100行的矩陣Z=tf.placeholder(tf.float32,shape=[None,100])#表示使用xavier方式初始化的生成器的G_W1參數(shù),是一個(gè)100行128列的矩陣G_W1=tf.Variable(xavier_init([100,128]))#表示全零方式初始化的生成器的G_b1參數(shù),是一個(gè)長(zhǎng)度為128的向量G_b1=tf.Variable(tf.zeros(shape=[128]))#表示使用xavier方式初始化的生成器的G_W2參數(shù),是一個(gè)128行784列的矩陣G_W2=tf.Variable(xavier_init([128,784]))#表示全零方式初始化的生成器的G_b2參數(shù),是一個(gè)長(zhǎng)度為784的向量G_b2=tf.Variable(tf.zeros(shape=[784]))#theta_G表示生成器的可訓(xùn)練參數(shù)集合theta_G=[G_W1,G_W2,G_b1,G_b2]#生成維度為[m,n]的隨機(jī)噪聲作為生成器G的輸入defsample_Z(m,n):returnnp.random.uniform(-1.,1.,size=[m,n])#生成器,z的維度為[N,100]defgenerator(z):#輸入的隨機(jī)噪聲乘以G_W1矩陣加上偏置G_b1,G_h1維度為[N,128]G_h1=tf.nn.relu(tf.matmul(z,G_W1)+G_b1)#G_h1乘以G_W2矩陣加上偏置G_b2,G_log_prob維度為[N,784]G_log_prob=tf.matmul(G_h1,G_W2)+G_b2#G_log_prob經(jīng)過(guò)一個(gè)sigmoid函數(shù),G_prob維度為[N,784]G_prob=tf.nn.sigmoid(G_log_prob)#返回G_prob
returnG_prob#判別器,x的維度為[N,784]defdiscriminator(x):#輸入乘以D_W1矩陣加上偏置D_b1,D_h1維度為[N,128]D_h1=tf.nn.relu(tf.matmul(x,D_W1)+D_b1)#D_h1乘以D_W2矩陣加上偏置D_b2,D_logit維度為[N,1]D_logit=tf.matmul(D_h1,D_W2)+D_b2#D_logit經(jīng)過(guò)一個(gè)sigmoid函數(shù),D_prob維度為[N,1]D_prob=tf.nn.sigmoid(D_logit)#返回D_prob,D_logitreturnD_prob,D_logit#保存圖片時(shí)使用的plot函數(shù)defplot(samples):#初始化一個(gè)4行4列包含16張子圖像的圖片fig=plt.figure(figsize=(4,4))#調(diào)整子圖的位置
gs=gridspec.GridSpec(4,4)#設(shè)置子圖間的間距
gs.update(wspace=0.05,hspace=0.05)#依次將16張子圖填充進(jìn)需要保存的圖像
fori,sampleinenumerate(samples):ax=plt.subplot(gs[i])plt.axis('off')ax.set_xticklabels([])ax.set_yticklabels([])ax.set_aspect('equal')plt.imshow(sample.reshape(28,28),cmap='Greys_r')
returnfig#取得生成器的生成結(jié)果G_sample=generator(Z)#取得判別器判別的真實(shí)手寫(xiě)數(shù)字的結(jié)果D_real,D_logit_real=discriminator(X)#取得判別器判別的生成的手寫(xiě)數(shù)字的結(jié)果D_fake,D_logit_fake=discriminator(G_sample)D_loss_real=#對(duì)判別器對(duì)真實(shí)樣本的判別結(jié)果計(jì)算誤差(將結(jié)果與1比較)tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=D_logit_real,labels=tf.ones_like(D_logit_real)))#對(duì)判別器對(duì)虛假樣本(即生成器生成的手寫(xiě)數(shù)字)的判別結(jié)果計(jì)算誤差(將結(jié)果與0比較)D_loss_fake=tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=D_logit_fake,labels=tf.zeros_like(D_logit_fake)))#判別器的誤差D_loss=D_loss_real+D_loss_fake#生成器的誤差(將判別器返回的對(duì)虛假樣本的判別結(jié)果與1比較)G_loss=tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=D_logit_fake,labels=tf.ones_like(D_logit_fake)))#記錄判別器判別真實(shí)樣本的誤差dreal_loss_sum=tf.summary.scalar("dreal_loss",D_loss_real)#記錄判別器判別虛假樣本的誤差dfake_loss_sum=tf.summary.scalar("dfake_loss",D_loss_fake)#記錄判別器的誤差d_loss_sum=tf.summary.scalar("d_loss",D_loss)#記錄生成器的誤差g_loss_sum=tf.summary.scalar("g_loss",G_loss)#日志記錄器summary_writer=tf.summary.FileWriter('snapshots/',graph=tf.get_default_graph())……最后得到了它的損失圖像如圖6-12所示。圖6-12GAN訓(xùn)練圖像遷移學(xué)習(xí)(TransferLearning)是指利用一個(gè)情景中已經(jīng)學(xué)到的內(nèi)容去改善另一個(gè)情景中的泛化情況。我們可以利用自己的學(xué)習(xí)經(jīng)歷去理解遷移學(xué)習(xí)。在我們學(xué)習(xí)了許多數(shù)學(xué)公式和物理公式之后,就可以用它們來(lái)解決一些其它領(lǐng)域的問(wèn)題。這個(gè)過(guò)程就是將已有的經(jīng)驗(yàn)應(yīng)用到其他場(chǎng)景中的典型實(shí)例,也就是一個(gè)知識(shí)遷移的過(guò)程。這個(gè)過(guò)程也適用于神經(jīng)網(wǎng)絡(luò)。神經(jīng)網(wǎng)絡(luò)需要用數(shù)據(jù)來(lái)訓(xùn)練,它的學(xué)習(xí)過(guò)程就是一個(gè)參數(shù)更新的過(guò)程。從數(shù)據(jù)獲得信息,進(jìn)而把它們轉(zhuǎn)換成相應(yīng)的權(quán)重。最終這些權(quán)重能夠被提取出來(lái)并且可以遷移到其他的神經(jīng)網(wǎng)絡(luò)中,這相當(dāng)于使用了這些學(xué)來(lái)的“經(jīng)驗(yàn)”?!?-5遷移學(xué)習(xí)及實(shí)例下面我們嘗試實(shí)現(xiàn)一個(gè)遷移學(xué)習(xí)模型。這里提供TensorFlow和Keras的實(shí)現(xiàn)過(guò)程供對(duì)比。示例是通過(guò)遷移InceptionV3模型來(lái)實(shí)現(xiàn),InceptionV3的訓(xùn)練集包括5種花的彩色圖像,如圖6-18和圖6-19所示。圖6-18InceptionV3的訓(xùn)練集樣本分類放置圖6-19InceptionV3的訓(xùn)練集樣本單種類下的樣本(Rose)#導(dǎo)入所需包importglobimportosimportnumpyasnpimportrandomimporttensorflowastffromtensorflow.python.platformimportgfileimportcv2#inception-v3模型瓶頸層的節(jié)點(diǎn)個(gè)數(shù)BOTTLENECT_TENSOR_SIZE=2048#瓶頸層中結(jié)果的張量名稱,在訓(xùn)練時(shí),可以通過(guò)獲取BOTTLENECT_TENSOR_NAME='pool_3/_reshape:0'#圖像輸入張量對(duì)應(yīng)的名稱JPEG_DATA_TENSOR_NAME='DecodeJpeg/contents:0'#模型所在的路徑MODEL_DIR='./'#谷歌訓(xùn)練好的inception-v3模型MODEL_FILE_NAME='./inception_dec_2015/tensorflow_inception_graph.pb'#保存圖像經(jīng)過(guò)inception-v3模型計(jì)算后得到的特征向量。CACHE_DIR='temp/'#輸入圖片對(duì)應(yīng)的路徑INPUT_DATA='flower_photos'VALIDATAION_PERCENTAGE=10TEST_PERCENTAGE=10LEANRNING_RAGE=0.01STEPS=40000BATCH=200#獲取當(dāng)前目錄下的所有子目錄
sub_dirs=[x[0]forxinos.walk(INPUT_DATA)]is_root_dir=Trueforsub_dirinsub_dirs:ifis_root_dir:is_root_dir=Falsecontinueextensions=['jpg','jpeg','JPG','JPEG']file_list=[]dir_name=os.path.basename(sub_dir)forextensioninextensions:file_glob=os.path.join(INPUT_DATA,dir_name,'*.'+extension)file_list.extend(glob.glob(file_glob))
#通過(guò)目錄名稱獲取類別的名稱
label_name=dir_name.lower()test_image=[]val_image=[]train_image=[]forfile_nameinfile_list:base_name=os.path.basename(file_name)chance=np.random.randint(100)ifchance<val_percentage:val_image.append(base_name)elifchance<(test_percentage+val_percentage):test_image.append(base_name)else:train_image.append(base_name)#將當(dāng)前的類別放入字典中
result[label_name]={'dir':dir_name,'training':train_image,'testing':test_image,'valing':val_image,}returnresult#image_lists:所有圖片的信息#image_dir:根目錄,存放圖片數(shù)據(jù)的根目錄#label_name:類別的名稱#index:需要獲取的圖片的編號(hào)#category:需要獲取的圖片屬于哪個(gè)激活【測(cè)試集、訓(xùn)練集、驗(yàn)證集】defget_image_path(image_lists,image_dir,label_name,index,category):lable_lists=image_lists[label_name]category_list=lable_lists[category]mod_index=index%len(category_list)base_name=category_list[mod_index]sub_dir=lable_lists['dir']full_path=os.path.join(image_dir,sub_dir,base_name)returnfull_pathdefget_bottleneck_path(image_lists,label_name,index,category):returnget_image_path(image_lists,CACHE_DIR,label_name,index,category)+'.txt'defrun_bottlenect_on_image(sess,image_data,image_data_tensro,bottlenect_tensor):
bottlenect_values=sess.run(bottlenect_tensor,{image_data_tensro:image_data})bottlenect_values=np.squeeze(bottlenect_values)returnbottlenect_valuesdefget_or_create_bottleneck(sess,image_lists,label_name,index,category,jpeg_data_tensor,bottleneck_tensor):label_lists=image_lists[label_name]sub_dir=label_lists['dir']sub_dir_path=os.path.join(CACHE_DIR,sub_dir)ifnotos.path.exists(sub_dir_path):os.makedirs(sub_dir_path)bottleneck_path=get_bottleneck_path(image_lists,label_name,index,category)ifnotos.path.exists(bottleneck_path):image_path=get_image_path(image_lists,INPUT_DATA,label_name,index,category)image_data=gfile.FastGFile(image_path,'rb').read()bottlenect_values=run_bottlenect_on_image(sess,image_data,jpeg_data_tensor,bottleneck_tensor)bottleneck_string=','.join(str(x)forxinbottlenect_values)withopen(bottleneck_path,'w')asf:f.write(bottleneck_string)else:withopen(bottleneck_path,'r')asf:bottleneck_string=f.read()bottlenect_values=[float(x)forxinbottleneck_string.split(',')]returnbottlenect_valuesdefget_random_cached_bottlenecks(sess,n_classes,image_lists,how_many,category,jpeg_data_tensor,bottleneck_tensor):
bottlenecks=[]ground_truths=[]for_inrange(how_many):label_index=random.randrange(n_classes)label_name=list(image_lists.keys())[label_index]image_index=random.randrange(65536)bottleneck=get_or_create_bottleneck(sess,image_lists,label_name,image_index,category,jpeg_data_tensor,bottleneck_tensor)ground_truth=np.zeros(n_classes,np.float32)ground_truth[label_index]=1.0bottlenecks.append(bottleneck)ground_truths.append(ground_truth)returnbottlenecks,ground_truths……以上部分即為利用TensorFlow實(shí)現(xiàn)遷移學(xué)習(xí)的過(guò)程,雖然代碼略顯繁瑣,但是理解之后會(huì)發(fā)現(xiàn)它十分靈活,能夠方便地編寫(xiě)出想要實(shí)現(xiàn)的特定功能層?!?-6強(qiáng)化學(xué)習(xí)在實(shí)際生活中或許都遇到過(guò)這樣的情景。小時(shí)候,當(dāng)我們做錯(cuò)事情后會(huì)受到父母的批評(píng),就知道了下次不能再犯同樣的錯(cuò)誤。而當(dāng)我們受到表?yè)P(yáng)的時(shí)候,我們就會(huì)告訴自己下次要更努力,取得更大的進(jìn)步。以此類推,機(jī)器是否也能夠具有這種通過(guò)外界反饋來(lái)調(diào)節(jié)自身行為的能力呢?回答是肯定的。使機(jī)器能夠根據(jù)外界環(huán)境的反饋來(lái)進(jìn)一步完善自身的算法被稱為強(qiáng)化學(xué)習(xí)(ReinforcementLearning)。強(qiáng)化學(xué)習(xí)的重點(diǎn)是如何確定決策,它需要通過(guò)外界環(huán)境的效果反饋來(lái)進(jìn)行,因此強(qiáng)化學(xué)習(xí)模型是一個(gè)閉環(huán)結(jié)構(gòu),原理如圖6.20所示。圖6-20強(qiáng)化學(xué)習(xí)原理簡(jiǎn)圖當(dāng)進(jìn)入危險(xiǎn)環(huán)境時(shí)會(huì)反饋一個(gè)很大的負(fù)值Reward表示對(duì)此行為加以“懲罰”;而當(dāng)進(jìn)入希望的目標(biāo)區(qū)域時(shí),則反饋一個(gè)適當(dāng)?shù)恼当硎尽蔼?jiǎng)勵(lì)”。強(qiáng)化學(xué)習(xí)的目標(biāo)就是通過(guò)不斷地強(qiáng)化這種懲罰和獎(jiǎng)勵(lì)以改進(jìn)策略并達(dá)到最佳狀態(tài)。而強(qiáng)化學(xué)習(xí)的過(guò)程就是通過(guò)不斷地調(diào)整策略來(lái)獲得最優(yōu)的反饋值,原理如圖6-21所示。圖6-21強(qiáng)化學(xué)習(xí)工作原理簡(jiǎn)圖下面我們以一個(gè)實(shí)例來(lái)體會(huì)Q-Learning算法的工作流程。該例子描述了一個(gè)利用無(wú)監(jiān)督學(xué)習(xí)來(lái)識(shí)別未知環(huán)境的agent。假設(shè)現(xiàn)在有這樣一個(gè)環(huán)境,該環(huán)境里有五個(gè)房間(編號(hào)分別為0至4),房間之間通過(guò)門相連,所有房間的外部被標(biāo)記為5,如圖6-23所示。圖6-23環(huán)境結(jié)構(gòu)示意圖這樣的房間圖也可以通過(guò)節(jié)點(diǎn)圖來(lái)表示,如圖6-24所示。對(duì)每一個(gè)房間的出入行程,利用節(jié)點(diǎn)間的有向線段表示。圖6-24房間及路線使用節(jié)點(diǎn)表示在這個(gè)示例中,對(duì)應(yīng)Q-Learning算法,我們要初始化,即將agent置于這個(gè)建筑中的任意一個(gè)房間,然后從該房間開(kāi)始使其走到建筑外,也就是圖中編號(hào)為5的地方,這就是我們的目標(biāo)狀態(tài)。二、sarsa算法Sarsa的算法流程如圖6-30所示。圖6-30Sarsa算法實(shí)現(xiàn)過(guò)程§6-7模型優(yōu)化的局限性前面介紹了多種深度學(xué)習(xí)模型優(yōu)化的方法,但依然還存在著許多限制模型性能進(jìn)一步發(fā)展的因素。這些因素也是當(dāng)今深度學(xué)習(xí)領(lǐng)域的重要研究方向6.7.1局部極小值凸優(yōu)化問(wèn)題的一個(gè)突出特點(diǎn)是可以簡(jiǎn)化為尋找一個(gè)局部極小點(diǎn)的問(wèn)題。凸優(yōu)化任何一個(gè)局部極小點(diǎn)都是全局最小點(diǎn),如圖6-31所示。
圖6-31凸函數(shù)局部極小點(diǎn)即為全局最小點(diǎn)6.7.2梯度消失、梯度爆炸與懸崖我們現(xiàn)在知道,越深的神經(jīng)網(wǎng)絡(luò)其有效容量就越大,但是在實(shí)際的工程當(dāng)中我們是不可能構(gòu)造一個(gè)無(wú)限深的深度學(xué)習(xí)模型的。隨著模型深度的增加,學(xué)習(xí)速度會(huì)明顯降低甚至出現(xiàn)不收斂的問(wèn)題。這種現(xiàn)象就是由梯度消失或梯度爆炸引起的。?般地說(shuō),在深度神經(jīng)網(wǎng)絡(luò)中的梯度是不穩(wěn)定的,在前面的層中或會(huì)消失,或會(huì)激增。這種不穩(wěn)定性才是深度神經(jīng)網(wǎng)絡(luò)中基于梯度學(xué)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 房屋搬運(yùn)合同范本
- 小區(qū)會(huì)所健身合作協(xié)議書(shū)范本
- 租用公司房產(chǎn)合同范本
- 春節(jié)前中學(xué)生安全教育
- 第一章 國(guó) 第二節(jié) 《人口》教學(xué)設(shè)計(jì)2023-2024學(xué)年人教版初中地理八年級(jí)上冊(cè)
- 第22課 抗日戰(zhàn)爭(zhēng)的勝利(新教學(xué)設(shè)計(jì))2023-2024學(xué)年八年級(jí)上冊(cè)歷史(部編版)
- 第三單元 第五課 干旱的寶地(第1課時(shí) 石油寶庫(kù))教學(xué)設(shè)計(jì)-人教版歷史與社會(huì)七年級(jí)上冊(cè)
- 2024材料供貨合同范本3
- 人教版八年級(jí)生物下冊(cè)第七單元生物圈中生命的延續(xù)和發(fā)展同步教學(xué)設(shè)計(jì)
- 吸污、清洗工程施工合同
- 2025年度產(chǎn)業(yè)園區(qū)建設(shè)項(xiàng)目委托代建服務(wù)協(xié)議
- 2025年湖南水利水電職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試近5年常考版參考題庫(kù)含答案解析
- 鄉(xiāng)鎮(zhèn)機(jī)關(guān)考勤管理制度
- 2025年徐州生物工程職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測(cè)試近5年??及鎱⒖碱}庫(kù)含答案解析
- 向量的數(shù)量積說(shuō)課
- 2024年全國(guó)體育專業(yè)單獨(dú)招生考試數(shù)學(xué)試卷試題真題(含答案)
- 人體解剖生理學(xué)(第2版) 課件 第二章 細(xì)胞
- 教務(wù)主任在教務(wù)管理經(jīng)驗(yàn)大會(huì)上發(fā)言稿
- 自動(dòng)體外除顫器
- 《腦出血護(hù)理》課件
- 《裝修流程圖課件》課件
評(píng)論
0/150
提交評(píng)論