強化學習中REIINFORCE演算法和AC演算法在演算法理論和實際程式碼設計中的區別
背景就不介紹了,REINFORCE演算法和AC演算法是強化學習中基於策略這類的基礎演算法,這兩個演算法的演算法描述(偽程式碼)參見Sutton的reinforcement introduction(2nd)。
AC演算法可以看做是在REINFORCE演算法基礎上擴展的,所以這裡我們主要討論REINFORCE演算法中演算法描述和實際程式碼設計中的一些區別,當然這也適用於AC演算法:
1. 時序折扣項為什麼在實際程式碼中不加入
REINFORCE演算法中是需要對狀態動作對出現在episode內的順序進行折扣加權的,即 γt 。但是在實際程式碼設計中我們並不會在實際計算中對每個狀態動作對進行時序折扣加權的,個人總結原因:
在論文推導中我們其實是假設在整個狀態動作對都是可以遍歷的條件下進行的,或許可以這樣理解,在一個batch size中就已經包括了所有的狀態動作對(準確的說是包括了所有的episodes,按照概率取樣到了所有的episodes),所以每個狀態動作對需要根據理論推導加入時序折扣,但是在實際程式碼中我們都是面對較大規模的問題,此時我們的一個batch size可以看做是對整體狀態動作對的一個mini抽樣,此時加入時序折扣非但可能不會更好的貼近實際分布而更可能造成擾亂並偏離實際狀態動作對的分布,況且加入時序折扣更會增加實際計算的複雜性。因此在REINFORCE演算法和AC演算法的實際程式碼中我們不加入時序折扣。
2. REINFORCE演算法實際程式碼中為什麼會對一個episode內的所有狀態動作對的折扣獎勵和進行規則化(Regularize)
總所周知在REINFORCE演算法的論文和實際理論中並沒有對一個episode內的所有狀態動作對的折扣獎勵sum做Regularize,但是在實際程式碼中卻進行了Regularize。在REINFORCE的實際程式碼編寫中一個episode內的每個狀態動作對的折扣獎勵sum都是相當於通過蒙特卡洛方式得到的,然後再對一個episode內的所有狀態動作的折扣獎勵和做規則化(減去均值除去方差),最後獲得一個episode內每個狀態動作對的規則化後的折扣獎勵和。
可以知道對episode內的每個狀態動作對的折扣獎勵sum進行規則化是程式碼編寫中的trick,這個trick並不是論文中給出的而是實際程式碼編寫和運行中得到的trick,經過大量實驗後發現該trick確實好用。為什麼這個trick好用呢,分析一下可以知道REINFORCE屬於蒙特卡洛方式的取樣估計,該種方式雖然無偏但卻高方差不利於收斂,所以要是嚴格按照論文不採用這個trick會不利於收斂。同時可以參考安德魯.NG.吳恩達的博士論文「reinforcement learning reward shape」可以知道通過對reward的shape可以提高演算法的訓練性能。REINFORCE演算法採用這個trick後可以很好的減少訓練時候的方差,有利於收斂。
===========================================