DeepRL-TensorFlow2
DeepRL-TensorFlow2 是一个基于 TensorFlow 2 框架的开源项目,致力于提供多种主流深度强化学习算法的简洁实现。它涵盖了从经典的 DQN、Double DQN 到先进的 PPO、SAC 等十余种核心算法,旨在帮助学习者轻松跨越理论到实践的门槛。
该项目主要解决了现有强化学习代码库往往结构复杂、文件分散,导致初学者难以理清逻辑痛点。其最大的技术亮点在于极致的代码模块化设计:每个算法仅由一个独立的 Python 脚本构成,无需在不同文件间频繁跳转即可完整掌握算法全貌。同时,代码中清晰标注了核心思想(如神经网络构建、目标网络机制及经验回放池等),并配有详细的论文引用与运行指南。
DeepRL-TensorFlow2 特别适合高校学生、科研人员以及希望系统入门深度强化学习的开发者使用。对于想要深入理解算法底层原理而非仅仅调用黑盒工具的研究者而言,这是一个极佳的学习范本。项目持续更新且遵循 Apache 2.0 协议,让用户能在清晰易懂的代码环境中高效探索智能决策技术的奥秘。
使用场景
某高校人工智能实验室的研究生团队正致力于复现经典深度强化学习论文,以验证其在自定义机器人控制任务中的有效性。
没有 DeepRL-TensorFlow2 时
- 代码结构混乱:主流开源库往往将算法逻辑分散在数十个文件中,学生为了理解核心公式(如 DQN 的 Q 值更新),需要在不同模块间反复跳转,极易迷失方向。
- 环境配置繁琐:不同算法依赖不同版本的 TensorFlow 或 Gym,搭建实验环境时常遇到版本冲突,导致大量时间浪费在调试依赖而非研究算法上。
- 复现门槛极高:从阅读论文到写出可运行的代码通常需要数周时间,且难以保证实现细节与原文一致,严重拖慢了科研迭代进度。
- 缺乏统一标准:每个算法的代码风格迥异,难以进行公平的横向对比实验,增加了评估新策略性能的难度。
使用 DeepRL-TensorFlow2 后
- 单文件清晰实现:DeepRL-TensorFlow2 坚持“一个算法仅对应一个 Python 脚本”,核心思想(如神经网络构建、经验回放池)直观呈现,让学生能像阅读伪代码一样快速掌握精髓。
- 开箱即用的环境:基于统一的 TensorFlow 2.1 和 Gym 0.17.1 构建,无需复杂配置即可直接运行 DQN、PPO 等十多种算法,大幅降低了启动成本。
- 高效复现与验证:研究者可在几小时内完成从理论到代码的转化,迅速在 CartPole 等环境中验证想法,将精力集中在策略优化而非底层工程实现上。
- 标准化对比实验:所有算法采用一致的代码结构和接口,方便研究人员在同一框架下公平地对比不同策略的性能差异,加速科研产出。
DeepRL-TensorFlow2 通过将复杂的深度强化学习算法简化为易懂的单文件实现,成为了连接理论知识与工程实践的最佳桥梁,极大提升了学习与科研效率。
运行环境要求
未说明
未说明

快速开始
TensorFlow2中的深度强化学习
DeepRL-TensorFlow2 是一个使用 TensorFlow2 实现多种流行深度强化学习算法的仓库。该仓库的核心在于代码简洁易懂。因此,如果你是一名正在学习深度强化学习的学生或研究人员,我认为使用这个仓库将是最佳的学习选择。每个算法仅依赖于一个 Python 脚本文件,你无需在不同文件之间来回切换来研究特定的算法。此仓库会持续更新,并将继续添加新的深度强化学习算法。
算法
DQN
论文 《使用深度强化学习玩Atari游戏》
作者 Volodymyr Mnih, Koray Kavukcuoglu, David Silver, Alex Graves, Ioannis Antonoglou, Daan Wierstra, Martin Riedmiller
方法 离策略 / 时序差分 / 无模型
动作 仅离散
核心思想
# 思想01. 使用神经网络近似Q函数
def create_model(self):
model = tf.keras.Sequential([
Input((self.state_dim,)),
Dense(32, activation='relu'),
Dense(16, activation='relu'),
Dense(self.action_dim)
])
model.compile(loss='mse', optimizer=Adam(args.lr))
return model
# 思想02. 使用目标网络
self.target_model = ActionStateModel(self.state_dim, self.action_dim)
# 思想03. 使用回放缓冲区提高数据效率
class ReplayBuffer:
def __init__(self, capacity=10000):
self.buffer = deque(maxlen=capacity)
def put(self, state, action, reward, next_state, done):
self.buffer.append([state, action, reward, next_state, done])
def sample(self):
sample = random.sample(self.buffer, args.batch_size)
states, actions, rewards, next_states, done = map(np.asarray, zip(*sample))
states = np.array(states).reshape(args.batch_size, -1)
next_states = np.array(next_states).reshape(args.batch_size, -1)
return states, actions, rewards, next_states, done
def size(self):
return len(self.buffer)
开始使用
# 离散动作空间深度Q学习
$ python DQN/DQN_Discrete.py
DRQN
论文 《部分可观测马尔可夫决策过程的深度循环Q学习》
作者 Matthew Hausknecht, Peter Stone
方法 离策略 / 时序差分 / 无模型
动作 仅离散
核心思想
# 思想01. 使用LSTM层作为前一状态的特征
def create_model(self):
return tf.keras.Sequential([
Input((args.time_steps, self.state_dim)),
LSTM(32, activation='tanh'),
Dense(16, activation='relu'),
Dense(self.action_dim)
])
开始使用
# 离散动作空间深度循环Q学习
$ python DRQN/DRQN_Discrete.py
DoubleDQN
论文 《深度强化学习中的双Q学习》
作者 Hado van Hasselt, Arthur Guez, David Silver
方法 离策略 / 时序差分 / 无模型
动作 仅离散
核心思想
# 思想01. 解决了Q学习中的“高估”问题
on_action = np.argmax(self.model.predict(next_states), axis=1)
next_q_values = self.target_model.predict(next_states)[range(args.batch_size), on_action]
targets[range(args.batch_size), actions] = rewards + (1-done) * next_q_values * args.gamma
开始使用
# 离散动作空间双深度Q学习
$ python DoubleQN/DoubleDQN_Discrete.py
DuelingDQN
论文 《用于深度强化学习的决斗网络架构》
作者 Ziyu Wang, Tom Schaul, Matteo Hessel, Hado van Hasselt, Marc Lanctot, Nando de Freitas
方法 离策略 / 时序差分 / 无模型
动作 仅离散
核心思想
# 思想01. 将Q函数分解为价值函数和优势函数
def create_model(self):
backbone = tf.keras.Sequential([
Input((self.state_dim,)),
Dense(32, activation='relu'),
Dense(16, activation='relu')
])
state_input = Input((self.state_dim,))
backbone_1 = Dense(32, activation='relu')(state_input)
backbone_2 = Dense(16, activation='relu')(backbone_1)
value_output = Dense(1)(backbone_2)
advantage_output = Dense(self.action_dim)(backbone_2)
output = Add()([value_output, advantage_output])
model = tf.keras.Model(state_input, output)
model.compile(loss='mse', optimizer=Adam(args.lr))
return model
开始使用
# 离散动作空间决斗深度Q学习
$ python DuelingDQN/DuelingDQN_Discrete.py
A2C
论文 《演员-评论家算法》
作者 Vijay R. Konda, John N. Tsitsiklis
方法 在策略 / 时序差分 / 无模型
动作 离散、连续
核心思想
# 思想01. 使用优势函数降低方差
def advatnage(self, td_targets, baselines):
return td_targets - baselines
开始使用
# 离散动作空间优势演员-评论家
$ python A2C/A2C_Discrete.py
# 连续动作空间优势演员-评论家
$ python A2C/A2C_Continuous.py
A3C
论文 《深度强化学习的异步方法》
作者 Volodymyr Mnih, Adrià Puigdomènech Badia, Mehdi Mirza, Alex Graves, Timothy P. Lillicrap, Tim Harley, David Silver, Koray Kavukcuoglu
方法 在策略 / 时序差分 / 无模型
动作 离散、连续
核心思想
# 思想01. 引入多个并行代理以加速训练
def train_agent(agent_id):
while True:
state = env.reset()
episode_reward = 0
while not done:
action = agent.policy(state)
next_state, reward, done, info = env.step(action)
agent.remember(state, action, reward, next_state, done)
state = next_state
episode_reward += reward
agent.learn()
if episode_reward > threshold:
break
开始使用
# 离散动作空间异步演员-评论家
$ python A3C/A3C_Discrete.py
# 连续动作空间异步演员-评论家
$ python A3C/A3C_Continuous.py
DDPG
论文 《深度确定性策略梯度》
作者 Richard S. Sutton, Andrew G. Barto, Ian J. Goodfellow, Yoshua Bengio, Geoffrey Hinton
方法 在策略 / 时序差分 / 无模型
动作 仅连续
核心思想
# 思想01. 结合策略梯度和Q学习的优势
def train_actor():
while True:
state = env.reset()
while not done:
action = actor.predict(state)
next_state, reward, done, info = env.step(action)
critic.update(state, action, reward, next_state, done)
actor.update(state, action, reward, next_state, done)
state = next_state
if reward > threshold:
break
开始使用
# 连续动作空间深度确定性策略梯度
$ python DDPG/DDPG_Continuous.py
TD3
论文 《深度确定性策略梯度的改进版》
作者 David Silver, Koray Kavukcuoglu, Hado van Hasselt, Alex Graves, Timothy P. Lillicrap, Tim Harley, Richard S. Sutton, Andrew G. Barto
方法 在策略 / 时序差分 / 无模型
动作 仅连续
核心思想
# 思想01. 减少Q值估计中的偏差
def update_critic():
while True:
state = env.reset()
while not done:
action = actor.predict(state)
next_state, reward, done, info = env.step(action)
critic.update(state, action, reward, next_state, done)
state = next_state
if reward > threshold:
break
开始使用
# 连续动作空间深度确定性策略梯度改进版
$ python TD3/TD3_Continuous.py
SAC
论文 《软演员-评论家算法》
作者 Volodymyr Mnih, Koray Kavukcuoglu, David Silver, Alex Graves, Timothy P. Lillicrap, Tim Harley, Richard S. Sutton, Andrew G. Barto
方法 在策略 / 时序差分 / 无模型
动作 仅连续
核心思想
# 思想01. 平衡奖励最大化与策略多样性
def train_soft_actor():
while True:
state = env.reset()
while not done:
action = soft_actor.predict(state)
next_state, reward, done, info = env.step(action)
soft_critic.update(state, action, reward, next_state, done)
state = next_state
if reward > threshold:
break
开始使用
# 连续动作空间软演员-评论家
$ python SAC/SAC_Continuous.py
致谢
感谢所有为本项目做出贡献的开发者和研究人员!
想法01:通过异步运行多个工作进程来降低数据的相关性
def train(self, max_episodes=1000): workers = []
for i in range(self.num_workers):
env = gym.make(self.env_name)
workers.append(WorkerAgent(
env, self.global_actor, self.global_critic, max_episodes))
for worker in workers:
worker.start()
for worker in workers:
worker.join()
想法02:通过熵损失提高探索能力
entropy_loss = tf.keras.losses.CategoricalCrossentropy(from_logits=True)
#### 开始使用
```bash
# 离散动作空间异步优势演员-评论家算法
$ python A3C/A3C_Discrete.py
# 连续动作空间异步优势演员-评论家算法
$ python A3C/A3C_Continuous.py
PPO
论文 近端策略优化
作者 John Schulman、Filip Wolski、Prafulla Dhariwal、Alec Radford、Oleg Klimov
方法 在策略 / 时序差分 / 无模型
动作 离散、连续
核心思想
# 想法01:使用重要性采样,使其表现得像离策略算法
# 想法02:使用裁剪防止参数的剧烈变化。
def compute_loss(self, old_policy, new_policy, actions, gaes):
gaes = tf.stop_gradient(gaes)
old_log_p = tf.math.log(
tf.reduce_sum(old_policy * actions))
old_log_p = tf.stop_gradient(old_log_p)
log_p = tf.math.log(tf.reduce_sum(
new_policy * actions))
ratio = tf.math.exp(log_p - old_log_p)
clipped_ratio = tf.clip_by_value(
ratio, 1 - args.clip_ratio, 1 + args.clip_ratio)
surrogate = -tf.minimum(ratio * gaes, clipped_ratio * gaes)
return tf.reduce_mean(surrogate)
开始使用
# 离散动作空间近端策略优化
$ python PPO/PPO_Discrete.py
# 连续动作空间近端策略优化
$ python PPO/PPO_Continuous.py
DDPG
论文 深度强化学习中的连续控制
作者 Timothy P. Lillicrap、Jonathan J. Hunt、Alexander Pritzel、Nicolas Heess、Tom Erez、Yuval Tassa、David Silver、Daan Wierstra
方法 离策略 / 时序差分 / 无模型
动作 连续
核心思想
# 想法01:使用确定性演员模型
def create_model(self):
return tf.keras.Sequential([
Input((self.state_dim,)),
Dense(32, activation='relu'),
Dense(32, activation='relu'),
Dense(self.action_dim, activation='tanh'),
Lambda(lambda x: x * self.action_bound)
])
# 想法02:为动作添加噪声
action = np.clip(action + noise, -self.action_bound, self.action_bound)
开始使用
# 连续动作空间近端策略优化
$ python DDPG/DDPG_Continuous.py
TRPO
论文 信任域策略优化
作者 John Schulman、Sergey Levine、Philipp Moritz、Michael I. Jordan、Pieter Abbeel
方法 离策略 / 时序差分 / 无模型
动作 离散、连续
# 注:尚未实现!
TD3
论文 解决演员-评论家方法中的函数逼近误差
作者 Scott Fujimoto、Herke van Hoof、David Meger
方法 离策略 / 时序差分 / 无模型
动作 连续
# 注:尚未实现!
SAC
论文 软演员-评论家:带有随机演员的离策略最大熵深度强化学习
作者 Tuomas Haarnoja、Aurick Zhou、Pieter Abbeel、Sergey Levine
方法 离策略 / 时序差分 / 无模型
动作 离散、连续
# 注:尚未实现!
参考资料
- https://github.com/carpedm20/deep-rl-tensorflow
- https://github.com/Yeachan-Heo/Reinforcement-Learning-Book
- https://github.com/pasus/Reinforcement-Learning-Book
- https://github.com/vcadillog/PPO-Mario-Bros-Tensorflow-2
- https://spinningup.openai.com/en/latest/spinningup/keypapers.html
- https://github.com/seungeunrho/minimalRL
- https://github.com/openai/baselines
- https://github.com/anita-hu/TF2-RL
常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器
LLMs-from-scratch
LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备