【人工智能机器学习基础篇】——深入详解强化学习之常用算法Q-Learning与策略梯度,掌握智能体与环境的交互机制

深入详解强化学习之常用算法:Q-Learning与策略梯度

        强化学习(Reinforcement Learning, RL)作为机器学习的一个重要分支,近年来在多个领域取得了显著成果。从棋类游戏的人机对战到自主驾驶汽车,强化学习技术展示了其强大的潜力。本文将深入探讨强化学习中的常用算法,重点介绍Q-Learning和策略梯度方法,详细阐述其关键概念、核心原理、示例及主要应用,帮助读者全面掌握智能体与环境的交互机制。

目录

深入详解强化学习之常用算法:Q-Learning与策略梯度

1. 引言

2. 强化学习概述

关键概念

智能体与环境的交互机制

3. Q-Learning

核心原理

算法步骤

示例:网格世界(Grid World)

主要应用

4. 策略梯度方法

核心原理

常见策略梯度算法

REINFORCE

Actor-Critic

示例:CartPole平衡

主要应用

5. 比较与选择

6. 深度强化学习

深度Q网络(DQN)

深度确定性策略梯度(DDPG)

7. 总结与展望

8. 参考资料


1. 引言

        强化学习是一种通过与环境交互来学习最优策略的机器学习方法。与监督学习和无监督学习不同,强化学习关注的是智能体(Agent)在环境中采取行动以最大化累积奖励的过程。理解强化学习中的常用算法,如Q-Learning和策略梯度方法,对于解决复杂的决策和控制问题至关重要。

2. 强化学习概述

关键概念

在深入算法之前,理解强化学习的基本概念至关重要:

  • 智能体(Agent):执行动作以与环境互动的实体。
  • 环境(Environment):智能体互动的外部系统,对智能体的动作做出反应。
  • 状态(State, S):环境在某一时刻的具体情况。
  • 动作(Action, A):智能体在特定状态下可以采取的行为。
  • 奖励(Reward, R):智能体执行动作后,环境给予的反馈信号,用于指导学习。
  • 策略(Policy, π):智能体选择动作的策略,可以是确定性的(π(s) = a)或随机的(π(a|s))。
  • 价值函数(Value Function, V):评估在状态s下,智能体未来能获得的累积奖励。
  • 状态-动作价值函数(Q-Function, Q):评估在状态s下采取动作a,智能体未来能获得的累积奖励。

智能体与环境的交互机制

强化学习的核心是通过试错与环境进行互动,智能体在每一步选择一个动作,环境返回一个奖励和下一个状态。智能体的目标是学习一个策略,使得在长期内累积的奖励最大化。这一过程可以形式化为马尔可夫决策过程(Markov Decision Process, MDP)。

3. Q-Learning

核心原理

Q-Learning是一种基于价值的强化学习算法,通过学习状态-动作价值函数Q(s, a),实现最优策略的逼近。Q-Learning的核心思想是通过迭代更新Q值,使其逐步逼近真实的Q值。

Q-Learning的更新公式为:

\[
Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha \left[ r_{t+1} + \gamma \max_{a} Q(s_{t+1}, a) - Q(s_t, a_t) \right]
\]

其中:

  • \( s_t \)是当前状态
  • \( a_t \) 是当前动作
  • \( r_{t+1} \) 是执行动作后的奖励
  • \( \gamma \) 是折扣因子(通常介于0和1之间)
  • \( \alpha \) 是学习率

算法步骤

Q-Learning的基本步骤如下:

  1. 初始化Q表(Q(s, a))为任意值(通常为0)。
  2. 对于每一个回合:
    • 初始化环境,获取初始状态s。
    • 对于每一个时间步:
      • 根据当前策略(如ε-贪心策略)选择动作a。
      • 执行动作a,观察奖励r和下一个状态s'。
      • 更新Q值:

           \[
               Q(s, a) \leftarrow Q(s, a) + \alpha \left[ r + \gamma \max_{a'} Q(s', a') - Q(s, a) \right]
               \]

      • 将状态s更新为s'。
      • 若达到终止状态,则结束当前回合。

示例:网格世界(Grid World)

下面通过一个简单的网格世界展示Q-Learning的应用。假设智能体在一个4x4的网格中移动,目标是从起点到达终点。

import numpy as np
import random

# 定义网格世界
class GridWorld:
    def __init__(self):
        self.size = 4
        self.start = (0, 0)
        self.end = (3, 3)
        self.state = self.start
        self.actions = ['up', 'down', 'left', 'right']
    
    def reset(self):
        self.state = self.start
        return self.state
    
    def step(self, action):
        x, y = self.state
        if action == 'up':
            x = max(x - 1, 0)
        elif action == 'down':
            x = min(x + 1, self.size - 1)
        elif action == 'left':
            y = max(y - 1, 0)
        elif action == 'right':
            y = min(y + 1, self.size - 1)
        
        self.state = (x, y)
        if self.state == self.end:
            return self.state, 1, True  # 奖励1,终止
        else:
            return self.state, 0, False  # 奖励0,继续

# Q-Learning算法
def q_learning(env, episodes=500, alpha=0.1, gamma=0.9, epsilon=0.1):
    Q = {}
    for x in range(env.size):
        for y in range(env.size):
            Q[(x, y)] = {a: 0 for a in env.actions}
    
    for episode in range(episodes):
        state = env.reset()
        done = False
        while not done:
            # ε-贪心策略
            if random.uniform(0, 1) < epsilon:
                action = random.choice(env.actions)
            else:
                action = max(Q[state], key=Q[state].get)
            
            next_state, reward, done = env.step(action)
            # Q值更新
            Q[state][action] += alpha * (reward + gamma * max(Q[next_state].values()) - Q[state][action])
            state = next_state
    return Q

# 训练代理
env = GridWorld()
Q = q_learning(env)

# 展示学习后的策略
def print_policy(Q, env):
    policy_actions = {'up': '↑', 'down': '↓', 'left': '←', 'right': '→'}
    for x in range(env.size):
        row = ''
        for y in range(env.size):
            if (x, y) == env.end:
                row += ' G '
            else:
                action = max(Q[(x, y)], key=Q[(x, y)].get)
                row += ' ' + policy_actions[action] + ' '
        print(row)

print_policy(Q, env)

代码说明

  1. GridWorld类:定义一个4x4的网格环境,智能体从(0,0)出发,目标是到达(3,3)。每次动作后,如果到达终点,获取奖励1并终止回合;否则,奖励为0。

  2. q_learning函数:实现Q-Learning算法,初始化Q表,采用ε-贪心策略选择动作,并根据奖励和最大Q值更新Q表。

  3. print_policy函数:展示学习后的策略,用箭头表示智能体在不同状态下的最佳动作。

结果展示

 →  ↓  →  ↓ 
 ↑  →  →  ↓ 
 ↑  ↑  →  ↓ 
 ←  ←  ←  G 

上述策略表明,智能体在各个状态下最优的动作方向,通过学习能够有效地从起点到达终点。

上述策略表明,智能体在各个状态下最优的动作方向,通过学习能够有效地从起点到达终点。

主要应用

Q-Learning广泛应用于各种决策和控制问题,主要包括:

  • 游戏AI:如Atari游戏、棋类游戏等智能体的策略学习。
  • 机器人导航:机器人在未知环境中的路径规划与避障。
  • 推荐系统:根据用户行为动态调整推荐策略。
  • 自动驾驶:车辆在复杂交通环境中的决策与控制。

4. 策略梯度方法

核心原理

策略梯度方法是基于策略优化的强化学习算法,直接优化策略函数π(a|s; θ),使得预期累积奖励最大化。与基于价值的方法(如Q-Learning)不同,策略梯度不依赖于价值函数,而是直接通过梯度上升来优化策略参数。

目标函数:

\[
J(\theta) = \mathbb{E}_{\pi_\theta} \left[ \sum_{t=0}^{T} \gamma^t r_t \right]
\]

策略梯度的更新规则基于梯度上升:

\[
\theta \leftarrow \theta + \alpha \nabla_\theta J(\theta)
\]

其中,梯度可以通过“策略梯度定理”得到:

\[
\nabla_\theta J(\theta) = \mathbb{E}_{\pi_\theta} \left[ \sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t|s_t) G_t \right]
\]

其中,\( G_t \) 是从时间步t开始的累积奖励。

常见策略梯度算法

REINFORCE

REINFORCE是最基础的策略梯度算法,又称为蒙特卡罗策略梯度。其特点是使用完整的回合数据进行更新。

算法步骤

1. 初始化策略参数θ。
2. 对于每一个回合:
   生成一个完整的回合,记录状态、动作和奖励。
   计算每个时间步的累积奖励 \( G_t \)。
   更新策略参数:
     \[
     \theta \leftarrow \theta + \alpha \sum_{t} \nabla_\theta \log \pi_\theta(a_t|s_t) G_t
     \]
     

Actor-Critic

Actor-Critic结合了策略梯度和值函数的方法,利用一个“演员”(Actor)来更新策略,一个“评论家”(Critic)来评估当前策略的价值函数,从而提高学习效率。

算法步骤

1. 初始化策略参数θ(Actor)和价值函数参数ϕ(Critic)。
2. 对于每一个时间步:
    根据策略π(a|s; θ)选择动作a。
    执行动作a,观察奖励r和下一个状态s'。
    计算TD误差:
     \[
     \delta = r + \gamma V(s'; \phi) - V(s; \phi)
     \]
    更新Critic参数:
     \[
     \phi \leftarrow \phi + \alpha_c \delta \nabla_\phi V(s; \phi)
     \]
    更新Actor参数:
     \[
     \theta \leftarrow \theta + \alpha_a \delta \nabla_\theta \log \pi(a|s; \theta)
     \]

示例:CartPole平衡

以经典的CartPole环境为例,演示策略梯度方法的应用。智能体需要通过移动小车,使得杆子保持平衡。

import gym
import numpy as np
import tensorflow as tf
from tensorflow.keras import layers

# 创建环境
env = gym.make('CartPole-v1')

num_states = env.observation_space.shape[0]
num_actions = env.action_space.n

# 构建策略网络
model = tf.keras.Sequential([
    layers.Dense(24, activation='relu', input_shape=(num_states,)),
    layers.Dense(24, activation='relu'),
    layers.Dense(num_actions, activation='softmax')
])

optimizer = tf.keras.optimizers.Adam(learning_rate=0.01)
gamma = 0.99

# 策略梯度算法
def policy_gradient():
    state = env.reset()
    state = np.reshape(state, [1, num_states])
    done = False
    rewards = []
    actions = []
    states = []
    
    while not done:
        action_probs = model(state).numpy()[0]
        action = np.random.choice(num_actions, p=action_probs)
        next_state, reward, done, _ = env.step(action)
        next_state = np.reshape(next_state, [1, num_states])
        
        states.append(state)
        actions.append(action)
        rewards.append(reward)
        
        state = next_state
    
    # 计算累积奖励
    discounted_rewards = []
    cumulative = 0
    for r in rewards[::-1]:
        cumulative = r + gamma * cumulative
        discounted_rewards.insert(0, cumulative)
    discounted_rewards = np.array(discounted_rewards)
    discounted_rewards -= np.mean(discounted_rewards)
    discounted_rewards /= (np.std(discounted_rewards) + 1e-8)
    
    with tf.GradientTape() as tape:
        loss = 0
        for logit, action, reward in zip(model(np.concatenate(states)), actions, discounted_rewards):
            loss += -tf.math.log(logit[action]) * reward
    grads = tape.gradient(loss, model.trainable_variables)
    optimizer.apply_gradients(zip(grads, model.trainable_variables))
    return np.sum(rewards)

# 训练智能体
episodes = 1000
for episode in range(episodes):
    total_reward = policy_gradient()
    if (episode + 1) % 100 == 0:
        print(f'Episode: {episode + 1}, Total Reward: {total_reward}')

env.close()

代码说明

  1. 环境创建:使用OpenAI Gym中的CartPole环境。
  2. 策略网络:构建一个两层隐藏层的神经网络,输出层使用Softmax激活函数,表示每个动作的概率。
  3. 策略梯度函数(policy_gradient)
    • 运行一个完整的回合,记录状态、动作和奖励。
    • 计算每个时间步的折扣累积奖励,并进行标准化。
    • 使用梯度带(Gradient Tape)计算损失函数的梯度,并更新策略网络参数。
  4. 训练过程:进行1000个回合的训练,每100个回合输出一次总奖励。

结果说明

随着训练的进行,智能体通过策略梯度方法逐步学会保持杆子的平衡,累积奖励不断增加,最终能够稳定地控制小车平衡杆子。

主要应用

策略梯度方法在需要连续动作空间和复杂策略优化的任务中表现优异,主要应用包括:

  • 机器人控制:如机械臂的精确控制、自主导航。
  • 游戏AI:如复杂策略游戏中的智能对手。
  • 金融交易:模拟和优化交易策略,进行高频交易决策。
  • 自然语言处理:如对话生成、文本摘要等任务中的策略优化。

5. 比较与选择

Q-Learning和策略梯度方法各有优缺点,选择合适的算法取决于具体应用场景:

  • Q-Learning
    • 优点
      • 简单易实现,适用于离散动作空间。
      • 理论基础扎实,收敛性良好。
    • 缺点
      • 难以扩展到高维和连续动作空间。
      • 对于大型状态空间,Q表难以存储和更新。
  • 策略梯度方法
    • 优点
      • 适用于高维和连续动作空间。
      • 能够直接优化策略,处理复杂策略类型。
    • 缺点
      • 收敛速度较慢,易受局部最优影响。
      • 需要大量样本进行训练,训练不稳定性较高。

在实际应用中,深度强化学习(Deep Reinforcement Learning, DRL)结合了深度学习与强化学习的优势,采用神经网络近似价值函数或策略,广泛应用于复杂任务中。

6. 深度强化学习

深度强化学习通过使用深度神经网络作为函数逼近器,解决了传统强化学习在高维状态空间和复杂任务中的局限性。典型的深度强化学习算法包括深度Q网络(Deep Q-Network, DQN)和深度确定性策略梯度(Deep Deterministic Policy Gradient, DDPG)等。

深度Q网络(DQN)

DQN通过使用神经网络近似Q函数,解决了Q-Learning在高维状态空间中的问题。DQN引入经验回放和目标网络,提升了训练的稳定性和效率。

关键技术

  • 经验回放(Experience Replay):将智能体的经验存储在缓冲区中,随机采样进行训练,打破数据的时间相关性。
  • 目标网络(Target Network):使用一个固定的目标网络来稳定Q值的更新,减少训练过程中的震荡。

深度确定性策略梯度(DDPG)

DDPG是一种适用于连续动作空间的深度强化学习算法,结合了策略梯度和确定性策略的方法。DDPG使用两个神经网络:一个是策略网络(Actor),另一个是价值网络(Critic),通过经验回放和软更新机制提升训练稳定性。

7. 总结与展望

本文深入探讨了强化学习中的两大主流算法:Q-Learning和策略梯度方法,详细介绍了其关键概念、核心原理、示例及主要应用。Q-Learning作为基于价值的方法,适用于离散动作空间,简单易实现;而策略梯度方法适用于复杂和连续动作空间,能够直接优化策略。通过对比与分析,可以根据具体任务选择合适的算法。

随着计算能力的提升和深度学习技术的发展,深度强化学习(DRL)进一步拓展了强化学习的应用范围,解决了许多传统方法难以应对的复杂问题。未来,强化学习将在更多领域发挥重要作用,如智能制造、智能医疗、无人驾驶等,推动人工智能技术的进一步发展。

8. 参考资料

  1. 《强化学习:An Introduction》(Richard S. Sutton, Andrew G. Barto 著)
  2. DeepMind的DQN论文:Mnih, V., et al. (2015). "Human-level control through deep reinforcement learning."
  3. OpenAI Gym官方文档:Gym Documentation
  4. TensorFlow官方网站:https://www.tensorflow.org/
  5. PyTorch官方网站:PyTorch

【此文为作者经过搜集资料,整理及编辑而成,仅供学习者参考。本文属于个人学习过程中对于人工智能相关知识概念进行的整合作品,如需更详细的信息和扩展内容,建议参考相关专业书籍和学术论文,若有不当之处可进行指正,共同学习交流!】 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/946973.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

家政预约小程序05活动管理

目录 1 搭建活动管理页面2 搭建活动规则页面3 搭建规则新增页面3 配置规则跳转4 搭建活动参与记录总结 上一篇我们介绍了活动管理的表结构设计&#xff0c;本篇我们介绍一下后台功能。 1 搭建活动管理页面 我们一共搭建了三个表&#xff0c;先搭建主表的后台功能。打开我们的后…

SpringCloud(二)--SpringCloud服务注册与发现

一. 引言 ​ 前文简单介绍了SpringCloud的基本简介与特征&#xff0c;接下来介绍每个组成部分的功能以及经常使用的中间件。本文仅为学习所用&#xff0c;联系侵删。 二. SpringCloud概述 2.1 定义 ​ Spring Cloud是一系列框架的有序集合&#xff0c;它巧妙地利用了Spring…

当生成式AI遇见数字孪生

吴付标 总部位于美国宾夕法尼亚州的Bentley软件公司&#xff0c;于金秋十月在枫叶之国加拿大名城温哥华举办一年一度的2024纵览基础设施大会暨光辉大奖赛。此次盛会吸引了来自全球的数百位行业精英&#xff0c;旨在探讨基础设施数智化的最新趋势&#xff0c;分享生态圈的创新成…

散度与旋度的探讨

一、散度的定义与物理意义 1. 散度的定义 散度(Divergence)是向量分析中的一个核心概念,用于描述一个向量场在某一点的源或汇的强度。在数学上,散度通常使用符号“div”表示。对于一个三维向量场F(x, y, z) = (Fx, Fy, Fz),其散度可以定义为: div F = ∂Fx/∂x + ∂Fy/…

英文字体:创意前卫杀手级标题海报封面设计粗体字体 Morne Display

看啊&#xff0c;设计师们&#xff01;Morne 刚刚进入字体游戏&#xff0c;让我们告诉你&#xff0c;它不是来玩的——认识我们的字体&#xff0c;它就像你早上的咖啡一样大胆。无论您是在制作杀手级标题、偷偷摸摸的副标题还是大胆的海报&#xff0c;Morne 都能为您提供前后、…

LLM - 使用 LLaMA-Factory 部署大模型 HTTP 多模态服务 (4)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/144881432 大模型的 HTTP 服务&#xff0c;通过网络接口&#xff0c;提供 AI 模型功能的服务&#xff0c;允许通过发送 HTTP 请求&#xff0c;交互…

【大模型系列】Mobile-Agent(2024.04)

Paper: https://arxiv.org/pdf/2401.16158Github: https://github.com/X-PLUG/MobileAgentAuthor: Junyang Wang et al. 北交、阿里巴巴 Mobile-agent核心工作&#xff1a; 首先使用视觉感知工具(检测和OCR模型)识别前端界面中文本和图像元素的精确位置 检测图标&#xff1a;…

JVM实战—8.如何分析jstat统计来定位GC

大纲 1.使用jstat了解线上系统的JVM运行状况 2.使用jmap和jhat了解线上系统的对象分布 3.如何分析JVM运行状况并合理优化 4.使用jstat分析模拟的BI系统JVM运行情况 5.使用jstat分析模拟的计算系统JVM运行情况 6.问题汇总 1.使用jstat了解线上系统的JVM运行状况 (1)JVM的…

什么是Redis哨兵机制?

大家好&#xff0c;我是锋哥。今天分享关于【什么是Redis哨兵机制&#xff1f;】面试题。希望对大家有帮助&#xff1b; 什么是Redis哨兵机制&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis 哨兵&#xff08;Sentinel&#xff09;机制是 Redis 提…

深度学习的魔法世界

技术文章&#xff1a;深度学习的魔法世界 引言 嘿&#xff0c;今天我们要一起探索一个非常酷的魔法世界——深度学习&#xff01;这是一门让计算机变得超级聪明的科学。我们会用最简单的语言来解释深度学习的基本概念&#xff0c;让你们也能轻松理解。 一、深度学习的六大魔…

数据挖掘——决策树分类

数据挖掘——决策树分类 决策树分类Hunt算法信息增益增益比率基尼指数连续数据总结 决策树分类 树状结构&#xff0c;可以很好的对数据进行分类&#xff1b; 决策树的根节点到叶节点的每一条路径构建一条规则&#xff1b;具有互斥且完备的特点&#xff0c;即每一个样本均被且…

RFID手持机与RFID工业平板在仓储物流管理系统中的选型

概述 随着物联网技术在仓储物流管理系统中的普及&#xff0c;RFID手持机与RFID工业平板作为基于RFID技术手持式读写器的两种重要终端设备形态&#xff0c;得到了广泛应用。尽管RFID手持机与RFID工业平板都具备读写 RFID标签的基本功能&#xff0c;使用场景较为类似&#xff0c…

文件本地和OSS上传

这里写目录标题 前端传出文件后端本地存储阿里云OSS存储上传Demo实现上传ConfigurationProperties 前端传出文件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>上传文件</title> </head&g…

element-plus大版本一样,但是小版本不一样导致页面出bug

npm 的版本 node的版本 npm的源这些都一样&#xff0c;但是效果不一样 发现是element的包版本不一样导致的 2.9.1与2.8.1的源是不一样的&#xff0c;导致页面出bug;

CSS进阶和SASS

目录 一、CSS进阶 1.1、CSS变量 1.2、CSS属性值的计算过程 1.3、做杯咖啡 1.4、下划线动画 1.5、CSS中的混合模式(Blending) 二、SASS 2.1、Sass的颜色函数 2.2、Sass的扩展(extend)和占位符(%)、混合(Mixin) 2.3、Sass的数学函数 2.4、Sass的模块化开发 2.5、Sass…

python-Flask:SQLite数据库路径不正确但是成功访问到了数据库,并对表进行了操作

出现了这个问题&#xff0c;就好像是我要去找在南方的人&#xff0c;然后我刚好不分南北&#xff0c;我认为的方向错了&#xff0c;实则方向对了。 在我针对复盘解决&#xff1a;sqlite3.OperationalError: unrecognized token: “{“-CSDN博客这个内容的时候&#xff0c;又出现…

剪映--关键帧教程:制作视频文字说明,文字动态划线,透明文字,虚拟触控,画面旋转缩小退出

关键帧介绍 剪映当中许多动态的效果都是关键帧的应用&#xff0c;像接下来会讲到的文字动态划线&#xff0c;画面旋转退出&#xff0c;都是关键帧的效果&#xff0c;用户只要设定初始状态和最后状态&#xff0c;软件会将中间的动态补齐。剪辑的难点在于自己需要先想好要怎么去…

【数据结构Ⅰ复习题】

如有错误欢迎指正&#xff0c;题目根据教材----------严蔚敏数据结构&#xff08;c语言版 第2版&#xff09;人民邮电电子版 数据结构Ⅰ复习题 一、填空题1&#xff0e;算法应该具备的5个重要特性有___有穷性___、确定性、可行性、输入和输出。2&#xff0e;非空单链表L中*p是头…

697: Edit Distance

我们定义 dp[i][j] 为将字符串 A[0..i-1] 转换为 B[0..j-1] 的最小操作数 状态转移 通过动态规划的思想&#xff0c;我们可以使用 状态转移方程 来计算 dp[i][j]。具体来说&#xff0c;dp[i][j] 的值可以由以下几种操作得到&#xff1a; 如果 A[i-1] B[j-1]&#xff1a; 如果…

【AI创作】kimi API初体验

一、介绍 接口文档 https://platform.moonshot.cn/docs/guide/migrating-from-openai-to-kimi 收费详情 并发: 同一时间内我们最多处理的来自您的请求数RPM: request per minute 指一分钟内您最多向我们发起的请求数TPM: token per minute 指一分钟内您最多和我们交互的toke…