Python手写强化学习Q-learning算法玩井字棋

简介: Python手写强化学习Q-learning算法玩井字棋

Q-learning 是强化学习中的一种常见的算法,近年来由于深度学习革命而取得了很大的成功。本教程不会解释什么是深度 Q-learning,但我们将通过 Q-learning 算法来使得代理学习如何玩 tic-tac-toe 游戏。尽管它很简单,但我们将看到它能产生非常好的效果。

要理解本教程,不必有任何关于强化学习的知识,但最好有一定的微积分和线性代数基础。首先,我们将通过一些必要的背景知识来快速了解强化学习,然后我们将介绍 Q-learning 算法,最后我们将介绍如何通过它来使得一个代理学会玩 tic-tac-toe。

强化学习简介

强化学习是指代理在不同状态的环境中,根据某种奖励函数来优化其行为的一门学科。在本教程中,环境是 tic-tac-toe 游戏,它有明确定义的动作,代理必须决定选择哪些动作才能赢得游戏。此外,代理人赢得游戏将获得一定奖励,这鼓励它在游戏中学习更好的策略。

强化学习的一个常见框架是(有限)马尔可夫决策过程(MDP, Markov Decision Process)。它帮助我们定义一组动作和状态,代理基于这些动作和状态进行决策。

MDP 通常包括有:

  • 一组有限的动作 A(在游戏面板上所有可以放置标记的位置)
  • 一组有限的状态 S(游戏面板上的所有可能情形)
  • 一种奖励函数 R(s,a)
  • 转移函数 T(s,a,s')

转换函数给出了在执行动作 a 时从状态 s 移动到 s' 的概率。当我们不确定动作是否总是产生期望结果时,转移函数十分必要。但是需要注意的是,对于 tic-tac-toe 游戏,我们确切地知道每个动作会做什么,所以我们不会使用转移函数。

image.png

在本例中,当前玩家可以执行六个可能的操作

MDP框架帮助我们将问题形式化,这样我们就可以根据当前状态确定哪些操作将在游戏期间使代理的总回报最大化。本教程中奖励函数 R(s,a) 将非常简单:

  • 如果代理在状态 s 执行一个操作 ,最终赢得游戏,那么 R(s,)=1.
  • 如果代理在状态 s 执行一个操作 ,最终输了游戏,那么 R(s,)=-1.
  • 否则,R(s,)=0.

在强化学习中,我们通常找到一个最优策略,代理通过该策略决定选择哪些动作。本教程中我们使用 Q-learning,简单地将策略表示为当代理处于s状态时执行动作 a 使函数 Q(s,a) 最大化:

image.png

Q-learning 中的状态更新

Q(s,a) 即代理在 s 状态下选择动作 a,则在游戏最后给出对应的奖励或惩罚。由于代理希望将其报酬最大化,因此它会选择使 Q 最大化的动作。

image.png

在场景中,首先计算当前玩家X所有动作的Q值,然后选择Q值最大的动作

要计算 Q(s,a),代理必须探索所有可能的状态和动作,同时从奖励函数 R(s,a) 获得反馈。在 tic-tac-toe 游戏中,我们通过让代理与对手进行多场比赛来迭代更新 Q(s,a),用于更新 Q 的方程如下:

image.png

  • 在当前状态 s 下执行动作 a
  • 考虑执行动作后的所有状态,计算其中的最大 Q 值。是执行动作 a 之后的新状态, 是下一个状态中的最佳动作
  • 学习率 α 决定我们覆盖旧值的程度,本例中将使用 α=0.1
  • 折现因子 γ 决定了在当前时间步 t 中,未来的奖励应加权多少。通常选择 γ=0.9

Q-learning 算法实现

为了得到一个经过充分训练的代理,我们需要获得 Q(s,a) 的值,这将通过让两个代理互相比赛来完成。首先,引入一个概率 ε,即每个代理选择一个随机动作,否则,它将根据 Q(s,a) 选择最佳动作。这样,我们就保证了学习的平衡,使代理有时探索新的行为,而其他时候则利用代理已经学习到的信息来执行动作。

训练阶段可以通过以下伪代码进行描述:

Initialise: Q(s,a) = 0, starting state s,
             starting player P, iterations N
for t = 0 : N
    With probability ε : P picks random action a
    Else, pick action a that maximise Q(s,a)
    Observe new state ŝ and reward R(s,a)
    If current player is our agent,
    update Q(s,a) = (1-α)Q(s,a) + α[R(s,a) + γ*max(Q(ŝ,â))]
    s = ŝ
    Switch turn, P = the other player

值得注意的是,迭代次数 N 必须相对较大,本例中进行了大约 500000 次迭代。此外,Q(s,a) 可以通过 Python dict 的数据格式进行存储;如果我们将 (s,a) 表示为整数,则可以通过二维数组的数据格式进行存储。最后,可以随时间改变概率 ε,以强调在早期迭代中更多的随机探索,从而加快学习速度。

在用上述算法训练代理之后,可以保存 Q(s,a) 并在想要进行比赛时加载它。然后,代理只需遵循最优策略,选择使 Q(s,a) 最大化的动作来赢得比赛。虽然由于 tic-tac-toe 游戏并不复杂,代理并没有获得高级智能,但是尝试这个方法可以学习如何实现 Q-learning 并了解它是如何工作的。

结语

本文首先介绍了马尔可夫决策过程以及如何在强化学习中应用它。然后使用状态、行动、奖励函数来对 tic-tac-toe 游戏进行建模。除此之外,我们还定义了函数 Q(s,a),该函数通过在状态 s 中选择动作 a 来量化预期的奖励,并通过重复玩游戏来计算 Q(s,a)。

目录
相关文章
|
3天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
93 55
|
19天前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
123 67
|
19天前
|
存储 搜索推荐 Python
用 Python 实现快速排序算法。
快速排序的平均时间复杂度为$O(nlogn)$,空间复杂度为$O(logn)$。它在大多数情况下表现良好,但在某些特殊情况下可能会退化为最坏情况,时间复杂度为$O(n^2)$。你可以根据实际需求对代码进行调整和修改,或者尝试使用其他优化策略来提高快速排序的性能
114 61
|
13天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
87 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
1天前
|
机器学习/深度学习 算法
强化学习之父Richard Sutton给出一个简单思路,大幅增强所有RL算法
Richard Sutton领导的团队提出了一种称为“奖励中心化”的方法,通过从观察到的奖励中减去其经验平均值,使奖励更加集中,显著提高了强化学习算法的性能。该方法在解决持续性问题时表现出色,尤其是在折扣因子接近1的情况下。论文地址:https://arxiv.org/pdf/2405.09999
24 15
|
19天前
|
存储 算法 搜索推荐
Python 中数据结构和算法的关系
数据结构是算法的载体,算法是对数据结构的操作和运用。它们共同构成了计算机程序的核心,对于提高程序的质量和性能具有至关重要的作用
|
19天前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
19天前
|
机器学习/深度学习 人工智能 算法
探索人工智能中的强化学习:原理、算法及应用
探索人工智能中的强化学习:原理、算法及应用
|
13天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
12天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。