一、深度Q网络(Deep Q-Network,DQN)介绍
1、背景与动机
深度Q网络(DQN)是深度强化学习领域的里程碑算法,由DeepMind于2013年提出。它首次在 Atari 2600 游戏上实现了超越人类的表现,解决了传统Q学习在高维状态空间中的应用难题。DQN在机器人路径规划领域展现出巨大潜力,能够帮助机器人在复杂环境中找到最优路径。
传统Q学习在状态空间维度较高时面临以下挑战:
- Q表无法存储高维状态的所有可能情况
- 特征提取需要手动设计,泛化能力差
- 更新过程容易导致Q值估计不稳定
DQN通过引入深度神经网络作为Q函数的近似器,并采用经验回放和目标网络等技术,有效解决了上述问题。
2、核心思想
DQN的核心思想是使用深度神经网络来近似Q函数,即:
Q∗(s,a)≈Q(s,a;θ)
Q^*(s, a) \approx Q(s, a; \theta)
Q∗(s,a)≈Q(s,a;θ)
其中,sss 表示状态,aaa 表示动作,θ\thetaθ 表示神经网络的参数。
目标是找到一组参数 θ∗\theta^*θ∗,使得网络输出的Q值与实际的Q值尽可能接近。通过不断与环境交互收集数据,使用梯度下降法优化网络参数。
3、算法流程
DQN的算法流程可以概括为以下步骤:
-
初始化:
- 初始化Q网络参数 θ\thetaθ
- 初始化目标网络参数 θ−\theta^-θ− 并与Q网络参数同步
- 初始化经验回放缓冲区 DDD
-
与环境交互:
- 在当前状态 sss 下,根据 ϵ\epsilonϵ-贪婪策略选择动作 aaa
- 执行动作 aaa,观察奖励 rrr 和下一个状态 s′s's′
- 将经验 (s,a,r,s′)(s, a, r, s')(s,a,r,s′) 存入经验回放缓冲区 DDD
-
采样与更新:
- 从经验回放中随机采样一批数据 {(si,ai,ri,si′)}\{(s_i, a_i, r_i, s_i')\}{(si,ai,ri,si′)}
- 计算目标Q值:
yi={riif si′ is terminalri+γmaxa′Q(si′,a′;θ−)otherwise y_i = \begin{cases} r_i & \text{if } s_i' \text{ is terminal} \\ r_i + \gamma \max_{a'} Q(s_i', a'; \theta^-) & \text{otherwise} \end{cases} yi={riri+γmaxa′Q(si′,a′;θ−)if si′ is terminalotherwise
其中,γ\gammaγ 是折扣因子(0≤γ≤10 \leq \gamma \leq 10≤γ≤1) - 计算当前Q值:Q(si,ai;θ)Q(s_i, a_i; \theta)Q(si,ai;θ)
- 计算损失函数:
L(θ)=1N∑i=1N(yi−Q(si,ai;θ))2 L(\theta) = \frac{1}{N} \sum_{i=1}^{N} (y_i - Q(s_i, a_i; \theta))^2 L(θ)=N1i=1∑N(yi−Q(si,ai;θ))2 - 使用梯度下降法更新Q网络参数 θ\thetaθ
-
同步目标网络:
- 每隔一定步数(如C步),将Q网络参数 θ\thetaθ 同步到目标网络 θ−\theta^-θ−
-
重复:
- 重复上述过程直到收敛
4、关键技术
1. 经验回放(Experience Replay)
经验回放通过存储代理与环境交互的经验,并随机采样小批量数据进行更新,解决了以下问题:
- 数据相关性:传统Q学习使用相关数据更新,容易导致估计偏差
- 数据利用效率:每个经验只使用一次,数据利用率低
经验回放的数学表达为:
D={e1,e2,…,eN},ei=(si,ai,ri,si′)
D = \{e_1, e_2, \dots, e_N\}, \quad e_i = (s_i, a_i, r_i, s_i')
D={e1,e2,…,eN},ei=(si,ai,ri,si′)
每次更新时,从 DDD 中随机采样小批量数据 B⊆DB \subseteq DB⊆D。
2. 目标网络(Target Network)
目标网络通过维持一个固定的网络来计算目标Q值,避免了Q值估计的不稳定。目标网络的参数 θ−\theta^-θ− 每隔一定步数与Q网络参数 θ\thetaθ 同步:
θ−←θevery C steps
\theta^- \leftarrow \theta \quad \text{every C steps}
θ−←θevery C steps
3. ϵ\epsilonϵ-贪婪策略
ϵ\epsilonϵ-贪婪策略在探索与利用之间取得平衡:
a={random actionwith probability ϵargmaxaQ(s,a;θ)with probability 1−ϵ
a =
\begin{cases}
\text{random action} & \text{with probability } \epsilon \\
\arg\max_a Q(s, a; \theta) & \text{with probability } 1-\epsilon
\end{cases}
a={random actionargmaxaQ(s,a;θ)with probability ϵwith probability 1−ϵ
其中,ϵ\epsilonϵ 随时间逐渐衰减,从初始值(如1.0)逐渐降低到较小值(如0.1)。
5、数学推导
1. Q学习更新公式
Q学习的目标是找到最优策略下的Q值:
Q∗(s,a)=Er[r+γmaxa′Q∗(s′,a′)]
Q^*(s, a) = \mathbb{E}_r[r + \gamma \max_{a'} Q^*(s', a')]
Q∗(s,a)=Er[r+γa′maxQ∗(s′,a′)]
其中,Er\mathbb{E}_rEr 表示对奖励分布的期望。
2. 损失函数
DQN使用均方误差(MSE)作为损失函数:
L(θ)=Es,a,r,s′[(y−Q(s,a;θ))2]
L(\theta) = \mathbb{E}_{s,a,r,s'} \left[ (y - Q(s, a; \theta))^2 \right]
L(θ)=Es,a,r,s′[(y−Q(s,a;θ))2]
其中,y=r+γmaxa′Q(s′,a′;θ−)y = r + \gamma \max_{a'} Q(s', a'; \theta^-)y=r+γmaxa′Q(s′,a′;θ−) 是目标Q值。
3. 梯度更新
使用梯度下降法更新参数 θ\thetaθ:
θ←θ+α∇θL(θ)
\theta \leftarrow \theta + \alpha \nabla_\theta L(\theta)
θ←θ+α∇θL(θ)
其中,α\alphaα 是学习率,∇θL(θ)\nabla_\theta L(\theta)∇θL(θ) 是损失函数对参数的梯度。
6、与传统Q学习的对比
特性 | 传统Q学习 | DQN |
---|---|---|
状态表示 | 离散状态或手工特征 | 深度神经网络自动提取特征 |
数据利用 | 每个数据只使用一次 | 经验回放多次利用数据 |
稳定性 | Q值估计容易发散 | 目标网络提高稳定性 |
适用场景 | 低维状态空间 | 高维状态空间(如图像) |
7、局限性
- 样本效率低:需要大量交互数据
- 超参数敏感:对 ϵ\epsilonϵ、学习率、折扣因子等敏感
- 奖励稀疏问题:在奖励稀疏环境中表现不佳
- 计算资源需求高:需要强大的计算设备支持
二、构建CNN-LSTM-GRU深度神经网络作为Q函数的近似器
输入是10*10大小含有障碍物的地图,输出是机器人8个方向的动作Q值,用于指导机器人选择最优动作。
三、DQN求解机器人路径规划
3.1 环境设置
- 状态空间:机器人当前的位置或状态,以及与目标位置的关系。
- 动作空间:机器人可以采取的所有可能动作,如移动到相邻位置。
- 奖励函数:定义机器人在执行动作后获得的即时奖励。例如,到达目标点给予高奖励,碰撞给予负奖励,距离目标点越近奖励越高。
3.2 网络设计
DQN网络输入是10×10大小的地图状态,输出是机器人8个方向的动作Q值。网络结构如下:
- 输入层:接收10×10的地图作为输入。
- 隐藏层:包含卷积层、LSTM、GRU等,用于提取地图特征。
- 输出层:输出8个方向动作的Q值。
3.3 训练过程
- 初始化:初始化经验池,随机初始化Q网络的参数,并初始化目标网络,其参数与Q网络相同。
- 获取初始状态:机器人从环境中获取初始状态。
- 选择动作:根据当前状态和ε-贪心策略选择动作。
- 执行动作并观察:机器人执行动作并观察新的状态和获得的奖励。
- 存储经验:将经验(状态、动作、奖励、新状态)存储在经验池中。
- 样本抽取与学习:从经验池中随机抽取样本,并使用这些样本来更新Q网络。
- 目标网络更新:定期将Q网络的参数复制到目标网络。
3.4 路径规划
在训练完成后,使用训练好的DQN网络来规划路径。机器人根据当前状态和Q值函数选择最优动作,逐步接近目标位置。
四、部分MATLAB代码及结果
%% 画图
analyzeNetwork(dqn_net)
figure
plot(curve,'r-',LineWidth=2);
saveas(gca,'11.jpg')
figure
imagesc(~map)
hold on
plot(state_mark(:,2),state_mark(:,1),'c-',LineWidth=2);
colormap('gray')
scatter(start_state_pos(2) ,start_state_pos(1),'MarkerEdgeColor',[0 0 1],'MarkerFaceColor',[0 0 1], 'LineWidth',1);%start point
scatter(target_state_pos(2),target_state_pos(1),'MarkerEdgeColor',[0 1 0],'MarkerFaceColor',[0 1 0], 'LineWidth',1);%goal point
text(start_state_pos(2),start_state_pos(1),'起点','Color','red','FontSize',10);%显示start字符
text(target_state_pos(2),target_state_pos(1),'终点','Color','red','FontSize',10);%显示goal字符
title('基于DQN的机器人路径规划')
saveas(gca,'12.jpg')