第四章-交叉熵方法
目標環境=CartPole-v0
定義一個簡單的神經網路,傳入狀態回傳動作。

定義最小化損失函數: objective = nn.CrossEntropyLoss()
定義optimaizer: optimizer = optim.Adam(params=net.parameters(), lr=0.01)
主程式:
邊玩邊學習,當獎勵到達預設目標後,即停止。

iterate_batches:
1. 使用狀態丟入nn得到每個動作的機率分布
2. 使用此機率分布得到一個動作
3. 對環境的目前狀態執行此動作,得到獎勵
4. 記錄以上的狀態,動作,獎勵
在集滿batch數目後,用yield傳出,等外部處理完batch後,再繼續收集。
當下有收集好的batch樣本,會透過主程式去學習修正nn網絡,而修正後的nn網絡又可以
在iterate_batches被使用,讓此網絡每次預測的動作越來越精準。
以下是網路找的交叉熵方法缺點
例如,如果你只嘗試100次的話,那麼可能會有一些稀少的情況,在這100次中只出現那麼一兩
次。這樣的話,會得到一個非常奇怪的概率分佈,可能會一直重複某一個行動。也許你可以通
過增加實驗的次數來改進這個問題,比如說100次增加到10000次,但是如果騎自行車摔倒1萬
次的話,那會非常疼。
要做的就是在正規化之前給所有的概率都加一些小的正數,這樣就永遠不會得到概率為零的
數。所以,即使某個狀態可能只達到過一次,也仍然能採取其他的 action。
另外交叉熵方法在隨機過程中應用的話會變得有點複雜。
當一個環境有一些隨機性時,例如我們在一個賭場中,可能有兩種行為。一種是可以離開賭
場,一種是走到最近的老虎機,投進去一個硬幣,拉動推桿,然後多數情況下都會輸掉一刀,
但有些時候你也會贏三刀。當重複這個遊戲一百次時,我們可能會輸掉一百多刀,也有可能很
幸運地選擇了離開賭場,也有可能幸運地贏得了錢。
那麼在這種情況下,如果在其中選擇25次最好的結果,很容易是有 biase 的,因為它會偏向幸
運的贏錢的情況。當它贏三刀後,它就會一直拉動這個推桿,而直到輸掉所有的錢。
交叉熵方法雖然可以應用到很多東西上,從機器人到優化廣告,到推薦系統,到機器翻譯,到
金融等幾乎任何事情,但比針對特定目的方法表現的要差一些。
交叉熵方法還有一個問題是,它在騎自行車這種可能只有十個state和四個action的小問題上表
現還算足夠,但還不能應用到數據量較大的問題中去。比如操作一個自動駕駛汽車,或者玩遊
戲,狀態空間可能不是離散的,而是連續的,是無法用技術來記錄的,或者考慮的是攝像頭的
輸入,那時圖片的數量是非常大的,這時不能再存儲一個state-action的概率表格了。