PyTorch強化學習——模擬FrozenLake環境
theme: hydrogen
持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第21天,點選檢視活動詳情
FrozenLake環境
FrozenLake
是典型的具有離散狀態空間的 Gym
環境,在此環境中,智慧體需要在網格中從起始位置移動到目標位置,同時應當避開陷阱。網格的尺寸為四乘四 (FrozenLake-v0
) 或八乘八 (FrozenLake8x8-v0
),網格中的格子包含以下四種類型:
- S:起始位置
- G:目標位置,該位置可用於結束一個回合
- F:結冰的格子,這是智慧體可以移動到的位置
- H:包含陷阱的格子,該位置可用於結束一個回合
FrozenLake
環境中可以執行四個動作:向左移動 (0
),向下移動 (1
),向右移動 (2
) 和向上移動 (3
)。如果智慧體成功到達目標位置,則獎勵為 +1
,否則為 0
。此外,狀態空間以 16
維整數陣列表示。
需要注意的是,在 FrozenLake
環境中,由於冰面很滑,因此智慧體不會始終按照指定的方向移動。例如,當執行向下移動的動作時,智慧體也可能向左或向右移動。
模擬FrozenLake環境
本節中,我們將模擬一個 4x4
的 FrozenLake
環境。
首先,匯入 gym
庫並建立 FrozenLake
環境的例項,並重置環境,智慧體從狀態 0
開始:
```python
import gym
import torch
env = gym.make('FrozenLake-v0')
n_state = env.observation_space.n
print(n_state)
16
n_action = env.action_space.n print(n_action)
4
env.reset()
渲染環境,可以看到一個4 * 4矩陣,它表示智慧體所在的冰凍湖面網格和當前所在格子(背景為紅色,此時狀態為 `0`):
python
env.render()
```
因為智慧體當前可以繼續移動,指定智慧體向下移動,渲染動作執行後的環境。可以看到動作執行後的冰凍湖面環境網格,其中智慧體向右移動到狀態 1
,看到智慧體並不一定以指定的動作 (1
,即向下)執行:
python
new_state, reward, is_done, info = env.step(1)
env.render()
打印出所有返回的資訊,可以看到智慧體會以 33.33%
的概率進入狀態 4
:
python
print(new_state)
print(reward)
print(is_done)
print(info)
打印出的結果如下:
shell
1
0.0
False
{'prob': 0.3333333333333333}
得到的獎勵為 0
,因為尚未達到目標位置並且回合尚未結束,同時可能會看到智慧體因格子光滑而移動到狀態 1
、狀態 4
或停留在狀態 0
。
如果滿足以下兩個條件之一,則回合將終止:
- 智慧體移動到 H
格子(狀態 5
、7
、11
或 12
):產生的總獎勵為 0
- 智慧體移動到 G
格子(狀態 15
):產生的總獎勵為 +1
為了驗證在冰凍的湖面上移動的困難性,使用隨機策略並執行 1000
回合計算平均總報酬。首先,定義函式 run_episode
用於根據給定策略模擬給定一個 FrozenLake
回合並返回總獎勵:
python
def run_episode(env, policy):
state = env.reset()
total_reward = 0
is_done = False
while not is_done:
action = policy[state].item()
state, reward, is_done, info = env.step(action)
total_reward += reward
if is_done:
break
return total_reward
隨機生成一個策略,並將在每個回合中使用該策略,共執行 1000
回合,並計算平均獎勵:
```python
n_episode = 1000
total_rewards = []
for episode in range(n_episode):
random_policy = torch.randint(high=n_action, size=(n_state,))
total_reward = run_episode(env, random_policy)
total_rewards.append(total_reward)
print('Average total reward under random policy: {}'.format(sum(total_rewards) / n_episode))
我們使用隨機生成的策略由 `16` 個動作組成,其對應於 `FrozenLake` 中的 `16` 個狀態,指定了在某一狀態時應執行的動作。需要強調的是,在 `FrozenLake` 中,運動方向僅部分取決於所選的動作,這增加了控制的不確定性。打印出的平均獎勵如下所示,我們可以認為,如果採用隨機動作,那麼智慧體平均只有 `1.1%` 的概率可以到達目標:
shell
Average total reward under random policy: 0.011
```
- OpenCV使用顏色進行膚色檢測
- Keras深度學習——構建電影推薦系統
- PyTorch張量操作詳解
- OpenCV直方圖的比較
- Python 常用字串操作
- 使用 dlib 進行人臉識別
- OpenCV 人臉檢測詳解(僅需2行程式碼學會人臉檢測)
- Keras深度學習——使用fastText構建單詞向量
- Keras深度學習——使用skip-gram和CBOW模型構建單詞向量
- Keras深度學習——從零開始構建單詞向量
- Keras深度學習——生成對抗網路
- Keras深度學習——建立自定義目標檢測資料集
- PyTorch強化學習——基於值迭代的強化學習演算法
- PyTorch強化學習——模擬FrozenLake環境
- PyTorch強化學習——策略評估
- PyTorch強化學習——馬爾科夫決策過程
- Keras深度學習——DeepDream演算法生成影象
- Keras深度學習——使用對抗攻擊生成可欺騙神經網路的影象
- PyTorch強化學習——策略梯度演算法
- Keras深度學習——交通標誌識別