国际象棋评价函数的训练
Training of chess evaluation function
我准备写一个基于强化学习的国际象棋引擎。
我想训练一个评估函数并计算出棋盘最重要特征的权重是多少。
我不是机器学习专家,我正在尝试从书籍和教程中学习。在每个教程中,奖励都非常简单,通常是 1、0,也许是 -1,但在国际象棋中没有如此明显的奖励(无论将死位置如何)。
例如,假设我在董事会上有一个情况。我进行了 10 次(随机)移动,此时我应该计算奖励,即起始位置与当前位置之间的差异(或误差)。当我唯一的评估功能正在训练时,如何做这样的事情?
我想避免使用其他引擎的评分系统,因为我觉得那更像是监督学习,这不是我的目标。
你真的不能直接这样做。
我可以建议的一些方法:
- 使用外部来源的评分至少可以启动您的算法。但是,评估给定位置的算法非常有限,您的 AI 无法单独使用它达到大师级水平。
- 探索使用另一个国际象棋下棋 AI(最好是开源的)评估位置的可能性。假设你有一个 "teacher" AI。您启动它的 2 个实例,然后从您要评估的位置开始游戏。让他们从那里开始互相对战,直到比赛结束。这个举动成功了吗?根据结果奖励您自己的 AI。
- 要添加一些可变性(您不想比单个 AI 更好),请对其他 AI 执行相同的操作。甚至,您自己的 AI 与自己对战。不过,要使后者发挥作用,可能需要下棋已经很不错,而不是完全随机下棋。您可以多次重玩相同的动作并完成游戏,让您的 AI 随机探索新的动作和策略(例如:尝试沿路走第二好的动作)。
- 使用真实玩家之间的游戏数据集为您的 ML 提供数据。因此,输赢玩家的每一步都可以"reinforced"
- 让您的 AI 通过与真实玩家对战来学习。加强你的 AI 动作(输的和赢的)和玩家的动作。
我不确定有什么真正好的方法可以做到这一点,但是由于我正在编写自己的带有调整功能的国际象棋引擎,所以我可以告诉您我是如何做到的。
我正在使用遗传算法来调整评估参数,但如果您没有评估模型适合度的方法,则调整方法将毫无用处。
我这样做的方法是玩大约 5-10 场游戏,随机开局。这样做是为了使模型不会过度拟合,因为它分析的是相同类型的位置。然后我收集游戏的结果和引擎搜索到的所有位置的评估。游戏结果表示为 -1 代表黑人获胜,0 代表平局,+1 代表白人获胜,因此需要一些函数来将评估缩小到 -1 到 +1 范围内。这里我使用了 tanh(0.5*Eval(pos)).
然后,对于每个位置,我计算了评估和游戏结果之间的平方差,并将所有这些相加得到评估的成本。
我准备写一个基于强化学习的国际象棋引擎。 我想训练一个评估函数并计算出棋盘最重要特征的权重是多少。
我不是机器学习专家,我正在尝试从书籍和教程中学习。在每个教程中,奖励都非常简单,通常是 1、0,也许是 -1,但在国际象棋中没有如此明显的奖励(无论将死位置如何)。 例如,假设我在董事会上有一个情况。我进行了 10 次(随机)移动,此时我应该计算奖励,即起始位置与当前位置之间的差异(或误差)。当我唯一的评估功能正在训练时,如何做这样的事情?
我想避免使用其他引擎的评分系统,因为我觉得那更像是监督学习,这不是我的目标。
你真的不能直接这样做。
我可以建议的一些方法:
- 使用外部来源的评分至少可以启动您的算法。但是,评估给定位置的算法非常有限,您的 AI 无法单独使用它达到大师级水平。
- 探索使用另一个国际象棋下棋 AI(最好是开源的)评估位置的可能性。假设你有一个 "teacher" AI。您启动它的 2 个实例,然后从您要评估的位置开始游戏。让他们从那里开始互相对战,直到比赛结束。这个举动成功了吗?根据结果奖励您自己的 AI。
- 要添加一些可变性(您不想比单个 AI 更好),请对其他 AI 执行相同的操作。甚至,您自己的 AI 与自己对战。不过,要使后者发挥作用,可能需要下棋已经很不错,而不是完全随机下棋。您可以多次重玩相同的动作并完成游戏,让您的 AI 随机探索新的动作和策略(例如:尝试沿路走第二好的动作)。
- 使用真实玩家之间的游戏数据集为您的 ML 提供数据。因此,输赢玩家的每一步都可以"reinforced"
- 让您的 AI 通过与真实玩家对战来学习。加强你的 AI 动作(输的和赢的)和玩家的动作。
我不确定有什么真正好的方法可以做到这一点,但是由于我正在编写自己的带有调整功能的国际象棋引擎,所以我可以告诉您我是如何做到的。 我正在使用遗传算法来调整评估参数,但如果您没有评估模型适合度的方法,则调整方法将毫无用处。
我这样做的方法是玩大约 5-10 场游戏,随机开局。这样做是为了使模型不会过度拟合,因为它分析的是相同类型的位置。然后我收集游戏的结果和引擎搜索到的所有位置的评估。游戏结果表示为 -1 代表黑人获胜,0 代表平局,+1 代表白人获胜,因此需要一些函数来将评估缩小到 -1 到 +1 范围内。这里我使用了 tanh(0.5*Eval(pos)).
然后,对于每个位置,我计算了评估和游戏结果之间的平方差,并将所有这些相加得到评估的成本。