精品久久久久久久久水蜜桃|丁香花五月|新中文字幕麻豆视频|美女下面粉嫩粉嫩冒白浆高清|日本黄h兄妹h动漫一区二区三区|床片激情免费视频|羞羞动漫在线入口免费阅读

mod|通過(guò)強(qiáng)化學(xué)習(xí)和官方API制作《星露谷物語(yǔ)》的自動(dòng)釣魚(yú)mod( 二 )



Q-learning 中關(guān)鍵問(wèn)題是要獲取曾經(jīng)處于哪個(gè)狀態(tài)和采取了哪些行動(dòng)、到達(dá)哪個(gè)新的狀態(tài) , 以及執(zhí)行這個(gè)行動(dòng)中得到的獎(jiǎng)勵(lì) 。 有了這些數(shù)據(jù) , 我們可以使用像價(jià)值迭代 (Value Iteration 一種動(dòng)態(tài)規(guī)劃算法)這樣的簡(jiǎn)單算法將獎(jiǎng)勵(lì)從最終狀態(tài)(獲勝狀態(tài))開(kāi)始分析 , 逐漸往回推直至推至所有狀態(tài) 。 因此對(duì)于每個(gè)可能的狀態(tài) , 模型都會(huì)知道最大化其未來(lái)回報(bào)的方向 。但是我不會(huì)使用價(jià)值迭代來(lái)訓(xùn)練模型 , 因?yàn)檎嬲膯?wèn)題往往有太多的狀態(tài)并且動(dòng)態(tài)規(guī)劃需要很長(zhǎng)時(shí)間 。
上面的價(jià)值迭代只是為了說(shuō)明在 C# 中保存每個(gè)條目的方式 。這里使用緩存從最后一幀獲取狀態(tài)和動(dòng)作 , 并將所有這些與當(dāng)前幀的狀態(tài)和獎(jiǎng)勵(lì)一起存儲(chǔ) 。
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;
所有這些數(shù)據(jù)都變成了一個(gè)巨大的 csv 文件 , 這樣可以通過(guò) Python 加載并用于訓(xùn)練 DQN 模型 。
DQN 模型【mod|通過(guò)強(qiáng)化學(xué)習(xí)和官方API制作《星露谷物語(yǔ)》的自動(dòng)釣魚(yú)mod】使用神經(jīng)網(wǎng)絡(luò)估計(jì) Q-table的 Q-Learning稱為Deep Q-Learning 。 這個(gè)方法在很多個(gè) Pytorch 教程中都有很好的解釋 , 我從里面復(fù)制了很多代碼并為我們的問(wèn)題對(duì)其進(jìn)行了一些修改 。 主要思想是使用兩個(gè)神經(jīng)網(wǎng)絡(luò) 。 一個(gè)將估計(jì) Q(sa) 的值(Policy Net) , 另一個(gè)將估計(jì)未來(lái) Q-values的值(Target Net) 。 然后我們對(duì)這兩個(gè)網(wǎng)絡(luò)的差異進(jìn)行反向傳播 。
這是 Q-Learning算法的基本方程 。 我們將使用一個(gè)網(wǎng)絡(luò)來(lái)估計(jì)當(dāng)前狀態(tài) Q(sa) 的正確值 , 另一個(gè)將估計(jì)下一個(gè)狀態(tài)的最大可能值 。 兩個(gè)網(wǎng)絡(luò)都使用隨機(jī)值進(jìn)行初始化 , 并且每隔幾次迭代將Policy Net權(quán)重復(fù)制到Target Net 。 Policy Net則通過(guò)反向傳播更新權(quán)重, 通過(guò)反向傳播這種 , Policy Net 最終將學(xué)會(huì)估計(jì)這兩個(gè)值 。

α 是學(xué)習(xí)率 , \uD835\uDEFE 是用于選擇為 Q 的未來(lái)值給出的重要值的折扣因子(discount factor) 。 強(qiáng)化學(xué)習(xí)是比較難易理解的所以最后會(huì)整理一堆鏈接 , 它們會(huì)做更好的細(xì)節(jié)解釋 。
訓(xùn)練訓(xùn)練過(guò)程是“自我驅(qū)動(dòng)的\uD83D\uDE02” , 首先要自己玩游戲收集狀態(tài)和獎(jiǎng)勵(lì)數(shù)據(jù) , 然后訓(xùn)練一個(gè)初始化的效果很差的模型讓它自動(dòng)玩游戲 , 并為我們收集新的數(shù)據(jù) 。 然后使用這些數(shù)據(jù)在 Python 端訓(xùn)練新模型 , 生成一個(gè)新的 ONNX格式模型 , 該模型將每 1000 幀左右重新加載一次 , 然后使用新模型繼續(xù)玩游戲并生成數(shù)據(jù)來(lái)訓(xùn)練新模型 。因?yàn)镃?# 必須編譯 mod 并將其打包到與游戲可執(zhí)行文件兼容的 Windows DLL 中 , 我沒(méi)有找到一個(gè)可以生成正確的 .NET 機(jī)器學(xué)習(xí)框架二進(jìn)制文件(Stardew Valley 是在 .NET 5 中編譯的) , 所以我放棄了 , 這里直接用 Python 編寫(xiě)了這部分 。
另外一個(gè)重要決定是該模型不需要在線訓(xùn)練 。Q-Learning就是要找到函數(shù) Q(sa) 的良好近似值 , 即估計(jì)在特定狀態(tài) s 下執(zhí)行特定動(dòng)作 a 的值的函數(shù) 。 所以模型的目的是數(shù)據(jù)徹底探索這個(gè)狀態(tài)空間 , 無(wú)論是你(人肉)還是模型玩游戲都沒(méi)有關(guān)系 , 當(dāng)然如果能夠全部自動(dòng)化拿看起來(lái)肯定更加的高大上 。
從 C # 中讀取 ONNX 模型C# 端唯一真正的 ML 代碼是 ONNX 進(jìn)行推理(預(yù)測(cè)) , 它定義了張量類型和會(huì)話的對(duì)象 , 可以發(fā)送張量輸入并從序列化的 ONNX 模型獲取張量輸出 。下面的代碼非常簡(jiǎn)單明了 。更新函數(shù)在每一幀都運(yùn)行 , 并以當(dāng)前狀態(tài)作為輸入查詢訓(xùn)練模型的動(dòng)作 , 最后幾行只是用于獲取模型輸出的 argMax一些代碼 , 這是與產(chǎn)生的動(dòng)作對(duì)應(yīng)的索引 。 序列化模型的重量只有 120kb 左右 , 所以運(yùn)行起來(lái)非常輕巧 。