強化學習代碼實戰


一.概述

  強化學習是根據獎勵信號以改進策略的機器學習方法。策略和獎勵是強化學習的核心元素。強化學習試圖找到最大化總獎勵的策略。強化學習不是監督學習,因為強化學習的學習過程中沒有參考答案;強化學習也不是非監督學習,因為強化學習需要利用獎勵信號來學習。

  強化學習任務常用“智能體/環境”接口建模。學習和決策的部分稱為智能體,其它部分稱為環境。智能體向環境執行動作,並從環境中得到獎勵和反饋。

  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物理引擎,該引擎設計用於快速而准確的機器人仿真。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM