DQN的e-greedy策略理解

阅读蘑菇书源码时,在写DQN网络的智能体是这样写的:

class DQN:
    def __init__(self, state_dim, action_dim, cfg):

        self.action_dim = action_dim  # 总的动作个数
        self.device = cfg.device  # 设备,cpu或gpu等
        self.gamma = cfg.gamma  # 奖励的折扣因子
        # e-greedy策略相关参数
        self.frame_idx = 0  # 用于epsilon的衰减计数
        self.epsilon = lambda frame_idx: cfg.epsilon_end + \
                                         (cfg.epsilon_start - cfg.epsilon_end) * \
                                         math.exp(-1. * frame_idx / cfg.epsilon_decay)
        self.batch_size = cfg.batch_size
        self.policy_net = MLP(state_dim, action_dim, hidden_dim=cfg.hidden_dim).to(self.device)  # 定义一个深度学习网络
        self.target_net = MLP(state_dim, action_dim, hidden_dim=cfg.hidden_dim).to(self.device)  # 目标深度学习网络
        for target_param, param in zip(self.target_net.parameters(),
                                       self.policy_net.parameters()):  # copy params from policy net
            target_param.data.copy_(param.data)
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=cfg.lr)
        self.memory = ReplayBuffer(cfg.memory_capacity)

对于衰减函数,可以描述成:
ε = ε e n d + ( ε s t a r t − ε e n d ) × e − i n d e x ε d e c a y \varepsilon = {\varepsilon _{end}} + ({\varepsilon _{start}} - {\varepsilon _{end}}) \times {e^{ - \frac{{index}}{{{\varepsilon _{decay}}}}}} ε=εend+(εstartεend)×eεdecayindex
利用MATLAB编程看一下这个函数的特点:

frame_idx=1:10000;
epsilon_end=0.01;
epsilon_start=0.90;
epsilon_decay=500;
epsilon=epsilon_end+(epsilon_start-epsilon_end).*exp(-frame_idx./epsilon_decay);
plot(frame_idx,epsilon)
hold on
scatter(500,epsilon(500))

绘图为:
在这里插入图片描述
可以看到,随着迭代次数frame_idx逐渐增大,最终的epsilon会越来越小,从初始的epsilon_start逐渐递减无限逼近epsilon_end实现策略收敛。

图中红色圆圈为迭代次数等于epsilon_decay时的位置,大概从这个位置开始放缓递减速度,之后逐渐收敛,达到策略稳定的效果。

这个策略在Q-learning里也是一样的。

### DQN与Q-Learning的关系 Deep Q-Networks (DQN) 是一种利用神经网络近似行动价值函数的方法,这使得该算法能够应用于具有高维输入空间的任务中。传统Q学习采用表格形式存储状态-动作对的价值估计,而DQN则通过多层神经网络计算这些值[^1]。 这种转变不仅解决了维度灾难的问题——即随着环境复杂度增加而导致的状态数量爆炸性增长问题;还允许模型泛化到未曾见过的状态上,从而提高了效率和性能。因此可以说,DQN是在经典Q学习基础上发展起来的一种更为强大的强化学习技术。 ### 实现差异对比 #### 表格型Q-Learning 在传统的基于表的Q-learning中,更新规则如下所示: \[ Q(s_t,a_t)\leftarrow Q(s_t,a_t)+\alpha[r_{t+1}+\gamma \max_a Q(s_{t+1},a)-Q(s_t,a_t)] \] 其中\( s_t \), \( a_t \),以及 \( r_{t+1} \)分别代表当前时间步下的状态、采取的动作及其对应的即时奖励;参数α控制着新旧信息之间的平衡程度;γ则是折扣因子用于衡量未来回报的重要性。 然而这种方法存在明显的局限性:它依赖于离散化的有限状态集,并且对于大型甚至连续的空间来说并不实用。 #### 基于深度学习DQN 相比之下,DQN 使用了一个深层卷积神经网路作为评估器来逼近最优策略所对应的最佳预期收益函数。具体而言就是训练这样一个映射关系: \[ y_i=r_i+\gamma \max _{a'} Q\left(\phi_{i+1}, a'; \theta^{-}\right) \] 这里引入了目标网络的概念 (\(θ^-\)) 来稳定梯度传播过程中的权重变化,同时经验回放缓冲区也被用来打破样本间的关联性并提高采样多样性[^4]。 ```python import torch.nn as nn class DQN(nn.Module): def __init__(self, input_dim, output_dim): super(DQN, self).__init__() self.fc = nn.Sequential( nn.Linear(input_dim, 256), nn.ReLU(), nn.Linear(256, output_dim) ) def forward(self, x): return self.fc(x) def compute_loss(current_q_values, target_q_values): loss_fn = nn.MSELoss() return loss_fn(current_q_values, target_q_values) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云月墨染

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值