強化學習中經典算法 —— reinforce算法 —— (進一步理解, 理論推導出的計算模型和實際應用中的計算模型的區別)


在獎勵折扣率為1的情況下,既沒有折扣的情況下,reinforce算法理論上可以寫為:

 

 

 

 

 

但是在有折扣的情況下,reinforce算法理論上可以寫為:

 

 

 

 

 

以上均為理論模型。

 

====================================================

 

 

根據上面的理論上的算法模型,或者說是偽代碼,你是難以使用這個算法的。這個reinforce算法也是十分古怪和氣人的,之所以這樣說是因為完全根據reinforce的算法描述(偽代碼)實際上基本無法寫出可以正常運行的代碼(能有效的代碼,算法結果是不收斂的或者在使用神經網絡做擬合函數會出現衰退的問題)。而且另一個古怪和氣人的地方是reinforce的算法描述(偽代碼)和reinforce算法的理論分析模型也是不同的,reinforce的理論分析一般都是假定有同一個執行策略(動作策略)下生成的大量episodes的數據來對評估網絡(評估策略)進行更新的,而在算法描述中往往是一個episode下的每一個step的數據就對策略網絡進行一次更新,或者說算法描述中我們是一個策略網絡生成一個episode的數據,然后我們把這個episode下每一step的數據都用來更新一次策略網絡。

總的說來,就是reinforce的標准算法描述是不可用的,往往在實際中我們使用的reinforce算法的模型,或者說實際上的算法描述(偽代碼)是不同的。

 

 

===============================================

 

實際上的  reinforce算法,真正使用的reinforce算法是這樣的:偽代碼(算法描述):

 

 

 

 

 

 

 

 

 

 但是,如果我們嚴格按照reinforce算法的理論推導,寫出的算法模型,偽代碼該是如下形式:

 

 

 

 

 

根據上面的兩個不同具體形式的偽代碼,我們可以看出嚴格按照理論推導得到的reinforce算法模型是需要使用折扣概率下的折扣獎勵來做計算的,而實際應用中我們往往直接使用折扣獎勵進行規整后的數值來進行計算。也就是說實際應用reinforce算法時我們不僅沒有對獎勵值取折扣概率下的值,並且還對折扣獎勵進行了規整(高斯化)。

 

 

 

那么我們可以不可以對折扣獎勵取折扣概率后再進行規整化呢,於是有了下面的算法模型,偽代碼:

 

 

===========================

 

根據上面的分析,實際使用reinforce算法時根據對獎勵值的處理可以分為以下4種:

1.  更新網絡參數時使用的獎勵值為  折扣獎勵,也就是最原始的獎勵值,不加其他處理的形式。

2.  更新網絡參數時使用的獎勵值為  折扣概率下的折扣獎勵。

3. 更新網絡參數時使用的獎勵值為  將折扣獎勵進行規整化后的獎勵值 。

4. 更新網絡參數時使用的獎勵值為  將折扣概率下的折扣獎勵進行規整化后的獎勵值。

 

--------------------------

通過gym環境下的實驗發現,第一種和第二種形式的reinforce算法直接導致神經網絡衰退,也就是說完全隨機策略進行交互我們可以得到的episode的長度在29左右,而第一種和第二種形式的reinforce算法所訓練得到的策略直接會衰退到對一個episode內的所有step下的狀態給出相同的action。

 

第二種形式下的部分運行結果:(第二種形式下,此時更新一次網絡的episodes數為10)

 

 

 

 

可以看到使用第二種形式的reinforce算法,在運行一段時間后運行效果直接從完全隨機的策略衰退為對一個episode下的所有狀態給出相同action的表現。

而在以前的博客(https://www.cnblogs.com/devilmaycry812839668/p/14097322.html)中也討論過即使使用實際應用中最常見的第3種形式的reinforce也會有一定的概率出現衰退問題,不過那時的衰退往往是運行效果優化到了一定程度后才進行衰退的,而第二種形式的reinforce算法是直接在開始的階段就直接從隨機策略衰退到完全無效的策略(對一個episode內的所有state給出完全相同的action)。 

第一種形式的reinforce和第二種形式的reinforce相似,都是從隨機策略開始后快速的衰退到對一個episode內的所有state給出完全相同的action,從而變成了無效的策略。

 

 

 

第一種,第二種形式的reinforce直接進入衰退,而第三種,第四中形式的reinforce就可以正常運行到要求的效果,這中間的區別就是最后訓練時所采用的獎勵值的具體形式。

 

=======================================

 個人的小嘗試:

第三種形式的reinforce中最后更新網絡的獎勵值的例子:

(action全部都是1的情況)

 

 

 

 

 

 

第二種形式的reinforce算法獎勵值的例子:

 

 

可以看到第一種形式的reinforce和第二種的reinforce最后進行網絡更新時的獎勵值都是大小在T到0之間,其中T為該episode的長度。而第三種形式的reinforce算法均值為0,方差為1。

 

 

 

 

 

觀察第二種形式的reinforce和第三種reinforce的區別,更新網絡時獎勵值的區別,我們將第二種形式的reinforce獎勵值的形式進行修改:

 

 此時運行reinforce算法:

 

 修改后的reinforce算法成功達到要求。

 

 

 

而第三種形式的reinforce運行結果:

 

 

可以看到采用新的獎勵值后的reinforce算法可以和第三種形式的reinforce算法性能相當,或者說並沒有明顯差於第三種形式的reinforce。

 

 

 

再一次修改第二種形式的reinforce的獎勵值形式:

 

 發現也是可以達到要求:

 

 

 

然而當獎勵值形式為:

 

或:

 

 

 reinforce算法都是無法達到要求的,直接衰退:

 

 

 

於是有了一個大膽的猜測,只要更新網絡時的一個episode內的各個step的獎勵值均值為0,那么必然可以運行到要求的水平,於是獎勵值設置下面的形式:

 

 

發現依然成功到達要求:

 

 

 

 

根據上面的實際應用中的reinforce的實際形式(形式3)和理論推導中的(形式2)之間運行效果的不同,我們大膽設想每一次更新網絡時reinforce算法要求各獎勵值的均值為0才可以成功運行。

 

 

 

==========================================

 

 

個人的一點小總結:

有時候理論上各種推導,各種公式,各種理論,然后各種名詞堆到一起搞出一個算法,貌似應該可行,而在實際上就並不是很可行,個人感覺這說明理論是有指導作用但是沒有絕定性的作用,而且至於靠譜不靠譜,完善不完善最終還是需要實際應用中去看,可能這也是那種  實踐是檢驗真理的唯一途徑。可能有時候由於理論的限制等等原因,有些改進的東西無法用完善的理論來解釋但是確實可行,而有的時候有些理論感覺很完善其實卻還差一些,這時候就需要一些在實踐中的改進了。

 

單純的從算法角度來看,那就是  reward shap 不僅會提高算法的運算效率,甚至對算法的最終性能(優化結果)也是具有很大的影響的,就像本文中的不同形式的reinforce,如果reward設置的不好往往算法不work。就像實際中的reinforce算法雖然和理論推導的形式有一些不同,但是卻能work,而我們最終采用的形式就是那種可以work就用哪種。

 

 

 

文中代碼地址:

https://gitee.com/devilmaycry812839668/cart-pole_-policy-network_-reinforce

 

====================================================

 

 

 

 

 

 

 

 

重要說明:

本文代碼中出現錯誤,后已經修復,因此上面的實驗結果均為錯誤。

 

 

經過修改后發現mode=0 ,  mode=1,   mode=2,   mode=3   均可以收斂取得最終結果。   因此原文中所得到的結論mode=0, mode=1 不能收斂是錯誤的。

 

特此更正。

 

 

 

----------------------------------------------

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM