【机器学习】必会算法模型之:Q-Learning

1、引言

在机器学习和人工智能的发展历程中,强化学习作为一种重要的学习范式,得到了广泛关注和应用。

不同于监督学习和无监督学习,强化学习通过智能体与环境的交互来学习如何采取行动,以最大化累积奖励。

Q-Learning 是强化学习中的一种基础算法,因其简单有效而备受瞩目。
接下来,跟着小鱼一起了解 Q-Learning
在这里插入图片描述

2、Q-Learning

2.1 定义

Q-Learning 是一种基于价值的强化学习算法,通过学习一个状态-动作价值函数(即 Q 函数)来指导智能体的行为决策。

Q 函数 ( Q ( s , a ) ) ( Q(s, a) ) (Q(s,a)) 表示在状态 ( s ) ( s ) (s) 下采取动作 ( a ) ( a ) (a)所能获得的预期累计奖励。

算法通过迭代优化 Q 函数,使得智能体可以在未知环境中逐步学到最优策略。

2.2 核心原理

Q-Learning 的核心思想是通过不断更新 Q Q Q 函数来逼近最优 Q Q Q 值。更新过程基于 Bellman 方程,其核心公式为:

[ Q ( s , a ) ← Q ( s , a ) + α [ r + γ max ⁡ a ′ Q ( s ′ , a ′ ) − Q ( s , a ) ] ] [ Q(s, a) \leftarrow Q(s, a) + \alpha \left[ r + \gamma \max_{a'} Q(s', a') - Q(s, a) \right] ] [Q(s,a)Q(s,a)+α[r+γmaxaQ(s,a)Q(s,a)]]

其中:

  • ( s ) ( s ) (s) ( a ) ( a ) (a) 分别是当前的状态和动作。
  • ( r ) ( r ) (r) 是采取动作 ( a ) ( a ) (a) 后的即时奖励。
  • ( s ′ ) ( s' ) (s) 是采取动作后的下一状态。
  • ( α ) ( \alpha ) (α) 是学习率,控制更新幅度。
  • ( γ ) ( \gamma ) (γ) 是折扣因子,衡量未来奖励的重要性。
  • ( max ⁡ a ′ Q ( s ′ , a ′ ) ) ( \max_{a'} Q(s', a') ) (maxaQ(s,a)) 表示在下一状态 ( s ′ ) ( s' ) (s) 下的最大 Q 值。

2.3 实现方式

Q-Learning 通过表格式方法实现价值函数的更新,对于每个状态-动作对,记录和更新对应的 Q Q Q 值。关键步骤包括:

  • 初始化 Q Q Q:将 Q Q Q 表初始化为零或小随机值,以便开始探索。
  • 状态选择和动作:在特定策略(如 ε − g r e e d y ε-greedy εgreedy 策略)下,从当前状态选择动作。
  • 环境交互:在环境中执行动作,观察即时奖励和下一状态。
  • 更新 Q Q Q:根据公式更新 Q Q Q 值。
  • 重复过程:直到达到终止条件(如完成某个回合数)。
    在这里插入图片描述

2.4 算法流程

Q-Learning 的算法流程如下:

  • 1、初始化 Q Q Q 表(所有 Q Q Q 值设为零或小随机值)。
  • 2、重复以下步骤,直到达到终止条件:
    • 2.1 从当前状态 $( s ) $选择动作 ( a ) ( a ) (a)(使用 ε − g r e e d y ε-greedy εgreedy 策略)。
    • 2.2 在环境中执行动作 ( a ) ( a ) (a),得到奖励 ( r ) ( r ) (r) 和下一状态 ( s ′ ) ( s' ) (s)
    • 2.3 使用 Bellman 方程更新 Q Q Q值:
      [ Q ( s , a ) ← Q ( s , a ) + α [ r + γ max ⁡ a ′ Q ( s ′ , a ′ ) − Q ( s , a ) ] ] [ Q(s, a) \leftarrow Q(s, a) + \alpha \left[ r + \gamma \max_{a'} Q(s', a') - Q(s, a) \right] ] [Q(s,a)Q(s,a)+α[r+γmaxaQ(s,a)Q(s,a)]]
      更新状态为下一状态 ( s ′ ) ( s' ) (s)
  • 3、输出最终的 Q Q Q 表和策略(在每个状态选择使 Q Q Q 值最大的动作)。

2.5 代码示例

# -*- coding:utf-8 -*-
# @Time   : 2024-07-20
# @Author : Carl_DJ

import numpy as np
import gym

# 创建 CliffWalking 环境
env = gym.make('CliffWalking-v0')

# 参数设置
num_episodes = 500
learning_rate = 0.1
discount_factor = 0.99
epsilon = 0.1

# 初始化 Q 表
Q = np.zeros((env.observation_space.n, env.action_space.n))

# 训练过程
for episode in range(num_episodes):
    state = env.reset()
    done = False

    while not done:
        # ε-greedy 策略选择动作
        if np.random.rand() < epsilon:
            action = env.action_space.sample()
        else:
            action = np.argmax(Q[state, :])
        
        # 执行动作,获取奖励和下一状态
        next_state, reward, done, _ = env.step(action)
        
        # 更新 Q 值
        best_next_action = np.argmax(Q[next_state, :])
        td_target = reward + discount_factor * Q[next_state, best_next_action]
        td_error = td_target - Q[state, action]
        Q[state, action] += learning_rate * td_error
        
        # 更新当前状态
        state = next_state

# 测试训练结果
state = env.reset()
done = False
total_reward = 0

while not done:
    action = np.argmax(Q[state, :])
    state, reward, done, _ = env.step(action)
    total_reward += reward
    env.render()

print("总奖励:", total_reward)

解析

  • 创建环境:使用 gym.make 创建经典的 Cliff Walking 问题环境。
  • 参数设置:初始化算法参数,包括回合数、学习率、折扣因子、 ε − g r e e d y ε-greedy εgreedy 策略中的 ε ε ε 值等。
  • 初始化 Q Q Q:将 Q Q Q 表初始化为零矩阵。
  • 训练过程:在每个回合中,按照 ε-greedy 策略选择动作,执行动作并更新 Q Q Q 表。通过重复过程不断优化 Q Q Q 值。
  • 测试训练结果:利用训练得到的 Q Q Q表选择动作,并展示移动路径和总奖励。

在这里插入图片描述

3、总结

Q-Learning 作为一种经典且有效的强化学习算法,能够通过学习状态-动作对的价值函数,指导智能体在未知环境中采取最优决策。

通过合理设置和优化 Q 表,Q-Learning 能够在各种应用场景中发挥显著作用。。

通过对 Q-Learning 的深入学习和实践,我们不仅可以提高在强化学习领域的技能,还能为解决实际问题提供强有力的工具。

未来,随着强化学习技术的不断发展,Q-Learning 和其他强化学习算法将在更多复杂场景中展现出其强大的适应性和应用潜力。

我是小鱼

  • CSDN 博客专家
  • 阿里云 专家博主
  • 51CTO博客专家
  • 企业认证金牌面试官
  • 多个名企认证&特邀讲师等
  • 名企签约职场面试培训、职场规划师
  • 多个国内主流技术社区的认证专家博主
  • 多款主流产品(阿里云等)评测一等奖获得者

关注小鱼,学习【机器学习】&【深度学习】领域的知识。

相关推荐

  1. 强化学习 - Q-learningQ学习

    2024-07-22 23:08:02       58 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 23:08:02       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 23:08:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 23:08:02       45 阅读
  4. Python语言-面向对象

    2024-07-22 23:08:02       55 阅读

热门阅读

  1. Webpack 5 Tree Shaking与Module Federation

    2024-07-22 23:08:02       15 阅读
  2. MUX-VLAN基本概述

    2024-07-22 23:08:02       17 阅读
  3. 探索特征降维的奥秘:sklearn中的分层方法

    2024-07-22 23:08:02       12 阅读
  4. 学习数据处理的三要点

    2024-07-22 23:08:02       15 阅读
  5. Mojo模型与A/B测试:数据驱动决策的科学

    2024-07-22 23:08:02       17 阅读
  6. 降维与选择:用Scikit-Learn精炼数据特征的艺术

    2024-07-22 23:08:02       15 阅读
  7. 集成学习的艺术:使用Scikit-Learn实现模型融合

    2024-07-22 23:08:02       12 阅读
  8. 2024年自动驾驶规划控制面试及答案

    2024-07-22 23:08:02       17 阅读
  9. Vue2 父子组件进行数据传递

    2024-07-22 23:08:02       14 阅读
  10. zzuli1027:判断水仙花数

    2024-07-22 23:08:02       14 阅读
  11. TypeScript极速梳理

    2024-07-22 23:08:02       14 阅读
  12. 通过NPOI读取Excel内容导入到数据库

    2024-07-22 23:08:02       16 阅读
  13. Go 环境安装配置

    2024-07-22 23:08:02       16 阅读