作為一名快樂(lè)的肥宅,玩游戲是居家必備,無(wú)論是王者榮耀、吃雞、原神這些大熱游戲,還是跳一跳、合成大西瓜、2048、這些風(fēng)靡一時(shí)得小游戲,咱都有涉及。但是為了成為一個(gè)“頭號(hào)玩家”,我總是瘋狂的去個(gè)各大社區(qū)、網(wǎng)站尋找各種攻略,跟著攻略成長(zhǎng),我時(shí)常在想,什么時(shí)候俺才能成為一代攻略大神啊,讓大家學(xué)習(xí)我的技術(shù),豈不是很刺激!
靈光一閃,畢竟我是個(gè)有點(diǎn)小技術(shù)的肥宅,曾經(jīng)也癡迷過(guò)deepmind,跑過(guò)AlphaGo,這不得訓(xùn)練一個(gè)AI玩一玩。
強(qiáng)化學(xué)習(xí)訓(xùn)練2048游戲,
觀察AI如何找到出口?
既然要練手,那就先從2048這種簡(jiǎn)單,不考驗(yàn)操作,純策略的游戲入手吧。在網(wǎng)上搜羅了一番,果然讓我找到了開(kāi)源的2048游戲環(huán)境,GitHub地址:
https://github.com/rgal/gym-2048。
下一步就是把這個(gè)算法和強(qiáng)化學(xué)習(xí)結(jié)合了。
算法部分很簡(jiǎn)單,目前我才用的是最傳統(tǒng)的DQN,10分鐘就可以達(dá)到一個(gè)還可以的模型效果。如果小伙伴們有想法,可以試試RainBow,PPO,A2C,SAC這類(lèi)算法,相信會(huì)獲得更佳的效果。
我開(kāi)發(fā)這個(gè)模型,用的是來(lái)自華為云的ModelArts(它是一個(gè)在線、開(kāi)箱即用的AI平臺(tái),還有免費(fèi)的GPU算力,每天不限次數(shù)使用,不要太爽!),所以代碼是在ipynb中跑的。
整體步驟大概可以分為3步:
1.創(chuàng)建游戲環(huán)境
2.創(chuàng)建DQN算法
def learn(self, buffer): # 當(dāng)replaybuffer中存儲(chǔ)的數(shù)據(jù)大于batchsize時(shí),從中隨機(jī)采樣一個(gè)batch的數(shù)據(jù)學(xué)習(xí) if buffer.size 》=self.args.batch_size: # 更新target_model的參數(shù) if self.learn_step_counter %args.target_update_freq == 0: self.target_model.load_state_dict(self.behaviour_model.state_dict()) self.learn_step_counter += 1 # 從replaybuffer中隨機(jī)采樣一個(gè)五元組(當(dāng)前觀測(cè)值,動(dòng)作,下一個(gè)觀測(cè)值,是否一局結(jié)束,獎(jiǎng)勵(lì)值) s1, a, s2, done, r =buffer.get_sample(self.args.batch_size) s1 =torch.FloatTensor(s1).to(device) s2 = torch.FloatTensor(s2).to(device) r = torch.FloatTensor(r).to(device) a = torch.LongTensor(a).to(device) if args.use_nature_dqn: q =self.target_model(s2).detach() else: q = self.behaviour_model(s2) # 每個(gè)動(dòng)作的q值=r+gamma*(1-0或1)*q_max target_q = r +torch.FloatTensor(args.gamma * (1 - done)).to(device) * q.max(1)[0] target_q =target_q.view(args.batch_size, 1) eval_q = self.behaviour_model(s1).gather(1,torch.reshape(a, shape=(a.size()[0], -1))) # 計(jì)算損失函數(shù) loss = self.criterion(eval_q,target_q) self.optimizer.zero_grad() loss.backward() self.optimizer.step() def get_action(self, state, explore=True): # 判斷是否探索,如果探索,則采用貪婪探索策略決定行為 if explore: if np.random.uniform() 》=args.epsilon: action = randint(0,self.action_dim - 1) else: # Choose the best action accordingto the network. q =self.behaviour_model(torch.FloatTensor(state).to(device)) m, index = torch.max(q, 1) action =index.data.cpu().numpy()[0] else: q = self.behaviour_model(torch.FloatTensor(state).to(device)) m, index = torch.max(q, 1) action =index.data.cpu().numpy()[0] return action classReplayBuffer: def __init__(self, buffer_size, obs_space): self.s1 = np.zeros(obs_space, dtype=np.float32) self.s2 = np.zeros(obs_space,dtype=np.float32) self.a = np.zeros(buffer_size,dtype=np.int32) self.r = np.zeros(buffer_size,dtype=np.float32) self.done = np.zeros(buffer_size,dtype=np.float32) # replaybuffer大小 self.buffer_size = buffer_size self.size = 0 self.pos = 0 # 不斷將數(shù)據(jù)存儲(chǔ)入buffer def add_transition(self, s1, action, s2,done, reward): self.s1[self.pos] = s1 self.a[self.pos] = action if not done: self.s2[self.pos] = s2 self.done[self.pos] = done self.r[self.pos] = reward self.pos = (self.pos + 1) %self.buffer_size self.size = min(self.size + 1,self.buffer_size) # 隨機(jī)采樣一個(gè)batchsize def get_sample(self, sample_size): i = sample(range(0, self.size), sample_size) return self.s1[i], self.a[i],self.s2[i], self.done[i], self.r[i]
3.創(chuàng)建網(wǎng)絡(luò)模型
此處我用的就是一個(gè)非常簡(jiǎn)單的三層卷積網(wǎng)絡(luò)
classNet(nn.Module): #obs是狀態(tài)空間輸入,available_actions_count為動(dòng)作輸出維度 def __init__(self, obs,available_actions_count): super(Net, self).__init__() self.conv1 = nn.Conv2d(obs, 128,kernel_size=2, stride=1) self.conv2 = nn.Conv2d(128, 64,kernel_size=2, stride=1) self.conv3 = nn.Conv2d(64, 16,kernel_size=2, stride=1) self.fc1 = nn.Linear(16,available_actions_count) self.relu = nn.ReLU(inplace=True) def forward(self, x): x = x.permute(0, 3, 1, 2) x = self.relu(self.conv1(x)) x = self.relu(self.conv2(x)) x = self.relu(self.conv3(x)) x = self.fc1(x.view(x.shape[0], -1)) return x
完成以上三步,就可以愉快的開(kāi)始訓(xùn)練啦:
print(‘
training.。。’)begin_t= time.time()max_reward= 0fori_episode in range(args.epochs): # 每局開(kāi)始,重置環(huán)境 s = env.reset() # 累計(jì)獎(jiǎng)勵(lì)值 ep_r = 0 while True: # 計(jì)算動(dòng)作 a = dqn.get_action(np.expand_dims(s,axis=0)) # 執(zhí)行動(dòng)作 s_, r, done, info = env.step(a) # 存儲(chǔ)信息 memory.add_transition(s, a, s_, done,r) ep_r += r # 學(xué)習(xí)優(yōu)化過(guò)程 dqn.learn(memory) if done: print(‘Ep: ’, i_episode, ‘| Ep_r: ’, round(ep_r, 2)) if ep_r 》 max_reward: max_reward = ep_r print(“current_max_reward{}”.format(max_reward)) # 保存模型 torch.save(dqn.behaviour_model,“2048.pt”) break s = s_print(“finish!time cost is {}s”.format(time.time() - begin_t))
我只訓(xùn)練了10分鐘,在這個(gè)不能錯(cuò)步的嚴(yán)格環(huán)境下,推理時(shí)可以達(dá)到256分,如果采用更先進(jìn)算法,更長(zhǎng)的訓(xùn)練時(shí)間,2048不是夢(mèng)。
詳細(xì)代碼獲取方式:
通過(guò)此鏈接可直接在線運(yùn)行,或者下載
https://marketplace.huaweicloud.com/markets/aihub/notebook/detail/?id=3a11d09b-85f5-4ae4-b4a7-9b19be2b444d
這個(gè)技術(shù)來(lái)源是我在去年華為云AI全棧成長(zhǎng)計(jì)劃中接觸到的,據(jù)說(shuō)今年華為云又開(kāi)始了新一輪【AI實(shí)戰(zhàn)營(yíng)】,6大分類(lèi)實(shí)戰(zhàn)營(yíng)Python、ModelArts、MindSpore AI框架、深度、強(qiáng)化、機(jī)器學(xué)習(xí),助我們成為“AI王者”!
編輯:jq
-
AI
+關(guān)注
關(guān)注
87文章
31982瀏覽量
270799 -
強(qiáng)化學(xué)習(xí)
+關(guān)注
關(guān)注
4文章
268瀏覽量
11323 -
華為云
+關(guān)注
關(guān)注
3文章
2706瀏覽量
17655
原文標(biāo)題:游戲“外掛”?- AI生成游戲最強(qiáng)攻略
文章出處:【微信號(hào):HW-DigitalHome,微信公眾號(hào):華為數(shù)字家庭】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
【書(shū)籍評(píng)測(cè)活動(dòng)NO.55】AI Agent應(yīng)用與項(xiàng)目實(shí)戰(zhàn)
拜登擬在卸任前加強(qiáng)AI芯片出口管制
巨人網(wǎng)絡(luò)發(fā)布“千影”大模型,加速“游戲+AI”布局
如何使用 PyTorch 進(jìn)行強(qiáng)化學(xué)習(xí)
谷歌發(fā)布革命性AI游戲引擎GameNGen
微軟攜手Lumen Technologies擴(kuò)容并強(qiáng)化AI網(wǎng)絡(luò)能力合作
紅魔9S Pro系列AI游戲手機(jī)正式發(fā)布
MediaTek天璣開(kāi)發(fā)者大會(huì)2024揭秘:AI Coaching游戲教學(xué)技術(shù)革新游戲體驗(yàn)
育碧將運(yùn)用AI技術(shù)打造活力四溢的游戲
阿里云通義大模型助力“小愛(ài)同學(xué)”強(qiáng)化多模態(tài)AI生成能力
NVIDIA數(shù)字人技術(shù)加速部署生成式AI驅(qū)動(dòng)的游戲角色

評(píng)論