根據前文(https://www.cnblogs.com/devilmaycry812839668/p/14665072.html)我們知道:
- 首先是v0和v4的區別:帶有v0的env表示會有25%的概率執行上一個action,而v4表示只執行agent給出的action,不會重復之前的action。
- 帶有Deterministic的env表示固定跳4幀,否則跳幀數隨機從 (2, 5) (2,4) 中采樣。
- 帶有NoFrameskip的env表示沒有跳幀。
=========================================
看下主要的源代碼的評論:
https://github.com/openai/gym/issues/1280
看下主要的源代碼:
v0 與 v4 版本:
Deterministic 下的 v0 與 v4 版本:
NoFrameskip 下的 v0 與 v4 版本:
============================================
可以看到在 Atari 游戲中, v0 v4 版本,與 Deterministic 下的 v0 v4 版本, 與 NoFrameskip 下的 v0 v4 版本 區別在於:
kwargs 字典中 鍵值 'frameskip' , 'repeat_action_probability'
frameskip 是指定是否跳幀(中間幀使用重復動作), repeat_action_probability 是指每次執行動作時重復上次選擇的動作的概率
可以看到 repeat_action_probability 主要用於區分 三類 v0 v4版本下的不同, 帶有v0 的則是以概率0.25來選擇上次執行的動作, 而v4則不設置該概率(以0概率執行上次動作,以1概率執行本次的動作)。
而 repeat_action_probability 只在 deterministic 和 NoFrameskip 下存在:
可以看到在所有游戲中frameskip默認設置為4,而只有在space_invaders中設置為3, 而這也是符合DeepMind原始論文中的設置的。
也就是說原始v0, v4版本是沒有設置frameskip的,也就是說每次接收agent動作時都是隨機從(2, 5)中選擇跳幀數。
而Deterministic 下 除了space_invaders中frameskip設置為3其余的frameskip均設置為4。
而NoFrameskip 下所有游戲frameskip均設置為1。
注:frameskip均設置為1意味着每個幀都需要agent輸入動作,不進行跳幀。跳幀的話,中間幀都是執行重復的動作。
舉例:
fameskip=1
0幀時agent傳入動作a0, 1幀時agent傳入動作a1, 2幀時agent傳入動作a2, 3幀時agent傳入動作a3 。
fameskip=2
0幀時agent傳入動作a0, 1幀時不需要agent傳入動作而是繼續執行動作a0, 2幀時agent傳入動作a2, 3幀時不需要agent傳入動作而是繼續執行動作a2 。
fameskip=3
0幀時agent傳入動作a0, 1幀時不需要agent傳入動作而是繼續執行動作a0, 2幀時不需要agent傳入動作而是繼續執行動作a0, 3幀時agent傳入動作a3 。
fameskip=4
0幀時agent傳入動作a0, 1幀時不需要agent傳入動作而是繼續執行動作a0, 2幀時不需要agent傳入動作而是繼續執行動作a0, 3幀時不需要agent傳入動作而是繼續執行動作a0 , 4幀時agent傳入動作a4。
============================================
為了更進一步了解 'frameskip' , 'repeat_action_probability' 的意義,
查看鏈接 here :
在 https://github.com/openai/gym/blob/master/gym/envs/atari/atari_env.py#L24 中可以知道:
step 函數的具體設置:
AtariEnv 類的初始化:
從AtariEnv 類的初始化 及 step 函數的具體設置 可以看到 frameskip (跳幀) 確實為前面的分析一致。
但是很神奇的是在 step中並沒有 repeat_action_probability 的設置。
但是在AtariEnv 類的初始化 中可以看到:
也就是說,repeat_action_probability 的設置是對 self.ale 進行的。
而 step 中具體的操作也是傳給 self.ale 進行的。
由此我們可以知道, 如果我們設置了 repeat_action_probability ,那么對於frameskip的中間幀進行重復的動作依然進行 repeat_action_probability 操作。
舉例: (設置repeat_action_probability,即動作重復概率為0.25 )
fameskip=1
0幀時agent傳入動作a0,傳給ale的動作為a0,ale執行a0, 最終執行的動作記為b0;
1幀時agent傳入動作a1,傳給ale的動作為a1,但是ale以0.25的概率執行b0, 以0.75的概率執行a1, 最終執行的動作記為b1;
2幀時agent傳入動作a2,傳給ale的動作為a2,但是ale以0.25的概率執行b1, 以0.75的概率執行a2, 最終執行的動作記為b2;
3幀時agent傳入動作a3,傳給ale的動作為a3,但是ale以0.25的概率執行b2, 以0.75的概率執行a3, 最終執行的動作記為b3;
fameskip=2
0幀時agent傳入動作a0,傳給ale的動作為a0,ale執行a0, 最終執行的動作記為b0;
1幀時不需要agent傳入動作,傳給ale的動作為a0,但是ale以0.25的概率執行b0, 以0.75的概率執行a0, 最終執行的動作記為b1;
2幀時agent傳入動作a2,傳給ale的動作為a2,但是ale以0.25的概率執行b1, 以0.75的概率執行a2, 最終執行的動作記為b2;
3幀時不需要agent傳入動作,傳給ale的動作為a2,但是ale以0.25的概率執行b2, 以0.75的概率執行a2, 最終執行的動作記為b3;
fameskip=3
0幀時agent傳入動作a0,傳給ale的動作為a0,ale執行a0, 最終執行的動作記為b0;
1幀時不需要agent傳入動作,傳給ale的動作為a0,但是ale以0.25的概率執行b0, 以0.75的概率執行a0, 最終執行的動作記為b1;
2幀時不需要agent傳入動作,傳給ale的動作為a0,但是ale以0.25的概率執行b1, 以0.75的概率執行a0, 最終執行的動作記為b2;
3幀時agent傳入動作a3,傳給ale的動作為a3,但是ale以0.25的概率執行b2, 以0.75的概率執行a3, 最終執行的動作記為b3;
=====================================================
關於 repeat_action_probability 部分參考:
https://blog.csdn.net/qq_27008079/article/details/100126060
Revisiting the Arcade Learning Environment: Evaluation Protocols and Open Problems for General Agents
在論文revisiting the arcade中5.2解釋的很清楚,里面圖3很形象
=============================================