強化學習演算法回顧 Q-learning 玩 OpenAI 的 Taxi 遊戲
這裡使用的是 OpenAI Taxi-V3 環境
這裡有 4 個地點,分別用 4 個字母表示,任務是要從一個地點接上乘客,送到另外 3 個中的一個放下乘客,越快越好。
- 成功運送一個客人獲得 20 分獎勵
- 每走一步損失 1 分(希望儘快送到目的地)
- 沒有把客人放到指定的位置,損失 10 分
- 渲染圖中顯示,一共 R,G,B,Y 這 4 個地點,黃色的塊是 taxi,其中 “:” 柵欄可以穿越,”|” 柵欄不能穿越
- 藍色顯示的就是有乘客的地方,紅色顯示的就是乘客的目的地
Step 0: 安裝依賴
Step 1: 創建環境
Step 2: 創建 Q 表並初始化
Step 3: 超參數設置
Step 4: Q learning 演算法
Step 5: 使用 Q 表來玩 Taxi !
Step 1: 創建環境
Step 2: 創建 Q 表並初始化
Step 3: 超參數設置
Step 4: Q learning 演算法
Step 5: 使用 Q 表來玩 Taxi !
Step 0: 安裝依賴
需要 3 個庫:
Numpy
用來存儲和更新 Q 表OpenAI Gym
用來創建交互環境Random
用來產生隨機數
import numpy as np
import gym
import random
Step 1: 創建環境
- 創建 Taxi environment
- OpenAI Gym 裡面有很多環境提供給強化學習使用
env = gym.make("Taxi-v3")
env.render()
Step 2: 創建 Q 表並初始化
- 創建 Q 表的前提,是知道有多少狀態和動作的維度
- OpenAI Gym 提供了兩個介面
env.action_space.n
和env.observation_space.n
action_size = env.action_space.n # 獲取動作維度(一個狀態下有幾種動作選擇)
print("Action size ", action_size)
state_size = env.observation_space.n # 獲取狀態維度(一共多少種狀態)
print("State size ", state_size)
qtable = np.zeros((state_size, action_size)) # 初始化 Q 表
print(qtable)
Step 3: 超參數設置
明確超參數:
total_episodes = 50000 # 一共玩多少局遊戲
total_test_episodes = 100 # 測試中一共走幾步
max_steps = 99 # 每一局遊戲最多走幾步
learning_rate = 0.7 # 學習率
gamma = 0.618 # 未來獎勵折扣率
# 探索相關參數
epsilon = 1.0 # 探索概率
max_epsilon = 1.0 # 一開始的探索概率
min_epsilon = 0.01 # 最低的探索概率
decay_rate = 0.01 # 探索概率的指數衰減概率
Step 4: Q learning 演算法
- Q learning 演算法具體實施:
# 循環 50000 局遊戲
for episode in range(total_episodes):
# 重置環境
state = env.reset()
step = 0
done = False
for step in range(max_steps): # 每一局遊戲最多 99 步
# 3. Choose an action a in the current world state (s)
## 生成 0~1 之間的隨機數
exp_exp_tradeoff = random.uniform(0,1)
## 如果這個數字大於 探索概率(開始時為 1),則進行開發(選擇最大 Q 的動作)
if exp_exp_tradeoff > epsilon:
action = np.argmax(qtable[state,:])
## 否則,進行探索(選擇隨機動作)
else:
action = env.action_space.sample()
# 這個動作與環境交互後,獲得獎勵,環境變成新的狀態
new_state, reward, done, info = env.step(action)
# 按照公式 Q(s,a):= Q(s,a) + lr [R(s,a) + gamma * max Q(s',a') - Q(s,a)] 更新 Q 表
qtable[state, action] = qtable[state, action] + learning_rate * (reward + gamma *
np.max(qtable[new_state, :]) - qtable[state, action])
# 迭代環境狀態
state = new_state
# 如果遊戲結束,則跳出循環
if done == True:
break
# 減小探索概率(由於不確定性越來越小)
epsilon = min_epsilon + (max_epsilon - min_epsilon)*np.exp(-decay_rate*episode)
Step 5: 使用 Q 表來玩 Taxi !
- 大約 50 000 局以後,就達到很好的訓練結果
- 看看我們訓練的智慧體如何玩 Taxi
env.reset()
rewards = []
for episode in range(total_test_episodes):
state = env.reset()
step = 0
done = False
total_rewards = 0
print("****************************************************")
print("EPISODE ", episode)
for step in range(max_steps):
env.render()
# 測試中我們就不需要探索了,只要選擇最優動作
action = np.argmax(qtable[state,:])
new_state, reward, done, info = env.step(action)
total_rewards += reward
if done:
rewards.append(total_rewards)
print ("Score", total_rewards)
break
state = new_state
env.close()
print ("Score over time: " + str(sum(rewards)/total_test_episodes))