Q-learning 中關鍵問題是要獲取曾經處于哪個狀態和采取了哪些行動、到達哪個新的狀態 , 以及執行這個行動中得到的獎勵 。 有了這些數據 , 我們可以使用像價值迭代 (Value Iteration 一種動態規劃算法)這樣的簡單算法將獎勵從最終狀態(獲勝狀態)開始分析 , 逐漸往回推直至推至所有狀態 。 因此對于每個可能的狀態 , 模型都會知道最大化其未來回報的方向 。但是我不會使用價值迭代來訓練模型 , 因為真正的問題往往有太多的狀態并且動態規劃需要很長時間 。
上面的價值迭代只是為了說明在 C# 中保存每個條目的方式 。這里使用緩存從最后一幀獲取狀態和動作 , 并將所有這些與當前幀的狀態和獎勵一起存儲 。
replayMemory[updateCounter0
= OldState[0
;
replayMemory[updateCounter1
= OldState[1
;
replayMemory[updateCounter2
= OldState[2
;
replayMemory[updateCounter3
= NewState[0
;
replayMemory[updateCounter4
= NewState[1
;
replayMemory[updateCounter5
= NewState[2
;
replayMemory[updateCounter6
= reward;
replayMemory[updateCounter7
= actionBuffer? 1 : 0;
所有這些數據都變成了一個巨大的 csv 文件 , 這樣可以通過 Python 加載并用于訓練 DQN 模型 。
DQN 模型【mod|通過強化學習和官方API制作《星露谷物語》的自動釣魚mod】使用神經網絡估計 Q-table的 Q-Learning稱為Deep Q-Learning 。 這個方法在很多個 Pytorch 教程中都有很好的解釋 , 我從里面復制了很多代碼并為我們的問題對其進行了一些修改 。 主要思想是使用兩個神經網絡 。 一個將估計 Q(sa) 的值(Policy Net) , 另一個將估計未來 Q-values的值(Target Net) 。 然后我們對這兩個網絡的差異進行反向傳播 。
這是 Q-Learning算法的基本方程 。 我們將使用一個網絡來估計當前狀態 Q(sa) 的正確值 , 另一個將估計下一個狀態的最大可能值 。 兩個網絡都使用隨機值進行初始化 , 并且每隔幾次迭代將Policy Net權重復制到Target Net 。 Policy Net則通過反向傳播更新權重, 通過反向傳播這種 , Policy Net 最終將學會估計這兩個值 。
α 是學習率 , \uD835\uDEFE 是用于選擇為 Q 的未來值給出的重要值的折扣因子(discount factor) 。 強化學習是比較難易理解的所以最后會整理一堆鏈接 , 它們會做更好的細節解釋 。
訓練訓練過程是“自我驅動的\uD83D\uDE02” , 首先要自己玩游戲收集狀態和獎勵數據 , 然后訓練一個初始化的效果很差的模型讓它自動玩游戲 , 并為我們收集新的數據 。 然后使用這些數據在 Python 端訓練新模型 , 生成一個新的 ONNX格式模型 , 該模型將每 1000 幀左右重新加載一次 , 然后使用新模型繼續玩游戲并生成數據來訓練新模型 。因為C?# 必須編譯 mod 并將其打包到與游戲可執行文件兼容的 Windows DLL 中 , 我沒有找到一個可以生成正確的 .NET 機器學習框架二進制文件(Stardew Valley 是在 .NET 5 中編譯的) , 所以我放棄了 , 這里直接用 Python 編寫了這部分 。
另外一個重要決定是該模型不需要在線訓練 。Q-Learning就是要找到函數 Q(sa) 的良好近似值 , 即估計在特定狀態 s 下執行特定動作 a 的值的函數 。 所以模型的目的是數據徹底探索這個狀態空間 , 無論是你(人肉)還是模型玩游戲都沒有關系 , 當然如果能夠全部自動化拿看起來肯定更加的高大上 。
從 C # 中讀取 ONNX 模型C# 端唯一真正的 ML 代碼是 ONNX 進行推理(預測) , 它定義了張量類型和會話的對象 , 可以發送張量輸入并從序列化的 ONNX 模型獲取張量輸出 。下面的代碼非常簡單明了 。更新函數在每一幀都運行 , 并以當前狀態作為輸入查詢訓練模型的動作 , 最后幾行只是用于獲取模型輸出的 argMax一些代碼 , 這是與產生的動作對應的索引 。 序列化模型的重量只有 120kb 左右 , 所以運行起來非常輕巧 。
- 觀眾|雙鴨山市首次通過云上直播迎新春音樂會
- 招聘|這一“國企”招聘不限學歷,面試通過就可以上崗,專科生機會更大
- |80后手藝人用2022根樹枝做冬奧會雕塑:通過自己的手藝為冬奧會加油
- 冰墩墩$80后手藝人用2022根樹枝做冬奧會雕塑:通過自己的手藝為冬奧會加油
- |長城幣2角硬幣,流通過的收藏價值300元左右,你能找到嗎?
- 論述|陜西“非物質文化遺產”全國征文大賽第四十九賽區第(1)批征稿初審通過名單
- 翡翠|翡翠原石如何通過皮殼判斷賭石種老和種嫩
- 童子$太上老君與菩提祖師的差距,已經通過徒弟之間的對比顯現了出來
- 招商證券|如何提升面試通過率?教你一招,面試前把這些功課做好
- 高宗&清代用儒家道統強化統治合法性,以祀孔尊儒來貫穿知識分子的思想
