使用OpenAI Gym實現(xiàn)簡單的強化學習訓練

CartPole-v0

規(guī)則

我們要操縱我們的小車左右移動慷嗜,使它上面不斷變長的木棒能夠保持平衡森枪。


狀態(tài)

狀態(tài)應包含以下四個因素:

編號 名稱 最小值 最大值
0 小車的位置 -2.4 2.4
1 小車的速度 -inf inf
2 木棒的角度 -41.8° 41.8°
3 木棒的速度 -inf inf
行動

對于某一個狀態(tài)s采取的行動A(s)應該包括以下兩種:

編號 名稱
0 小車向左移動
1 小車向右移動
報酬

木棒每保持平衡1個時間步,就得到1分贫堰。
每一場游戲的最高得分為200分
每一場游戲的結束條件:木棒傾斜角度大于41.8°或者已經達到200分
最終獲勝條件為:最近100場游戲的平均得分高于195

代碼雛形
import gym
import numpy as np

env = gym.make('CartPole-v0')

max_number_of_steps = 200   # 每一場游戲的最高得分
#---------獲勝的條件是最近100場平均得分高于195-------------
goal_average_steps = 195
num_consecutive_iterations = 100
#----------------------------------------------------------
num_episodes = 5000 # 共進行5000場游戲
last_time_steps = np.zeros(num_consecutive_iterations)  # 只存儲最近100場的得分(可以理解為是一個容量為100的棧)

# 重復進行一場場的游戲
for episode in range(num_episodes):
    observation = env.reset()   # 初始化本場游戲的環(huán)境
    episode_reward = 0  # 初始化本場游戲的得分
    # 一場游戲分為一個個時間步
    for t in range(max_number_of_steps):
        env.render()    # 更新并渲染游戲畫面
        action = np.random.choice([0, 1])   # 隨機決定小車運動的方向
        observation, reward, done, info = env.step(action)  # 獲取本次行動的反饋結果
        episode_reward += reward
        if done:
            print('%d Episode finished after %f time steps / mean %f' % (episode, t + 1, last_time_steps.mean()))
            last_time_steps = np.hstack((last_time_steps[1:], [episode_reward]))    # 更新最近100場游戲的得分stack
            break
    # 如果最近100場平均得分高于195
    if (last_time_steps.mean() >= goal_average_steps):
        print('Episode %d train agent successfuly!' % episode)
        break

print('Failed!')

上面的代碼只是使用np.random.choice([0, 1])隨機決定小車運動的方向死陆,并沒有進行任何的智能學習措译。

運行代碼,發(fā)現(xiàn)每場游戲的平均得分僅22左右饰序。

使用Q-Learning改進代碼

如果利用每次行動后得到的反饋進行強化學習建模,選擇Q-learning算法求豫,那么如果在時間步t時塌衰,狀態(tài)為st诉稍,我們采取的行動為at,本次行動的有利程度記為Q(st,at)最疆,則有下式:
Q(s_t,a_t)\leftarrow(1-\alpha)Q(s_t,a_t)+\alpha(r_{t+1}+\gamma\underset{r_{t+1}}{\mathrm{Max}}Q(s_{t+1},a_{t+1})
上面的α被稱為學習系數(shù)杯巨,γ被稱為報酬衰減系數(shù),rt為時間步為t時得到的報酬努酸。

import gym
import numpy as np

env = gym.make('CartPole-v0')

max_number_of_steps = 200   # 每一場游戲的最高得分
#---------獲勝的條件是最近100場平均得分高于195-------------
goal_average_steps = 195
num_consecutive_iterations = 100
#----------------------------------------------------------
num_episodes = 5000 # 共進行5000場游戲
last_time_steps = np.zeros(num_consecutive_iterations)  # 只存儲最近100場的得分(可以理解為是一個容量為100的棧)

# q_table是一個256*2的二維數(shù)組
# 離散化后的狀態(tài)共有4^4=256中可能的取值服爷,每種狀態(tài)會對應一個行動
# q_table[s][a]就是當狀態(tài)為s時作出行動a的有利程度評價值
# 我們的AI模型要訓練學習的就是這個映射關系表
q_table = np.random.uniform(low=-1, high=1, size=(4 ** 4, env.action_space.n))

# 分箱處理函數(shù),把[clip_min,clip_max]區(qū)間平均分為num段获诈,位于i段區(qū)間的特征值x會被離散化為i
def bins(clip_min, clip_max, num):
    return np.linspace(clip_min, clip_max, num + 1)[1:-1]

# 離散化處理仍源,將由4個連續(xù)特征值組成的狀態(tài)矢量轉換為一個0~~255的整數(shù)離散值
def digitize_state(observation):
    # 將矢量打散回4個連續(xù)特征值
    cart_pos, cart_v, pole_angle, pole_v = observation
    # 分別對各個連續(xù)特征值進行離散化(分箱處理)
    digitized = [np.digitize(cart_pos, bins=bins(-2.4, 2.4, 4)),
                 np.digitize(cart_v, bins=bins(-3.0, 3.0, 4)),
                 np.digitize(pole_angle, bins=bins(-0.5, 0.5, 4)),
                 np.digitize(pole_v, bins=bins(-2.0, 2.0, 4))]
    # 將4個離散值再組合為一個離散值,作為最終結果
    return sum([x * (4 ** i) for i, x in enumerate(digitized)])

# 根據(jù)本次的行動及其反饋(下一個時間步的狀態(tài))舔涎,返回下一次的最佳行動
def get_action(state, action, observation, reward):
    next_state = digitize_state(observation)    # 獲取下一個時間步的狀態(tài)镜会,并將其離散化
    next_action = np.argmax(q_table[next_state])    # 查表得到最佳行動
    #-------------------------------------訓練學習,更新q_table----------------------------------
    alpha = 0.2     # 學習系數(shù)α
    gamma = 0.99    # 報酬衰減系數(shù)γ
    q_table[state, action] = (1 - alpha) * q_table[state, action] + alpha * (reward + gamma * q_table[next_state, next_action])
    # -------------------------------------------------------------------------------------------
    return next_action, next_state

# 重復進行一場場的游戲
for episode in range(num_episodes):
    observation = env.reset()   # 初始化本場游戲的環(huán)境
    state = digitize_state(observation)     # 獲取初始狀態(tài)值
    action = np.argmax(q_table[state])      # 根據(jù)狀態(tài)值作出行動決策
    episode_reward = 0
    # 一場游戲分為一個個時間步
    for t in range(max_number_of_steps):
        env.render()    # 更新并渲染游戲畫面
        observation, reward, done, info = env.step(action)  # 獲取本次行動的反饋結果
        action, state = get_action(state, action, observation, reward)  # 作出下一次行動的決策
        episode_reward += reward
        if done:
            print('%d Episode finished after %f time steps / mean %f' % (episode, t + 1, last_time_steps.mean()))
            last_time_steps = np.hstack((last_time_steps[1:], [episode_reward]))  # 更新最近100場游戲的得分stack
            break
            # 如果最近100場平均得分高于195
        if (last_time_steps.mean() >= goal_average_steps):
            print('Episode %d train agent successfuly!' % episode)
            break

print('Failed!')

(感謝注釋部分讓英語不好的我也能夠讀懂代碼)

運行代碼终抽,發(fā)現(xiàn)雖然分數(shù)是有所提高,但效果并沒有十分顯著桶至,隨著訓練的進行昼伴,在過擬合之前,最高的平均分數(shù)也僅有32左右镣屹。

\varepsilon-貪心策略

接下來看作者引入了\varepsilon-貪心策略圃郊,即每次要移動小車時,以ε的概率以均勻概率隨機選一個方向進行移動女蜈;以1-ε的概率選擇目前為止探索到的對于當前狀態(tài)的最佳行動方向進行移動持舆。

然后把get_action函數(shù)更改成了下面這個樣子:

def get_action(state, action, observation, reward):
    next_state = digitize_state(observation)
    epsilon = 0.2   # ε-貪心策略中的ε
    if  epsilon <= np.random.uniform(0, 1):
        next_action = np.argmax(q_table[next_state])
    else:
        next_action = np.random.choice([0, 1])

接下來嘗試著修改一下報酬評價函數(shù),讓模型對一些會直接導致最終失敗的錯誤行動伪窖,其報酬值要減200

        observation, reward, done, info = env.step(action)
        # 對致命錯誤行動進行極大力度的懲罰逸寓,讓模型恨恨地吸取教訓
        if done:
            reward = -200
        action, state = get_action(state, action, observation, reward, episode)
        if done:
            print('%d Episode finished after %f time steps / mean %f' % (episode, t + 1,
                last_time_steps.mean()))
            last_time_steps = np.hstack((last_time_steps[1:], [t + 1]))
            break

經過改進,1000場左右游戲過后覆山,模型的平均分終于達到了195分竹伸。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市簇宽,隨后出現(xiàn)的幾起案子勋篓,更是在濱河造成了極大的恐慌,老刑警劉巖魏割,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件譬嚣,死亡現(xiàn)場離奇詭異,居然都是意外死亡钞它,警方通過查閱死者的電腦和手機拜银,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門殊鞭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钱豁,“玉大人疯汁,你說我怎么就攤上這事“迹” “怎么了溢豆?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵漩仙,是天一觀的道長。 經常有香客問我卷仑,道長,這世上最難降的妖魔是什么锡凝? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任窜锯,我火速辦了婚禮芭析,結果婚禮上,老公的妹妹穿的比我還像新娘工秩。我一直安慰自己进统,他們只是感情好螟碎,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著俭缓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪华坦。 梳的紋絲不亂的頭發(fā)上惜姐,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機與錄音坷衍,去河邊找鬼条舔。 笑死,一個胖子當著我的面吹牛迁杨,可吹牛的內容都是我干的铅协。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼坯钦!你這毒婦竟也來了侈玄?” 一聲冷哼從身側響起序仙,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎律秃,沒想到半個月后治唤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡柜裸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年粱锐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铐然。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡锦爵,死狀恐怖奥裸,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情樟氢,我是刑警寧澤侠鳄,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站伟恶,受9級特大地震影響,放射性物質發(fā)生泄漏潦牛。R本人自食惡果不足惜挡育,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一即寒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逸爵,春花似錦凹嘲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冈闭。三九已至抖单,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耍休,已是汗流浹背货矮。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工囚玫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人燃少。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓阵具,卻偏偏與公主長得像阳液,于是被迫代替她去往敵國和親宿稀。 傳聞我的和親對象是個殘疾皇子赖捌,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內容

  • 書名異類的天賦作者(英)凱文·達頓(Kevin Dutton)譯者金九菊 / 程亞克豆瓣http://douban...
    xuwensheng閱讀 6,125評論 0 9
  • 摘幾枝綠意罩锐,采幾朵紅花 插在我的水晶瓶中 擺在我的桌前 給你足夠的水分和自由的空氣 給你我最悉心的照顧 伴著展翅高...
    遇見penny閱讀 238評論 0 1
  • 原來腦子里會自動刪除一些不好事情是一種自我保護意識涩惑,我的自我刪除絕了桑驱,朋友開玩笑說我是金魚的記憶只有七秒跛蛋,刪除掉那...
    劉斯宇閱讀 197評論 0 0
  • 近日睡眠不好,入睡困難晋被,輾轉反側間總覺得自己是條魚刚盈,在黑暗的深海中,孤獨地游走翘县,冰冷谴分,不會擁抱牺蹄。 ...
    張家小鬧閱讀 588評論 0 1
  • 1 在未來鼎天,超越免費將體現(xiàn)在多個方面,做生意育勺、做人罗岖、自我成長等 2 超越免費第二條:時效性 ○ 我們算賬不止是看得...
    陳之然閱讀 369評論 0 0