image from unsplash.com by Pietro De Grandi
上篇文章我們用強化學習的方法玩了小車爬山,平衡車的遊戲。兩個遊戲有一個共同點,即動作空間(Action Space) 是非連續的。也就是說只能控制動作 (Action) 方向,無法控制動作大小。這篇文章我們就來看看動作空間連續的情況,用Q-learning 該如何處理。
完整代碼請見:
https://github.com/zht007/tensorflow-practice
1. 環境簡介
同樣是小車爬山與 "MountainCarContinuous-v0“ ,的動作空間是連續的,你不僅能決定動作的方向,同時還能控制動作的大小。當動作大於0的時候動作方向向右,小於0的動作方向向左。環境的其他變量,包括獎勵,結束條件均與 “MountainCar-v0” 環境相似。
2. 離散化動作空間
由於 Q-learning 的Q表是離散的,所以第一步就是要將動作空間離散化。 這裏我將動作從-1到1分成6份,reshape 動作空間以匹配環境對 action 的要求。當然讀者可以嘗試進一步細分動作空間。
action_space = np.array(range(-10,11,4))/10.
action_space = action_space.reshape(len(action_space),1)
初始化Q表與之前沒有太大差別,但是所有env.action_space.n 的部分均要替換成我們自己定義的 len(action_space)。
DISCRETE_OS_SIZE = [Q_TABLE_LEN] * len(env.observation_space.high)
discrete_os_win_size = (env.observation_space.high - env.observation_space.low) / DISCRETE_OS_SIZE
q_table = np.random.uniform(low=0, high=1,
size=(DISCRETE_OS_SIZE + [len(action_space)]))
Code from github repo with MIT liscence
3. 幫助函數
此處的離散化狀態和 take_epsilon_gready_action 幫助函數與“MountainCar-v0” 環境相似,但是需要注意的是,Q表的Action index 不在表示 action 數值,action 數值需要到 action_space 中索引。
def get_discrete_state (state):
discrete_state = (state - env.observation_space.low) // discrete_os_win_size
return tuple(discrete_state.astype(int))
def take_epilon_greedy_action(state, epsilon):
discrete_state = get_discrete_state(state)
if np.random.random() < epsilon:
action_indx = np.random.randint(0,len(action_space))
else:
action_indx = np.argmax(q_table[discrete_state])
return action_indx, action_space[action_indx]
Code from github repo with MIT liscence
4. 訓練智能體
訓練部分也與“MountainCar-v0” 環境相似,但是還是需要注意 action_indx 和 action_space 以及 action 的關係。
for episode in range(EPISODES):
# initiate reward every episode
ep_reward = 0
if episode % SHOW_EVERY == 0:
print("episode: {}".format(episode))
render = True
else:
render = False
state = env.reset()
done = False
while not done:
action_indx, action = take_epilon_greedy_action(state, epsilon)
next_state, reward, done, _ = env.step(action)
ep_reward += reward
# if render:
# env.render()
if not done:
td_target = reward + DISCOUNT * np.max(q_table[get_discrete_state(next_state)])
q_table[get_discrete_state(state)][action_indx] += LEARNING_RATE * (td_target - q_table[get_discrete_state(state)][action_indx])
elif next_state[0] >= 0.5:
# print("I made it on episode: {} Reward: {}".format(episode,reward))
q_table[get_discrete_state(state)][action_indx] = 0
state = next_state
# Decaying is being done every episode if episode number is within decaying range
if END_EPSILON_DECAYING >= episode >= START_EPSILON_DECAYING:
epsilon -= epsilon_decay_value
# recoard aggrated rewards on each epsoide
ep_rewards.append(ep_reward)
# every SHOW_EVERY calculate average rewords
if episode % SHOW_EVERY == 0:
avg_reward = sum(ep_rewards[-SHOW_EVERY:]) / len(ep_rewards[-SHOW_EVERY:])
aggr_ep_rewards['ep'].append(episode)
aggr_ep_rewards['avg'].append(avg_reward)
aggr_ep_rewards['min'].append(min(ep_rewards[-SHOW_EVERY:]))
aggr_ep_rewards['max'].append(max(ep_rewards[-SHOW_EVERY:]))
Code from github repo with MIT liscence
5.訓練效果
我們訓練了 10000 次,將每200次的平均獎勵,最大獎勵,最小獎勵結果畫出來如下
可見智能體很快就發現了上山的方法,並通過不斷地學習強化收斂,平均獎勵和最低獎勵也平滑上升。
參考資料
[1] Reinforcement Learning: An Introduction (2nd Edition)
[2] David Silver's Reinforcement Learning Course (UCL, 2015)
[3] Github repo: Reinforcement Learning
相關文章
強化學習——MC(蒙特卡洛)玩21點撲克遊戲
強化學習實戰——動態規劃(DP)求最優MDP
強化學習——強化學習的算法分類
強化學習——重拾強化學習的核心概念
AI學習筆記——Sarsa算法
AI學習筆記——Q Learning
AI學習筆記——動態規劃(Dynamic Programming)解決MDP(1)
AI學習筆記——動態規劃(Dynamic Programming)解決MDP(2)
AI學習筆記——MDP(Markov Decision Processes馬可夫決策過程)簡介
AI學習筆記——求解最優MDP
首發steemit
歡迎掃描二維碼關注我的微信公衆號“tensorflow機器學習”,一起學習,共同進步