强化学习入门第一周
内容包括ε-greedy策略,Q-learning,DQN的概念介绍、公式、以及简单的代码实现。
表格RL
ε-greedy策略:(多臂老虎机举例)
增量式更新公式:
对某个拉杆 $a$:
第$n$次选择动作$a$得到的奖励记为:$R_n(a)$
之前对该动作的奖励期望估计为:$Q_{n−1}(a)$
选择了第$n$次后,计数器更新:$N_n(a)=N_{n−1}(a)+1$
增量公式:
$Q_n(a) = Q_{n-1}(a) + \frac{1}{N_n(a)}(R_n(a)-Q_{n-1}(a))$
ε-greedy 策略
基本思想是:
- 以概率$1-ε$选择当前估计期望奖励最大的拉杆(利用)
- 以概率 $ε$ 在所有拉杆中随机选择一个(探索)
ε-greedy 的动作选择规则为:
$ A_t= \begin{cases}
argmaxQ_t(a),\quad 以概率1-ε \
所有拉杆中等概率随机选一个,\quad 以概率ε
\end{cases}$
Q-learning算法
Q-learning 的更新公式
$Q(s_t,a_t)←Q(s_t,a_t)+α(r_t+γmaxQ(s_{t+1},a′)−Q(s_t,a_t))$
其中:
- $α∈(0,1]$为学习率;
- $r_t+γmaxQ(s_{t+1},a′)$ 被称为 TD 目标(TD target);
- $δt=r_t+γmaxQ(s_{t+1},a′)−Q(s_t,a_t)$ 称为 TD 误差(TD error).
以Q-learning算法,代码实现解决GridWorld
1 | import numpy as np |
扩展
SARSA:
on-policy 版本的 Q-learning
更新公式变成:$Q(s_t,a_t)←Q(s_t,a_t)+α(r_t+γQ(s_{t+1},a_{t+1})−Q(s_t,a_t)$
和 Q-learning 的区别:
Q-learning 用 $max_{a’} Q(s’, a’)$ 假设下一步一定选最优→ off-policy
SARSA 用实际选出来的下一个动作
a_{t+1}→ on-policy
Monte Carlo(MC)
一条完整 episode 结束之后,用真实 return 更新
- TD:有偏但更高效、更稳定
- MC:无偏但方差大
Deep RL(DQN)
神经网络逼近$Q(s,a)$
DQN中定义一个网络输入:状态 $ s$ ,输出:每个动作的 $Q$ 值$ [Q(s,a_1), Q(s,a_2), …, Q(s,a_N)]$
写作$Q(s,a;θ)$
更新目标
与Qlearning形式一样
$$
y=r+γa^′maxQ(s^′,a^′;θ^−)
$$
损失函数是:
$$
L(\theta) = \big(y - Q(s,a;\theta)\big)^2
$$
让当前 Q(s,a; θ) 接近目标 y
用梯度下降更新 θ:
$$
\theta \leftarrow \theta - \eta \nabla_\theta L(\theta)
$$
经验回放
准备一个大容量队列 replay_buffer;
每次与环境交互得到 (s, a, r, s', done) 就 buffer.append(...);
训练时:从 buffer 里随机采样一个batch,用这些样本算 TD target,做一次梯度更新。
目标网络 Target Network
在 Q-learning 更新时,target 里有 $max_a’ Q(s’, a’)$;
如果 target 也用“当前正在训练的网络参数”计算,会导致:目标 y 和当前输出 $Q(s,a; θ)$ 同时跟着 θ 变化;
再复制一份网络作为 target_net,参数记为 $θ^⁻$;
训练时,目标:
$$
y=r+γa^′maxQ(s^′,a^′;θ^−)
$$
每步只更新$policy$的 $θ$;
每隔 C 步,把$θ$ 拷贝到 $θ^⁻$:
完整步骤
初始化
- 初始化 Q 网络
Q(s,a; θ)(policy_net) - 初始化 target 网络
Q(s,a; θ⁻)(target_net),参数和 θ 相同 - 创建一个
replay Buffer(环形队列) - 设置超参数:
- 学习率
lr - 折扣因子
γ - ε-greedy:
ε_start, ε_end, ε_decay - batch_size
- target_update_freq(多少步同步一次 target_net)
- 学习率
训练循环
对每一步:
选动作(ε-greedy)
与环境交互
得到$ (s, a, r, s_next, done)$,存入
replay buffer。从 buffer 采样一个 batch:
计算 target y
如果 done,则 y = r[i]
否则 y = r[i] + γ * q_next
计算当前 $Q(s,a; θ)$
计算损失 & 反向传播
loss = MSE(y_batch, q_selected)或 Huber lossloss.backward()optimizer.step(),optimizer.zero_grad()更新 ε
epsilon = max(ε_end, ε * ε_decay)定期更新 target 网络
每隔 N 步:$θ^⁻ ← θ$
若
done:重置环境,开始下一个 episode。
基于cartpole-V1代码实现
1 | import gymnasium as gym |