Q-Learning—可操控動作大小的小車爬山遊戲

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機器學習”,一起學習,共同進步

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章