iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0
AI/ ML & Data

深度學習的學習之旅:從理論到實作系列 第 12

[Day 12]強化學習實戰最終章:FrozenLakeAgent 完整訓練與評估展示

  • 分享至 

  • xImage
  •  

前言

終於到了我們強化學習的最終章節了,今天就會把我們整個訓練完成囉,那廢話不多說,直接來看我們的程式!

程式

  1. run功能

在這邊我們定義了一個運行的函數,也就是我們的類別在實例化時要呼叫進入的地方,往下看看程式碼。

def run(self, episodes, is_training=True, render=False):
        if is_training:
            self.train(episodes, render)
        else:
            self.load_q_table("result.pkl")
            self.evaluate(episodes, render)

可以注意到我們run的函數參數

  • episodes: 這個參數代表要運行的回合數。它決定代理人在環境中互動的次數,不論是訓練還是評估。
  • is_training: 這個布林值參數決定代理人是否進行訓練。默認為 True,即進行訓練。當它設為 False 時,代理人會跳過訓練,直接進行評估,也就會進入我等等會介紹的第二個部分 load_q_table 及第三個部分 evaluate評估。
  • render: 這個布林值參數用於控制是否要在環境中渲染代理人的行為。默認為 False,若設為 True,則在訓練或評估過程中會啟用可視化。
  1. load_q_table
def load_q_table(self, file_name):
    with open(file_name, 'rb') as f:
        self.q_table = pickle.load(f)

這段程式碼的功能是從檔案中載入之前保存的 Q 表,以便在代理人不需要重新訓練的情況下使用已經學習到的策略進行決策,簡單來說,他就是讓代理人能夠基於已學習的知識進行決策,而不需要重新訓練模型。這在進行評估或測試時特別有用。

  1. evaluate評估函數
    這個部分是用來評估已經訓練完成的 Q 表,在給定的回合數中讓代理人根據 Q 表進行行動,並記錄每回合是否成功完成目標。程式也可以選擇是否呈現 FrozenLake 環境的視覺化。
  • render 參數控制是否顯示環境:

    • 當 render=True 時,環境會以「人類可見模式」呈現,也就是顯示出 FrozenLake 的動態畫面,讓使用者可以觀察代理人在環境中的動作。
    • 當 render=False 時,環境會以無視覺模式運行,只進行評估而不顯示畫面。
  • 環境初始化:

    • 根據是否啟用 render,使用 gym.make 初始化 FrozenLake 環境,設定地圖和滑動性質(map_name 和 is_slippery 由代理人之前的設置決定)。
  • rewards_per_episode:

    • 這是一個 NumPy 陣列,用來記錄每回合是否成功獲得獎勵。陣列的每個元素對應一個回合,當該回合成功到達目標(reward == 1)時,對應的值會被設為 1。
  • 每回合的運行流程:

    • 代理人從環境中獲取初始狀態(state = self.env.reset()[0])。
    • 在每個回合中,代理人根據目前的 Q 表選擇最佳行動(np.argmax(self.q_table[state, :])),並在環境中執行這個行動(self.env.step(action))。
    • 當該回合結束(terminated 或 truncated),記錄是否成功到達目標(reward == 1)。
  • 結果視覺化:

    • 每回合完成後,環境被關閉(self.env.close()),並且利用 plot_rewards 函數將每回合的結果(即成功率)進行繪製並存檔。
  1. 運行程式
    最後我們在執行整個程式的時候可以這樣運行
if __name__ == '__main__':
    agent = FrozenLakeAgent()
    agent.run(15000, is_training=True, render=False)

這段程式碼是整個程式的入口,當程式直接執行時,這段邏輯會被執行。它的功能是創建一個 FrozenLakeAgent 代理人,並依照不同模式運行代理人進行評估和訓練,在這邊我們先讓他進行訓練。

  • 首次運行 (訓練): 執行第一個 agent.run(15000, is_training=True, render=False),這次代理人會進行訓練(因為 is_training=True),代理人會在環境中互動 15000 次,不斷更新 Q 表以學習最佳策略。render=False 表示這段訓練過程不會被可視化,以提高運行效率。

接著進行評估

if __name__ == '__main__':
    agent = FrozenLakeAgent()
    agent.run(10, is_training=False, render=True)

  • 再次運行 (評估): 接著執行 agent.run(1000, is_training=False, render=True),這裡代理人不會進行訓練(因為 is_training=False),而是使用之前已經學習到的策略進行評估。render=True 表示代理人的行動將會在環境中被可視化展示。這部分的目的是檢驗代理人在已學會的策略下能否有效地解決問題。

成果展示

在首次運行 我們可以得到一張訓練15000次後的圖表
image

  • 初期表現(0-8000回合):
    • 在訓練初期,累積的獎勵數值較低,甚至幾乎是 0。這表示代理人在早期的回合中,還沒有學會有效地到達目標或取得獎勵,大多數情況下可能選擇了次優策略,並沒有獲得獎勵。
  • 中期表現(8000-10000回合左右):
    • 在大約 8000 回合之後,圖中的累積獎勵數值開始大幅上升。這意味著代理人已經逐漸學會如何在環境中獲得獎勵,並開始更多地選擇有利於成功到達目標的行動。
  • 後期表現(10000回合之後):
    • 在大約 10,000 回合之後,累積獎勵保持在一個較高的水準,顯示代理人的表現已經趨於穩定,並能夠持續地在每回合獲得較多的獎勵。
    • 儘管仍有一些波動,但整體的累積獎勵趨勢維持在 40 到 50 之間,這表明代理人已經學到了穩定的策略,並且在大多數回合中能夠成功到達目標。

接著讓他進行評估,也就是成果的部分,先來看看我們的小精靈如何在這個冰面上找到終點吧!
gif

運行結果也會有一張圖表
image
這張圖表表示我們在運行了十次訓練過後的Q-table中,這個可愛的小精靈有六次能夠成功找到終點。

結語

歷經多篇章節的學習,我們終於來到了強化學習系列的最後一篇。在這個系列中,我們從強化學習的基礎,到逐步實作代理人、設計訓練流程,再到最終的評估階段,一步步見證了代理人如何學習在動態的環境中做出最佳決策。當初找題材的時候看到這個有趣的素材,覺得相當有趣,相信大家跟著學習應該也對強化學習更了解了吧。/images/emoticon/emoticon37.gif


上一篇
[Day 11] 從理論到實踐:完成Frozen Lake的Q-learning訓練
下一篇
[Day 13] 從機器學習到深度學習:人工智慧的下一步
系列文
深度學習的學習之旅:從理論到實作20
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言