《强化学习:原理与Python实现》更新与勘误

(2019年11月第1版第2次印刷)

Gym 0.25版本更新了API,GitHub代码已相应更新。代码以GitHub上为准。

行数计算方法

本勘误文档中,行数计算“第i行”(i=0,1,2,)是从0开始计数的。小节标题、公式、内联代码、注意、本章要点记入行数,章标题、图、表、代码清单及它们的题注不计入行数。空行不计入行数。

第11页第17行

动作空间是Disrete(3)

改为

动作空间是Discrete(3)

第17页第6行

作者注: “轨道”又称为“轨迹”。本书中这两个词混用。

第20页第2行

作者注: 这种带折扣的回报定义既可以用于回合制任务,也可以用于连续性任务,是一种统一的表示。

第20页第9行

R¯=limt+E[1tτ=0tRτ]

改为

R¯=limt+E[1tτ=1tRτ]

第22页图2-2b)中图注

vπ(𝘴)

改为

vπ(𝘴)

第24页代码清单2-1代码最后一行

代码改为

第28页第0行

Δ=(1γ)(1(1αxβy))>0

改为

Δ=(1γ)(1(1αxβy)γ)>0

第28页第1行

分母部分

改为

分子部分

第29页正文第2行

γ<14β1α

改为

γ14β1α

第30页

作者注:用线性规划求解最优状态价值的详细证明可见《Markov Decision Processes: Discrete Stochastic Dynamic Programming》(Martin Puterman)的第6.9节。证明大致如下:当c(𝘴)为Markov决策过程的初始状态分布时,原问题和对偶问题的目标都是Markov决策过程的平均回合奖励,原问题的最优解是最优状态价值。对c(𝘴)做灵敏度分析可知,无论c(𝘴)取什么分布,对偶问题均有解(这利用到对偶问题的可行域就是带折扣的状态动作对组成的分布所在的空间),所以原问题的最优解都是不变的。也就是说,Markov决策过程的最优状态价值和初始状态分布无关。进一步,可以在原问题中放宽𝘴c(𝘴)=1这个限制,原问题的解依然不变,只是优化目标进行了放缩。

第33页第6行

Bellmn期望方程为

改为

Bellman期望方程为

第33页第11行

Bellan期望方程:

改为

Bellman期望方程:

第33页代码清单2-6题注

用Bellman方差求解

改为

用Bellman方程求解

第34页第9行

计算这个动态规划问题

改为

计算这个线性规划问题

第39页第1行

v(𝘴)

改为

v(𝘴)

第39页第25行

(fix point)

改为

(fixed point)

第42页第9行

对于两个确定性的策略

改为

对于策略

第48页3.5节

作者注:Gym 0.19版本将FrozenLake-v0改为FrozenLake-v1。

作者注:Gym 0.22删除了DiscreteEnv类,所以env.unwrapped.nS和env.unwrapped.nA不再可用。建议用env.observation_space.n替换env.unwrapped.nA,用env.action_space.n替换env.unwrapped.nA。

第50页第4行

这个函数使用theta作

改为

这个函数使用tolerant作

第54页第15行

1ci=1cgc

改为

1ci=1cgi

第56页第10行

同时满足{αk:k=1,2,}

改为

{αk:k=1,2,}同时满足

第57页算法4-2第1步,第58页算法4-4第1步(共2处)

初始化动作价值估计

改为

初始化状态价值估计

第58页最后一行

𝘴

改为

𝘴

第61页第4行

qπ(𝘴,𝘢)=ε|A(𝘴)|𝘢qπ(𝘴,𝘢)+(1ε)max𝘢qπ(𝘴,𝘢)

改为

𝘢π(𝘢|𝘴)qπ(𝘴,𝘢)=ε|A(𝘴)|𝘢qπ(𝘴,𝘢)+(1ε)max𝘢qπ(𝘴,𝘢)

第61页算法4-6第2.3.3步

π(𝘈|𝘚t)(1ε)

改为

π(𝘈|𝘚t)π(𝘈|𝘚t)+(1ε)

第64页第3行

vv+1c(gv)

改为

vv+ρc(gv)

第64页第7行

vv+ρc(ρgv)

改为

vv+1c(ρgv)

第64页算法4-7第2.4.2步

w[Gq(𝘚t,𝘈t)]2

改为

ρ[Gq(𝘚t,𝘈t)]2

第65页算法4-8第2.2步

𝘚0,𝘈0,R1,𝘚1,𝘈1,R1,,𝘚T1,𝘈T1,RT,𝘚T

改为

𝘚0,𝘈0,R1,𝘚1,𝘈1,R2,,𝘚T1,𝘈T1,RT,𝘚T

第66页4.3节

作者注:Gym 0.20版本将Blackjack-v0改为Blackjack-v1。

第67页第3行

范围为3~21的int型数值

改为

范围为4~21的int型数值

第67页第5行

是有将1张A牌计算为11点。

改为

是否将1张A牌计算为11点。

第71页第7行

最优价值和最优价值函数

改为

最优策略和最优价值函数

第72页4.3.4节正文第1行,第73页正文第0行

evaluate_action_monte_carlo_importance_resample

改为

evaluate_monte_carlo_importance_sample

第72页代码清单4-7第0行,第73页正文第7行

evaluate_monte_carlo_importance_resample

改为

evaluate_monte_carlo_importance_sample

第73页代码清单4-8第0行,第74页正文第0行,第74页正文第3行

monte_carlo_importance_resample

改为

monte_carlo_importance_sample

第75页第8行

ρt:T1=k=tT1π(𝘈t|𝘚t)b(𝘈t|𝘚t)

改为

ρt:T1=τ=tT1π(𝘈τ|𝘚τ)b(𝘈τ|𝘚τ)

第79页算法5-2第2.1步

2.1(初始化状态动作对)

改为

2.1(初始化状态)

第81页算法5-4输出

输出:动作价值估计

改为

输出:状态价值估计

第85页算法5-10输入

输入:环境(无数学描述)、策略π

改为

输入:环境(无数学描述)、如果是策略评估还需要输入策略π

第85页算法5-10输出

若是最优策略控制则还是输出策略

改为

若是最优策略控制则还要输出策略

第85页算法5-10第2.3.1步

根据π(𝘚t+n)决定

改为

根据b(𝘚t+n)决定

第87页第14行

使得从𝘴状态更倾向于选择

改为

使得从𝘴开始更倾向于选择

第88页算法5-12第2.1步

2.1(初始化状态动作对)

改为

2.1(初始化状态)

第88页算法5-12第2.2.4步

UR+γq(1i)(𝘚t+1,argmax𝘢q(i)(𝘚t+1,𝘢))

改为

UR+γq(1i)(𝘚,argmax𝘢q(i)(𝘚,𝘢))

第90页第13行

对的单步自益结果

改为

的单步自益结果

第91页算法5-13参数部分、第92页算法5-14参数部分

参数:资格迹参数β

改为

参数:资格迹参数λβ

第91页算法5-13第2.3.5步

改为

2.3.5(更新价值)q(𝘴,𝘢)q(𝘴,𝘢)+αe(𝘴,𝘢)[Uq(𝘚,𝘈)],𝘴S,𝘢A(𝘴);

第91页算法5-13第2.3.6步

退出2.2步

改为

退出2.3步

第92页算法5-14第2.1-2.2步

2.1(初始化资格迹)c(𝘴)0,𝘴S

2.2(初始化状态动作对)选择状态𝘚

改为

2.1(初始化资格迹)e(𝘴)0,𝘴S

2.2(初始化状态)选择状态𝘚

第92页算法5-14第2.3.3步

𝘴S,𝘢A

改为

𝘴S

第92页算法5-14第2.3.5步

改为

2.2.5(更新价值)v(𝘴)v(𝘴)+αe(𝘴)[Uv(𝘚)],𝘴S

第96页代码清单5-6第14行

改为

第98页第2行

DoubleQLearnignAgent

改为

DoubleQLearningAgent

第100页第12行

Ut(i)=Rt+1+γq(i)(𝘚t+1,argmax𝘢q(1i)(𝘚t+1,𝘢))

改为

Ut(i)=Rt+1+γq(1i)(𝘚t+1,argmax𝘢q(i)(𝘚t+1,𝘢))

第100页第16行

形式为Ut=Rt+1+q(𝘚t+1,𝘈t+1)

改为

形式为Ut=Rt+1+γq(𝘚t+1,𝘈t+1)

第102页第12行

t=0T[Gtv(𝘚t;w)]2

改为

t=0T1[Gtv(𝘚t;w)]2

第104页算法6-4第2.1步

2.1(初始化状态动作对)选择状态𝘚,再根据输入策略π选择动作𝘈

改为

2.1(初始化状态)选择状态𝘚

第104页算法6-4第2.2.3步、第106页算法6-6第2.3.3步(共2处)

删去此步

第104页算法6-4第2.2.4步、第106页算法6-6第2.3.4步(共2处)

如果是动作价值评估

改为

如果是状态价值评估

第104页算法6-4第2.2.5步,第106页算法6-6第2.3.6步(共2处)

(更新动作价值函数)

改为

(更新价值函数)

第105页算法6-5第2.1步

增加

初始化资格迹z0

第106页算法6-6第2.1~2.2步

2.1(初始化资格迹)z0

2.2(初始化状态动作对)选择状态𝘚,再根据输入策略π选择动作𝘈

改为

2.1(初始化资格迹)z0

2.2(初始化状态)选择状态𝘚

第109页算法6-7第2.2步

决定确定性策略

改为

决定策略

第111页算法6-8第2.1步、第113页算法6-9第2.1步(共2处)

2.1(初始化状态动作对)

改为

2.1(初始化状态)

第114页第5行

算法6-10

改为

算法6-9

第114页6.4.4节

本节将“duel network”译作“对偶网络”有误。可译为“决斗网络”。相应的“对偶Q网络”、“对偶深度Q网络”可改为“决斗Q网络”、“决斗深度Q网络”。

第118页

作者注:

砖瓦编码是一种历史悠久的特征构造方法,可用于回归、分类等问题。目前学术界倾向于用神经网络代替砖瓦编码来构造特征。由于砖瓦编码和强化学习没有直接关联,本书没有用过多的篇幅介绍砖瓦编码。

实际使用砖瓦编码时,不需要精确计算砖瓦的数量,常随意的大致估计砖瓦的数量作为特征数。如果设置的特征数大于真实的砖瓦数量,那么有些特征永远不会取到,有些浪费;如果设置的特征数小于真实的砖瓦数量,那么有多个砖瓦需要共享特征,具体逻辑可以见代码清单6-3中“冲突处理”部分。这些浪费和冲突往往不会造成明显的性能损失。

第118页砖瓦数计算:每个大网格的网格宽度刚好是整个取值范围的1/8。所以,第0层大网格每个维度有8个大网格;第1~7层由于有偏移,每个维度需要有9个大网格才能覆盖整个取值范围。第117页图6-3b的情况略有不同:这个图中每个维度的取值范围不是大网格的长度的整数倍。所以有些层偏移后,不需要更多的大网格也可以覆盖整个取值范围。

第126页第10行

再配合其他一些容易活动的

改为

再配合其他一些容易获得的

第126页最后一行

=𝘴Pr[𝘚t=𝘴]vπ(θθ)(𝘚t)

改为

=𝘴Pr[𝘚t=𝘴]vπ(θθ)(𝘴)

第127页第10行

=E[𝘢qπ(θθ)(𝘚0,𝘢)π(𝘢|𝘚0;θθ)]+E[𝘢γqπ(θθ)(𝘚1,𝘢)π(𝘢|𝘚1;θθ)]+γ2E[vπ(θθ)(𝘚1)]

改为

=E[𝘢qπ(θθ)(𝘚0,𝘢)π(𝘢|𝘚0;θθ)]+E[𝘢γqπ(θθ)(𝘚1,𝘢)π(𝘢|𝘚1;θθ)]+γ2E[vπ(θθ)(𝘚2)]

第127页第18行

=E[γtqπ(θθ)(𝘚t,𝘈t)π(𝘈t|𝘚t;θθ)]

改为

=E[γtqπ(θθ)(𝘚t,𝘈t)lnπ(𝘈t|𝘚t;θθ)]

第127页第20行

E[𝘢γtqπ(θθ)(𝘚t,𝘢)π(𝘢|𝘚t;θθ)]=E[γtqπ(θθ)(𝘚t,𝘈t)π(𝘈t|𝘚t;θθ)]=E[γtGtπ(𝘈t|𝘚t;θθ)]

改为

E[𝘢γtqπ(θθ)(𝘚t,𝘢)π(𝘢|𝘚t;θθ)]=E[γtqπ(θθ)(𝘚t,𝘈t)lnπ(𝘈t|𝘚t;θθ)]=E[γtGtlnπ(𝘈t|𝘚t;θθ)]

第128页第10行

增量αγtGtπ(𝘈t|𝘚t;θθt)

改为

增量αγtGtπ(𝘈t|𝘚t;θθ)

第128页算法7-1输入和第130页算法7-2输入(共2处)

输入:环境(无数学描述)、策略π

改为

输入:环境(无数学描述)。

第128页算法7-1第2步和第130页算法7-2第2步(共2处)

2.(时序差分更新)

改为

2.(回合更新)

第129页第10~12行

=𝘢γt(GtB(𝘚t))π(𝘈t|𝘚t;θθ)

=𝘢γtGtπ(𝘢|𝘚t;θθ)

=E[γtGtπ(𝘢|𝘚t;θθ)]

改为

=𝘢γt(GtB(𝘚t))π(𝘢|𝘚t;θθ)

=𝘢γtGtπ(𝘢|𝘚t;θθ)

=E[γtGtπ(𝘈t|𝘚t;θθ)]

第129页第15行

随机变量B(𝘚)=τ=1t1γτtRτ

改为

随机变量B(𝘚)=τ=0t1γτtRτ+1

第130页算法7-2第2.3.3步

更新θθ以减小γt[Gv(𝘚t;w)]lnπ(𝘈t|𝘚t;θθ)

改为

更新θθ以减小γt[Gv(𝘚t;w)]lnπ(𝘈t|𝘚t;θθ)

第131页算法7-3第2.3步

2.3(初始化回报和权重)

改为

2.3(初始化回报)

第137页代码清单7-1中learn()函数

改为

第139页第17行

减了基线b(𝘴)=vπ(𝘴)

改为

减去基线B(𝘴)=vπ(𝘴)

第139页第18行

加上基线b(𝘴)=vπ(𝘴)

改为

减去基线B(𝘴)=vπ(𝘴)

第140页第4行

Rt+1+vπ(𝘚t+1;w)

改为

Rt+1+γvπ(𝘚t+1;w)

第140页算法8-1第2.3.1步

得到采样R

改为

得到奖励R

第142页算法8.3第2.3.2步

作者注:这里的更新式子遵循了论文原文而没有考虑累积折扣。推导出现折扣是正确的;更新时考虑折扣也是正确和合理的。

第143页第5行,第143页算法8.4第2.3.4步(共2处)

lnπ(𝘈𝘚;w)

改为

lnπ(𝘈𝘚;θθ)

第144页第7~11行

Eπ(θθ)[t=0+γtaπk(𝘚t,𝘈t)]

=Eπ(θθ)[t=0+γt(Rt+γvπ(θθk)(𝘚t+1)vπ(θθk)(𝘚t))]

=Eπ(θθ)[vπ(θθk)(𝘚0)+t=0+γtRt]

=E𝘚0[vπ(θθk)(𝘚0)]+Eπ(θθ)[t=0+γtRt]

=Eπ(θθk)[G0]+Eπ(θθ)[G0].

改为

Eπ(θθ)[t=0+γtaπ(θθk)(𝘚t,𝘈t)]

=Eπ(θθ)[t=0+γt(Rt+1+γvπ(θθk)(𝘚t+1)vπ(θθk)(𝘚t))]

=Eπ(θθ)[vπ(θθk)(𝘚0)+t=0+γtRt+1]

=E𝘚0[vπ(θθk)(𝘚0)]+Eπ(θθ)[t=0+γtRt+1]

=Eπ(θθk)[G0]+Eπ(θθ)[G0].

第144页第15行和第18行(共2处)

E𝘚t,𝘈tπ(θθ)[aπk(𝘚t,𝘈t)]

改为

E𝘚t,𝘈tπ(θθ)[aπ(θθk)(𝘚t,𝘈t)]

第146页算法8-5第2.3步

更新θθ以减小

改为

更新θθ以增大

第147页图8-1中间线的注记

l(θθ)

改为

l(θθ)

第148页第8行

J. Kakade在文章《Anatural policy gradient》

改为

S. Kakade在文章《A natural policy gradient》

第149页第9行

如果它们满足piFpj=0

改为

如果它们满足piTFpj=0

第150页第9行

αk(12(xk+αkpk)TF(xk+αkpk)gT(xk+αpk))=αkpkTFpkpkT(Fxkg)

改为

αk(12(xk+αkpk)TF(xk+αkpk)gT(xk+αkpk))=αkpkTFpk+pkT(Fxkg)

第150页第11行

αk=pkT(Fxkg)pkTFpk

改为

αk=pkT(gFxk)pkTFpk

第150页算法8-7第2.1步

2.1 zFx

改为

2.1 zFp

第154页算法8-10第2.2步

2.2(决定初始动作)用b(|𝘚)得到动作𝘈

改为

2.2(决定初始状态动作对)选择状态𝘚,用b(|𝘚)得到动作𝘈

第155页第28行

=𝘢π(𝘢|𝘚t;θθEMA)π(𝘢|𝘚t;θθ).

改为

=𝘢π(𝘢|𝘚t;θθEMA)π(𝘢|𝘚t;θθ)θθπ(𝘢|𝘚t;θθ).

第157页算法8-11第3.2.3步

kθθdKL(π(|𝘚t;θθEMA)||π(|𝘚t;θθ))

改为

kθθdKL(π(|𝘚t;θθEMA)||π(|𝘚t;θθ))

第161页第4~5行

作者注:“动作价值网络和策略网络往往采用矢量形式的输出”指的是动作空间是离散动作空间的情况。如果动作空间是连续动作空间,往往用Gaussian形式的策略,详见GitHub代码。包括SAC算法在内的使用策略梯度的算法采用Gaussian形式策略后,策略被限制为了单峰(unimodal)形式。如果需要策略具有多峰(multimodal)形式,可以使用混合Gaussian模型(Gaussian Mixture Model,GMM)。

第161页8.6节

作者注:这个案例的动作空间是离散的。同时,本章介绍的算法,包括但不限于PPO、SAC等算法,也可用于动作空间是连续空间的情况。

第162页第11~12行

使得角速度有界Θ˙t[4π,4π]Θ˙t[9π,9π]

改为

使得角速度有界Θ˙t[4π,4π]Θ˙t[9π,9π]

第162页第17行

单5-7中的

改为

单5-3中的

第163页代码清单8-1

其中的learn()函数代码应排版为(内容不变,只是重新排版)

第165页代码清单8-2前4行(中间有个空行不计入)

多缩进4个空格

第173页第9行

vπ(θθ)(𝘚t)

改为

vπ(θθ)(𝘴)

第173页第20行

=E[π(𝘚0;θθ)[𝘢qπ(θθ)(𝘚0,𝘢)]𝘢=π(𝘚0;θθ)]+γE[π(𝘚1;θθ)[𝘢qπ(θθ)(𝘚1,𝘢)]𝘢=π(𝘚1;θθ)]+γ2E[vπ(θθ)(𝘚1)]

改为

=E[π(𝘚0;θθ)[𝘢qπ(θθ)(𝘚0,𝘢)]𝘢=π(𝘚0;θθ)]+γE[π(𝘚1;θθ)[𝘢qπ(θθ)(𝘚1,𝘢)]𝘢=π(𝘚1;θθ)]+γ2E[vπ(θθ)(𝘚2)]

第174页第4行

ρπ(𝘴)=𝘴0Sp𝘚0(𝘴0)t=0+γtPr[𝘚t|𝘚0=𝘴0;θθ]d𝘴0

改为

ρπ(θθ)(𝘴)=t=0+γtPr[𝘚t=𝘴;π(θθ)], 𝘴S

作者注:从严格意义上说,有折扣的状态分布并不是概率分布,因为它的和不总是1。针对有折扣的状态分布的期望也只是采用了期望的形式。

第174页第7~11行

=t=0+𝘴p𝘚t(𝘴)γtπ(𝘴;θθ)[𝘴qπ(θθ)(𝘴,𝘢)]𝘢=π(𝘚t;θθ)d𝘴

=t=0+𝘴(𝘴0𝘴0p𝘚0(𝘴0)Pr[𝘚t=𝘴|𝘴0=𝘴0;θθ]d𝘴0)γtπ(𝘴;θθ)[𝘴qπ(θθ)(𝘴,𝘢)]𝘢=π(𝘴;θθ)d𝘴

=𝘴(𝘴0p𝘚0(𝘴0)t=0+γtPr[𝘚t=𝘴|𝘴0=𝘴0;θθ]d𝘴0)π(𝘚t;θθ)[𝘢qπ(θθ)]𝘢=π(𝘴;θθ)d𝘴

=𝘴ρπ(θθ)(𝘴)π(𝘴;θθ)[𝘢qπ(θθ)(𝘴,𝘢)]𝘢=π(𝘴;θθ)d𝘴

=Eρπ(θθ)[π(𝘴;θθ)[𝘢qπ(θθ)(𝘴,𝘢)]𝘢=π(𝘴;θθ)]

改为

=t=0+𝘴Pr[𝘚t=𝘴;π(θθ)]γtπ(𝘴;θθ)[𝘢qπ(θθ)(𝘴,𝘢)]𝘢=π(𝘴;θθ)

=𝘴(t=0+γtPr[𝘚t=𝘴;π(θθ)])π(𝘴;θθ)[𝘢qπ(θθ)(𝘴,𝘢)]𝘢=π(𝘴;θθ)

=𝘴ρπ(θθ)(𝘴)π(𝘴;θθ)[𝘢qπ(θθ)]𝘢=π(𝘴;θθ)

=Eρπ(θθ)[π(𝘚;θθ)[𝘢qπ(θθ)(𝘚,𝘢)]𝘢=π(𝘚;θθ)]

第175页第7行

其中𝘈min𝘈max是动作的最小取值和最大取值

改为

其中𝘈low𝘈high是动作的最小取值和最大取值

第175页算法9-1第2.2步

2.2(决定初始动作)

改为

2.2(初始化状态动作对)选择状态𝘚

第176页第12行

σ2eθ(t+s)E[0teθτdBt0seθτdBt]

改为

σ2eθ(t+s)E[0teθτdBτ0seθτdBτ]

第176页到第177页9.2节正文

改为

对于连续的动作空间,我们希望能够找到一个确定性策略,使得每条轨迹的回报最大。同策确定性算法利用策略π(θθ)生成轨迹,并在这些轨迹上求得回报的平均值,通过让平均回报最大,使得每条轨迹上的回报尽可能大。事实上,如果每条轨迹的回报都要最大,那么对于任意策略b采样得到的轨迹,我们都希望在这套轨迹上的平均回报最大。所以异策确定性策略算法引入确定性行为策略b,将这个平均改为针对策略b采样得到的轨迹,得到异策确定性梯度为Eρb[qπ(θθ)(𝘚,π(𝘚;θθ))]=Eρb[π(𝘚;θθ)[aqπ(θθ)(𝘚,𝘢)]𝘢=π(𝘚;θθ)]。这个表达式与同策的情形相比,期望运算针对的表达式相同。所以,异策确定性算法的迭代式与同策确定性算法的迭代式相同。

异策确定性算法可能比同策确定性算法性能好的原因在于,行为策略可能会促进探索,用行为策略采样得到的轨迹能够更加全面的探索轨迹空间。这时候,最大化对轨迹分布的平均期望时能够同时考虑到更多不同的轨迹,使得在整个轨迹空间上的所有轨迹的回报会更大。

与非确定性策略梯度相比,非确定性异策算法的迭代式中含有重采样因子π(𝘈t|𝘚t;θθ)b(𝘈t|𝘚t),而确定性异策算法中没有。这是因为,确定性的行为策略b并不对于确定性的目标策略π(θθ)绝对连续,重采样因子没有定义,所以不包括重采样因子。

第177页算法9-2第2.1步和2.2步之间

增加

2.2(初始化状态)选择状态𝘚

2.3(确定行为策略)确定行为策略b

第177页算法9-2第2.2.1步

2.2.1(执行)用b(𝘚)得到

改为

2.4.1(执行)用b(𝘚)得到

第180页9.3节

作者注:Gym 0.21版本将Pendulum-v0改为Pendulum-v1。

第180页图9-1

改为

第180页第4行

X轴是水平向下的,Y轴是水平向右的。

改为

X轴是水平向上的,Y轴是水平向左的。

第180页表9-1最右边一列

倒立摆(Pendulum-v0)
[π,π)×[4π,4π]×[9π,9π]
[1,1]2×[4π,4π]×[9π,9π]
[2,2]
[π26.404,0]

改为

倒立摆(Pendulum-v0)
[π,π)×[8,8]
[1,1]2×[8,8]
[2,2]
[π26.404,0]

第180页第18-19行

Θt+1Θt+0.05(Θ˙t0.75sinΘt0.15𝘈t)[π,+π)的主值区间

Θ˙t+1clip(Θ˙t0.75sinΘt0.15𝘈t,8,+8)

改为

Θt+1Θt+0.05(Θ˙t+0.75sinΘt+0.15𝘈t)[π,+π)的主值区间

Θ˙t+1clip(Θ˙t+0.75sinΘt+0.15𝘈t,8,+8)

第188页10.1节

作者注:Gym 0.21版本修改了Atari游戏环境的安装方式。

第189页

适用于Python 3.7的下列安装文件

对应适用于Python 3.8的安装文件名为

对应Python 3.9和Python 3.10版本的以此类推。

第191页表10-1(共4处)

NoFrameSkip

改为

NoFrameskip

第207页图11-3

改为