【强化学习】Actor-Critic算法

最近读论文看到了强化学习中的Actor-Critic算法。因此了解一下这方面的知识,并记录下来,以防忘记。文章中部分内容也借鉴了其他优秀的博主。

文章目录

  • 一、简介
  • [二、策略梯度法(Policy Gradient)](#二、策略梯度法(Policy Gradient))
  • 三、Q-Learning
  • [四、Actor-Critic 算法](#四、Actor-Critic 算法)

一、简介

Actor-Critic 算法是一种综合了策略迭代和价值迭代的集成算法。Actor是利用策略梯度算法 实现,Critic使用时序差分实现。Actor-Critic 算法的组成部分为:

  • Actor(策略网络):Actor是策略函数 π θ ( s ) π_θ(s) πθ(s),是一个神经网络,它负责在给定状态下选择动作,输出每个动作的概率分布。该网络的训练目标是最大化累计回报的期望。

    Critic(价值网络):Critic是值函数 V π ( s ) V_π(s) Vπ(s),也是一个神经网络,它估计给定状态的价值(状态值)或某个特定动作的价值(动作值)。

二、策略梯度法(Policy Gradient)

策略梯度方法的核心思想是直接优化策略,而不是通过估计价值函数间接优化策略。

具体推导可参考这篇文章:【详解+推导!!】Policy Gradient 策略梯度法

策略梯度法的主要过程是:

  1. 初始化一个策略网络 θ θ θ
  2. 用这个策略网络进行 N N N次游戏,产生 N N N个 τ τ τ
  3. 利用这 N N N个 τ τ τ进行梯度上升,调整策略网络的参数:
  4. 再如此重复2、3步。

三、Q-Learning

Q-learning 是一种无模型的、基于价值的强化学习算法,旨在通过学习 Q 值函数来找到最优策略。Q-learning 不需要环境的模型(即不知道状态转移概率),它通过与环境交互获得奖励信息来进行学习。

具体推导可参考这篇文章:Q Learning概念、更新、代码实现,文章讲得很直白易懂。

大致过程如下:

四、Actor-Critic 算法

具体可以看这篇文章,我认为比较好懂:【深度强化学习】(4) Actor-Critic 模型解析,附Pytorch完整代码

Actor网络的优化目标如下:
L a c t o r = 1 N ∑ i N l o g π ∗ ( s t , a t ) ( G t − V ( s t ) ) L_{actor} = \frac{1}{N}\sum_{i}^Nlogπ_*(s_t,a_t)(G_t-V(s_t)) Lactor=N1i∑Nlogπ∗(st,at)(Gt−V(st))

我的理解:

(1) π ∗ π_* π∗代表最优策略, π ∗ ( s t , a t ) π_*(s_t,a_t) π∗(st,at)表示在状态 s t s_t st选择动作 a t a_t at的概率.

(2) G t G_t Gt表示从时间步𝑡开始的 实际累积回报(Return), V ( s t ) V(s_t) V(st)状态值函数,即从状态 s t s_t st出发按照当前策略 𝜋 所能期望获得的未来累积奖励的估计值。它通常通过一个神经网络来估计,即价值网络(Critic)。

(3) G t − V ( s t ) G_t-V(s_t) Gt−V(st)反映了当前策略与目标策略之间的差异,是一个 优势函数(Advantage Function) 的估计,即 当前实际获得的回报与模型估计的回报之间的差异。当这个差值大于0时,说明实际回报高于预期,表明选择了一个好的动作;反之,当这个差值小于0时,说明实际回报低于预期,表明选择了一个较差的动作。

(4)在实际代码实现中,很难直接获得真正的实际累积回报 G t G_t Gt(特别是在长期任务或持续任务中,因为需要积累未来所有的奖励)。因此,通常会使用 时序差分(TD)误差作为 G t − V ( s t ) G_t-V(s_t) Gt−V(st)的近似替代来估计优势函数。时序差分误差的定义:

Critic网络的优化目标如下:

Critic 网络的损失函数计算公式采用均方误差损失函数,即 TD 误差值的累计平方值的均值
L c r i t i c = 1 N ∑ i N ( G t − V ( s t ) ) L_{critic} = \frac{1}{N}\sum_{i}^N(G_t-V(s_t)) Lcritic=N1i∑N(Gt−V(st))

相关推荐
luoganttcc1 分钟前
华为昇腾(Ascend)等芯片,同样存在“寄存器 / 片上存储资源限制并发”的问题
算法·华为
Foreer黑爷5 分钟前
Java并发工具箱:CountDownLatch与CyclicBarrier使用指南
java·开发语言·jvm
小O的算法实验室7 分钟前
2025年SEVC,神经-粒子群算法+大规模动态优化,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
wayz117 分钟前
Day 7:第一周复习与模型综合比较
人工智能·算法·机器学习·量化交易
玛丽莲茼蒿8 分钟前
Leetcode hot100 买卖股票的最佳时机【简单】
算法·leetcode·职场和发展
syker10 分钟前
AIFerric v2.0 项目总结报告
c语言·开发语言·c++
阿Y加油吧16 分钟前
两道 LeetCode 题的复盘笔记:从「只会暴力」到「懂优化」
笔记·算法·leetcode
周杰伦fans21 分钟前
C# CAD二次开发:RotatedDimension 文字边框设置完全指南
开发语言·c#
万世浮华戏骨26 分钟前
PHP 与数据库交互 与 SQL注⼊漏洞
数据库·sql·php
蚰蜒螟32 分钟前
从 pthread_create 到 thread_native_entry:glibc 如何唤醒 Java 线程
java·开发语言