一.概述
強化學習是根據獎勵信號以改進策略的機器學習方法。策略和獎勵是強化學習的核心元素。強化學習試圖找到最大化總獎勵的策略。強化學習不是監督學習,因為強化學習的學習過程中沒有參考答案;強化學習也不是非監督學習,因為強化學習需要利用獎勵信號來學習。
強化學習任務常用“智能體/環境”接口建模。學習和決策的部分稱為智能體,其它部分稱為環境。智能體向環境執行動作,並從環境中得到獎勵和反饋。
Python擴展庫Gym是OpenAI推出的免費的強化學習試驗環境。Gym庫的使用方法是:用env=gym.make(環境名)取出環境,用env.reset()初始化環境,用env.step(動作)執行一步環境,用env.render()顯示環境,用env.close()關閉環境。

大狗機器人的姿態自適應就是基於深度學習算法,根據環境反饋進行自動姿態調整,以保障能穩定站立並行走。
二.安裝
使用Anaconda的小伙伴在聯網的情況下可以直接在Anaconda Prompt上執行pip install gym即可安裝Gym庫。
其它安裝的細節可以參考官網:http://gym.openai.com/docs/#getting-started-with-gym
三.案例【基本信息輸出】
1 # -*- coding: utf-8 -*- 2 """ 3 Created on Mon Nov 4 20:05:03 2019 4 5 @author: Administrator 6 """ 7 8 import gym 9 10 env = gym.make('MountainCar-v0') 11 print('觀測空間={}'.format(env.observation_space)) 12 print('動作空間={}'.format(env.action_space)) 13 print('觀測范圍={}~{}'.format(env.observation_space.low, env.observation_space.high)) 14 print('動作數={}'.format(env.action_space.n))
四.執行結果

五.案例【小車自適應翻越小溝】
1 # -*- coding: utf-8 -*- 2 import gym 3 import time 4 5 ''' 6 基於強化學習實現小車自適應翻越小溝 7 ''' 8 class BespokeAgent: 9 def __init__(self, env): 10 pass 11 12 def decide(self, observation): 13 position, velocity = observation 14 lb = min(-0.09 * (position + 0.25) ** 2 + 0.03, 0.3 * (position + 0.9) ** 4 - 0.008) 15 ub = -0.07 * (position + 0.38) ** 2 + 0.06 16 if lb < velocity < ub: 17 action = 2 18 else: 19 action = 0 20 return action # 返回動作 21 22 def learn(self, *args): # 學習 23 pass 24 25 def play_ones(self, env, agent, render=False, train=False): 26 episode_reward = 0 # 記錄回合總獎勵,初始值為0 27 observation = env.reset() # 重置游戲環境,開始新回合 28 while True: # 不斷循環,直到回合結束 29 if render: # 判斷是否顯示 30 env.render() # 顯示圖形界面,可以用env.close()關閉 31 action = agent.decide(observation) 32 next_observation, reward, done, _ = env.step(action) # 執行動作 33 episode_reward += reward # 搜集回合獎勵 34 if train: # 判斷是否訓練智能體 35 break 36 observation = next_observation 37 return episode_reward # 返回回合總獎勵 38 39 if __name__ == '__main__': 40 env = gym.make('MountainCar-v0') 41 env.seed(0) # 設置隨機數種子,只是為了讓結果可以精確復現,一般情況下可以刪除 42 43 agent = BespokeAgent(env) 44 for _ in range(100): 45 episode_reward = agent.play_ones(env, agent, render=True) 46 print('回合獎勵={}'.format(episode_reward)) 47 48 time.sleep(10) # 停頓10s 49 env.close() # 關閉圖形化界面
這是經典的“代理程序-環境循環”的實現。每個時間步,代理都選擇一個action,並且環境返回一個observation和一個reward。

六.執行結果

七.案例【不倒翁】
1 import gym 2 import time 3 4 ''' 5 基於強化學習實現不倒翁特性:自動平衡恢復 6 ''' 7 if __name__ == "__main__": 8 env = gym.make('CartPole-v0') 9 for i_episode in range(20): 10 observation = env.reset() 11 for t in range(100): 12 env.render() 13 # print(observation) 14 action = env.action_space.sample() 15 observation, reward, done, info = env.step(action) 16 if done: 17 # print("Episode finished after {} timesteps".format(t + 1)) 18 print(observation) 19 time.sleep(1) # 暫停以下,便於觀察 20 break 21 22 time.sleep(10) # 停頓10s 23 env.close() # 關閉圖形化界面
如果我們想做的比在每個步驟中都采取隨機action更好的話,那么最好是真正了解我們的action對環境影響。環境的step功能恰好返回了我們需要的。實際上,step返回四個值,包括:
>observation【對象】:特定於環境的對象,代表對環境的一次觀察。例如,機器人的關節角度或者棋盤的狀態。
>reward【獎勵】:上一個動作獲得的獎勵。規模因環境而異,但目標始終是增加總獎勵。
>done【執行狀態】:是否需要重新再次進入環境。當done等於True時表示停止。
>info【結果】:對調試有用的診斷信息。
八.執行結果

圖示:

九.可用環境
Gym擁有各種環境,從 簡單到復雜,涉及許多不同種類的數據。包括:
>經典控制和玩具文字:完成小規模的任務,大部分來自RL文獻。用於入門。
>算法化:執行計算,例如添加多位數和反轉順序。
>Atari:經典的Atari游戲。使用易於安裝的Arcade學習環境。
>2D和3D機器人:在仿真中控制機器人。這些任務使用了MuJoCo物理引擎,該引擎設計用於快速而准確的機器人仿真。
