【深度强化学习 DRL 快速实践】Deep Q-learning

在这里插入图片描述

Deep Q-learning (2015,DeepMind) 核心改进点

Q-learning 是一种经典的强化学习算法,通过学习一个动作-价值函数(Q函数),从而在未知环境中找到最优的策略

  • model-free, off-policy, Value-based
核心改进点说明
Q 函数近似通过深度神经网络来近似 Q(s, a) 函数,解决传统 Q-learning 在大规模状态空间中的存储问题
经验回放 (Experience Replay)缓存智能体的历史经验,打破时间相关性,使得训练更稳定
目标网络 (Target Network)通过使用一个延迟更新的 Q 网络来减少 Q 值的震荡,增强算法稳定性

Deep Q-learning 网络更新

Q ( s t , a t ) = Q ( s t , a t ) + α [ r t + γ max ⁡ a Q ( s t + 1 , a ) − Q ( s t , a t ) ] Q(s_t, a_t) = Q(s_t, a_t) + \alpha \left[ r_t + \gamma \max_a Q(s_{t+1}, a) - Q(s_t, a_t) \right] Q(st,at)=Q(st,at)+α[rt+γamaxQ(st+1,a)Q(st,at)]

【重要特点】Q-learning 收敛性:依据是贝尔曼最优方程(Bellman optimality equation),只要每对状态-动作对被无限次访问,并且学习率衰减得当,Q-learning 可以保证收敛到最优策略


Deep Q-learning 问题分析和解决方案 Tips

  1. Q 值的估计通常是过高的: Q-learning tends to select the action that is over-estimated
  • 解决方法: Double DQN – 核心思想是选择 action 和评估这个 action 分开,用不同的 Q 网络处理,也就是说:选择用 Q Q Q,评估用 Q ′ Q' Q (tips: Q ′ Q' Q 可以直接用 Q-learning 里面的 Q target network,这样改动最少)
    原 DQN :   r t + γ max ⁡ a Q ( s t + 1 , a ) → 改进后的 Double DQN :   r t + γ Q ′ ( s t + 1 , arg max ⁡ a Q ( s t + 1 , a ) ) \text{\textcolor{red}{原 DQN}: \ } r_t + \gamma \max_a Q(s_{t+1}, a) \to \text{\textcolor{red}{改进后的 Double DQN}: \ } r_t + \gamma Q'(s_{t+1}, \argmax_a Q(s_{t+1}, a))  DQN:  rt+γamaxQ(st+1,a)改进后的 Double DQN:  rt+γQ(st+1,aargmaxQ(st+1,a))
  1. 数据利用率低,没有被选择过的 a a a 对应的 Q 值很难更新
  • 解决方法:Dueling DQN – 核心思想是优化采样到的数据利用,采样数据 (s, a) 不仅用来更新 a 对应的 Q 值,还用来更新 s 下的其他 a‘ 对应的 Q 值,具体来说是修改了 network 架构,把原来的 Q 预测分成 VAdvantage 分开预测再相加
  • 【细节】限制 s 下的所有 a 的 Advantage 的和为 0 来促进网络学习 V (不然可能直接把 V 全学为 0, 导致退化为了原来的 DQN)
  1. 实际上各类优化方法很多,参考 rainbow

快速代码示例

import numpy as np
import random

class QLearningAgent:
    def __init__(self, n_actions, n_states, alpha=0.1, gamma=0.9, epsilon=0.1):
        self.n_actions = n_actions
        self.n_states = n_states
        self.alpha = alpha
        self.gamma = gamma
        self.epsilon = epsilon
        self.Q = np.zeros((n_states, n_actions))  # 初始化 Q 表

    def choose_action(self, state):
        if random.uniform(0, 1) < self.epsilon:
            return random.randint(0, self.n_actions - 1)  # 探索
        else:
            return np.argmax(self.Q[state])  # 利用

    def update(self, state, action, reward, next_state):
        best_next_action = np.argmax(self.Q[next_state])
        self.Q[state, action] = self.Q[state, action] + self.alpha * (
            reward + self.gamma * self.Q[next_state, best_next_action] - self.Q[state, action]
        )

# 示例:应用 Q-learning 解决简单问题
def q_learning_example():
    n_states = 5  # 状态数量
    n_actions = 2  # 动作数量
    
    agent = QLearningAgent(n_actions, n_states)
    n_episodes = 1000  # 训练轮数

    for episode in range(n_episodes):
        state = 0  # 每轮从状态0开始
        done = False
        while not done:
            action = agent.choose_action(state)

            # 假设某些简单的奖励和转移逻辑
            if action == 0:  # 向左
                next_state = max(state - 1, 0)
                reward = -1
            else:  # 向右
                next_state = min(state + 1, n_states - 1)
                reward = 1

            if next_state == n_states - 1:
                done = True

            agent.update(state, action, reward, next_state)
            state = next_state
            
    return agent.Q
    
# 训练并打印结果
Q_table = q_learning_example()
print("训练后的 Q 表:")
print(Q_table)


参考资料:Q-learning 详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值