Q 在 Python 中学习:它是什么,定义 [编码示例]

已发表: 2020-03-26

强化学习是指学习代理通过不断的交互来学习根据其环境优化行为。 代理会经历各种情况,这些情况也称为状态。 正如您已经猜到的那样,强化学习在我们的世界中有很多应用。 如果您有兴趣了解有关数据科学算法的更多信息,请了解更多信息。

此外,它有许多算法,其中最流行的是Q learning 在本文中,我们将讨论这个算法是什么以及它是如何工作的。

所以,事不宜迟,让我们开始吧。

目录

什么是 Q 学习?

Q 学习是一种强化学习算法,它专注于为特定情况寻找最佳行动方案。 这是不符合策略的,因为 Q 学习函数从中学习的动作超出了现有策略,所以它不需要一个。 它专注于学习增加其总奖励的策略。 这是一种简单的强化学习形式,它使用动作值(或 Q 值)来增强学习代理的行为。

Q 学习是强化学习中最流行的算法之一,因为它易于理解和实现。 Q学习中的“Q”代表质量。 正如我们前面提到的,Q 学习侧重于为特定情况找到最佳行动。 质量显示了特定操作的有用性以及它可以帮助您获得什么奖励。

重要定义

在我们开始讨论它是如何工作的之前,我们应该首先看一下 q learning 的一些基本概念。 让我们开始吧。

Q值

Q 值也称为动作值。 它们由 Q(S, A) 表示,它们为您提供 A 在状态 S 下采取的行动有多好的估计。模型将使用我们稍后讨论的时间差异更新规则迭代地计算此估计在这个部分。

剧集和奖励

代理从一个开始状态开始,经过几次转换,然后根据其动作和环境从当前状态移动到下一个状态。 每当代理采取行动时,它都会获得一些奖励。 当没有可能的过渡时,这就是这一集的完成。

TD-Update(时间差)

这是 TD 更新或时间差异规则:

Q(S,A) Q(S,A) + (R + Q(S',A')-Q(S,A))

这里,S 代表智能体的当前状态,而 S' 代表下一个状态。 A表示当前动作,A'表示根据Q值估计的下一个最佳动作,R表示根据当前动作的当前奖励,代表折扣因子,并表示步长。

另请阅读:数据科学的先决条件。 它如何随时间变化?

Q学习Python示例

了解 Q 学习 Python 的最好方法是看一个例子。 在这个例子中,我们使用 OpenAI 的健身房环境并用它训练我们的模型。 首先,您必须安装环境。 您可以使用以下命令执行此操作:

点安装健身房

现在,我们将导入此示例所需的库:

进口健身房

导入迭代工具

导入 matplotlib

导入 matplotlib.style

将 numpy 导入为 np

将熊猫导入为 pd

导入系统

从集合导入 defaultdict

从 windy_gridworld 导入 WindyGridworldEnv

导入绘图

matplotlib.style.use('ggplot')

如果没有必要的库,您将无法成功执行这些操作。 导入库后,我们将创建环境:

env = WindyGridworldEnv()

现在我们将创建-greedy 策略:

def createEpsilonGreedyPolicy(Q, epsilon, num_actions):

“”

创建基于 epsilon-greedy 策略

在给定的 Q 函数和 epsilon 上。

返回一个接受状态的函数

作为输入并返回概率

对于 numpy 数组形式的每个动作

动作空间的长度(一组可能的响应)。

“”

定义策略函数(状态):

Action_probabilities = np.ones(num_actions,

dtype = float) * epsilon / num_actions

best_action = np.argmax(Q[状态])

Action_probabilities[best_action] += (1.0 – epsilon)

返回 Action_probabilities

退货政策功能

以下是构建 q-learning 模型的代码:

def qLearning(env, num_episodes, discount_factor = 1.0,

阿尔法 = 0.6,ε = 0.1):

“”

Q-Learning 算法:Off-policy TD 控制。

在改进的同时找到最优贪心策略

遵循 epsilon-greedy 策略”””

# 动作价值函数

# 映射的嵌套字典

# state -> (action -> action-value)。

Q = defaultdict(lambda: np.zeros(env.action_space.n))

# 跟踪有用的统计信息

stats = plotting.EpisodeStats(

episode_lengths = np.zeros(num_episodes),

episode_rewards = np.zeros(num_episodes))

# 创建一个 epsilon 贪心策略函数

# 适合环境动作空间

策略 = createEpsilonGreedyPolicy(Q, epsilon, env.action_space.n)

# 每集

对于范围内的 ith_episodes(num_episodes):

# 重置环境并选择第一个动作

状态 = env.reset()

对于 itertools.count() 中的 t:

# 从当前状态获取所有动作的概率

action_probabilities = 政策(状态)

# 选择动作根据

# 概率分布

行动= np.random.choice(np.arange(

len(action_probabilities)),

p = action_probabilities)

# 采取行动并获得奖励,转移到下一个状态

next_state, 奖励, 完成, _ = env.step(action)

# 更新统计

stats.episode_rewards[i_episode] += 奖励

stats.episode_lengths[i_episode] = t

# TD 更新

best_next_action = np.argmax(Q[next_state])

td_target = 奖励 + discount_factor * Q[next_state][best_next_action]

td_delta = td_target – Q[状态][动作]

Q[状态][动作] += alpha * td_delta

# 如果剧集终止,done 为 True

如果完成:

休息

状态 = 下一个状态

返回 Q,统计

现在让我们训练模型:

Q, stats = qLearning(env, 1000)

在我们创建并训练模型之后,我们可以绘制相同的基本统计数据:

plotting.plot_episode_stats(统计)

使用此代码运行模型并绘制图形。 你看到什么样的结果? 与我们分享您的结果,如果您遇到任何困惑或疑问,请告诉我们。

另请阅读:数据科学的机器学习算法

学习世界顶尖大学的数据科学课程获得行政 PG 课程、高级证书课程或硕士课程,以加快您的职业生涯。

最后的想法

当您绘制图表时,您会看到每集的奖励随着时间的推移逐渐增加。 在某些剧集之后,情节还反映了它拉平了每集的高奖励限制。 这说明什么?

这意味着您的模型已经学会通过确保其表现最佳来增加它在一个情节中可以获得的总奖励。 您一定也看到了为什么 q learning Python 会在如此多的行业和领域中看到应用程序。

强化学习的缺点是什么?

1. 过度强化学习可能会导致状态过多,从而降低结果的质量。
2. 不推荐强化学习来轻松解决问题。
3.强化学习需要大量的数据和计算。
4. 强化学习有自己独特且非常复杂的障碍,例如具有挑战性的训练设计设置以及探索和强化平衡的问题。

Q学习是基于模型的吗?

不,Q 学习不依赖于模型。 Q-learning 是一种无模型强化学习技术,用于确定给定状态下某个动作的价值。 Q 学习是当前几种无模型的强化学习算法之一,这意味着它可以在各种环境中使用,并且可以快速适应新的和未知的条件。 它可以处理涉及随机转换和奖励的问题,而不需要适应,也不需要环境模型。 Q-learning是一种基于价值观的学习算法。 基于值的算法使用方程来更新值函数(尤其是贝尔曼方程)。

Q learning 和 SARSA 有何不同?

SARSA 在探索时学习接近最优的策略,而 Q-learning 直接学习最优策略。 Off-policy SARSA 学习与其遵循的策略相关的动作值,而 on-policy SARSA 学习与其遵循的策略相关的动作值。 关于贪婪策略,Q-Learning 做到了。 它们都在一些相似的条件下收敛到实值函数,但速度不同。 Q-Learning 需要更长的时间才能收敛,但它可能会在规则改变的同时继续学习。 当与线性近似相结合时,Q-Learning 不能保证收敛。 SARSA 在接近收敛时会考虑探索性步骤的惩罚,而 Q-learning 不会。 如果沿着理想路径有机会获得显着的负回报,Q-learning 会在探索时尝试触发它,但是 SARSA 会尝试避免有风险的最优路径,并且只有在探索参数减少后才学会使用它。