Street Fighter II很难,所以我训练了一个AI来帮我

  训练人工神经网络玩《街头霸王II》冠军版

  首先,我要说我不擅长打游戏。 长大后,我总是会输掉大多数比赛,直到我想出了扣球直到获胜的策略。 尽管如此,我还是年轻的时候还是决定接受Capcom最受欢迎的游戏Street Fighter II的挑战。 这是90年代的游戏之一,激发了一代听起来很酷的战斗动作和惊人的关卡主题。

  尽管按钮粉碎策略很有效,但我需要采用其他策略才能完成广告系列。 然后,突然意识到,我设法接受了训练增援人员为我击败的想法。 因此,在准备好舞台之后,我决定参加训练自己的模型以击败竞选的旅程!

  健身房复古与整合工具

  首先,我们需要一种将Street Fighter II实际实现到Python中的方法。 有两种方法可以做到这一点,但是为了节省时间,最简单的方法是"复古健身房"。 Gym-retro是一个Python软件包,可以将我们的游戏数据转换为可用的环境。 健身房复古配备了超过1000种不同游戏的预制环境。 这个工具很棒,因为它使得在游戏中实现人工代理变得非常简单。 它还使提取每次运行的动作和奖励变得非常简单。

  缺少初始软件包的唯一一件事是每个级别的保存状态。 但是,他们还发布了自己的集成工具,您可以将其用于此方案!

  首先,您需要将其安装到拥有健身房复古文件和游戏文件的文件夹中。 启动后,您只需要将角色带到您想要具有保存状态然后导出的级别的开始即可。 简短而简单!

  最终,一段时间后,我获得了用于训练代理的所有级别。 接下来,我们需要决定使用哪种强化算法。

  稳定的基线和培训

  我决定使用的算法是A2C(演员优势评论家)模型。

  该模型背后的基本思想是几乎不可能预测几乎无限量输入的动作。 因此,我们改为使用一个神经网络"演员"来探索当前环境并执行动作。 另一个神经网络"评论家"获取当前状态和动作并输出评估结果。 然后,"演员"根据"评论家"建议调整执行某些动作的可能性。 改变执行动作的方式是优势所在。它比较了执行特定动作的代理与该状态下采取的平均动作之间的收益。

  稳定基准是Open AI最初的Baselines Python软件包的延续,对原始软件包进行了改进。 它包括许多可与之一起使用的强化学习模型,因此一定要检查一下! 他们将使用他们的A2C模型,因此,我们拥有所有运动部件来训练我们的模型!

  基线稳定稳定基线是一组基于OpenAI基线的强化学习算法的改进实现。

  我们将使用Google Colab作为我们的Python环境。 使用免费版本的Colab,我们可以在Google的Cloud Platform上运行Python笔记本,并利用其Tesla K80 GPU进行培训。 安装完所有软件包后,就该创建模型了。 首先,我们对Google云端硬盘进行身份验证,并使用Gym-Retro软件包中包含的Python脚本导入游戏文件。

  !pip install stable-baselines[mpi]==2.10.0

  !pip install gym-retro

  !pip install tqdm

  from tqdm import tqdm

  import time

  import retrofrom stable_baselinesmon.policies

  import MlpPolicy,MlpLstmPolicy, MlpLnLstmPolicy, CnnLnLstmPolicy, CnnPolicy, CnnLstmPolicy

  from stable_baselinesmon.vec_env import SubprocVecEnv, DummyVecEnv

  from stable_baselines import PPO2, A2C

  from google.colab import drivedrive.mount('/gdrive')

  !python -m retroport /gdrive/"My Drive"/"Where you Keep your Game Files"

  接下来,我们将创建模型。 我们将使用之前导入的A2C模型和CNN政策(最适合2D游戏)。 我们还需要通过提供我们正在使用的游戏以及我们希望我们的代理商开始的状态来初始化我们的环境。

  #Create and Train Model on SFII Enginegame

  name='StreetFighterIISpecialChampionEdition-Genesis'

  modelname='Fighter_a2c_pt2'

  #whatever name you want to give it

  env=DummyVecEnv([lambda: retro.make(gamename ,state='Champion.Level1.RyuVsGuile')])

  model=A2C(CnnPolicy,env,n_steps=128, verbose=1)

  #model=A2C.load('/gdrive/My Drive/ROMS/Fighter_a2c_pt2.zip')

  model.set_env(env)model.learn(total_timesteps=1000)

  #Saves Model into

  model.save("/gdrive/My Drive/"

  #"Whatever Your File Name is/"

  + modelname)

  env.close()

  现在是有趣的部分。 我们将训练我们的模型以实际击败广告系列! "街头霸王II"广告系列以Ryu为唯一可玩角色,因此我们将使用他来训练模型。 我们的模型将在每个级别运行100,000次,并在每个级别之后保存。 我们的最终结果基于10个训练周期(每个级别1百万次迭代)。 我很好奇的一件事是培训需要多长时间? 通过使用Python中的时间包,我可以看到每个训练周期大约需要2个小时。

  #Training and Saving Your Model

  #Use whatever you called your states without the .state extensions

  ts=['RyuVsGuile','RyuVsBlanka','RyuVsRyu','RyuVsKen','RyuVsChunLi','RyuVsZangief','RyuVsDhalsim','RyuVsHonda','RyuVsBalrog','RyuVsVega','RyuVsSagat','RyuVsBison']

  start_time=time.time()

  for st in tqdm(sts, desc='Main Loop'):

  print(st)

  env=DummyVecEnv([lambda: retro.make('StreetFighterIISpecialChampionEdition-Genesis', state=st, scenario='scenario')])

  model.set_env(env) model.learn(total_timesteps=500000)

  model.save(modelname)

  env.close()

  end_time=time.time() - start_time

  print(f'

  The Training Took {end_time} seconds')

  训练完模型后,我们将要计算代理商获得的奖励金额。 为此,我们可以通过让坐席经过一个关卡,然后对坐席获得的奖励总额(赢得比赛后获得的积分)进行累加来实现。 测试该模型的难度要比训练难度大,这仅仅是因为这样做可以产生最佳结果。 我们还将利用Gym-Retro的一项出色功能,使您可以记录您的经纪人在比赛中的表现! 录制的素材是BK2文件,可以使用Gym-Retro随附的另一个Python脚本将其转换为MP4。

  env=DummyVecEnv([lambda: retro.make('StreetFighterIISpecialChampionEdition-Genesis',state='RyuVsHonda-Easy', record='/gdrive/My Drive/'#"Wherever you put file")])

  model=A2C.load(modelname)

  model.set_env(env)

  obs=env.reset()d

  one=False

  reward=0

  while not done:

  actions, _=model.predict(obs)

  obs, rew, done, info=env.step(actions)

  reward +=rew

  print(reward)

  ### Convert BK2 to MP4 File

  !python /usr/local/lib/python3.6/dist-packages/retro/scripts/playback_movie.py "/gdrive/My Drive/Level16.RyuVsHonda-Easy-000000.bk2"

  终于,经过漫长的旅程,我们制造出了能够击败Street Fighter II的AI! 这是整个运动中播放的Ryu_Bot的视频。

  局限性和未来设计

  尽管该项目给出了令人满意的结果,但该设计仍存在一些局限性。 首先,此模型仅适用于Ryu。 当切换到单独的角色(例如Guile)时,该模型的效果不佳,因为它们的特殊动作具有单独的输入。 对于将来的设计,我将研究使用单独的角色训练模型,或者比较和对比不同的强化学习算法,看看哪种算法效果最好。

  归根结底,如果您对总体上开始使用机器学习感到好奇,那么建立RL代理会非常有趣且信息丰富。 强化学习除了视频游戏外,还有许多其他用途,例如优化问题或机器人技术。 也有很多很棒的文章和视频系列可以帮助您入门。

  感谢您的阅读!

posted @ 2022-01-15 15:36  linjingyg  阅读(721)  评论(0编辑  收藏  举报