1. 立项背景和目标
随着强化学习在连续控制领域(如机器人、自动驾驶、机械臂控制)中的广泛应用,深度确定性策略梯度(DDPG)算法因其能够处理高维连续动作空间而成为重要的研究工具。本项目旨在通过实现DDPG算法,模拟一个二维平面内“末端执行器”通过调整两个关节角度,实现对动态目标点的追踪任务。
2. 功能
本系统实现了以下核心功能:
机械臂运动仿真:模拟两个关节角度(0~360°)的连续控制,并计算末端执行器的二维坐标。
DDPG智能体训练:通过与环境交互,自主学习调整关节角度以接近目标点。
课程学习机制:先让机械臂学习抵达固定目标点,然后每隔一定回合随机重置目标点,逐步训练其追踪能力。
训练过程监控与数据记录:记录每回合的最小/最大奖励、总奖励、步数等,并定期保存模型参数。
3. 核心功能模块描写
模块 功能描述
qNet Critic网络,输入状态+动作,输出Q值,评估当前动作的好坏。
aNet Actor网络,输入状态,输出连续动作(两个关节的角度变化量,范围-2~2度)。
DDPG 主算法类,包含经验存储、动作选择、网络更新、软目标更新等核心逻辑。
环境交互模块(在DDPGlearning.py中) 定义状态转移、奖励计算、末端坐标计算等物理仿真逻辑。
课程学习调度模块 控制目标点重置频率,逐步提高任务难度。
训练监控与存储模块 记录训练指标,定期保存模型参数和奖励日志。
4. 业务流程
初始化:创建DDPG智能体,初始化环境状态(两个关节角度随机、目标点固定或随机)。
交互采样:智能体根据当前状态选择动作,环境执行动作并返回新状态和奖励。
经验存储:将(s, a, r, s_)存入经验池。
经验回放与学习:当经验池数据足够时,随机采样批次数据,更新Actor和Critic网络。
目标网络软更新:每TARGET_REPLACE_ITER步,通过Polyak平均更新目标网络参数。
课程学习调整:每完成一定回合数,重置目标点位置,并记录训练数据。
模型保存与日志输出:定期保存网络参数,输出奖励统计信息。
5. 功能路径描述
启动训练:运行DDPGlearning.py。
阶段一(固定目标):目标点固定为[0.2, 0.2](归一化坐标),智能体学习如何调整关节角度使末端执行器抵达该点。
阶段二(动态追踪):成功抵达目标点的轮次进行随机重置目标点,智能体需适应新目标并持续追踪。
监控输出:控制台不直接输出,但n_rn.txt文件会记录每回合的奖励统计,模型参数保存为.pkl文件。
继续训练:可通过加载已保存的模型参数继续训练或测试。
1. 整体架构和设计思路
本项目的整体架构分为两层:底层是DDPG算法核心库(DDPG.py),上层是机械臂环境仿真与训练调度程序(DDPGlearning.py)。算法与环境分离的设计使得后续可方便地替换为真实机械臂接口。
设计思路围绕三个核心挑战展开:连续动作空间的高效探索、训练过程的稳定性保障、从固定任务到动态任务的泛化能力。针对这些挑战,我采用了以下策略:
经验回放:使用大小为5000的循环缓冲区存储历史样本,打破时间相关性,提高样本效率。
软目标更新:采用Polyak平均(τ=0.01)缓慢更新目标网络,避免目标值剧烈波动导致训练崩溃。
课程学习:先让智能体在固定目标点上充分学习,待策略稳定后再逐步引入目标点随机重置,实现从“记忆”到“泛化”的平滑过渡。
渐进式探索:初始探索方差VAR=1,随着训练进行按0.98的系数衰减,使智能体从探索为主转向利用为主。
2. 不同模块使用的技术栈
模块 技术栈
深度学习框架 PyTorch(网络定义、自动求导、优化器)
数值计算与存储 NumPy(经验池、随机采样)
环境仿真 纯数学计算(三角函数、角度归一化)
模型持久化 torch.save / torch.load
训练日志 文本文件写入
3. 我负责的模块和结果
我独立完成了全部模块的开发与调试:
DDPG算法模块:实现了Actor网络(输出连续动作,通过tanh×2限制在[-2,2]范围)、Critic网络(输出Q值)、经验池管理、动作选择(添加高斯噪声)、软更新逻辑、梯度裁剪等核心组件。
环境建模模块:定义了10维状态空间(2个关节角度+6个末端坐标衍生特征+2个目标坐标)、2维连续动作空间、奖励函数(基于末端与目标点距离的负值,并引入连续接近的正向激励)。
课程学习调度模块:控制目标点重置频率,记录每回合的奖励统计(最小值、最大值、总和、步数),定期保存模型参数。
最终结果:模型能够在固定目标点上稳定收敛,末端执行器准确抵达目标附近;切换为随机目标点后,能够快速调整关节角度,实现基本追踪能力;训练过程平稳,未出现梯度爆炸或输出饱和问题。
4. 遇到的难点、坑和解决方案
难点一:训练不稳定,奖励剧烈震荡
原因:初始探索方差过大,动作跳跃剧烈;奖励函数区分度低;目标网络更新方式不当。
解决方案:引入课程学习,先从固定目标点开始训练;改进奖励函数,增加连续接近的正向累加奖励;使用软更新代替硬更新;添加梯度裁剪。
难点二:输出饱和,动作总是边界值或零
原因:Actor网络输出经过tanh后易进入饱和区;状态特征幅值差异大。
解决方案:对状态进行归一化处理;使用较小的权重初始化;通过课程学习逐步降低探索噪声,减少对边界动作的依赖;调整奖励结构,让小幅度修正动作也能获得正向反馈。