郭震 AI公众号:郭震AI

23 REINFORCE算法

发布日期:

最近更新:

分类: 强化学习

预计阅读: 3 分钟

阅读次数: 0

预计阅读3 分钟
结构重点4 个
图文要点6 张
正文规模1.4k 字

整理说明

这篇内容怎么整理

郭震 · 2026-06-04

独立整理围绕 4 个结构重点拆成环境、步骤、验证点和常见误区,尽量让读者能照着复现。
图文对照保留 6 张和配置、流程、判断结果有关的图片,方便快速定位正文重点。
持续校对工具、模型和命令变化较快,后续优先修正入口、参数和风险提醒。

阅读路线

先按这条路线读

先抓住主线,再回到代码、配置和图文细节,读起来会更稳。

图文要点

先看本文图文节点

按图先建立主线,再跳回正文核对步骤、配置和判断标准。

REINFORCE算法结构图查看大图
REINFORCE算法结构图

强化学习的核心是智能体在环境中试错,学习时要同时看状态、动作、奖励和策略更新。阅读时可以按「REINFORCE算法概述 -> 算法步骤 -> 案例:CartPole环境中的REINFORCE实现 -> 状态动作」建立结构,再回到正文里的代码、案例或指标做验证。

REINFORCE算法核对图查看大图
REINFORCE算法核对图

读完后,用一个真实小任务复查:输入是什么,处理环节在哪里,输出是否可验收;失败时先查「REINFORCE算法概述」,再查「算法步骤」。

在上篇中,我们探讨了策略梯度方法的基本概念,了解了如何通过优化策略函数来提升智能体的表现。接下来,我们将深入研究一种具体的策略梯度方法——REINFORCE算法。这是一种基于蒙特卡罗方法的策略梯度算法,适合用于离线学习任务。

REINFORCE算法概述

REINFORCE算法主要用于通过直接调整策略来最大化预期的回报。该算法的基本思想是:在探索环境后,通过收集的经验来更新策略。它使用蒙特卡罗方法计算每个状态的期望回报,从而实现策略优化。

REINFORCE算法要点判断卡查看大图
REINFORCE算法要点判断卡

读这篇时,可以把「REINFORCE算 -> 算法步骤 -> 案例:CartPol -> 复查」当成一条检查线:先看对象、路径和证据,再回到案例、代码或指标里复查。

算法步骤

  1. 初始化策略参数 θ\theta
  2. 生成一条完整的轨迹(即,从环境中收集一系列状态、动作、奖励的序列)。
  3. 对于轨迹中的每一步,计算回报:
    • 对于每个时间步 tt,根据之后的奖励计算从时间步 tt 到终止时刻的折扣回报 GtG_t
    Gt=Rt+γRt+1+γ2Rt+2+G_t = R_t + \gamma R_{t+1} + \gamma^2 R_{t+2} + \cdots 这里,RtR_t 是时间步 tt 的奖励,γ\gamma 是折扣因子。
  4. 更新策略参数
    • 使用每个状态动作对的回报 GtG_t 来更新参数:
θθ+αθlogπθ(atst)Gt\theta \gets \theta + \alpha \nabla_{\theta} \log \pi_{\theta}(a_t | s_t) G_t 其中 α\alpha 是学习率,πθ(atst)\pi_{\theta}(a_t | s_t) 是在状态 sts_t 选择动作 ata_t 的概率。

案例:CartPole环境中的REINFORCE实现

让我们以OpenAI Gym中的CartPole环境为例,展示如何实现REINFORCE算法。

import numpy as np
import gym

# 策略网络的简单实现
class PolicyNetwork:
    def __init__(self, input_dim, output_dim, learning_rate=0.01):
        self.input_dim = input_dim
        self.output_dim = output_dim
        self.learning_rate = learning_rate
        self.weights = np.random.rand(input_dim, output_dim)  # 权重初始化

    def predict(self, state):
        """根据状态预测动作的概率分布"""
        z = np.dot(state, self.weights)
        exp_z = np.exp(z - np.max(z))  # 数值稳定性
        return exp_z / exp_z.sum()

    def update(self, states, actions, rewards):
        """更新策略"""
        for t in range(len(states)):
            state = states[t]
            action = actions[t]
            G_t = sum(rewards[t + k] * (0.99 ** k) for k in range(len(rewards) - t))  # 计算折扣回报
            
            # 使用REINFORCE更新公式
            log_prob = np.log(self.predict(state)[action])
            self.weights += self.learning_rate * log_prob * G_t * state  # 更新权重

# REINFORCE算法主循环
def reinf_force():
    env = gym.make('CartPole-v1')
    policy_net = PolicyNetwork(input_dim=4, output_dim=2)
    
    for episode in range(1000):
        state = env.reset()
        states, actions, rewards = [], [], []
        
        done = False
        while not done:
            prob = policy_net.predict(state)
            action = np.random.choice(range(prob.size), p=prob)  # 根据概率选择动作
            next_state, reward, done, _ = env.step(action)
            
            states.append(state)
            actions.append(action)
            rewards.append(reward)
            state = next_state
        
        # 更新策略
        policy_net.update(np.array(states), np.array(actions), np.array(rewards))

    env.close()

reinf_force()

在这个示例中,PolicyNetwork类实现了一个简单的线性政策网络,并定义了update方法来更新策略。在主循环reinf_force()中,我们收集了状态、动作和奖励,并在每一回合结束时根据REINFORCE算法更新策略。

REINFORCE算法应用复盘卡查看大图
REINFORCE算法应用复盘卡

如果《REINFORCE算法》还没完全消化,可以从这张卡片的四个动作重新走一遍。

REINFORCE算法应用检查卡查看大图
REINFORCE算法应用检查卡

回看《REINFORCE算法》时,不必一次做大项目,先用一条简单样例确认主线是否清楚。

小结

在本节中,我们详细探讨了REINFORCE算法的原理及其在CartPole环境中的实现。通过该算法,智能体能够通过接收到的奖励来优化其策略。接下来,我们将讨论有关优势函数的主题,以及如何进一步改进策略梯度方法的性能。 强化学习阅读地图卡

读《REINFORCE算法》时,可以先看配图里的任务、概念、练习和判断点,再回到正文补细节。这样更容易判断这篇内容能放到哪个真实场景里。

继续阅读

从这篇继续找到相关教程

AI 教程总索引

常见问题

读前先确认这三点

REINFORCE算法适合谁读?

这是 强化学习入门 系列第 23 / 28 篇,适合正在学习强化学习入门,并且需要把概念落到操作步骤或判断标准里的读者。

读这篇强化学习入门教程要多久?

按中文技术文章阅读速度估算,通读大约 3 分钟;如果要跟着复现,建议把命令、配置和结果检查分开做。

这篇文章里的图文节点怎么用?

正文里有 6 个图文节点,可以先用它们抓住流程、配置和判断点,再回到对应段落细读。

分享文章

转发到常用平台

微信/朋友圈可先复制链接

相关教程

AI 教程总索引

继续阅读

继续找到相关 AI 教程

返回栏目

Reader Messages

读者留言

有问题、补充资料或实测结果,可以直接留下。这里不需要登录。

最多 800 字

为了防刷,每条留言会做长度、链接数量和提交频率限制。

0/800

留言列表

0
正在加载留言...