tonyxu99

Results 28 comments of tonyxu99

先看看PyTorch支不支持你的GPU。估计AMD的没戏。我在Linux环境下,就按照这个项目的README的来设置,自动就用GPU来训练了。我的GPU是 Quadro RTX5000

这个AI不会发波,升龙是因为作者不知基于什么原因让一个AI的指令持续6帧。你想让这个AI会发波升龙也很简单。只需注释或删除street_fighter_custom_wrapper.py的74行到81行。不需要重新训练。

另外我感觉这个所谓的AI动作都很随机,很多动作都是乱来。例如离敌人还很远就在乱出招。能赢最后的boss也有点盲拳打死老师傅的感觉,一对真人就没戏了。我感觉用这种方法训练的AI真的很不聪明。

> > 另外我感觉这个所谓的AI动作都很随机,很多动作都是乱来。例如离敌人还很远就在乱出招。能赢最后的boss也有点盲拳打死老师傅的感觉,一对真人就没戏了。我感觉用这种方法训练的AI真的很不聪明。 > > 别这样,作者虽然技术菜了点,但最少开源了LOL 我可没说作者技术菜!作者的目的的是打赢最终boss,他这个AI可是做到了。特别是第一局, 有100%的胜率,这是因为他是用第一局来训练的。可是第一局的boss是有固定套路的,所以AI也是用固定套路来赢的。所以这个AI根本无法对决其他电脑控制角色,更不论和人对决。 所以我尝试修改程序,从第一关打起来训练,每次训练直到AI被败为止。所以AI可以学习如何对战不同的对手。可是训练结果很差,根本不收敛。所以说,我才是那个菜鸟。我也是第一次接触RL,多谢Linyi作者给我带来兴趣和入门方法。我现在也有一些想法,看看能不能提高AI的水平。

现在我大概明白为什么作者要一个AI的指令持续6帧然后才输出奖惩值。这个是因为在游戏中,做出一个动作并不会马上打到对手并得分,要大概几个Frame的时间才能看到效果。如果我们把每一帧都丢给AI,当AI做对一个动作,并在几帧(step)后得到一个奖励,这个做对的动作实际得到的discounted return (刚刚学到的术语)就会相当小, 反而离奖励近的无效动作得到的discounted return多,这样并不利于AI训练。 所以我有个想法,既要用作者的这个方法,也要让AI会发波,升龙。

> > 现在我大概明白为什么作者要一个AI的指令持续6帧然后才输出奖惩值。这个是因为在游戏中,做出一个动作并不会马上打到对手并得分,要大概几个Frame的时间才能看到效果。如果我们把每一帧都丢给AI,当AI做对一个动作,并在几帧(step)后得到一个奖励,这个做对的动作实际得到的discounted return (刚刚学到的术语)就会相当小, 反而离奖励近的无效动作得到的discounted return多,这样并不利于AI训练。 > > 所以我有个想法,既要用作者的这个方法,也要让AI会发波,升龙。 > > > > > 另外我感觉这个所谓的AI动作都很随机,很多动作都是乱来。例如离敌人还很远就在乱出招。能赢最后的boss也有点盲拳打死老师傅的感觉,一对真人就没戏了。我感觉用这种方法训练的AI真的很不聪明。 > > > > > > > > > 别这样,作者虽然技术菜了点,但最少开源了LOL > > > >...

仔细看了代码,我觉得我找到为什么林哥的这个AI不会发波,升龙的原因。因为AI发出的一个指令会持续6帧,这样AI基本不可能出任何需要搓的招式。我有时间试一试把这个一个指令会持续6帧的设定去掉,再重新训练,看看会不会出发波,升龙。

你说的那段代码就是这个AI训练的奖惩算法啊。这个算法就只是从双方的血量变化计算奖惩。这个retro框架还没有高级到可以从画面检测角色是否使用了过肩摔,从而计算奖惩。不过因为过肩摔等高难度动作通常会造成对手比较大血量损失,所以当AI做出了过肩摔,是会得到比较大的奖励的。从另一方面说,这个游戏要赢的目的就是无论用什么招式让对手血量清零,所以只用血量作为奖惩就足够了。

另外一个youtuber做的类似AI就只是用分数的变化来计算血量也是一个方法。我觉得如果只是想让AI赢的几率较大,还是用血量靠谱一点。如果想让AI赢的漂亮(招式华丽),可能用分数比较好。