終於到了我們強化學習的最終章節了,今天就會把我們整個訓練完成囉,那廢話不多說,直接來看我們的程式!
在這邊我們定義了一個運行的函數,也就是我們的類別在實例化時要呼叫進入的地方,往下看看程式碼。
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,則在訓練或評估過程中會啟用可視化。def load_q_table(self, file_name):
with open(file_name, 'rb') as f:
self.q_table = pickle.load(f)
這段程式碼的功能是從檔案中載入之前保存的 Q 表,以便在代理人不需要重新訓練的情況下使用已經學習到的策略進行決策,簡單來說,他就是讓代理人能夠基於已學習的知識進行決策,而不需要重新訓練模型。這在進行評估或測試時特別有用。
render
參數控制是否顯示環境:
環境初始化:
rewards_per_episode:
每回合的運行流程:
結果視覺化:
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次後的圖表
接著讓他進行評估,也就是成果的部分,先來看看我們的小精靈如何在這個冰面上找到終點吧!
運行結果也會有一張圖表
這張圖表表示我們在運行了十次訓練過後的Q-table中,這個可愛的小精靈有六次能夠成功找到終點。
歷經多篇章節的學習,我們終於來到了強化學習系列的最後一篇。在這個系列中,我們從強化學習的基礎,到逐步實作代理人、設計訓練流程,再到最終的評估階段,一步步見證了代理人如何學習在動態的環境中做出最佳決策。當初找題材的時候看到這個有趣的素材,覺得相當有趣,相信大家跟著學習應該也對強化學習更了解了吧。