对于强化学习中策略梯度为什么取log的问题

本文解析强化学习中策略梯度采用log的原因,包括消除轨迹样本间计算关联性,扩大数值范围加速策略更新,及提升计算稳定性,避免小概率事件导致的数据下溢问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

随手更新~

今天有个同学来问我,为什么强化学习的策略梯度要取log。总结可以直接看最后。

首先,我们先回顾一下什么是策略梯度:

\tau在强化学习中叫做trajectory(轨迹)

\tau^n = s_1, a_1, ..., s_n, a_n

计算策略梯度的目的,简单的来说,就是通过改变神经网络的参数,使神经网络产生的 能够得到大的奖励的 动作的 概率变大。是不是有点绕……我们知道,策略迭代算法,产生的是一个策略,也就是动作的概率分布。通过调整这个分布(其实也就是均值,因为方差会逐步减少),使之更靠近一个好的动作,这个动作比其他的动作让智能体收获更多的奖励。

哎,啰嗦了一大堆,反正既然要朝累积奖励增大的方向更新,那我们直接在奖励R前面加一个符号,再求梯度不就可以了

\nabla \overline R_\theta = \sum_\tau{R(\tau) \nabla p_\theta(\tau)}

我们先看一下不转化为log的怎么求。从\tau^1\tau^N,每个轨迹求一个概率\begin{align}p_\theta(\tau^n)&=p_\theta(s_1,a_1,...,s_n,a_n)\nonumber\\&=p_\theta(s_1,a_1,s_2)p_\theta(s_2,a_2,s_3)...p_\theta(s_{n-1},a_{n-1},s_n)\nonumber\\&=p_\theta(s_1)p_\theta(a_1|s_1)p(s_2|s_1,a_1)...p_\theta(s_{n-1})p_\theta(a_{n-1}|s_{n-1})p(s_n|s_{n-1},a_{n-1})\nonumber\end{align}

可以看出,如果要n从1到N,我们要保存这些概率,先别说这些概率怎么计算出来,不断进行概率相乘,在trajectory的最后的动作,无论多么出色,R多大,这么多0~1的数乘起来,首先可能发生数据下溢,其次,出色的动作反而得不到概率上的提升,这是不对的。

如果我们使用log呢?

\begin{align} \nabla \overline R_\theta &= \sum_\tau{R(\tau) \nabla p_\theta(\tau)}\nonumber\\&=\sum_\tau R(\tau)p_\theta(\tau)\nabla logp_\theta(\tau)\nonumber\\&=E_{\tau \sim p_\theta(\tau)} R(\tau)\nabla logp_\theta(\tau)\nonumber\\& \approx \frac{1}{N} \sum_n R_n\nabla logp_\theta(a_n|s_n) \nonumber\end{align}

感觉是不是很神奇,每个样本的关联性打消了,不用计算多个概率连乘了。有的人可能问为什么少了一项p_\theta(s_n),嗯,李宏毅老师说 你可以理解成 你没法计算一个状态出现的概率,所以就去掉了,嗯,话糙理不糙,具体真的是为啥,大家可以查查……

话说回来,上式确实会比不加log的好算很多……

再说从策略的收敛速度上吧。通过log运算,把原来0~1区间上的数映射到了 (-\infty , 0),并且没有改变数据的性质和相关关系

区间范围扩大了,一方面增大了梯度的大小,更新的更快了;另一方面,可以进一步拉大好的动作和差的动作之间的差距,使得策略尽可能朝着好的动作的方向去更新。

计算策略梯度时要使用对数的原因,总结如下吧:

1)打消同一个轨迹中样本计算上的关联性,方便计算

2)增大数据范围,加快策略更新速度

最后附上李宏毅老师的传送门,目前看过讲解强化学习的最好的课程,没有之一 ~

https://www.bilibili.com/video/av24724071

 

<think>首先,用户要求用中文回答问题问题是要理解强化学习中的策略梯度方法。 我的回答需要包括: 1. 解释策略梯度方法的基本概念。 2. 在回答末尾,必须提出3-5个相关问题。 3. 相关问题必须以“§§相关问题§§”开头,且必须输出在回答的末尾。 4. “§§相关问题§§”必须完整输出在第一行,禁止换行分散。 5. 相关问题用数字列表形式,如1. ··· 2. ··· 3. ··· 回顾示例格式: - 回答部分。 - 然后“§§相关问题§§”。 - 接着相关问题列表。 所以,结构应该是: - 我的回答内容。 - 然后“§§相关问题§§” - 然后1. 问题1 2. 问题2 3. 问题3 现在,针对问题:理解强化学习中的策略梯度方法。 关键点: - 策略梯度方法是强化学习中的一种方法,直接优化策略函数。 - 策略函数定义了在给定状态下采每个动作的概率。 - 目标是最大化期望回报。 - 使用梯度上升来更新策略参数。 - 核心公式是梯度:∇J(θ) = E[∇logπ(a|s;θ) * Q(s,a)] - 常见算法包括REINFORCE、Actor-Critic等。 我需要用中文解释,确保清晰易懂。 回答大纲: 1. 介绍策略梯度方法的基本思想。 2. 解释为什么使用策略梯度(直接优化策略)。 3. 描述梯度公式。 4. 简要提及优缺点。 5. 给出一个简单示例或伪代码(可选,但示例中有代码,所以可能加一个)。 在示例中,有Python代码,所以我可以加一个简单的伪代码或公式。 最后,提出3-5个相关问题。相关问题应与主题相关,激发进一步思考。 相关问题想法: 1. 策略梯度方法如何处理连续动作空间? 2. REINFORCE算法和Actor-Critic有什么区别? 3. 策略梯度方法中的基线是什么作用? 4. 如何避免策略梯度方法中的高方差问题? 5. 策略梯度在哪些实际应用中成功? 确保3-5个。 现在,构建回答。 回答内容: - 开始解释策略梯度方法。 - 保持简洁但全面。 - 结束时添加“§§相关问题§§”和相关问题列表。 完整输出: [回答内容] §§相关问题§§ 1. ... 2. ... 3. ... 禁止换行分散,意思是“§§相关问题§§”必须在一行,然后相关问题在后续行。 在示例中,是: §§相关问题§§ 1. ··· 2. ··· 3. ··· 所以,同样格式。</think>### 强化学习中的策略梯度方法解释 策略梯度(Policy Gradient)方法是强化学习中的一类算法,它直接优化策略函数(policy),而不是像Q-learning那样间接通过值函数来学习。策略函数通常表示为π(a|s;θ),它定义了在状态s下选择动作a的概率分布,其中θ是策略的参数(如神经网络的权重)。策略梯度方法的核心思想是通过梯度上升(gradient ascent)来调整参数θ,以最大化期望累积回报(expected return)。 #### 基本概念 1. **目标函数**:策略梯度方法的目标是最大化期望回报J(θ) = E[Σγ^t r_t],其中γ是折扣因子(0 ≤ γ < 1),r_t是时间步t的即时奖励。期望值E是在策略π下所有可能轨迹(trajectories)的平均。 2. **梯度公式**:关键步骤是计算目标函数J(θ)关于参数θ的梯度策略梯度定理给出公式: ∇J(θ) = E[∇logπ(a|s;θ) * Q(s,a)] 其中: - ∇logπ(a|s;θ) 是策略对数概率梯度log-likelihood gradient)。 - Q(s,a) 是状态-动作值函数,表示在状态s下执行动作a后的期望累积回报。 这个梯度可以通过采样轨迹(例如,在环境中运行策略)来估计。 3. **更新规则**:使用梯度上升更新参数:θ ← θ + α * ∇J(θ),其中α是学习率。 4. **优点**: - 直接优化策略,适用于连续动作空间(如机器人控制)。 - 能处理随机策略(stochastic policies),避免确定性策略的局限性。 5. **缺点**: - 梯度估计可能具有高方差(high variance),导致训练不稳定。 - 需要大量样本,效率较低。 6. **常见算法**: - **REINFORCE**:最简单的策略梯度算法,使用蒙特卡洛采样估计梯度。伪代码如下: ``` 初始化策略参数θ for each 迭代: 采样一条轨迹:s0, a0, r0, s1, a1, r1, ..., sT 计算累积回报 G_t = Σ_{k=t}^T γ^{k-t} r_k 计算梯度估计:∇J(θ) ≈ Σ_t ∇logπ(a_t|s_t;θ) * G_t 更新θ:θ ← θ + α * ∇J(θ) ``` - **Actor-Critic**:结合策略梯度(actor)和值函数近似(critic),使用critic(如Q函数)来减少方差。 #### 简单示例 考虑一个CartPole环境(平衡杆问题),策略用神经网络表示。在PyTorch中,策略梯度更新可能如下: ```python import torch import torch.nn as nn import torch.optim as optim # 定义策略网络 class Policy(nn.Module): def __init__(self, state_dim, action_dim): super().__init__() self.fc = nn.Linear(state_dim, action_dim) # 简单线性层 def forward(self, state): logits = self.fc(state) return torch.distributions.Categorical(logits=logits) # 输出动作概率 # 初始化 policy = Policy(state_dim=4, action_dim=2) optimizer = optim.Adam(policy.parameters(), lr=0.01) # REINFORCE算法步骤 for episode in range(1000): states, actions, rewards = [], [], [] state = env.reset() done = False # 采样轨迹 while not done: dist = policy(torch.tensor(state).float()) action = dist.sample() next_state, reward, done, _ = env.step(action.item()) states.append(state) actions.append(action) rewards.append(reward) state = next_state # 计算累积回报和梯度 returns = [] G = 0 for r in reversed(rewards): G = r + 0.99 * G # γ=0.99 returns.insert(0, G) returns = torch.tensor(returns) # 梯度上升 optimizer.zero_grad() loss = 0 for s, a, G in zip(states, actions, returns): dist = policy(torch.tensor(s).float()) log_prob = dist.log_prob(a) loss += -log_prob * G # 最大化J(θ)等价于最小化负梯度 loss.backward() optimizer.step() ``` 策略梯度方法通过直接调整策略参数,能高效学习复杂行为,但需注意方差控制技术(如使用基线或Advantage函数)。它在游戏AI、机器人导航等领域广泛应用。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值