linyiLYi / street-fighter-ai

This is an AI agent for Street Fighter II Champion Edition.
Apache License 2.0
6.34k stars 1.36k forks source link

看了一下视频和代码简单说以下原理和感觉还有疑问 #48

Open zhouguwei opened 1 year ago

zhouguwei commented 1 year ago

刚看到视频时感觉我CAO这么牛B,之后看了代码竟然这么小! 打开一看。。这AI原来是乱按的啊,根本没有抓画面,所谓的训练只是靠读取双方血条和胜负的内存地址来判断的。 也就是说AI完全靠乱按试出了一个套路可以在这特定存档中打死拜森/贝加,毫无通用性。 不过CHATGPT能写出这段代码感觉已经非常强了。。 另外 有人能告诉我data/data.json里那些内存地址哪来的? PS 另外这个感觉用在训练马里奥这种没什么随机性的游戏更适合。。

tonyxu99 commented 1 year ago

刚看到视频时感觉我CAO这么牛B,之后看了代码竟然这么小! 打开一看。

  • 代码量小是因为调用了最聪明的人写的封装好的大量代码。例如,这个AI用了openAI的PPO强化学习算法。
  • 这AI原来是乱按的啊,根本没有抓画面,所谓的训练只是靠读取双方血条和胜负的内存地址来判断的。

  • AI是有抓画面(observation),作为AI模型的输入。 你仔细看代码就知道了。作者把当前帧的前第9,第6,第3帧加起来丢给AI,从而让AI知道一些运动轨迹。

也就是说AI完全靠乱按试出了一个套路可以在这特定存档中打死拜森/贝加,毫无通用性。

  • 是的,简单来说,强化学习就是从随机动作出发,做了好动作,得到奖励就记住,下次就会在相同的状态做这个动作。当前的这个AI的确是毫无通用性。我一直在思考如何改进,能尽量打赢更多对手。

不过CHATGPT能写出这段代码感觉已经非常强了。。 另外 有人能告诉我data/data.json里那些内存地址哪来的? PS 另外这个感觉用在训练马里奥这种没什么随机性的游戏更适合。。

zhouguwei commented 1 year ago

刚看到视频时感觉我CAO这么牛B,之后看了代码竟然这么小! 打开一看。

  • 代码量小是因为调用了最聪明的人写的封装好的大量代码。例如,这个AI用了openAI的PPO强化学习算法。

这AI原来是乱按的啊,根本没有抓画面,所谓的训练只是靠读取双方血条和胜负的内存地址来判断的。

  • AI是有抓画面(observation),作为AI模型的输入。 你仔细看代码就知道了。作者把当前帧的前第9,第6,第3帧加起来丢给AI,从而让AI知道一些运动轨迹。

也就是说AI完全靠乱按试出了一个套路可以在这特定存档中打死拜森/贝加,毫无通用性。

  • 是的,简单来说,强化学习就是从随机动作出发,做了好动作,得到奖励就记住,下次就会在相同的状态做这个动作。当前的这个AI的确是毫无通用性。我一直在思考如何改进,能尽量打赢更多对手。

不过CHATGPT能写出这段代码感觉已经非常强了。。 另外 有人能告诉我data/data.json里那些内存地址哪来的? PS 另外这个感觉用在训练马里奥这种没什么随机性的游戏更适合。。

我的意思是那些抓的画面没用在custom_reward里(加减分只靠血量胜负来判定),导致AI的训练完全是没目的并不会根据敌我双方的位置动作来判断最优步骤,完全靠瞎按(等敌人正好自己撞死),没我想象的高级。 如果用在超级马里奥里我觉得能训练出一个不出意外从头玩到底的AI,但是用在街霸里就只能打特定存档了。。哪怕打一样的敌人只要不是这个存档造成敌人开场动作有一点偏差基本上就没用了。

fr0zenrain commented 1 year ago
  • AI是有抓画面(observation),作为AI模型的输入。 你仔细看代码就知道了。作者把当前帧的前第9,第6,第3帧加起来丢给AI,从而让AI知道一些运动轨迹。

大佬看来是研究过了,比想象中的差哎,我自己还换了个角色训练了800万step,依然打不赢。我对这个这个游戏没兴趣,我想搞kof97,研究了一下retro不支持kof97,挺麻烦的。

tonyxu99 commented 1 year ago

我的意思是那些抓的画面没用在custom_reward里(加减分只靠血量胜负来判定),导致AI的训练完全是没目的并不会根据敌我双方的位置动作来判断最优步骤,完全靠瞎按(等敌人正好自己撞死),没我想象的高级。

我正在构思一些想法来帮一下AI. 我计划把移动,跳跃,发波,升龙等绝招作为action space, 这样AI就可以说我要发波,就可以发波了。reward函数也可优化一下,例如远距离时发波,可以得到一定奖励,这样就可以训练AI在敌人距离远的时候就发波,而不是乱出根本到打不到对方的拳或脚。

zhouguwei commented 1 year ago

我的意思是那些抓的画面没用在custom_reward里(加减分只靠血量胜负来判定),导致AI的训练完全是没目的并不会根据敌我双方的位置动作来判断最优步骤,完全靠瞎按(等敌人正好自己撞死),没我想象的高级。

我正在构思一些想法来帮一下AI. 我计划把移动,跳跃,发波,升龙等绝招作为action space, 这样AI就可以说我要发波,就可以发波了。reward函数也可优化一下,例如远距离时发波,可以得到一定奖励,这样就可以训练AI在敌人距离远的时候就发波,而不是乱出根本到打不到对方的拳或脚。

对,想象了1下应该通过抓取双方位置图片动作来判断,空挥拳扣分,造成伤害加分,同理还可以抓取各种飞行道具得样子闪躲加分,防御不扣分被击中扣分。 又想了一下挥拳这些可以不用抓每个人物动作,只要判断双方位置和按出按钮后一定时间内没造成血量伤害来进行加减分(由于必杀技防御也扣血所以这样还能诱导电脑用必杀技),但是这样也有疏漏毕竟有些必杀技是会位移或者放出飞行道具,还是抓画面比较精准。 PS 感觉连续技就比较难判定,街霸2这游戏有点古老,稍微新一点得游戏都直接抓画面就能获取,但是街霸2就比较麻烦 通过短时间内造是否成伤害判断又不精确。

tonyxu99 commented 1 year ago

我的意思是那些抓的画面没用在custom_reward里(加减分只靠血量胜负来判定),导致AI的训练完全是没目的并不会根据敌我双方的位置动作来判断最优步骤,完全靠瞎按(等敌人正好自己撞死),没我想象的高级。

我正在构思一些想法来帮一下AI. 我计划把移动,跳跃,发波,升龙等绝招作为action space, 这样AI就可以说我要发波,就可以发波了。reward函数也可优化一下,例如远距离时发波,可以得到一定奖励,这样就可以训练AI在敌人距离远的时候就发波,而不是乱出根本到打不到对方的拳或脚。

对,想象了1下应该通过抓取双方位置图片动作来判断,空挥拳扣分,造成伤害加分,同理还可以抓取各种飞行道具得样子闪躲加分,防御不扣分被击中扣分。 又想了一下挥拳这些可以不用抓每个人物动作,只要判断双方位置和按出按钮后一定时间内没造成血量伤害来进行加减分(由于必杀技防御也扣血所以这样还能诱导电脑用必杀技),但是这样也有疏漏毕竟有些必杀技是会位移或者放出飞行道具,还是抓画面比较精准。 PS 感觉连续技就比较难判定,街霸2这游戏有点古老,稍微新一点得游戏都直接抓画面就能获取,但是街霸2就比较麻烦 通过短时间内造是否成伤害判断又不精确。

另一方面来说,如果我们把太多人类的想法注入AI不知是否是一个好事。例如AlphaGo就学习了人类的棋谱,但更强的AlphaZero就完全不学人类的棋谱,而是通过自我对弈自我学习。

Datou commented 1 year ago

我的意思是那些抓的画面没用在custom_reward里(加减分只靠血量胜负来判定),导致AI的训练完全是没目的并不会根据敌我双方的位置动作来判断最优步骤,完全靠瞎按(等敌人正好自己撞死),没我想象的高级。

我正在构思一些想法来帮一下AI. 我计划把移动,跳跃,发波,升龙等绝招作为action space, 这样AI就可以说我要发波,就可以发波了。reward函数也可优化一下,例如远距离时发波,可以得到一定奖励,这样就可以训练AI在敌人距离远的时候就发波,而不是乱出根本到打不到对方的拳或脚。

不需要进行这类设置,AI也能学会大招,可以看看我录的这段 https://twitter.com/Datou/status/1652845188988166144?s=20

tonyxu99 commented 1 year ago

我的意思是那些抓的画面没用在custom_reward里(加减分只靠血量胜负来判定),导致AI的训练完全是没目的并不会根据敌我双方的位置动作来判断最优步骤,完全靠瞎按(等敌人正好自己撞死),没我想象的高级。

我正在构思一些想法来帮一下AI. 我计划把移动,跳跃,发波,升龙等绝招作为action space, 这样AI就可以说我要发波,就可以发波了。reward函数也可优化一下,例如远距离时发波,可以得到一定奖励,这样就可以训练AI在敌人距离远的时候就发波,而不是乱出根本到打不到对方的拳或脚。

不需要进行这类设置,AI也能学会大招,可以看看我录的这段 https://twitter.com/Datou/status/1652845188988166144?s=20

你是用同一个model打到第七关吗?能具体说一下是如何训练的吗?我发觉训练了下一关,AI就会把之前的关的训练忘了。所以只要我们针对每一关训练一个模型,在测试时自动选用对应的模型,应该很容易就可以通关了。不知这算不算作弊。

Datou commented 1 year ago

我的意思是那些抓的画面没用在custom_reward里(加减分只靠血量胜负来判定),导致AI的训练完全是没目的并不会根据敌我双方的位置动作来判断最优步骤,完全靠瞎按(等敌人正好自己撞死),没我想象的高级。

我正在构思一些想法来帮一下AI. 我计划把移动,跳跃,发波,升龙等绝招作为action space, 这样AI就可以说我要发波,就可以发波了。reward函数也可优化一下,例如远距离时发波,可以得到一定奖励,这样就可以训练AI在敌人距离远的时候就发波,而不是乱出根本到打不到对方的拳或脚。

不需要进行这类设置,AI也能学会大招,可以看看我录的这段 https://twitter.com/Datou/status/1652845188988166144?s=20

你是用同一个model打到第七关吗?能具体说一下是如何训练的吗?我发觉训练了下一关,AI就会把之前的关的训练忘了。所以只要我们针对每一关训练一个模型,在测试时自动选用对应的模型,应该很容易就可以通关了。不知这算不算作弊。

同一个模型,最多可以打到第七关本田,再练模型就崩,还没找到继续突破的办法。训练方法是从第一关开始,只在输的时候(出现倒计时)重置,能走多远算多远。奖励策略用的林哥的,训练方法用的IBM小哥的,先用optuna跑100来个参数组合,每个组合训练10万步左右,选出表现最好的参数(这时候AI已经可以打到第四关了),然后用这个参数训练几百万步(打到本田的模型训练了475万步)。

对不同的关卡选用不同的模型当然更容易通关,甚至可能是唯一可行的通过方法。如果想看一个“通用”的AI能有多厉害,还是只用一个模型合适。

as7786971 commented 1 year ago

我的意思是那些抓的画面没用在custom_reward里(加减分只靠血量胜负来判定),导致AI的训练完全是没目的并不会根据敌我双方的位置动作来判断最优步骤,完全靠瞎按(等敌人正好自己撞死),没我想象的高级。

我正在构思一些想法来帮一下AI. 我计划把移动,跳跃,发波,升龙等绝招作为action space, 这样AI就可以说我要发波,就可以发波了。reward函数也可优化一下,例如远距离时发波,可以得到一定奖励,这样就可以训练AI在敌人距离远的时候就发波,而不是乱出根本到打不到对方的拳或脚。

不需要进行这类设置,AI也能学会大招,可以看看我录的这段 https://twitter.com/Datou/status/1652845188988166144?s=20

你是用同一个model打到第七关吗?能具体说一下是如何训练的吗?我发觉训练了下一关,AI就会把之前的关的训练忘了。所以只要我们针对每一关训练一个模型,在测试时自动选用对应的模型,应该很容易就可以通关了。不知这算不算作弊。

同一个模型,最多可以打到第七关本田,再练模型就崩,还没找到继续突破的办法。训练方法是从第一关开始,只在输的时候(出现倒计时)重置,能走多远算多远。奖励策略用的林哥的,训练方法用的IBM小哥的,先用optuna跑100来个参数组合,每个组合训练10万步左右,选出表现最好的参数(这时候AI已经可以打到第四关了),然后用这个参数训练几百万步(打到本田的模型训练了475万步)。

对不同的关卡选用不同的模型当然更容易通关,甚至可能是唯一可行的通过方法。如果想看一个“通用”的AI能有多厉害,还是只用一个模型合适。

你可以提供一下你的训练模型吗?我想试试,我训练了好久,我的AI Ryu角色还是很蠢。

Datou commented 1 year ago

我的意思是那些抓的画面没用在custom_reward里(加减分只靠血量胜负来判定),导致AI的训练完全是没目的并不会根据敌我双方的位置动作来判断最优步骤,完全靠瞎按(等敌人正好自己撞死),没我想象的高级。

我正在构思一些想法来帮一下AI. 我计划把移动,跳跃,发波,升龙等绝招作为action space, 这样AI就可以说我要发波,就可以发波了。reward函数也可优化一下,例如远距离时发波,可以得到一定奖励,这样就可以训练AI在敌人距离远的时候就发波,而不是乱出根本到打不到对方的拳或脚。

不需要进行这类设置,AI也能学会大招,可以看看我录的这段 https://twitter.com/Datou/status/1652845188988166144?s=20

你是用同一个model打到第七关吗?能具体说一下是如何训练的吗?我发觉训练了下一关,AI就会把之前的关的训练忘了。所以只要我们针对每一关训练一个模型,在测试时自动选用对应的模型,应该很容易就可以通关了。不知这算不算作弊。

同一个模型,最多可以打到第七关本田,再练模型就崩,还没找到继续突破的办法。训练方法是从第一关开始,只在输的时候(出现倒计时)重置,能走多远算多远。奖励策略用的林哥的,训练方法用的IBM小哥的,先用optuna跑100来个参数组合,每个组合训练10万步左右,选出表现最好的参数(这时候AI已经可以打到第四关了),然后用这个参数训练几百万步(打到本田的模型训练了475万步)。 对不同的关卡选用不同的模型当然更容易通关,甚至可能是唯一可行的通过方法。如果想看一个“通用”的AI能有多厉害,还是只用一个模型合适。

你可以提供一下你的训练模型吗?我想试试,我训练了好久,我的AI Ryu角色还是很蠢。

把这两个压缩文件的zip后缀去掉,用7zip解压缩,可以得到一个测试文件和一个模型。这个模型大概是能打到本田的模型,时间太久了我有点记不清了。测试文件打开后直接点击“全部运行”按钮即可。 streetfighter2.7z.001.zip streetfighter2.7z.002.zip

截屏2023-05-28 下午3 52 30

运行过程中会输出bk2录像文件,通过命令 python -m retro.scripts.playback_movie xxx.bk2 可以把bk2渲染成mp4视频。

我的运行环境是python 3.8.16。

as7786971 commented 1 year ago

我的意思是那些抓的画面没用在custom_reward里(加减分只靠血量胜负来判定),导致AI的训练完全是没目的并不会根据敌我双方的位置动作来判断最优步骤,完全靠瞎按(等敌人正好自己撞死),没我想象的高级。

我正在构思一些想法来帮一下AI. 我计划把移动,跳跃,发波,升龙等绝招作为action space, 这样AI就可以说我要发波,就可以发波了。reward函数也可优化一下,例如远距离时发波,可以得到一定奖励,这样就可以训练AI在敌人距离远的时候就发波,而不是乱出根本到打不到对方的拳或脚。

不需要进行这类设置,AI也能学会大招,可以看看我录的这段 https://twitter.com/Datou/status/1652845188988166144?s=20

你是用同一个model打到第七关吗?能具体说一下是如何训练的吗?我发觉训练了下一关,AI就会把之前的关的训练忘了。所以只要我们针对每一关训练一个模型,在测试时自动选用对应的模型,应该很容易就可以通关了。不知这算不算作弊。

同一个模型,最多可以打到第七关本田,再练模型就崩,还没找到继续突破的办法。训练方法是从第一关开始,只在输的时候(出现倒计时)重置,能走多远算多远。奖励策略用的林哥的,训练方法用的IBM小哥的,先用optuna跑100来个参数组合,每个组合训练10万步左右,选出表现最好的参数(这时候AI已经可以打到第四关了),然后用这个参数训练几百万步(打到本田的模型训练了475万步)。 对不同的关卡选用不同的模型当然更容易通关,甚至可能是唯一可行的通过方法。如果想看一个“通用”的AI能有多厉害,还是只用一个模型合适。

你可以提供一下你的训练模型吗?我想试试,我训练了好久,我的AI Ryu角色还是很蠢。

把这两个压缩文件的zip后缀去掉,用7zip解压缩,可以得到一个测试文件和一个模型。这个模型大概是能打到本田的模型,时间太久了我有点记不清了。测试文件打开后直接点击“全部运行”按钮即可。 streetfighter2.7z.001.zip streetfighter2.7z.002.zip 截屏2023-05-28 下午3 52 30

运行过程中会输出bk2录像文件,通过命令 python -m retro.scripts.playback_movie xxx.bk2 可以把bk2渲染成mp4视频。

我的运行环境是python 3.8.16。

我刚刚按你说的把压缩文件的zip后缀去掉,然后用7zip解压缩。然后发现两个文件都是解压报错,麻烦你可以重新发一遍吗?

as7786971 commented 1 year ago

我的意思是那些抓的画面没用在custom_reward里(加减分只靠血量胜负来判定),导致AI的训练完全是没目的并不会根据敌我双方的位置动作来判断最优步骤,完全靠瞎按(等敌人正好自己撞死),没我想象的高级。

我正在构思一些想法来帮一下AI. 我计划把移动,跳跃,发波,升龙等绝招作为action space, 这样AI就可以说我要发波,就可以发波了。reward函数也可优化一下,例如远距离时发波,可以得到一定奖励,这样就可以训练AI在敌人距离远的时候就发波,而不是乱出根本到打不到对方的拳或脚。

不需要进行这类设置,AI也能学会大招,可以看看我录的这段 https://twitter.com/Datou/status/1652845188988166144?s=20

你是用同一个model打到第七关吗?能具体说一下是如何训练的吗?我发觉训练了下一关,AI就会把之前的关的训练忘了。所以只要我们针对每一关训练一个模型,在测试时自动选用对应的模型,应该很容易就可以通关了。不知这算不算作弊。

同一个模型,最多可以打到第七关本田,再练模型就崩,还没找到继续突破的办法。训练方法是从第一关开始,只在输的时候(出现倒计时)重置,能走多远算多远。奖励策略用的林哥的,训练方法用的IBM小哥的,先用optuna跑100来个参数组合,每个组合训练10万步左右,选出表现最好的参数(这时候AI已经可以打到第四关了),然后用这个参数训练几百万步(打到本田的模型训练了475万步)。 对不同的关卡选用不同的模型当然更容易通关,甚至可能是唯一可行的通过方法。如果想看一个“通用”的AI能有多厉害,还是只用一个模型合适。

你可以提供一下你的训练模型吗?我想试试,我训练了好久,我的AI Ryu角色还是很蠢。

把这两个压缩文件的zip后缀去掉,用7zip解压缩,可以得到一个测试文件和一个模型。这个模型大概是能打到本田的模型,时间太久了我有点记不清了。测试文件打开后直接点击“全部运行”按钮即可。 streetfighter2.7z.001.zip streetfighter2.7z.002.zip 截屏2023-05-28 下午3 52 30

运行过程中会输出bk2录像文件,通过命令 python -m retro.scripts.playback_movie xxx.bk2 可以把bk2渲染成mp4视频。

我的运行环境是python 3.8.16。

经过测试你的模型,确实在难度普通的情况下。同一个模型能打到至少6关。可以学习一下你的训练手法吗?

Datou commented 1 year ago

我的意思是那些抓的画面没用在custom_reward里(加减分只靠血量胜负来判定),导致AI的训练完全是没目的并不会根据敌我双方的位置动作来判断最优步骤,完全靠瞎按(等敌人正好自己撞死),没我想象的高级。

我正在构思一些想法来帮一下AI. 我计划把移动,跳跃,发波,升龙等绝招作为action space, 这样AI就可以说我要发波,就可以发波了。reward函数也可优化一下,例如远距离时发波,可以得到一定奖励,这样就可以训练AI在敌人距离远的时候就发波,而不是乱出根本到打不到对方的拳或脚。

不需要进行这类设置,AI也能学会大招,可以看看我录的这段 https://twitter.com/Datou/status/1652845188988166144?s=20

你是用同一个model打到第七关吗?能具体说一下是如何训练的吗?我发觉训练了下一关,AI就会把之前的关的训练忘了。所以只要我们针对每一关训练一个模型,在测试时自动选用对应的模型,应该很容易就可以通关了。不知这算不算作弊。

同一个模型,最多可以打到第七关本田,再练模型就崩,还没找到继续突破的办法。训练方法是从第一关开始,只在输的时候(出现倒计时)重置,能走多远算多远。奖励策略用的林哥的,训练方法用的IBM小哥的,先用optuna跑100来个参数组合,每个组合训练10万步左右,选出表现最好的参数(这时候AI已经可以打到第四关了),然后用这个参数训练几百万步(打到本田的模型训练了475万步)。 对不同的关卡选用不同的模型当然更容易通关,甚至可能是唯一可行的通过方法。如果想看一个“通用”的AI能有多厉害,还是只用一个模型合适。

你可以提供一下你的训练模型吗?我想试试,我训练了好久,我的AI Ryu角色还是很蠢。

把这两个压缩文件的zip后缀去掉,用7zip解压缩,可以得到一个测试文件和一个模型。这个模型大概是能打到本田的模型,时间太久了我有点记不清了。测试文件打开后直接点击“全部运行”按钮即可。 streetfighter2.7z.001.zip streetfighter2.7z.002.zip 截屏2023-05-28 下午3 52 30 运行过程中会输出bk2录像文件,通过命令 python -m retro.scripts.playback_movie xxx.bk2 可以把bk2渲染成mp4视频。 我的运行环境是python 3.8.16。

经过测试你的模型,确实在难度普通的情况下。同一个模型能打到至少6关。可以学习一下你的训练手法吗?

先用optuna从头跑80个10万步的模型,选出来几个表现好的,把hyperparameters记下来。 用表现好的hyperparameters训练几百万步,数据能提升就持续练,数据走平或者大幅下降了就中止,换其他hyperparameters。 实在无法继续提升之后,把表现最好的模型放到optuna,关卡改成最后一关,再跑几十个几万步的模型,也许能稍微优点突破。

越到后面提升越难,从第六关到第七关我尝试了很多办法花了好几天,然后就不想再折腾了。

lhua0420 commented 1 year ago

我的意思是那些抓的画面没用在custom_reward里(加减分只靠血量胜负来判定),导致AI的训练完全是没目的并不会根据敌我双方的位置动作来判断最优步骤,完全靠瞎按(等敌人正好自己撞死),没我想象的高级。

我正在构思一些想法来帮一下AI. 我计划把移动,跳跃,发波,升龙等绝招作为action space, 这样AI就可以说我要发波,就可以发波了。reward函数也可优化一下,例如远距离时发波,可以得到一定奖励,这样就可以训练AI在敌人距离远的时候就发波,而不是乱出根本到打不到对方的拳或脚。

不需要进行这类设置,AI也能学会大招,可以看看我录的这段 https://twitter.com/Datou/status/1652845188988166144?s=20

你是用同一个model打到第七关吗?能具体说一下是如何训练的吗?我发觉训练了下一关,AI就会把之前的关的训练忘了。所以只要我们针对每一关训练一个模型,在测试时自动选用对应的模型,应该很容易就可以通关了。不知这算不算作弊。

同一个模型,最多可以打到第七关本田,再练模型就崩,还没找到继续突破的办法。训练方法是从第一关开始,只在输的时候(出现倒计时)重置,能走多远算多远。奖励策略用的林哥的,训练方法用的IBM小哥的,先用optuna跑100来个参数组合,每个组合训练10万步左右,选出表现最好的参数(这时候AI已经可以打到第四关了),然后用这个参数训练几百万步(打到本田的模型训练了475万步)。 对不同的关卡选用不同的模型当然更容易通关,甚至可能是唯一可行的通过方法。如果想看一个“通用”的AI能有多厉害,还是只用一个模型合适。

你可以提供一下你的训练模型吗?我想试试,我训练了好久,我的AI Ryu角色还是很蠢。

把这两个压缩文件的zip后缀去掉,用7zip解压缩,可以得到一个测试文件和一个模型。这个模型大概是能打到本田的模型,时间太久了我有点记不清了。测试文件打开后直接点击“全部运行”按钮即可。 streetfighter2.7z.001.zip streetfighter2.7z.002.zip 截屏2023-05-28 下午3 52 30 运行过程中会输出bk2录像文件,通过命令 python -m retro.scripts.playback_movie xxx.bk2 可以把bk2渲染成mp4视频。 我的运行环境是python 3.8.16。

经过测试你的模型,确实在难度普通的情况下。同一个模型能打到至少6关。可以学习一下你的训练手法吗?

先用optuna从头跑80个10万步的模型,选出来几个表现好的,把hyperparameters记下来。 用表现好的hyperparameters训练几百万步,数据能提升就持续练,数据走平或者大幅下降了就中止,换其他hyperparameters。 实在无法继续提升之后,把表现最好的模型放到optuna,关卡改成最后一关,再跑几十个几万步的模型,也许能稍微优点突破。

越到后面提升越难,从第六关到第七关我尝试了很多办法花了好几天,然后就不想再折腾了。

train.py可以参考下么

Datou commented 1 year ago

我的意思是那些抓的画面没用在custom_reward里(加减分只靠血量胜负来判定),导致AI的训练完全是没目的并不会根据敌我双方的位置动作来判断最优步骤,完全靠瞎按(等敌人正好自己撞死),没我想象的高级。

我正在构思一些想法来帮一下AI. 我计划把移动,跳跃,发波,升龙等绝招作为action space, 这样AI就可以说我要发波,就可以发波了。reward函数也可优化一下,例如远距离时发波,可以得到一定奖励,这样就可以训练AI在敌人距离远的时候就发波,而不是乱出根本到打不到对方的拳或脚。

不需要进行这类设置,AI也能学会大招,可以看看我录的这段 https://twitter.com/Datou/status/1652845188988166144?s=20

你是用同一个model打到第七关吗?能具体说一下是如何训练的吗?我发觉训练了下一关,AI就会把之前的关的训练忘了。所以只要我们针对每一关训练一个模型,在测试时自动选用对应的模型,应该很容易就可以通关了。不知这算不算作弊。

同一个模型,最多可以打到第七关本田,再练模型就崩,还没找到继续突破的办法。训练方法是从第一关开始,只在输的时候(出现倒计时)重置,能走多远算多远。奖励策略用的林哥的,训练方法用的IBM小哥的,先用optuna跑100来个参数组合,每个组合训练10万步左右,选出表现最好的参数(这时候AI已经可以打到第四关了),然后用这个参数训练几百万步(打到本田的模型训练了475万步)。 对不同的关卡选用不同的模型当然更容易通关,甚至可能是唯一可行的通过方法。如果想看一个“通用”的AI能有多厉害,还是只用一个模型合适。

你可以提供一下你的训练模型吗?我想试试,我训练了好久,我的AI Ryu角色还是很蠢。

把这两个压缩文件的zip后缀去掉,用7zip解压缩,可以得到一个测试文件和一个模型。这个模型大概是能打到本田的模型,时间太久了我有点记不清了。测试文件打开后直接点击“全部运行”按钮即可。 streetfighter2.7z.001.zip streetfighter2.7z.002.zip 截屏2023-05-28 下午3 52 30 运行过程中会输出bk2录像文件,通过命令 python -m retro.scripts.playback_movie xxx.bk2 可以把bk2渲染成mp4视频。 我的运行环境是python 3.8.16。

经过测试你的模型,确实在难度普通的情况下。同一个模型能打到至少6关。可以学习一下你的训练手法吗?

先用optuna从头跑80个10万步的模型,选出来几个表现好的,把hyperparameters记下来。 用表现好的hyperparameters训练几百万步,数据能提升就持续练,数据走平或者大幅下降了就中止,换其他hyperparameters。 实在无法继续提升之后,把表现最好的模型放到optuna,关卡改成最后一关,再跑几十个几万步的模型,也许能稍微优点突破。 越到后面提升越难,从第六关到第七关我尝试了很多办法花了好几天,然后就不想再折腾了。

train.py可以参考下么 train.zip 不确定能不能跑,一个文件是寻找hyperparameters的,一个文件是用找到的hyperparameters进行训练的。

qinzhen0514 commented 1 year ago

@Datou 你好大佬!请问关卡信息是怎么得到的呢?我看原生info只有enemy_matches_won/matches_won。 我一开始以为你是统计出现matches_won = 2的数量 但是你这边的“奖励关”的信息是怎么得到的呢? 烦请赐教 多谢啦!

Datou commented 1 year ago

@Datou 你好大佬!请问关卡信息是怎么得到的呢?我看原生info只有enemy_matches_won/matches_won。 我一开始以为你是统计出现matches_won = 2的数量 但是你这边的“奖励关”的信息是怎么得到的呢? 烦请赐教 多谢啦!

每三关一个奖励关,4、8、12是奖励关。

qinzhen0514 commented 1 year ago

@Datou 你好大佬!请问关卡信息是怎么得到的呢?我看原生info只有enemy_matches_won/matches_won。 我一开始以为你是统计出现matches_won = 2的数量 但是你这边的“奖励关”的信息是怎么得到的呢? 烦请赐教 多谢啦!

每三关一个奖励关,4、8、12是奖励关。

多谢多谢!奖励关意思是不管输赢都可以进入下一关吗? 我还以为第12关是最终关😂

piggggyy commented 2 months ago

刚看到视频时感觉我CAO这么牛B,之后看了代码竟然这么小! 打开一看。

  • 代码量小是因为调用了最聪明的人写的封装好的大量代码。例如,这个AI用了openAI的PPO强化学习算法。

这AI原来是乱按的啊,根本没有抓画面,所谓的训练只是靠读取双方血条和胜负的内存地址来判断的。

  • AI是有抓画面(observation),作为AI模型的输入。 你仔细看代码就知道了。作者把当前帧的前第9,第6,第3帧加起来丢给AI,从而让AI知道一些运动轨迹。

也就是说AI完全靠乱按试出了一个套路可以在这特定存档中打死拜森/贝加,毫无通用性。

  • 是的,简单来说,强化学习就是从随机动作出发,做了好动作,得到奖励就记住,下次就会在相同的状态做这个动作。当前的这个AI的确是毫无通用性。我一直在思考如何改进,能尽量打赢更多对手。

不过CHATGPT能写出这段代码感觉已经非常强了。。 另外 有人能告诉我data/data.json里那些内存地址哪来的? PS 另外这个感觉用在训练马里奥这种没什么随机性的游戏更适合。。

大佬请教一下,这段代码为啥要以步长为2截取图片呢? def step(self, action): custom_done = False

    obs, _reward, _done, info = self.env.step(action)
    self.frame_stack.append(obs[::2, ::2, :])