作為一名快樂的肥宅,玩游戲是居家必備,無論是王者榮耀、吃雞、原神這些大熱游戲,還是跳一跳、合成大西瓜、2048、這些風靡一時得小游戲,咱都有涉及。但是為了成為一個“頭號玩家”,我總是瘋狂的去個各大社區、網站尋找各種攻略,跟著攻略成長,我時常在想,什么時候俺才能成為一代攻略大神啊,讓大家學習我的技術,豈不是很刺激!
靈光一閃,畢竟我是個有點小技術的肥宅,曾經也癡迷過deepmind,跑過AlphaGo,這不得訓練一個AI玩一玩。
強化學習訓練2048游戲,
觀察AI如何找到出口?
既然要練手,那就先從2048這種簡單,不考驗操作,純策略的游戲入手吧。在網上搜羅了一番,果然讓我找到了開源的2048游戲環境,GitHub地址:
https://github.com/rgal/gym-2048。
下一步就是把這個算法和強化學習結合了。
算法部分很簡單,目前我才用的是最傳統的DQN,10分鐘就可以達到一個還可以的模型效果。如果小伙伴們有想法,可以試試RainBow,PPO,A2C,SAC這類算法,相信會獲得更佳的效果。
我開發這個模型,用的是來自華為云的ModelArts(它是一個在線、開箱即用的AI平臺,還有免費的GPU算力,每天不限次數使用,不要太爽!),所以代碼是在ipynb中跑的。
整體步驟大概可以分為3步:
1.創建游戲環境
2.創建DQN算法
def learn(self, buffer): # 當replaybuffer中存儲的數據大于batchsize時,從中隨機采樣一個batch的數據學習 if buffer.size 》=self.args.batch_size: # 更新target_model的參數 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中隨機采樣一個五元組(當前觀測值,動作,下一個觀測值,是否一局結束,獎勵值) 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) # 每個動作的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))) # 計算損失函數 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 # 不斷將數據存儲入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) # 隨機采樣一個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.創建網絡模型
此處我用的就是一個非常簡單的三層卷積網絡
classNet(nn.Module): #obs是狀態空間輸入,available_actions_count為動作輸出維度 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
完成以上三步,就可以愉快的開始訓練啦:
print(‘
training.。。’)begin_t= time.time()max_reward= 0fori_episode in range(args.epochs): # 每局開始,重置環境 s = env.reset() # 累計獎勵值 ep_r = 0 while True: # 計算動作 a = dqn.get_action(np.expand_dims(s,axis=0)) # 執行動作 s_, r, done, info = env.step(a) # 存儲信息 memory.add_transition(s, a, s_, done,r) ep_r += r # 學習優化過程 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))
我只訓練了10分鐘,在這個不能錯步的嚴格環境下,推理時可以達到256分,如果采用更先進算法,更長的訓練時間,2048不是夢。
詳細代碼獲取方式:
通過此鏈接可直接在線運行,或者下載
https://marketplace.huaweicloud.com/markets/aihub/notebook/detail/?id=3a11d09b-85f5-4ae4-b4a7-9b19be2b444d
這個技術來源是我在去年華為云AI全棧成長計劃中接觸到的,據說今年華為云又開始了新一輪【AI實戰營】,6大分類實戰營Python、ModelArts、MindSpore AI框架、深度、強化、機器學習,助我們成為“AI王者”!
編輯:jq
-
AI
+關注
關注
87文章
31133瀏覽量
269460 -
強化學習
+關注
關注
4文章
268瀏覽量
11270 -
華為云
+關注
關注
3文章
2607瀏覽量
17478
原文標題:游戲“外掛”?- AI生成游戲最強攻略
文章出處:【微信號:HW-DigitalHome,微信公眾號:華為數字家庭】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論