深度學習技術基礎與實踐 課件 第7、8章 模型優(yōu)化、強化學習實戰(zhàn)_第1頁
深度學習技術基礎與實踐 課件 第7、8章 模型優(yōu)化、強化學習實戰(zhàn)_第2頁
深度學習技術基礎與實踐 課件 第7、8章 模型優(yōu)化、強化學習實戰(zhàn)_第3頁
深度學習技術基礎與實踐 課件 第7、8章 模型優(yōu)化、強化學習實戰(zhàn)_第4頁
深度學習技術基礎與實踐 課件 第7、8章 模型優(yōu)化、強化學習實戰(zhàn)_第5頁
已閱讀5頁,還剩94頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第7章模型優(yōu)化授課教師:時

間:目錄7.17.27.3超參數(shù)搜索方法編程實戰(zhàn)模型壓縮剪枝、低秩分解、模型量化、權值共享、知識蒸餾網(wǎng)格搜索、隨機搜索、啟發(fā)式搜索模型量化實驗、參數(shù)搜索實驗7.11模型壓縮模型壓縮模型壓縮方法的目標是,在盡可能保留現(xiàn)有深度神經(jīng)網(wǎng)絡模型表現(xiàn)的前提下,有效地剔除冗余信息、減小模型存儲空間。常用的模型壓縮方法有:剪枝低秩分解模型量化權值共享知識蒸餾7.1.1剪枝神經(jīng)網(wǎng)絡剪枝起初是用于解決過擬合問題,如C4.5決策樹算法中剪枝操作的運用,現(xiàn)在更多地被用于降低網(wǎng)絡復雜度,通過剔除神經(jīng)網(wǎng)絡中冗余的參數(shù)和連接,將一個復雜度較高的網(wǎng)絡模型修剪為一個復雜度較低的網(wǎng)絡,有效地壓縮了模型的大小,同時也在一定程度上解決了過擬合問題。通常情況下,我們需要訓練一個大型的、參數(shù)冗余化的模型,以此來保證模型的可塑性,這樣才能通過剪枝操作來剔除這些冗余,以保證模型的高效性。神經(jīng)網(wǎng)絡剪枝就是通過剔除權重矩陣中相對冗余的權值,然后再重新訓練網(wǎng)絡進行微調。1990年LeCun等人提出了“最佳腦損傷”的方法對網(wǎng)絡進行剪枝,通過剔除一些不重要的權重,能夠有效地加速網(wǎng)絡的推理速度,同時提升泛化性能。隨后出現(xiàn)了很多基于二階梯度的剪枝算法。這些剪枝方法有共同的邏輯思想,圍繞如何對深度神經(jīng)網(wǎng)絡模型進行剪枝。7.1.1剪枝近年來研究者提出了各種各樣有效的剪枝方案,即使算法的細節(jié)有所不同,整體的框架卻都是相似的。常見的框架流程如下:1.初始化一個大型的、參數(shù)冗余化的深度神經(jīng)網(wǎng)絡模型,通過訓練得到一個高性能的模型。過度參數(shù)化的大型模型可以使我們從中安全地刪除冗余的參數(shù)而不導致模型的準確性降低。2.衡量神經(jīng)元的重要程度。神經(jīng)元的定義可以是濾波器,也可以是通道。首先確定一個需要剪枝的層,可以是基于神經(jīng)元的方案,也可以是基于梯度的方案,然后設定一個裁剪閾值或者比例進行重要程度的衡量,不同方案的計算復雜度與效果都有很大區(qū)別。3.移除掉一部分不重要的神經(jīng)元。根據(jù)上一步衡量的結果,按照設定的閾值或者比例移除掉部分神經(jīng)元。4.模型微調。經(jīng)過剪枝后,網(wǎng)絡模型的精度會受到影響,因此為了盡可能保留模型的性能,必須對模型進行微調。對于存儲模型參數(shù)的稀疏矩陣,為了提高對存儲空間的利用率,僅存儲非零值及其所在的矩陣坐標。這樣,通過還原矩陣就可以讀取模型參數(shù)。7.1.1剪枝基于上述框架流程,Han等人提出了一個簡單而有效的方法。首先,將低于某個閾值的權重連接全部減除。然后,對剪枝后的模型網(wǎng)絡進行微調,如此反復迭代更新參數(shù),直到模型在性能和規(guī)模上達到較好的平衡。最終,在保持網(wǎng)絡分類精度不降低的前提下,可以將參數(shù)規(guī)模減少到原來的十分之一左右。該方法簡單有效,但是經(jīng)過剪枝后的網(wǎng)絡呈現(xiàn)出隨機稀疏化的結構,即被減除的網(wǎng)絡連接在分布上沒有任何的連續(xù)性,硬件實現(xiàn)的過程中難以很好地實現(xiàn)對網(wǎng)絡的加速和壓縮,同時由于結構的改變,使得剪枝之后的網(wǎng)絡模型極度依賴于平臺應用。7.1.1剪枝后來的研究者逐步提出了許多結構化的剪枝策略,包括濾波器剪枝和通道剪枝等方法。濾波器剪枝即直接除掉整個濾波器。這樣一來,模型的速度能得到有效的提升,模型的大小得到有效的壓縮,而剪枝后網(wǎng)絡的通用性也不會受到影響。這類算法的關鍵思想在于如何衡量濾波器的重要程度,通過移除掉不重要的濾波器來減小對模型準確度和通用性的破壞。通道剪枝是直接將網(wǎng)絡中卷積層的整個通道刪除。因為刪除通道意味著相關的神經(jīng)元也會被刪除,裁剪力度很大,所以會導致精度的損失也相對較大。通道剪枝的優(yōu)點是不會產(chǎn)生稀疏矩陣。7.1.1剪枝后來的研究者逐步提出了許多結構化的剪枝策略,包括濾波器剪枝和通道剪枝等方法。濾波器剪枝即直接除掉整個濾波器。這樣一來,模型的速度能得到有效的提升,模型的大小得到有效的壓縮,而剪枝后網(wǎng)絡的通用性也不會受到影響。這類算法的關鍵思想在于如何衡量濾波器的重要程度,通過移除掉不重要的濾波器來減小對模型準確度和通用性的破壞。通道剪枝是直接將網(wǎng)絡中卷積層的整個通道刪除。因為刪除通道意味著相關的神經(jīng)元也會被刪除,裁剪力度很大,所以會導致精度的損失也相對較大。通道剪枝的優(yōu)點是不會產(chǎn)生稀疏矩陣。剪枝操作對網(wǎng)絡結構的破壞程度極小,這種良好的特性往往被用于網(wǎng)絡壓縮過程的前端處理。將剪枝與其他后端壓縮技術相結合,能夠達到網(wǎng)絡模型的最大程度壓縮??傮w而言,剪枝是一項有效減小模型復雜度的通用壓縮技術,其關鍵是如何衡量刪除個別權重對于整體模型的影響程度。7.1.2低秩分解在卷積神經(jīng)網(wǎng)絡中,卷積核可以看成是一個矩陣或張量,卷積操作由矩陣相乘完成。在實際應用中,權重矩陣通常非常龐大且稠密,導致計算和存儲的成本非常高。低秩分解是將稠密矩陣分解為若干個小規(guī)模矩陣,從而降低網(wǎng)絡模型存儲和計算的開銷。低秩分解的方法主要有矩陣分解和結構化矩陣重構兩種方法。7.1.2低秩分解低秩分解的方法主要有矩陣分解和結構化矩陣重構兩種方法:使用矩陣分解來減少權重矩陣的參數(shù)是一種比較簡便的方法,比如使用奇異值分解(SingularValueDecomposition,SVD)來重構全連接層的權重。通常情況下,先對權重矩陣進行SVD分解,然后根據(jù)奇異矩陣中的數(shù)值分布情況,選擇保留前k個最大項。于是,可以通過兩個矩陣相乘的形式來重構原矩陣。再結合其他技術,利用矩陣分解能夠將卷積層壓縮到原來的二分之一到三分之一,將全連接層壓縮到原來的五分之一到十三分之一,速度提升2倍左右,而精度損失則被控制在1%之內。7.1.2低秩分解

7.1.3模型量化模型量化是深度學習常用的優(yōu)化手段,指通過減少每個權重的比特數(shù)來壓縮原始網(wǎng)絡,有低精度和重編碼兩種方法。對于卷積神經(jīng)網(wǎng)絡來說,網(wǎng)絡模型權重都是單精度浮點型32位。低精度方法是指使用更低位數(shù)的浮點數(shù)或整型數(shù)對其進行訓練;重編碼方法對原有數(shù)據(jù)進行重編碼,采用更少的位數(shù)對原有數(shù)據(jù)進行表示。7.1.3模型量化模型量化是深度學習常用的優(yōu)化手段,指通過減少每個權重的比特數(shù)來壓縮原始網(wǎng)絡,有低精度和重編碼兩種方法。對于卷積神經(jīng)網(wǎng)絡來說,網(wǎng)絡模型權重都是單精度浮點型32位。低精度方法是指使用更低位數(shù)的浮點數(shù)或整型數(shù)對其進行訓練;重編碼方法對原有數(shù)據(jù)進行重編碼,采用更少的位數(shù)對原數(shù)據(jù)進行表示。在許多情況下,我們希望只是通過壓縮權重或量化權重和激活輸出來縮小模型而不必重新訓練模型。訓練后量化就是這種可以在有限的數(shù)據(jù)條件下完成量化的技術。訓練后量化操作簡單,只需要使用量化工具將訓練好的模型執(zhí)行量化操作,即可實現(xiàn)模型的量化。訓練后量化分為兩種,分為只對權重量化和對權重和激活輸出都量化。此外還有訓練時量化。7.1.3模型量化

7.1.3模型量化

7.1.4權值共享權值共享指從一個局部區(qū)域學習到的信息應用于整個圖像。例如用一個的卷積核去卷積整幅圖像,相當于對圖像做一個全圖濾波,每個卷積核在整個圖像上是不斷重復的,這些重復的單元參數(shù)設定相同。比如一個卷積核對應的特征是邊緣,用該卷積核作用于整個圖像,即將圖像各個位置的邊緣都提取出來。不同的卷積核用于提取不同的圖像特征?;谶@個思想,權值共享技術可以用于壓縮和加速神經(jīng)網(wǎng)絡模型。例如,在一個神經(jīng)網(wǎng)絡中相鄰兩層以全連接的方式相連,每層有100個節(jié)點,那么這兩層共有有100*100個權值。對這一百萬個權值進行聚類,用每個類的均值代替這一類的權值,這樣部分連接將實現(xiàn)權值共享。如果將一萬個數(shù)聚類為一百類,就可以把參數(shù)從一萬降到一百,這樣就可以大幅度壓縮模型大小。7.1.5知識蒸餾知識蒸餾(KnowledgeDistillation)的思想是將預先訓練好的教師模型(Teacher

Model)中的知識轉移到學生模型(StudentModel)中去。通過教師模型學到的知識指導小模型的訓練,從而提升小模型的性能。一般情況下,教師模型的能力更出色,而學生模型結構更緊湊。常見的知識蒸餾框架結構如圖7.2所示,知識蒸餾的主要過程是通過損失函數(shù)學習教師模型softmax層的輸出,將知識從教師模型轉移到學生模型。圖7.2:知識蒸餾框架7.1.5知識蒸餾

7.22超參數(shù)搜索方法7.2超參數(shù)搜索方法超參數(shù)是需要在模型開始學習之前設定好的參數(shù),然后在深度學習過程中需要對超參數(shù)進行優(yōu)化,使超參數(shù)達到最優(yōu),以優(yōu)化模型學習的效果。模型搜索方法是為深度學習尋找較佳超參數(shù)集的有效策略。超參數(shù)的搜索過程如下:將數(shù)據(jù)集分為訓練集,驗證集及測試集;選擇模型性能評價指標;用訓練集對模型進行訓練;在驗證集上對模型進行超參數(shù)搜索,用性能指標評價超參數(shù)好壞;選出最優(yōu)超參數(shù)。7.2.1網(wǎng)格搜索網(wǎng)格搜索(GridSearch)指通過循環(huán)遍歷所有候選超參數(shù),選擇使模型表現(xiàn)最好的超參數(shù)作為最優(yōu)超參數(shù)。其原理是在一定的區(qū)間內循環(huán)遍歷所有的候選超參數(shù),并計算其約束函數(shù)和目標函數(shù)的值。對滿足約束條件的點,逐個比較其目標函數(shù)的值,保留使目標函數(shù)達到最優(yōu)解的點,以得到最優(yōu)超參數(shù)。為了評價每次選出的參數(shù)的好壞,需要選擇評價指標,評價指標可以根據(jù)自己的需要選擇。網(wǎng)格搜索的工作流程:在n維上定義一個網(wǎng)格,其中一個映射代表一個超參數(shù)。對于每個維度,定義可能值的范圍。搜索所有可能的配置并等待結果來建立較佳配置。7.2.2隨機搜索隨機搜索(RandomSearch)是利用隨機數(shù)去求函數(shù)的近似最優(yōu)解的方法。原理是在一定的區(qū)間內不斷隨機地產(chǎn)生點,并計算其約束函數(shù)和目標函數(shù)的值,對滿足約束條件的點,逐個比較其目標函數(shù)的值,保留使其目標函數(shù)達到最優(yōu)解的點,以得到最優(yōu)超參數(shù)。這種方法是建立在概率論的基礎上,所取隨機點越多,則得到最優(yōu)解的概率也越大。隨機搜索找到近似最優(yōu)解的效率高于網(wǎng)格搜索,但隨機搜索也存在精度較差的不足。7.2.3啟發(fā)式搜索啟發(fā)式搜索(HeuristicallySearch)是利用問題擁有的啟發(fā)信息來引導搜索,可以通過指導搜索向最優(yōu)解可能存在的方向前進,以達到減少搜索范圍、降低問題復雜度的目的。遺傳算法(GeneticAlgorithm)是一種啟發(fā)式搜索算法。遺傳算法是從問題可能潛在的解集的一個種群開始的。初代種群產(chǎn)生之后,按照“適者生存和優(yōu)勝劣汰”的原理,逐代演化產(chǎn)生出更優(yōu)的近似解。這個過程將使后生代種群比前代更加適應于環(huán)境,末代種群中的最優(yōu)個體則是問題最優(yōu)解。此外,常用的啟發(fā)式搜索還有模擬退火算法、列表搜索算法、進化規(guī)劃、進化策略、蟻群算法、人工神經(jīng)網(wǎng)絡等。7.33編程實戰(zhàn)7.3.1模型量化實驗第一步,導入本次實驗所需的所有依賴庫。7.3.1模型量化實驗第二步,配置實驗的運行環(huán)境。MindSpore中的context類用于配置當前的執(zhí)行環(huán)境,包括執(zhí)行模式、執(zhí)行后端等功能切換。7.3.1模型量化實驗第三步,構建模型。構造一個用于對MNIST數(shù)據(jù)進行分類的分類模型,用MindSpore框架實現(xiàn)LeNet網(wǎng)絡,將輸入大小設置為[1,28,28],輸出類別數(shù)為10。7.3.1模型量化實驗第四步,定義輸入數(shù)據(jù)。選取簡單的MNIST數(shù)據(jù)集,首先下載MNIST數(shù)據(jù)集并保存在"./datasets/mnist"下。MindSpore提供的mindspore.dataset模塊可以幫助用戶構建數(shù)據(jù)集對象,并且分批次地將數(shù)據(jù)傳入訓練函數(shù)中。同時,在各個數(shù)據(jù)集類中還內置了數(shù)據(jù)處理和數(shù)據(jù)增強算子,能夠幫助用戶將數(shù)據(jù)處理成想要的格式,提升數(shù)據(jù)訓練效果。7.3.1模型量化實驗第五步,定義超參數(shù)、損失函數(shù)及優(yōu)化器,執(zhí)行訓練并保存模型。MindSpore提供訓練函數(shù)接口,不用自定義訓練函數(shù)。因為MNIST數(shù)據(jù)集數(shù)據(jù)較少,所以只需要執(zhí)行5個epoch便能得到較高的訓練精度。在模型訓練的過程中,使用Callback回調機制傳入回調函數(shù)ModelCheckpoint對象,可以保存模型參數(shù),生成CheckPoint文件,在下次加載模型時,需要先創(chuàng)建相同模型的實例,然后使用load_checkpoint和load_param_into_net方法加載參數(shù)。7.3.1模型量化實驗第六步,利用測試數(shù)據(jù)集進行測試。加載MNIST數(shù)據(jù)集中的測試數(shù)據(jù)集,查看模型精度。7.3.1模型量化實驗第七步,保存并導出模型。使用之前添加檢查點(CheckPoint)保存下來的模型參數(shù),以便執(zhí)行推理及再訓練使用,并導出生成MINDIR格式模型文件。7.3.1模型量化實驗第八步,模型量化。對于已經(jīng)訓練好的float32模型,通過訓練后量化將其轉為int8,不僅能減小模型大小,而且能顯著提高推理性能。在MindSporeLite中,這部分功能集成在模型轉換工具conveter_lite內,通過增加命令行參數(shù),便能夠轉換得到量化后模型。在Windows環(huán)境下,在MindSpore官網(wǎng)下載轉換工具的zip包并解壓至本地目錄,即可獲得converter工具。執(zhí)行以下轉換命令:轉換成功,則顯示如下提示,且同時獲得model.ms目標文件:7.3.2參數(shù)搜索實驗傳統(tǒng)的方式需要人工去調試和配置超參數(shù),這種方式消耗時間和精力。MindInsight為MindSpore提供了簡單易用的調優(yōu)調試能力,MindInsight提供的Mindoptimizer調參命令可以用于搜索超參,基于用戶給的調參配置信息,可以自動搜索參數(shù)并且執(zhí)行模型訓練。用戶在使用時需要按照yaml格式來配置超參的范圍等信息,并且修改訓練腳本,即可將待試驗的超參同步到訓練腳本里面。Mindoptimizer調參工具為MindInsight的子模塊,需要先安裝MindInsight才能使用調參命令。采用pip安裝的方式,在終端輸入以下命令:7.3.2參數(shù)搜索實驗第一步,配置調參配置文件config.yaml。在config.yaml中需要配置運行命令、訓練日志根目錄、調參方法、優(yōu)化目標和超參數(shù)信息。MindInsight會通過推薦算法分析配置的超參數(shù)和優(yōu)化目標之間的關系,從而更好地推薦超參數(shù)。7.3.2參數(shù)搜索實驗第二步,修改訓練腳本。在訓練腳本中實例化HyperConfig對象,并使用HyperConfig實例的參數(shù)變量作為訓練腳本中對應參數(shù)的取值,再加上Summa_x0002_ryCollector來收集訓練信息,包括超參數(shù)和評估指標值等。在模型量化實驗中的模型訓練部分修改為:7.3.2參數(shù)搜索實驗第三步,運行Mindoptimizer程序。在終端輸入以下命令即可開始自動調參:MindInsight還提供了可視化性能調試模塊和精度調試模塊??梢暬阅苷{試模塊支持在AscendAI處理器和GPU上使用。進行性能調試首先需要準備訓練腳本,并且添加MindSporeProfiler相關接口在訓練腳本中,用于收集神經(jīng)網(wǎng)絡的性能數(shù)據(jù)。接著啟動MindInsight。啟動成功后,根據(jù)IP和端口即可訪問可視化界面,在訓練列表中找到對應的訓練,點擊性能調試,即可查看對應的訓練性能數(shù)據(jù)。Q&AAnyQuestion?第8章強

戰(zhàn)授課教師:時

間:01概述1.1概述強化學習人類學習的非常重要的方法之一是在實踐中學習智能體沒有被指定需要做那種行動,所以能得到最大獎勵的行動是通過嘗試得出的強化學習的主要思想是學習怎么做可以將環(huán)境對應到行動,以最大化的獲得獎勵強化學習不僅僅只關注一個點上的獎勵,更多的時候它關注的結果是通過一系列的動作最后達到的最大的獎勵。02概述2.1基礎知識強化學習概念區(qū)分01監(jiān)督學習通過學習訓練集中帶有標簽的數(shù)據(jù),力圖預測出那些沒有在訓練集中的數(shù)據(jù)屬于哪個標簽0203無監(jiān)督學習的目的是發(fā)現(xiàn)數(shù)據(jù)背后的結構,數(shù)據(jù)隱含的規(guī)律強化學習是通過所在的環(huán)境、嘗試的行動、獲得的獎勵或懲罰,得到一系列行動以達到最多的獎勵強化學習組件強化學習組件智能體(Agent)環(huán)境(Environment)策略(Policy)獎勵信號(Rewardsignal)價值函數(shù)(ValueFunction)環(huán)境模型(Modelofenvironment)強化學習組件強化學習組件智能體(Agent)智能體是通過與環(huán)境的交互來學習以達成回報最大化或實現(xiàn)特定目標的東西。就類似于游戲中的玩家。強化學習組件強化學習組件環(huán)境(Environment)環(huán)境指的是智能體被置于的外部環(huán)境,智能體的行動會影響到外部環(huán)境,外部環(huán)境也會對智能體做出反應。強化學習組件強化學習組件策略(Policy)策略規(guī)定了智能體在特定環(huán)境狀態(tài)和時間的行為,也就是從環(huán)境狀態(tài)到在這些狀態(tài)下要采取的行動的映射。它符合心理學中所謂的一套刺激-反應規(guī)則或聯(lián)想。策略可以是一個簡單的函數(shù)也可能涉及大量的計算。策略是強化學習的核心,因為它本身就足以決定行為。強化學習組件強化學習組件獎勵信號(Rewardsignal)獎勵信號定義了強化學習問題的目標環(huán)境向智能體發(fā)送一個數(shù)字,稱為獎勵智能體的唯一目標是在一長段時間內獲得的總獎勵最大強化學習組件強化學習組件價值函數(shù)(ValueFunction)獎賞信號表明什么是即時意義上的好,而價值函數(shù)表明了什么是長期意義上的好獎勵決定了環(huán)境狀態(tài)的直接可取性,價值表明了狀態(tài)的長期可取性強化學習組件強化學習組件環(huán)境模型(Modelofenvironment)環(huán)境模型用于模擬環(huán)境可能產(chǎn)生的反應環(huán)境模型被用于預測可能發(fā)生的狀況和制定計劃可以將強化學習的方法分為兩種,一種基于模型的方法,一種是更簡單的不用模型的方法03經(jīng)典模型3.1Q-learning3.1DQN3.1PolicyGradient3.1ActorCriticQ-learningQ代表的是Q(s,a),意思是在某一個狀態(tài)s(state)下,采取一種行動a(action)能夠獲得收益的期望環(huán)境的獎勵也會影響到Q(s,a)的取值用一張名為Q-table的表格來存儲Q值,這個表格也是選取動作的根據(jù)Q-learning流程選擇動作跳轉狀態(tài)獲得獎勵更新表格初始化Q-TableNewQ(s,a)=Q(s,a)+α[R(s,a)+γmaxQ′(s′,a′)?Q(s,a)]Q-table會通過迭代地使用貝爾曼方程更新Q(s,a)來給出越來越好的近似DQNDQN,DeepQNetwork是Q-learning和神經(jīng)網(wǎng)絡的結合DQN使用神經(jīng)網(wǎng)絡來估計每個狀態(tài)的Q值,從而近似估計出最優(yōu)的Q函數(shù)DQN隨機抽取一些之前的經(jīng)歷進行學習,這打亂了經(jīng)歷之間的相關性,也使得神經(jīng)網(wǎng)絡更新更有效率種打亂相關性的機理,在DQN中使用到兩個結構相同但參數(shù)不同的神經(jīng)網(wǎng)絡,預測Q估計的神經(jīng)網(wǎng)絡具備最新的參數(shù)。經(jīng)驗回放FixedQ-targets

DQN的損失函數(shù)如下PolicyGradientPolicygradient是一種更加直接的方法,直接輸出每種動作的概率Policygradient選擇行動的過程是輸入當前狀態(tài),輸出行動的概率分布

PolicyGradient得到概率后,可以用采樣的到獎勵值,計算出數(shù)學期望及其期望梯度PolicyGradient在實際情況下,采樣只能采樣到部分的行動如果采樣到的獎勵較小的,沒有采樣到獎勵比較大的,沒有采樣到的行動概率就下降在期望上減去一個baseline得到新的梯度公式ActorCritic在當前狀態(tài)下決定哪一個動作被執(zhí)行會達到最好的效果對某一個狀態(tài)下采取的某個動作做出評價。這個評價會影響actor今后的選擇ActorCritic策略梯度值函數(shù)ActorCritic在采樣的過程中沒有辦法得到很多的獎勵值,會造成不穩(wěn)定引入Q-learning。將兩者結合,用Q-learning當中的V和Q來替換policygradient公式里面的累積reward和baselinee為什么需要在PolicyGradient中引入Q-learning?ActorCriticActorCritic策略梯度其中值函數(shù)定義為:ActorCriticActorCritic需要估計兩個網(wǎng)絡:若去掉期望,即更新后的梯度表示為:04MindSpore實戰(zhàn)4.1配置環(huán)境4.1算法流程配置環(huán)境pipinstallhttps://ms??north?4./1.5.0/Reinforcement/any/mindspore_rl?{version}?py3?none?any.whl??trusted?hostms??north?4.myhuaweicloud.com?ihttps://pypi.tuna.tsinghua./simplepipinstallgymMindSporeMindSporeReinforcementopenAIgymCartPole控制下面的cart移動使連接在上面的桿保持垂直不倒要么向左用力,要么向右用力state狀態(tài)就是這個桿的位置和速度DQN結構用于計算目標Q值用于選擇動作,更新參數(shù)targetpolicy共享參數(shù)算法流程構建網(wǎng)絡回合結束構建兩個神經(jīng)網(wǎng)絡,一個主網(wǎng)絡,一個目標網(wǎng)絡回合結束時重置環(huán)境,重新選擇動作并將經(jīng)驗放入回放池經(jīng)驗回放從經(jīng)驗池中隨機選取數(shù)據(jù)更新目標網(wǎng)絡訓練網(wǎng)絡每次action結束后進行梯度下降更新epsilon更新權重將target網(wǎng)絡參數(shù)復制到主網(wǎng)絡每個batch隨機減小epsilon代碼結構??src??dqn.py??config.pydqn_trainer.py??train.py??eval.py本節(jié)實驗主要包括一個src文件夾、train文件以及eval文件。其中src文件夾共包括配置文件config,策略文件dqn以及智能體文件dqn_trainer三個文件。具體如下所示配置文件”””DQNconfig.”””importmindsporeasmsfrommindspore_rl.environmentimportGymEnvironmentfrommindspore_rl.core.replay_bufferimportReplayBufferfrom.dqnimportDQNActor,DQNLearner,DQNPolicylearner_params={’gamma’:0.99}trainer_params={’evaluation_interval’:10,’num_evaluation_episode’:10,’keep_checkpoint_max’:5,’metrics’:False,}配置文件env_params={’name’:’CartPole?v0’}eval_env_params={’name’:’CartPole?v0’}policy_params={’epsi_high’:0.1,’epsi_low’:0.1,’decay’:200,’lr’:0.001,’state_space_dim’:0,’action_space_dim’:0,’hidden_size’:100,}配置文件algorithm_config={’actor’:{’number’:1,’type’:DQNActor,’params’:None,’policies’:[’init_policy’,’collect_policy’,’evaluate_policy’],’networks’:[’policy_network’,’target_network’],’environment’:True,’eval_environment’:True,},’learner’:{’number’:1,’type’:DQNLearner,’params’:learner_params,’networks’:[’target_network’,’policy_network_train’]},配置文件’policy_and_network’:{’type’:DQNPolicy,’params’:policy_params},’collect_environment’:{’type’:GymEnvironment,’params’:env_params},’eval_environment’:{’type’:GymEnvironment,’params’:eval_env_params},’replay_buffer’:{’type’:ReplayBuffer,’capacity’:100000,’data_shape’:[(4,),(1,),(1,),(4,)],’data_type’:[ms.float32,ms.int32,ms.float32,ms.float32],’sample_size’:64},}Policy類實現(xiàn)importmindsporeasmsimportmindspore.nnasnnfrommindsporeimportTensorfrommindspore.opsimportcompositeasCfrommindspore.opsimportoperationsasPfrommindspore.common.parameterimportParameter,ParameterTuplefrommindspore_rl.agent.actorimportActorfrommindspore_rl.agent.learnerimportLearnerfrommindspore_rl.networkimportFullyConnectedNetfrommindspore_rl.policyimportEpsilonGreedyPolicyfrommindspore_rl.policyimportGreedyPolicyfrommindspore_rl.policyimportRandomPolicy_update_opt=C.MultitypeFuncGraph(”update_opt”)DQNPolicy類用于實現(xiàn)神經(jīng)網(wǎng)絡并定義策略。構造函數(shù)將先前定義的Python字典類型的超參數(shù)policy_parameters作為輸Policy類實現(xiàn)#更新目標網(wǎng)絡參數(shù)@_update_opt.register(”Tensor”,”Tensor”)def_parameter_update(policy_param,target_param):assign=P.Assign()new_param=(1?0.05)?target_param+0.05?policy_paramoutput=assign(target_param,new_param)returnoutputclassDQNPolicy():”””DQNPolicy”””#計算損失Policy類實現(xiàn)classPolicyNetWithLossCell(nn.Cell):”””DQNpolicynetworkwithlosscell”””def__init__(self,backbone,loss_fn):super(DQNPolicy.PolicyNetWithLossCell,self).__init__(auto_prefix=False)self._backbone=backboneself._loss_fn=loss_fnself.gather=P.GatherD()defconstruct(self,x,a0,label):”””constructorforLossCell”””out=self._backbone(x)out=self.gather(out,1,a0)loss=self._loss_fn(out,label)returnlossPolicy類實現(xiàn)def__init__(self,params):#初始化策略網(wǎng)絡、目標網(wǎng)絡、優(yōu)化器等self.policy_network=FullyConnectedNet(params[’state_space_dim’],params[’hidden_size’],params[’action_space_dim’])self.target_network=FullyConnectedNet(params[’state_space_dim’],params[’hidden_size’],params[’action_space_dim’])optimizer=nn.Adam(self.policy_network.trainable_params(),learning_rate=params[’lr’])loss_fn=nn.MSELoss()loss_q_net=self.PolicyNetWithLossCell(self.policy_network,loss_fn)self.policy_network_train=nn.TrainOneStepCell(loss_q_net,optimizer)self.policy_network_train.set_train(mode=True)Policy類實現(xiàn)self.init_policy=RandomPolicy(params[’action_space_dim’])self.collect_policy=EpsilonGreedyPolicy(self.policy_network,(1,1),params[’epsi_high’],params[’epsi_low’],params[’decay’],params[’action_space_dim’])self.evaluate_policy=GreedyPolicy(self.policy_network)#用于評估策略網(wǎng)絡Actor類實現(xiàn)self.init_policy=RandomPolicy(params[’action_space_dim’])self.collect_policy=EpsilonGreedyPolicy(self.policy_network,(1,1),params[’epsi_high’],params[’epsi_low’],params[’decay’],params[’action_space_dim’])self.evaluate_policy=GreedyPolicy(self.policy_network)#用于評估策略網(wǎng)絡DQNActor類繼承了MindSporeReinforcement提供的Actor類。并重載trainer使用的方法act_init,act與evaluate。Actor類實現(xiàn)classDQNActor(Actor):”””DQNActor”””def__init__(self,params):super(DQNActor,self).__init__()self.policy_network=params[’policy_network’]self.target_network=params[’target_network’]self.init_policy=params[’init_policy’]self.collect_policy=params[’collect_policy’]self.evaluate_policy=params[’evaluate_policy’]self._environment=params[’collect_environment’]self._eval_env=params[’eval_environment’]self.replay_buffer=params[’replay_buffer’]Actor類實現(xiàn)self.id=0self.step=Parameter(Tensor(0,ms.int32),name=”step”,requires_grad=False)self.expand_dims=P.ExpandDims()self.reshape=P.Reshape()self.ones=P.Ones()self.abs=P.Abs()self.assign=P.Assign()self.hyper_map=C.HyperMap()self.select=P.Select()self.policy_param=ParameterTuple(self.policy_network.get_parameters())self.target_param=ParameterTuple(self.target_network.get_parameters())self.reward=Tensor([1,],ms.float32)self.penalty=Tensor([?1,],ms.float32)Actor類實現(xiàn)defact_init(self,state):”””Fillthereplaybuffer”””action=self.init_policy()new_state,reward,done=self._environment.step(action)action=self.reshape(action,(1,))my_reward=self.select(done,self.penalty,self.reward)returndone,reward,new_state,action,my_rewarddefact(self,state):”””Experiencecollection”””self.step+=1ts0=self.expand_dims(state,0)step_tensor=self.ones((1,1),ms.float32)?self.stepaction=self.collect_policy(ts0,step_tensor)new_state,reward,done=self._environment.step(action)actionself.reshape(action,(1,))my_reward=self.select(done,self.penalty,self.reward)returndone,reward,new_state,action,my_rewardActor類實現(xiàn)defevaluate(self,state):”””Evaluatethetrainedpolicy”””ts0=self.expand_dims(state,0)action=self.evaluate_policy(ts0)new_state,reward,done=self._eval_env.step(action)returndone,reward,new_statedefupdate(self):”””Updatethenetworkparameters”””assign_result=self.hyper_map(_update_opt,self.policy_param,self.target_param)returnassign_resultActor類實現(xiàn)defevaluate(self,state):”””Evaluatethetrainedpolicy”””ts0=self.expand_dims(state,0)action=self.evaluate_policy(ts0)new_state,reward,done=self._eval_env.step(action)returndone,reward,new_statedefupdate(self):”””Updatethenetworkparameters”””assign_result=self.hyper_map(_update_opt,self.policy_param,self.target_param)returnassign_resultLearner類實現(xiàn)classDQNLearner(Learner):”””DQNLearner”””def__init__(self,params=None):super(DQNLearner,self).__init__()self.target_network=params[’target_network’]self.policy_network_train=params[’policy_network_train’]self.gamma=Tensor(params[’gamma’],ms.float32)self.expand_dims=P.ExpandDims()self.reshape=P.Reshape()self.ones_like=P.OnesLike()self.select=P.Select()DQNLearner類繼承了MindSporeReinforcementAPI中的Learner類,并重載learn方法Learner類實現(xiàn)deflearn(self,samples):”””Modelupdate”””s0,a0,r1,s1=samplesnext_state_values=self.target_network(s1)next_state_values=next_state_values.max(axis=1)r1=self.reshape(r1,(?1,))y_true=r1+self.gamma?next_state_values#Modifylaststeprewardone=self.ones_like(r1)y_true=self.select(r1==?one,one,y_true)y_true=self.expand_dims(y_true,1)success=self.policy_network_train(s0,a0,y_true)returnsuccessTrainer類實現(xiàn)”””DQNTrainer”””importmatplotlib.pyplotaspltimportmindsporeasmsimportmindspore.nnasnnimportmindspore.numpyasmsnpfrommindspore.train.serializationimportload_checkpoint,load_param_into_netfrommindspore.common.apiimportms_functionfrommindsporeimportTensorfrommindspore.opsimportoperationsasPfrommindspore_rl.agent.trainerimportTrainerDQNTrainer類表示訓練循環(huán),該循環(huán)迭代地從回放緩沖區(qū)收集經(jīng)驗并訓練目標模型。它必須繼承自Trainer類,該類是MindSporeReinforcementAPI的一部分。Trainer類實現(xiàn)classDQNTrainer(Trainer):”””DQNTrainer”””def__init__(self,msrl,params):nn.Cell.__init__(self,auto_prefix=False)self.zero=Tensor(0,ms.float32)self.assign=P.Assign()self.squeeze=P.Squeeze()self.less=P.Less()self.zero_value=Tensor(0,ms.float32)self.fill_value=Tensor(1000,ms.float32)self.mod=P.Mod()self.all_ep_r=[]self.all_steps=[]self.evaluation_interval=params[’evaluation_interval’]self.num_evaluation_episode=params[’num_evaluation_episode’]self.is_save_ckpt=params[’save_ckpt’]Trainer類實現(xiàn)ifself.is_save_ckpt:self.save_ckpt_path=params[’ckpt_path’]self.keep_checkpoint_max=params[’keep_checkpoint_max’]self.metrics=params[’metrics’]self.update_period=Tensor(5,ms.float32)super(DQNTrainer,self).__init__(msrl)Trainer類實現(xiàn)deftrain(self,episode):”””TrainDQN”””self.init_training()steps=0foriinrange(episode):ifi%self.evaluation_interval==0:reward=self.evaluation()reward=reward.asnumpy()#saveckptfileifself.is_save_ckpt:self.save_ckpt(self.save_ckpt_path,self.msrl.actors.policy_network,i,self.keep_checkpoint_max)print(”?????????????????????????????????????????”)print(f”Evaluationresultinepisode{i}is{reward:.3f}”)print(”?????????????????????????????????????????”)ifself.metrics:self.all_steps.append(steps)self.all_ep_r.append(reward)reward,episode_steps=self.train_one_episode(self.update_period)Trainer類實現(xiàn)steps+=episode_steps.asnumpy()print(f”Episode{i},steps:{steps},reward:{reward.asnumpy():.3f}”)reward=self.evaluation()reward=reward.asnumpy()print(”?????????????????????????????????????????”)print(f”Evaluationresultinepisode{i}is{reward:.3f}”)print(”?????????????????????????????????????????”)ifself.metrics:self.all_ep_r.append(reward)self.all_steps.append(steps)self.plot()Trainer類實現(xiàn)defplot(self):plt.plot(self.all_steps,self.all_ep_r)plt.xlabel(’step’)plt.ylabel(’reward’)plt.savefig(’dqn_rewards.png’)defeval(self):params_dict=load_checkpoint(self.save_ckpt_path)not_load=load_param_into_net(self.msrl.actors.policy_network,params_dict)ifnot_load:raiseValueError(”Loadparamsintonetfailed!”)reward=self.evaluation()reward=reward.asnumpy()print(”?????????????????????????????????????????”)ifself.is_save_ckpt:print(f”Evaluationresultis{reward:.3f},checkpointfileis{self.save_ckpt_path}”)else:print(f”Evaluationresultis{reward:.3f}”)print(”?????????????????????????????????????????”)Trainer類實現(xiàn)@ms_functiondefinit_training(self):”””Initializetraining”””state,done=self.msrl.agent_reset_collect()i=self.zero_valuewhileself.less(i,self.fil_value):done,_,new_state,action,my_reward=self.msrl.agent_act_init(state)self.msrl.replay_buffer_insert([state,action,my_reward,new_state])state=new_stateifdone:state,done=self.msrl.agent_reset_collect()i+=1returndoneTrainer類實現(xiàn)@ms_functiondeftrain_one_episode(self,update_period=5):”””Trainoneepisode”””state,done=self.msrl.agent_reset_collect()total_reward=self.zerosteps=self.zerowhilenotdone:done,r,new_state,action,my_reward=self.msrl.agent_act(state)self.msrl.replay_buffer_insert([state,action,my_reward,new_state])state=new_stater=self.squeeze(r)self.msrl.agent_learn(self.msrl.replay_buffer_sample())total_reward+=rsteps+=1ifnotself.mod(steps,update_period):self.msrl.agent_update()returntotal_reward,stepsTrainer類實現(xiàn)@ms_functiondefevaluation(self):”””Policyevaluation”””total_reward=self.zero_valuefor_inmsnp.arange(self.num_evaluation_episode):episode_reward=self.zero_valuestate,done=self.msrl.agent_reset_eval()whilenotdone:done,r,state=self.msrl.agent_evaluate(state)r=self.squeeze(r)episode_reward+=rtotal_reward+=episode_rewardavg_reward=total_reward/self.num_evaluation_episodereturnavg_reward訓練和測試importosimportargparsefromsrcimportconfigfromsrc.dqn_trainerimportDQNTrainerfrommindsporeimportcontextfrommindspore_rl.coreimportSessionparser=argparse.ArgumentParser(descri

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論