Reward Centering(四)
- 文章概括
- 摘要
- 附录
- A 伪代码
文章概括
引用:
@article{naik2024reward,
title={Reward Centering},
author={Naik, Abhishek and Wan, Yi and Tomar, Manan and Sutton, Richard S},
journal={arXiv preprint arXiv:2405.09999},
year={2024}
}
Naik, A., Wan, Y., Tomar, M. and Sutton, R.S., 2024. Reward Centering. arXiv preprint arXiv:2405.09999.
原文: https://arxiv.org/abs/2405.09999
代码、数据和视频:
系列文章:
请在
《
《
《文章
》
》
》 专栏中查找
论文笔记(七十二)Reward Centering(一)
论文笔记(七十二)Reward Centering(二)
论文笔记(七十二)Reward Centering(三)
论文笔记(七十二)Reward Centering(四)
论文笔记(七十二)Reward Centering(五)
摘要
我们证明,在解决持续强化学习问题时,折扣方法如果通过减去奖励的经验均值来对奖励进行中心化处理,其性能会显著提升。在常用的折扣因子下,这种改进是显著的,并且随着折扣因子趋近于1,改进幅度进一步增加。此外,我们证明,如果一个问题的奖励被加上一个常数偏移量,则标准方法的表现会变得更差,而采用奖励中心化的方法则不受影响。在on-policy设置下,估计平均奖励是直接的;对于off-policy设置,我们提出了一种稍微更复杂的方法。奖励中心化是一个通用的概念,因此我们预计几乎所有的强化学习算法都能从奖励中心化的加入中受益。
附录
A 伪代码
在本节中,我们将介绍在 Q-learning 的表格、线性和非线性变体中添加基于值的奖励中心的伪代码。
这段伪代码实现了一个“表格型(Tabular)Q-learning”算法,区别在于它使用了基于值的奖励中心化(value-based reward centering)。也就是说:
- 它仍然是Q-learning:用一个Q表来存储每个状态-动作对 ( s , a ) (s,a) (s,a) 的价值估计 Q ( s , a ) Q(s,a) Q(s,a)。
- 奖励中心化:在计算时序差分(TD)误差时,使用 ( R − R ˉ ) (R - \bar{R}) (R−Rˉ) 代替原始奖励 R R R,并且同时更新一个平均奖励估计 R ˉ \bar{R} Rˉ。
这么做的原因在于:如果奖励有一个大常数偏移,或者折扣因子 γ \gamma γ 很接近 1,那么原始 Q-learning 会出现数值范围很大的问题;通过减去一个平均奖励 R ˉ \bar{R} Rˉ,可以让学习更稳定、更快速。
行0:输入与算法参数
Input: The behavior policy b (e.g. ε-greedy)
Algorithm parameters: discount factor γ, step-size parameters α, η
- 行为策略 b b b:这是智能体在训练中实际用来选动作的策略。例如,最常见的是 ϵ \epsilon ϵ-greedy——以概率 1 − ϵ 1-\epsilon 1−ϵ 选当前Q值最高的动作,以概率 ϵ \epsilon ϵ 随机选动作。
- 折扣因子 γ \gamma γ:决定未来奖励的重要性, γ ∈ [ 0 , 1 ) \gamma \in [0,1) γ∈[0,1)。数值越接近1,越重视长期回报;越小则越关注近期。
- 步长参数 α , η \alpha, \eta α,η: α \alpha α 多用于网络参数更新(学习率), η \eta η 用于调节平均奖励 R ˉ \bar{R} Rˉ 的更新幅度。
行1:初始化
Initialize Q(s, a) ∀s, R̄ arbitrarily (e.g., to zero)
- 我们为所有状态-动作对 ( s , a ) (s,a) (s,a) 初始化一个Q表,记为 Q ( s , a ) Q(s,a) Q(s,a)。在表格型设置下,这通常是一个二维数组,也可以用字典等结构实现。
- 初始化平均奖励 R ˉ \bar{R} Rˉ 为0或任意值。
行2:获得初始状态
Obtain initial S
- 与环境交互时,智能体先观察到一个起始状态 S S S。在仿真或某些任务中,这可能是随机选的或由环境指定。
行3, 4:主循环
for all time steps do
Take action A according to b, observe R, S'
- 在每个时间步
t
t
t:
- 根据行为策略 b b b 从状态 S S S 选动作 A A A。
- 环境返回即时奖励 R R R 并转移到新状态 S ′ S' S′。
- 这是标准 Q-learning 过程:智能体在环境中执行动作并收集数据。
行5:计算时序差分误差 δ δ δ
δ = R - R̄ + γ max_a Q(S', a) - Q(S, A)
这是本算法的核心:
- R − R ˉ R - \bar{R} R−Rˉ:把原始奖励 R R R 减去当前的平均奖励估计 R ˉ \bar{R} Rˉ,得到“中心化奖励”。
- γ max a Q ( S ′ , a ) \gamma \max_{a} Q(S', a) γmaxaQ(S′,a):与标准Q-learning一样,估计下一状态 S ′ S' S′ 的最大Q值作为未来回报。
- − Q ( S , A ) - Q(S,A) −Q(S,A):我们要看“(中心化奖励 + 折扣后的最大下一步价值)与当前Q值估计”的差距,这就是TD误差 δ \delta δ。
在标准Q-learning里, δ = R + γ max a Q ( S ′ , a ) − Q ( S , A ) \delta = R + \gamma \max_{a} Q(S',a) - Q(S,A) δ=R+γmaxaQ(S′,a)−Q(S,A)。这里则变成 R − R ˉ R - \bar{R} R−Rˉ,多了个 − R ˉ -\bar{R} −Rˉ 的中心化操作。
行6:更新Q表
Q(S, A) = Q(S, A) + α δ
- 这是最基本的Q-learning更新:用TD误差 δ \delta δ 调整当前Q值,步长由 α \alpha α 决定。
- 由于 δ \delta δ 包含了 ( R − R ˉ ) (R - \bar{R}) (R−Rˉ),我们实际上是学习一个“相对于平均奖励”的Q值。
行7:更新平均奖励
R̄ = R̄ + η α δ
- 这是与标准Q-learning不同之处:我们同时更新平均奖励 R ˉ \bar{R} Rˉ,使其也跟随TD误差进行调整。
- 其中 η \eta η 是一个系数(伪代码里写的可能是“ η η η”,也可能用其他符号),用来控制更新速度;有时可与 α \alpha α 合并成一个“effective step-size”。
- 直观理解:如果 δ \delta δ 是正的,说明“实际的中心化奖励 + 未来回报”比我们预期的要好,于是我们适度提高 R ˉ \bar{R} Rˉ;若 δ \delta δ 为负,则降低 R ˉ \bar{R} Rˉ。
- 这样, R ˉ \bar{R} Rˉ 会逐渐收敛到一个与目标策略相关的平均奖励(若行为策略足够探索、步长合适等条件满足)。
行8:转移到新状态
S = S'
- 这一行将当前状态更新为下一个状态,为下个时间步的循环做准备。
行9:循环结束
end
- 该算法持续进行,直到满足某个停止条件(如到达最大步数或收敛)。
简单数值例子
假设我们有一个小小的任务:
- 状态空间只有2个状态: S 1 S_1 S1, S 2 S_2 S2;动作空间只有2个动作: A 1 A_1 A1, A 2 A_2 A2。
- 假设某个回合中:
- 当前状态 S = S 1 S = S_1 S=S1,动作 A = A 1 A = A_1 A=A1,获得即时奖励 R = 10 R = 10 R=10,下一状态 S ′ = S 2 S' = S_2 S′=S2。
- 当前估计的平均奖励 R ˉ = 8 \bar{R} = 8 Rˉ=8。
- γ = 0.9 \gamma = 0.9 γ=0.9,且我们查表发现 max a Q ( S 2 , a ) = 20 \max_a Q(S_2, a) = 20 maxaQ(S2,a)=20,而当前 Q ( S 1 , A 1 ) = 15 Q(S_1, A_1) = 15 Q(S1,A1)=15。
- 学习率 α = 0.1 \alpha = 0.1 α=0.1, η = 0.5 \eta = 0.5 η=0.5(示例取值)。
第5行:计算TD误差
δ
=
(
R
−
R
ˉ
)
+
γ
max
a
Q
(
S
2
,
a
)
−
Q
(
S
1
,
A
1
)
=
(
10
−
8
)
+
0.9
×
20
−
15
=
2
+
18
−
15
=
5.
\delta = (R - \bar{R}) + \gamma \max_a Q(S_2,a) - Q(S_1,A_1) = (10 - 8) + 0.9 \times 20 - 15 = 2 + 18 - 15 = 5.
δ=(R−Rˉ)+γamaxQ(S2,a)−Q(S1,A1)=(10−8)+0.9×20−15=2+18−15=5.
第6行:更新Q表
Q
(
S
1
,
A
1
)
←
15
+
0.1
×
5
=
15.5.
Q(S_1, A_1) \leftarrow 15 + 0.1 \times 5 = 15.5.
Q(S1,A1)←15+0.1×5=15.5.
第7行:更新平均奖励
R
ˉ
←
8
+
0.5
×
0.1
×
5
=
8
+
0.25
=
8.25.
\bar{R} \leftarrow 8 + 0.5 \times 0.1 \times 5 = 8 + 0.25 = 8.25.
Rˉ←8+0.5×0.1×5=8+0.25=8.25.
解释:
- 因为 δ = 5 \delta = 5 δ=5 为正数,表示实际获得的“中心化奖励 + 折扣未来回报”比我们先前估计的还要好,于是我们适度提高 Q ( S 1 , A 1 ) Q(S_1, A_1) Q(S1,A1) 并且也提高了平均奖励估计 R ˉ \bar{R} Rˉ(从8增加到8.25)。
- 这样,如果下次再拿到类似奖励,中心化奖励 R − R ˉ R - \bar{R} R−Rˉ 就会变小(10 - 8.25 = 1.75),防止Q值无限增大。
本算法是一个“线性Q-learning”的版本,与传统Q-learning相比,主要有两个特点:
-
线性函数逼近:
- 采用线性模型来近似 Q 值函数,即对每个动作 a a a 都维护一个参数向量 w a ∈ R d \mathbf{w}_a \in \mathbb{R}^d wa∈Rd,并将状态(或观测)转换为一个特征向量 x ∈ R d \mathbf{x} \in \mathbb{R}^d x∈Rd。
- 动作值估计为 q ^ ( x , a ) = w a ⊤ x \hat{q}(\mathbf{x}, a) = \mathbf{w}_a^\top \mathbf{x} q^(x,a)=wa⊤x。
-
基于值的奖励中心化(value-based reward centering):
- 在计算时序差分(TD)误差时,使用 ( R − R ˉ ) \bigl(R - \bar{R}\bigr) (R−Rˉ) 代替原始奖励 R R R,其中 R ˉ \bar{R} Rˉ 是一个在线估计的平均奖励。
- 同时,利用同一个 TD 误差更新平均奖励 R ˉ \bar{R} Rˉ 本身。
通过这种“奖励中心化”,我们可以去除奖励中可能存在的常数偏移,在高折扣因子或大常数奖励的情况下让学习更稳定、更有效。
行0:输入与算法参数
Input: The behavior policy b (e.g., ε-greedy)
Algorithm parameters: discount factor γ, step-size parameters α, η
- 行为策略 b b b:在训练过程中用于实际选动作的策略,例如 ϵ \epsilon ϵ-greedy。
- 折扣因子 γ \gamma γ:权衡当前奖励和未来奖励的重要程度, γ ∈ [ 0 , 1 ) \gamma \in [0,1) γ∈[0,1)。
- 步长参数 α \alpha α 和 η \eta η: α \alpha α 多用于网络参数更新(学习率), η \eta η 用于调节平均奖励 R ˉ \bar{R} Rˉ 的更新幅度。
行1:初始化
Initialize wₐ ∈ ℝ^d ∀a, R̄ arbitrarily (e.g., to zero)
- 对每个动作 a a a,都初始化一个权重向量 w a ∈ R d \mathbf{w}_a \in \mathbb{R}^d wa∈Rd。通常初始化为0向量或小随机值。
- 初始化平均奖励 R ˉ \bar{R} Rˉ 为0或任意值。
行2:获得初始观测
Obtain initial observation x
- 在与环境交互前,我们先得到一个初始状态或观测,并将其转换为一个特征向量 x \mathbf{x} x。
- 例如,在某个连续空间里,你可能会用 tile-coding 或其他方式把原始状态映射成 x \mathbf{x} x。
行3, 4:主循环
for all time steps do
Take action A according to b, observe R, x'
- 每个时间步
t
t
t:
- 根据行为策略 b b b(如 ϵ \epsilon ϵ-greedy)从特征 x \mathbf{x} x 选择一个动作 A A A。
- 环境返回即时奖励 R R R 并转移到新观测 x ′ \mathbf{x}' x′。
行5:计算TD误差 δ δ δ
δ = R - R̄ + γ maxₐ (wₐ)ᵀ x' - (wA)ᵀ x
这是本算法最关键的一步:
- R − R ˉ R - \bar{R} R−Rˉ:将原始奖励减去平均奖励,得到“中心化奖励”。
- γ max a w a ⊤ x ′ \gamma \max_{a} \mathbf{w}_a^\top \mathbf{x}' γmaxawa⊤x′:估计下一状态的最大Q值(线性模型下为各动作权重向量与 x ′ \mathbf{x}' x′ 的内积)。
- − w A ⊤ x - \mathbf{w}_A^\top \mathbf{x} −wA⊤x:从当前Q值中减去上一步对所选动作 A A A 的Q值估计。
- 整体上, δ \delta δ 表示 “中心化即时奖励 + 折扣未来回报” 与 “当前Q值估计” 之间的差距 (即TD误差)。
行6:更新动作权重向量
wA = wA + α δ x
- 对于所选动作
A
A
A,我们用 TD 误差
δ
\delta
δ 调整其权重向量:
w A ← w A + α δ x . \mathbf{w}_A \leftarrow \mathbf{w}_A + \alpha \,\delta \,\mathbf{x}. wA←wA+αδx. - 线性模型下, ∇ w A ( w A ⊤ x ) = x \nabla_{\mathbf{w}_A} \bigl(\mathbf{w}_A^\top \mathbf{x}\bigr) = \mathbf{x} ∇wA(wA⊤x)=x,所以这是标准的梯度升/降更新形式。
行7:更新平均奖励
R̄ = R̄ + η α δ
- 同样地,我们也用同一个 TD 误差 δ \delta δ 来更新平均奖励 R ˉ \bar{R} Rˉ。
- η α \eta\alpha ηα 可以视作平均奖励更新的有效步长;若 η = 1 \eta=1 η=1,则直接用 α δ \alpha\delta αδ;若 η \eta η 不同于1,就能灵活调节更新幅度。
行8:更新当前特征
x = x'
- 将下一状态特征 x ′ \mathbf{x}' x′ 变为当前特征 x \mathbf{x} x,进入下一步循环。
行9:循环结束
end
- 算法在有限时间或直到收敛为止进行多次迭代。
知识点回顾
-
线性Q-learning:
- 不再用一个表格存储 Q ( s , a ) Q(s,a) Q(s,a),而是对每个动作维护一个权重向量 w a \mathbf{w}_a wa,用线性函数 w a ⊤ x \mathbf{w}_a^\top \mathbf{x} wa⊤x 逼近动作值。
- 在高维或连续状态下,这是常用的方法。
-
奖励中心化:
- 在TD误差中使用 ( R − R ˉ ) (R - \bar{R}) (R−Rˉ) 代替 R R R,减少由于奖励有常数偏移或 γ \gamma γ 较大导致的数值膨胀问题。
- 通过更新 R ˉ \bar{R} Rˉ,使其自适应地追踪策略的平均奖励水平。
-
TD误差 δ \delta δ:
- 反映了当前估计与目标之间的差距。
- 这里的“目标”是中心化即时奖励 + 折扣未来最优价值;
- δ \delta δ 越大(正),说明“实际情况比估计好”;越大(负),说明“比估计差”。
-
步长参数:
- α \alpha α 控制Q值(权重向量)更新速度;
- η α \eta\alpha ηα 控制平均奖励更新速度。
- 这些步长通常要满足一定条件(如 Robbins–Monro)才能保证收敛。
简单数值例子
下面我们给出一个简单的数值例子,展示如何在单步中计算并更新各量。
- 假设特征向量维度 d = 3 d=3 d=3。
- 当前状态特征 x = [ 1 , 0 , 2 ] ⊤ \mathbf{x} = [1, 0, 2]^\top x=[1,0,2]⊤。
- 下一状态特征 x ′ = [ 0 , 1 , 1 ] ⊤ \mathbf{x}' = [0, 1, 1]^\top x′=[0,1,1]⊤。
- 行为策略 ϵ \epsilon ϵ-greedy 从 x \mathbf{x} x 中选取动作 A A A,此处动作空间有2个动作: a 1 a_1 a1 和 a 2 a_2 a2。
权重向量与平均奖励初始化
- w a 1 = [ 0.5 , 0.2 , − 0.1 ] ⊤ \mathbf{w}_{a_1} = [0.5, 0.2, -0.1]^\top wa1=[0.5,0.2,−0.1]⊤, w a 2 = [ 0.3 , 0.4 , 0.1 ] ⊤ \mathbf{w}_{a_2} = [0.3, 0.4, 0.1]^\top wa2=[0.3,0.4,0.1]⊤。
- R ˉ = 2.0 \bar{R} = 2.0 Rˉ=2.0(任意初始化)。
- 折扣因子 γ = 0.9 \gamma = 0.9 γ=0.9。
- 学习率 α = 0.1 \alpha = 0.1 α=0.1,平均奖励更新因子 η = 0.5 \eta=0.5 η=0.5(示例值)。
执行动作并获得奖励
- 设定当前动作为 A = a 1 A = a_1 A=a1。
- 环境返回即时奖励 R = 5 R = 5 R=5,下一状态特征 x ′ = [ 0 , 1 , 1 ] ⊤ \mathbf{x}' = [0, 1, 1]^\top x′=[0,1,1]⊤。
计算TD误差 δ
- 计算中心化奖励: R − R ˉ = 5 − 2.0 = 3 R - \bar{R} = 5 - 2.0 = 3 R−Rˉ=5−2.0=3。
- 计算下一状态每个动作的Q值:
w a 1 ⊤ x ′ = [ 0.5 , 0.2 , − 0.1 ] ⋅ [ 0 , 1 , 1 ] = 0.2 + ( − 0.1 ) = 0.1 , \mathbf{w}_{a_1}^\top \mathbf{x}' = [0.5, 0.2, -0.1] \cdot [0, 1, 1] = 0.2 + (-0.1) = 0.1, wa1⊤x′=[0.5,0.2,−0.1]⋅[0,1,1]=0.2+(−0.1)=0.1, w a 2 ⊤ x ′ = [ 0.3 , 0.4 , 0.1 ] ⋅ [ 0 , 1 , 1 ] = 0.4 + 0.1 = 0.5. \mathbf{w}_{a_2}^\top \mathbf{x}' = [0.3, 0.4, 0.1] \cdot [0, 1, 1] = 0.4 + 0.1 = 0.5. wa2⊤x′=[0.3,0.4,0.1]⋅[0,1,1]=0.4+0.1=0.5.
因此, max a w a ⊤ x ′ = 0.5 \max_{a} \mathbf{w}_a^\top \mathbf{x}' = 0.5 maxawa⊤x′=0.5。 - 计算当前Q值:
w A ⊤ x = w a 1 ⊤ x = [ 0.5 , 0.2 , − 0.1 ] ⋅ [ 1 , 0 , 2 ] = 0.5 + ( − 0.2 ) = 0.3. \mathbf{w}_{A}^\top \mathbf{x} = \mathbf{w}_{a_1}^\top \mathbf{x} = [0.5, 0.2, -0.1] \cdot [1, 0, 2] = 0.5 + (-0.2) = 0.3. wA⊤x=wa1⊤x=[0.5,0.2,−0.1]⋅[1,0,2]=0.5+(−0.2)=0.3. - 整理得到:
δ = ( 5 − 2.0 ) + 0.9 × 0.5 − 0.3 = 3 + 0.45 − 0.3 = 3.15. \delta = (5 - 2.0) + 0.9 \times 0.5 - 0.3 = 3 + 0.45 - 0.3 = 3.15. δ=(5−2.0)+0.9×0.5−0.3=3+0.45−0.3=3.15.
更新动作权重向量
w a 1 ← w a 1 + α δ x = [ 0.5 , 0.2 , − 0.1 ] ⊤ + 0.1 × 3.15 × [ 1 , 0 , 2 ] ⊤ . \mathbf{w}_{a_1} \leftarrow \mathbf{w}_{a_1} + \alpha\,\delta\,\mathbf{x} = [0.5, 0.2, -0.1]^\top + 0.1 \times 3.15 \times [1, 0, 2]^\top. wa1←wa1+αδx=[0.5,0.2,−0.1]⊤+0.1×3.15×[1,0,2]⊤.
- 先计算增量: 0.1 × 3.15 = 0.315 0.1 \times 3.15 = 0.315 0.1×3.15=0.315。
- 对 x = [ 1 , 0 , 2 ] \mathbf{x}=[1,0,2] x=[1,0,2] 的增量为 [ 0.315 , 0 , 0.63 ] [0.315, 0, 0.63] [0.315,0,0.63]。
- 更新后:
w a 1 = [ 0.5 + 0.315 , 0.2 + 0 , − 0.1 + 0.63 ] = [ 0.815 , 0.2 , 0.53 ] . \mathbf{w}_{a_1} = [0.5 + 0.315, \; 0.2 + 0, \; -0.1 + 0.63] = [0.815, \; 0.2, \; 0.53]. wa1=[0.5+0.315,0.2+0,−0.1+0.63]=[0.815,0.2,0.53].
更新平均奖励
R ˉ ← R ˉ + η α δ = 2.0 + 0.5 × 0.1 × 3.15 = 2.0 + 0.1575 = 2.1575. \bar{R} \leftarrow \bar{R} + \eta \alpha \delta = 2.0 + 0.5 \times 0.1 \times 3.15 = 2.0 + 0.1575 = 2.1575. Rˉ←Rˉ+ηαδ=2.0+0.5×0.1×3.15=2.0+0.1575=2.1575.
更新当前特征
x ← x ′ = [ 0 , 1 , 1 ] ⊤ . \mathbf{x} \leftarrow \mathbf{x}' = [0,1,1]^\top. x←x′=[0,1,1]⊤.
解释:
- 通过上面这一步更新,我们提高了动作 a 1 a_1 a1 的权重,因为 δ \delta δ 为正数,表示“实际比我们估计的好”。
- 同时,也提高了平均奖励 R ˉ \bar{R} Rˉ(从2.0到2.1575),让之后的中心化奖励 R − R ˉ R - \bar{R} R−Rˉ 会相应变小(即不至于无限累加)。
本算法是一个“深度Q网络(DQN)”版本,但与传统DQN相比,它使用了基于值的奖励中心化(value-based reward centering)。也就是说:
-
非线性函数逼近(DQN)
- 我们用一个神经网络来逼近 Q 值函数:给定状态(或观测) x \mathbf{x} x,以及动作 a a a,输出 q ^ ( x , a ) \hat{q}(\mathbf{x}, a) q^(x,a)。
- 训练时,我们会用“经验回放(replay buffer)”批量采样过往数据,并通过梯度下降更新网络参数。
-
奖励中心化
- 在计算TD误差时,将即时奖励 R R R 替换为 ( R − R ˉ ) (R - \bar{R}) (R−Rˉ),其中 R ˉ \bar{R} Rˉ 是一个在线估计的平均奖励。
- 同时,用同一个TD误差来更新 R ˉ \bar{R} Rˉ。
- 这样可减轻高折扣因子或大常数奖励带来的数值膨胀,令学习更稳定。
行0:输入与算法参数
Input: The behavior policy b (e.g., ε-greedy)
Algorithm parameters: discount factor γ, step-size parameters α, η
- 行为策略 b b b:训练过程中智能体实际用来选动作的策略,如 ϵ \epsilon ϵ-greedy。
- 折扣因子 γ \gamma γ:衡量未来奖励的重要性, γ ∈ [ 0 , 1 ) \gamma \in [0,1) γ∈[0,1)。
- 步长参数 α , η \alpha, \eta α,η: α \alpha α 多用于网络参数更新(学习率), η \eta η 用于调节平均奖励 R ˉ \bar{R} Rˉ 的更新幅度。
行1:初始化
Initialize value network, target network; initialize R̄ arbitrarily (e.g., to zero)
- 初始化价值网络参数:例如,一个神经网络 θ \theta θ 用来逼近 Q 值 q ^ ( x , a ; θ ) \hat{q}(\mathbf{x}, a; \theta) q^(x,a;θ)。
- 初始化平均奖励 R ˉ \bar{R} Rˉ 为 0 或其他任意值。
行2:获得初始观测 x \mathbf{x} x
Obtain initial observation x
- 在与环境交互前,我们先得到初始状态(或观测)并将其表示为向量 x \mathbf{x} x。
行3–5:与环境交互 & 存储体验
for all time steps do
Take action A according to b, observe R, x'
Store tuple (x, A, R, x') in the experience buffer
- 与环境交互:在时间步 t t t,根据行为策略 b b b(如 ϵ \epsilon ϵ-greedy)选择动作 A A A,环境返回即时奖励 R R R 并转移到新观测 x ′ \mathbf{x}' x′。
- 存储体验:将四元组 ( x , A , R , x ′ ) (\mathbf{x}, A, R, \mathbf{x}') (x,A,R,x′) 存入“experience buffer”(经验回放池),以便后续批量采样训练。
行6–11:用采样的迷你批更新估计
if time to update estimates then
Sample a minibatch of transitions (x, A, R, x')^b
For every i-th transition: δᵢ = Rᵢ - R̄ + γ maxₐ q̂(xᵢ', a) - q̂(xᵢ, Aᵢ)
Perform a semi-gradient update of the value-network parameters with the δ² loss
R̄ = R̄ + η α mean(δ)
Update the target network occasionally
这是DQN训练的核心部分,与传统DQN相比多了“减去 R ˉ \bar{R} Rˉ”以及更新 R ˉ \bar{R} Rˉ:
-
采样迷你批:
- 从 replay buffer 中随机采样一批(batch)过往转移 { ( x i , A i , R i , x i ′ ) } \{(\mathbf{x}_i, A_i, R_i, \mathbf{x}_i')\} {(xi,Ai,Ri,xi′)}。
- 这使得训练更稳定且可重复利用经验。
-
计算 TD 误差
- 对每条转移计算
δ i = ( R i − R ˉ ) + γ max a q ^ ( x i ′ , a ) − q ^ ( x i , A i ) . \delta_i = \bigl(R_i - \bar{R}\bigr) + \gamma \max_a \hat{q}(\mathbf{x}_i', a) - \hat{q}(\mathbf{x}_i, A_i). δi=(Ri−Rˉ)+γamaxq^(xi′,a)−q^(xi,Ai). - 与标准DQN不同之处在于,奖励部分变成了 ( R i − R ˉ ) (R_i - \bar{R}) (Ri−Rˉ) 而非 R i R_i Ri;这样就是奖励中心化。
- 对每条转移计算
-
半梯度(semi-gradient)更新
- 在DQN中,我们通常用均方误差(MSE)来训练网络参数 θ \theta θ。
- 当TD目标是
(
R
i
−
R
ˉ
)
+
γ
max
a
q
^
(
x
i
′
,
a
)
\bigl(R_i - \bar{R}\bigr) + \gamma \max_a \hat{q}(\mathbf{x}_i', a)
(Ri−Rˉ)+γmaxaq^(xi′,a),网络输出为
q
^
(
x
i
,
A
i
;
θ
)
\hat{q}(\mathbf{x}_i, A_i; \theta)
q^(xi,Ai;θ),
其损失可以写作
L ( θ ) = 1 2 ∑ i [ δ i ( θ ) ] 2 , L(\theta) = \frac{1}{2}\sum_i \bigl[\delta_i(\theta)\bigr]^2, L(θ)=21i∑[δi(θ)]2,
其中 δ i ( θ ) \delta_i(\theta) δi(θ) 会随 θ \theta θ 改变。我们通过反向传播对 θ \theta θ 做梯度下降。
-
更新平均奖励
R ˉ ← R ˉ + η α mean ( δ ) , \bar{R} \leftarrow \bar{R} + \eta \,\alpha \,\text{mean}(\delta), Rˉ←Rˉ+ηαmean(δ),- 这里 mean ( δ ) \text{mean}(\delta) mean(δ) 表示对 minibatch 中所有 δ i \delta_i δi 取平均。
- 如果 δ \delta δ 平均值为正,说明当前整体回报超出估计;若为负,则说明不足。
-
更新目标网络
- 在 DQN 中,通常还会使用一个“目标网络(target network)”来稳定训练:定期或软更新其参数为 θ \theta θ,然后在 max a q ( x ′ , a ) \max_a q(\mathbf{x}', a) maxaq(x′,a) 时用该目标网络的值来计算。
行12–14:收尾与下一步
end
x = x'
end
- 这里表明:在完成更新后,将当前观测 x \mathbf{x} x 设置为下一状态 x ′ \mathbf{x}' x′,然后进入下一个时间步。
关键知识点
-
DQN:
- 用神经网络逼近 Q 值,采用体验回放和目标网络来减少数据相关性和训练不稳定。
-
奖励中心化:
- 在 TD 误差中使用 ( R − R ˉ ) (R - \bar{R}) (R−Rˉ) 代替原始 R R R。
- 同时更新 R ˉ \bar{R} Rˉ,让它逐渐逼近策略的平均奖励。
- 这样可以缓解高折扣因子下 Q 值变得很大的问题,并提高训练稳定性。
-
半梯度更新:
- 我们把 δ i 2 \delta_i^2 δi2 作为损失,对网络参数 θ \theta θ 求梯度并更新。
- 称为“半梯度”或“近似梯度”,因为 δ i \delta_i δi 中包含了 max a q ^ ( x ′ , a ) \max_a \hat{q}(\mathbf{x}', a) maxaq^(x′,a),本身对 θ \theta θ 也有依赖,但在实际 DQN 中我们常用一个固定目标网络来近似,或者只对 q ^ ( x , A ) \hat{q}(\mathbf{x},A) q^(x,A) 的部分做梯度。
-
m e a n ( δ ) mean(\delta) mean(δ):
- 在一个 batch 中,每条样本都会产生一个 δ i \delta_i δi。我们对它们求平均,用于更新 R ˉ \bar{R} Rˉ。
- 如果整体 δ \delta δ 为正,表示当前估计偏保守;如果整体 δ \delta δ 为负,则表示估计偏乐观。
数值示例
1. 背景与思路
在非线性 DQN中,我们用一个神经网络来近似 Q 值函数:
Q
θ
(
x
,
a
)
=
NN
(
x
;
θ
)
[
a
]
,
Q_\theta(\mathbf{x}, a) = \text{NN}(\mathbf{x}; \theta)[a],
Qθ(x,a)=NN(x;θ)[a],
其中:
- x \mathbf{x} x 是状态(或观测)的输入;
- θ \theta θ 表示网络所有的可训练参数(如权重矩阵、偏置等);
- NN ( x ; θ ) \text{NN}(\mathbf{x}; \theta) NN(x;θ) 输出一个向量,每个分量对应一个动作的 Q 值。
在“value-based reward centering”里,我们在计算 TD 目标时使用 ( R − R ˉ ) (R - \bar{R}) (R−Rˉ) 代替原始奖励 R R R,并且利用同一个时序差分(TD)误差更新平均奖励 R ˉ \bar{R} Rˉ。下文会展示更完整的过程。
2. 一个小型神经网络示例
为了具体化,我们假设一个非常小的神经网络:
- 输入层:维度 = 2(状态/观测是 x ∈ R 2 \mathbf{x}\in \mathbb{R}^2 x∈R2)。
- 隐藏层:维度 = 2,带 ReLU 激活。
- 输出层:维度 = 2(表示有 2 个动作,输出对应 q ^ ( x , a 1 ) \hat{q}(\mathbf{x}, a_1) q^(x,a1) 和 q ^ ( x , a 2 ) \hat{q}(\mathbf{x}, a_2) q^(x,a2))。
用符号表示:
- 隐藏层:
h = max { 0 , W 1 x + b 1 } , \mathbf{h} = \max\{0,\; W_1 \mathbf{x} + \mathbf{b}_1\}, h=max{0,W1x+b1},
其中 W 1 W_1 W1 是 2 × 2 2\times 2 2×2 矩阵, b 1 \mathbf{b}_1 b1 是 2 维偏置, max { 0 , ⋅ } \max\{0,\cdot\} max{0,⋅} 表示 ReLU 逐元素操作。 - 输出层:
q θ ( x ) = W 2 h + b 2 , \mathbf{q}_\theta(\mathbf{x}) = W_2 \mathbf{h} + \mathbf{b}_2, qθ(x)=W2h+b2,
这是一个 2 维向量,分别对应动作 a 1 a_1 a1 和 a 2 a_2 a2 的 Q 值。
这样, θ \theta θ 包含 { W 1 , b 1 , W 2 , b 2 } \{W_1, \mathbf{b}_1, W_2, \mathbf{b}_2\} {W1,b1,W2,b2}。在实际DQN里可能更大更多层,但这里只演示一个非常小的网络方便手算。
3. 初始化与数据设定
我们随便给定一些初始参数(数字都很小、只作示例):
W 1 = ( 0.5 − 0.2 0.1 0.3 ) , b 1 = ( 0.0 0.1 ) , W_1 = \begin{pmatrix} 0.5 & -0.2 \\ 0.1 & 0.3 \end{pmatrix}, \quad \mathbf{b}_1 = \begin{pmatrix} 0.0 \\ 0.1 \end{pmatrix}, W1=(0.50.1−0.20.3),b1=(0.00.1),
W 2 = ( 0.4 0.2 − 0.1 0.3 ) , b 2 = ( 0.0 0.0 ) . W_2 = \begin{pmatrix} 0.4 & 0.2 \\ -0.1 & 0.3 \end{pmatrix}, \quad \mathbf{b}_2 = \begin{pmatrix} 0.0 \\ 0.0 \end{pmatrix}. W2=(0.4−0.10.20.3),b2=(0.00.0).
另外,设:
- 当前平均奖励 R ˉ = 5 \bar{R} = 5 Rˉ=5(示例);
- 折扣因子 γ = 0.9 \gamma=0.9 γ=0.9;
- 学习率 α = 0.01 \alpha=0.01 α=0.01(针对网络参数);
- 平均奖励更新因子 η = 1 \eta=1 η=1(只为简化,实际可不一样)。
一条训练样本
假设我们只看一条样本(batch size=1):
- 当前状态 x = [ 0.5 , − 1.2 ] ⊤ \mathbf{x}=[0.5, -1.2]^\top x=[0.5,−1.2]⊤;
- 动作 A = a 1 A=a_1 A=a1;
- 即时奖励 R = 7 R=7 R=7;
- 下一状态 x ′ = [ 1.0 , 0.3 ] ⊤ \mathbf{x}'=[1.0, 0.3]^\top x′=[1.0,0.3]⊤;
- 环境中还有另一个动作 a 2 a_2 a2,我们需要它来做 max a Q ( x ′ , a ) \max_a Q(\mathbf{x}',a) maxaQ(x′,a)。
我们先做一次前向传播,计算出:
- 当前状态 x \mathbf{x} x下,对动作 a 1 a_1 a1 和 a 2 a_2 a2 的 Q 值;
- 下一状态 x ′ \mathbf{x}' x′下,对动作 a 1 a_1 a1 和 a 2 a_2 a2 的 Q 值。
4. 前向传播(Forward Pass)
4.1 计算 q ^ θ ( x ) \hat{q}_\theta(\mathbf{x}) q^θ(x)
(1) 隐藏层激活 h \mathbf{h} h
z 1 = W 1 x + b 1 = ( 0.5 − 0.2 0.1 0.3 ) ( 0.5 − 1.2 ) + ( 0.0 0.1 ) . \mathbf{z}_1 = W_1 \mathbf{x} + \mathbf{b}_1 = \begin{pmatrix} 0.5 & -0.2 \\ 0.1 & 0.3 \end{pmatrix} \begin{pmatrix} 0.5 \\ -1.2 \end{pmatrix} + \begin{pmatrix} 0.0 \\ 0.1 \end{pmatrix}. z1=W1x+b1=(0.50.1−0.20.3)(0.5−1.2)+(0.00.1).
先做矩阵乘法:
- 第一行: 0.5 ∗ 0.5 + ( − 0.2 ) ∗ ( − 1.2 ) = 0.25 + 0.24 = 0.49 0.5*0.5 + (-0.2)*(-1.2) = 0.25 + 0.24 = 0.49 0.5∗0.5+(−0.2)∗(−1.2)=0.25+0.24=0.49;
- 第二行: 0.1 ∗ 0.5 + 0.3 ∗ ( − 1.2 ) = 0.05 − 0.36 = − 0.31 0.1*0.5 + 0.3*(-1.2) = 0.05 - 0.36 = -0.31 0.1∗0.5+0.3∗(−1.2)=0.05−0.36=−0.31;
然后加偏置 b 1 \mathbf{b}_1 b1:
- 第一维: 0.49 + 0.0 = 0.49 0.49 + 0.0 = 0.49 0.49+0.0=0.49;
- 第二维: − 0.31 + 0.1 = − 0.21 -0.31 + 0.1 = -0.21 −0.31+0.1=−0.21。
因此
z
1
=
(
0.49
−
0.21
)
.
\mathbf{z}_1 = \begin{pmatrix} 0.49 \\ -0.21 \end{pmatrix}.
z1=(0.49−0.21).
再做 ReLU:
h
=
max
{
0
,
z
1
}
\mathbf{h} = \max\{0, \mathbf{z}_1\}
h=max{0,z1}:
- 第一维: max { 0 , 0.49 } = 0.49 \max\{0,0.49\} = 0.49 max{0,0.49}=0.49;
- 第二维: max { 0 , − 0.21 } = 0 \max\{0,-0.21\} = 0 max{0,−0.21}=0(因为 -0.21 < 0)。
所以
h
=
(
0.49
0
)
.
\mathbf{h} = \begin{pmatrix} 0.49 \\ 0 \end{pmatrix}.
h=(0.490).
(2) 输出层 q θ ( x ) \mathbf{q}_\theta(\mathbf{x}) qθ(x)
q
θ
(
x
)
=
W
2
h
+
b
2
=
(
0.4
0.2
−
0.1
0.3
)
(
0.49
0
)
+
(
0.0
0.0
)
.
\mathbf{q}_\theta(\mathbf{x}) = W_2 \mathbf{h} + \mathbf{b}_2 = \begin{pmatrix} 0.4 & 0.2 \\ -0.1 & 0.3 \end{pmatrix} \begin{pmatrix} 0.49 \\ 0 \end{pmatrix} + \begin{pmatrix} 0.0 \\ 0.0 \end{pmatrix}.
qθ(x)=W2h+b2=(0.4−0.10.20.3)(0.490)+(0.00.0).
矩阵乘法:
- 对输出第1维(动作 a 1 a_1 a1): 0.4 ∗ 0.49 + 0.2 ∗ 0 = 0.196 0.4*0.49 + 0.2*0 = 0.196 0.4∗0.49+0.2∗0=0.196;
- 对输出第2维(动作 a 2 a_2 a2): − 0.1 ∗ 0.49 + 0.3 ∗ 0 = − 0.049 -0.1*0.49 + 0.3*0 = -0.049 −0.1∗0.49+0.3∗0=−0.049。
所以
q
θ
(
x
)
=
(
0.196
−
0.049
)
.
\mathbf{q}_\theta(\mathbf{x}) = \begin{pmatrix} 0.196 \\ -0.049 \end{pmatrix}.
qθ(x)=(0.196−0.049).
表示:
- q ^ θ ( x , a 1 ) = 0.196 \hat{q}_\theta(\mathbf{x}, a_1)=0.196 q^θ(x,a1)=0.196;
- q ^ θ ( x , a 2 ) = − 0.049 \hat{q}_\theta(\mathbf{x}, a_2)=-0.049 q^θ(x,a2)=−0.049。
4.2 计算 q ^ θ ( x ′ ) \hat{q}_\theta(\mathbf{x}') q^θ(x′)
同理,对下一状态 x ′ = [ 1.0 , 0.3 ] \mathbf{x}'=[1.0, 0.3] x′=[1.0,0.3]:
-
隐藏层:
z 1 ′ = W 1 x ′ + b 1 = ( 0.5 − 0.2 0.1 0.3 ) ( 1.0 0.3 ) + ( 0.0 0.1 ) . \mathbf{z}_1' = W_1 \mathbf{x}' + \mathbf{b}_1 = \begin{pmatrix} 0.5 & -0.2 \\ 0.1 & 0.3 \end{pmatrix} \begin{pmatrix} 1.0 \\ 0.3 \end{pmatrix} + \begin{pmatrix} 0.0 \\ 0.1 \end{pmatrix}. z1′=W1x′+b1=(0.50.1−0.20.3)(1.00.3)+(0.00.1).- 第一行: 0.5 ∗ 1.0 + ( − 0.2 ) ∗ 0.3 = 0.5 − 0.06 = 0.44 0.5*1.0 + (-0.2)*0.3 = 0.5 - 0.06 = 0.44 0.5∗1.0+(−0.2)∗0.3=0.5−0.06=0.44;
- 第二行:
0.1
∗
1.0
+
0.3
∗
0.3
=
0.1
+
0.09
=
0.19
0.1*1.0 + 0.3*0.3 = 0.1 + 0.09=0.19
0.1∗1.0+0.3∗0.3=0.1+0.09=0.19;
加偏置 b 1 \mathbf{b}_1 b1: - 第一维: 0.44 + 0 = 0.44 0.44 + 0=0.44 0.44+0=0.44;
- 第二维:
0.19
+
0.1
=
0.29
0.19 + 0.1=0.29
0.19+0.1=0.29。
z 1 ′ = ( 0.44 0.29 ) . \mathbf{z}_1' = \begin{pmatrix} 0.44 \\ 0.29 \end{pmatrix}. z1′=(0.440.29).
ReLU:
h ′ = ( max { 0 , 0.44 } max { 0 , 0.29 } ) = ( 0.44 0.29 ) . \mathbf{h}' = \begin{pmatrix} \max\{0,0.44\} \\ \max\{0,0.29\} \end{pmatrix} = \begin{pmatrix} 0.44 \\ 0.29 \end{pmatrix}. h′=(max{0,0.44}max{0,0.29})=(0.440.29).
-
输出层:
q θ ( x ′ ) = W 2 h ′ + b 2 = ( 0.4 0.2 − 0.1 0.3 ) ( 0.44 0.29 ) + ( 0 0 ) . \mathbf{q}_\theta(\mathbf{x}') = W_2 \mathbf{h}' + \mathbf{b}_2 = \begin{pmatrix} 0.4 & 0.2 \\ -0.1 & 0.3 \end{pmatrix} \begin{pmatrix} 0.44 \\ 0.29 \end{pmatrix} + \begin{pmatrix} 0 \\ 0 \end{pmatrix}. qθ(x′)=W2h′+b2=(0.4−0.10.20.3)(0.440.29)+(00).- 对动作 a 1 a_1 a1: 0.4 ∗ 0.44 + 0.2 ∗ 0.29 = 0.176 + 0.058 = 0.234 0.4*0.44 + 0.2*0.29=0.176 + 0.058=0.234 0.4∗0.44+0.2∗0.29=0.176+0.058=0.234;
- 对动作
a
2
a_2
a2:
−
0.1
∗
0.44
+
0.3
∗
0.29
=
−
0.044
+
0.087
=
0.043
-0.1*0.44 + 0.3*0.29=-0.044 + 0.087=0.043
−0.1∗0.44+0.3∗0.29=−0.044+0.087=0.043。
q θ ( x ′ ) = ( 0.234 0.043 ) . \mathbf{q}_\theta(\mathbf{x}') = \begin{pmatrix} 0.234 \\ 0.043 \end{pmatrix}. qθ(x′)=(0.2340.043).
即 - q ^ θ ( x ′ , a 1 ) = 0.234 \hat{q}_\theta(\mathbf{x}', a_1)=0.234 q^θ(x′,a1)=0.234;
- q ^ θ ( x ′ , a 2 ) = 0.043 \hat{q}_\theta(\mathbf{x}', a_2)=0.043 q^θ(x′,a2)=0.043。
5. 计算 TD 误差 δ \delta δ
在“value-based reward centering”中,TD 目标 = ( R − R ˉ ) + γ max a q ^ θ ( x ′ , a ) (R - \bar{R}) + \gamma \max_{a} \hat{q}_\theta(\mathbf{x}', a) (R−Rˉ)+γmaxaq^θ(x′,a)。
- 中心化奖励: R − R ˉ = 7 − 5 = 2 R - \bar{R} = 7 - 5=2 R−Rˉ=7−5=2。
- 下一状态最大 Q: max { 0.234 , 0.043 } = 0.234 \max\{0.234, 0.043\}=0.234 max{0.234,0.043}=0.234。
- 当前 Q: q ^ θ ( x , A = a 1 ) = 0.196 \hat{q}_\theta(\mathbf{x}, A=a_1)=0.196 q^θ(x,A=a1)=0.196。
- 折扣因子: γ = 0.9 \gamma=0.9 γ=0.9。
于是
δ
=
7
−
5
+
0.9
×
0.234
−
0.196
=
2
+
0.2106
−
0.196
=
2.0146.
\delta = 7 - 5 + 0.9 \times 0.234 - 0.196 = 2 + 0.2106 - 0.196 = 2.0146.
δ=7−5+0.9×0.234−0.196=2+0.2106−0.196=2.0146.
这是我们这条样本的时序差分误差。
6. 损失函数与梯度下降
我们用均方误差(MSE)来训练网络参数
θ
\theta
θ。对这条样本来说,损失可以写作:
L
(
θ
)
=
1
2
[
δ
(
θ
)
]
2
,
L(\theta) = \frac12 \bigl[\delta(\theta)\bigr]^2,
L(θ)=21[δ(θ)]2,
其中
δ
(
θ
)
\delta(\theta)
δ(θ) 是上面算出来的 TD 误差,会随
θ
\theta
θ 改变。为了简化,我们此处把
δ
\delta
δ 视为“只依赖当前
θ
\theta
θ”的值(实际 DQN 常用“目标网络”或“停止梯度”技巧来使
δ
\delta
δ 的一部分不随
θ
\theta
θ 变)。在示例中,我们就把
δ
=
2.0146
\delta=2.0146
δ=2.0146当作固定,便于演示梯度下降主流程。
6.1 反向传播(Backprop)
要更新 θ \theta θ,我们要对 L ( θ ) = 1 2 δ 2 L(\theta)=\tfrac12 \delta^2 L(θ)=21δ2 做梯度下降:
∇ θ L ( θ ) = δ ∇ θ δ . \nabla_\theta L(\theta) = \delta \,\nabla_\theta \delta. ∇θL(θ)=δ∇θδ.
但
δ
≈
q
^
θ
(
x
′
,
⋅
)
\delta\approx \hat{q}_\theta(\mathbf{x}',\cdot)
δ≈q^θ(x′,⋅) 等项都和
θ
\theta
θ 有关。如果在纯DQN实现里,我们通常冻结下一状态的
max
q
^
θ
(
x
′
,
a
)
\max \hat{q}_\theta(\mathbf{x}',a)
maxq^θ(x′,a)(用目标网络
θ
−
\theta^-
θ−)或做停止梯度,所以
δ
\delta
δ 中只有“
q
^
θ
(
x
,
A
)
\hat{q}_\theta(\mathbf{x},A)
q^θ(x,A)”那一部分对
θ
\theta
θ 求导。这样:
∇
θ
δ
≈
−
∇
θ
q
^
θ
(
x
,
A
)
,
\nabla_\theta \delta \approx -\,\nabla_\theta \hat{q}_\theta(\mathbf{x}, A),
∇θδ≈−∇θq^θ(x,A),
因为
δ
=
(常数)
−
q
^
θ
(
x
,
A
)
\delta = \text{(常数)} - \hat{q}_\theta(\mathbf{x}, A)
δ=(常数)−q^θ(x,A) 在这种实现里“下一状态部分”不回传梯度。
为简单,我们就这么做:只对当前 Q 值 q ^ θ ( x , A ) \hat{q}_\theta(\mathbf{x}, A) q^θ(x,A) 求导。
小结
- ∇ θ L ( θ ) ≈ δ × [ − ∇ θ q ^ θ ( x , A ) ] \nabla_\theta L(\theta) \approx \delta \times \bigl[-\,\nabla_\theta \hat{q}_\theta(\mathbf{x}, A)\bigr] ∇θL(θ)≈δ×[−∇θq^θ(x,A)].
6.2 梯度下降更新
更新公式:
θ
←
θ
−
α
∇
θ
L
(
θ
)
.
\theta \leftarrow \theta - \alpha \,\nabla_\theta L(\theta).
θ←θ−α∇θL(θ).
带入上面近似:
θ
←
θ
−
α
δ
[
−
∇
θ
q
^
θ
(
x
,
A
)
]
=
θ
+
α
δ
∇
θ
q
^
θ
(
x
,
A
)
.
\theta \leftarrow \theta - \alpha\,\delta \,\bigl[-\nabla_\theta \hat{q}_\theta(\mathbf{x}, A)\bigr] = \theta + \alpha\,\delta \,\nabla_\theta \hat{q}_\theta(\mathbf{x}, A).
θ←θ−αδ[−∇θq^θ(x,A)]=θ+αδ∇θq^θ(x,A).
由于 α = 0.01 \alpha=0.01 α=0.01, δ = 2.0146 \delta=2.0146 δ=2.0146,剩下就是计算 ∇ θ q ^ θ ( x , A = a 1 ) \nabla_\theta \hat{q}_\theta(\mathbf{x}, A=a_1) ∇θq^θ(x,A=a1)。这涉及到对 W 1 , b 1 , W 2 , b 2 W_1, b_1, W_2, b_2 W1,b1,W2,b2 做反向传播。下面我们只展示核心思路,不手算全部梯度细节——现实中由深度学习框架(如 PyTorch、TensorFlow)自动完成。
大体流程:
- 输出层: q ^ θ ( x , a 1 ) = z o u t , 1 \hat{q}_\theta(\mathbf{x}, a_1)=z_{out,1} q^θ(x,a1)=zout,1,梯度 ∂ z o u t , 1 / ∂ W 2 \partial z_{out,1}/\partial W_2 ∂zout,1/∂W2 与 ∂ z o u t , 1 / ∂ b 2 \partial z_{out,1}/\partial b_2 ∂zout,1/∂b2 依赖于隐藏层 h \mathbf{h} h。
- 隐藏层:再把梯度传回去,计算 ∂ z o u t , 1 / ∂ W 1 \partial z_{out,1}/\partial W_1 ∂zout,1/∂W1 等,因为 h \mathbf{h} h = ReLU( z 1 \mathbf{z}_1 z1),其中 z 1 = W 1 x + b 1 \mathbf{z}_1=W_1\mathbf{x}+b_1 z1=W1x+b1。
- 最后:更新每个参数,形如
W 2 ← W 2 + α δ ∂ q ^ θ ( x , a 1 ) ∂ W 2 , … W_2 \leftarrow W_2 + \alpha\,\delta \,\frac{\partial \hat{q}_\theta(\mathbf{x}, a_1)}{\partial W_2}, \quad\ldots W2←W2+αδ∂W2∂q^θ(x,a1),…
在实际代码中,这都是自动微分搞定。我们这里只要明白:每个参数都会被往“让 q ^ θ ( x , a 1 ) \hat{q}_\theta(\mathbf{x}, a_1) q^θ(x,a1) 更接近 TD 目标”的方向调整。
7. 更新平均奖励 R ˉ \bar{R} Rˉ
按照“value-based reward centering”伪代码,还要更新
R
ˉ
\bar{R}
Rˉ。
令
R
ˉ
←
R
ˉ
+
η
α
δ
_
m
e
a
n
\bar{R} \leftarrow \bar{R} + \eta\alpha\,\delta\_mean
Rˉ←Rˉ+ηαδ_mean。
- 这里 δ _ m e a n \delta\_mean δ_mean 是对一个 batch 的平均。我们示例 batch size=1,所以 δ _ m e a n = δ = 2.0146 \delta\_mean=\delta=2.0146 δ_mean=δ=2.0146。
-
α
=
0.01
\alpha=0.01
α=0.01,
η
=
1
\eta=1
η=1,则
R ˉ ← 5 + 0.01 × 2.0146 = 5 + 0.020146 ≈ 5.020146. \bar{R} \leftarrow 5 + 0.01\times 2.0146 = 5 + 0.020146 \approx 5.020146. Rˉ←5+0.01×2.0146=5+0.020146≈5.020146. - 表示由于本次样本的 TD 误差为正,说明我们的“中心化奖励”在估计上偏低,于是稍微提高 R ˉ \bar{R} Rˉ(从5到5.020146)。
8. 结果与意义
-
神经网络参数 θ \theta θ 的意义:
- θ \theta θ 包含了所有层的权重和偏置。它决定了给定状态 x \mathbf{x} x 时,各动作的 Q 值输出。
- 当我们执行梯度下降时,其实是在“微调”这些参数,以减少 δ 2 \delta^2 δ2(TD 误差的平方),让 Q 值逼近我们想要的目标。
-
为什么梯度下降?
- 因为我们的损失函数 L ( θ ) = 1 2 δ 2 L(\theta)=\tfrac12\delta^2 L(θ)=21δ2 对 θ \theta θ 求导可得更新方向;更新后,网络输出的 q ^ θ ( x , a ) \hat{q}_\theta(\mathbf{x}, a) q^θ(x,a) 就会更接近“中心化奖励 + 折扣未来价值”。
-
数值更新后:
- θ \theta θ 中的所有参数( W 1 , b 1 , W 2 , b 2 W_1, b_1, W_2, b_2 W1,b1,W2,b2) 会小幅度调整;
- R ˉ \bar{R} Rˉ 也小幅度提高。
- 在多步迭代后, R ˉ \bar{R} Rˉ 收敛到策略的平均奖励水平,网络学习到一个Q值函数,不会出现因奖励有大常数偏移而导致的 Q 值无限膨胀。
-
非线性 vs. 线性:
- 跟线性Q-learning不同的是,这里 q ^ θ ( x , a ) \hat{q}_\theta(\mathbf{x}, a) q^θ(x,a) 是神经网络输出的一个非线性函数;我们需要用反向传播(backprop)来计算梯度。
- 在例子中,我们手动演示了如何做前向传播得到 Q 值,反向传播的梯度更新就由深度学习库自动计算了。
9. 小结
- θ \theta θ 是神经网络的所有可学习参数(权重、偏置等)。它把状态 x \mathbf{x} x 映射到各动作的Q值输出。
- 梯度下降:我们对 1 2 δ 2 \tfrac12 \delta^2 21δ2 做最小化,通过反向传播更新 θ \theta θ。其中 δ = ( R − R ˉ ) + γ max a Q θ ( x ′ , a ) − Q θ ( x , A ) \delta = (R - \bar{R}) + \gamma \max_a Q_\theta(\mathbf{x}',a) - Q_\theta(\mathbf{x},A) δ=(R−Rˉ)+γmaxaQθ(x′,a)−Qθ(x,A)。
- 示例:
- 前向传播:计算隐藏层 h \mathbf{h} h 和输出层 q θ ( x ) \mathbf{q}_\theta(\mathbf{x}) qθ(x),得出 q ^ θ ( x , a 1 ) \hat{q}_\theta(\mathbf{x}, a_1) q^θ(x,a1) 等值。
- 计算 δ ≈ 2.0146 \delta\approx2.0146 δ≈2.0146 并做梯度更新:让 q ^ θ ( x , a 1 ) \hat{q}_\theta(\mathbf{x}, a_1) q^θ(x,a1) 朝目标 ( R − R ˉ ) + γ max a q ^ θ ( x ′ , a ) (R-\bar{R}) + \gamma \max_a \hat{q}_\theta(\mathbf{x}',a) (R−Rˉ)+γmaxaq^θ(x′,a) 靠近。
- 同时更新平均奖励 R ˉ ← R ˉ + η α δ _ m e a n \bar{R}\leftarrow \bar{R} + \eta\alpha\,\delta\_mean Rˉ←Rˉ+ηαδ_mean。
- 意义:
- 通过“奖励中心化”,我们去掉了奖励中的大偏移,使 Q 值学习更稳定;
- 通过神经网络参数 θ \theta θ 的梯度下降,我们逐步逼近真正的Q值函数;
- 每次更新都在自动微分框架下完成,无需手动算所有梯度。
希望这个更细致的示例能帮你理解:
- θ \theta θ 就是神经网络所有可学习参数;
- 梯度下降如何基于 δ \delta δ 进行一次更新(反向传播);
- 奖励中心化对 TD 目标的影响,以及** R ˉ \bar{R} Rˉ** 的更新方式。
效果
- 本次更新后:
- 动作 a 1 a_1 a1 在状态 m a t h b f x mathbf{x} mathbfx 下的估计值会稍微增大(因为 δ \delta δ 为正);
- 平均奖励 R ˉ \bar{R} Rˉ 也稍微增大。
- 在多步迭代后, R ˉ \bar{R} Rˉ 将逐渐收敛到一个与策略性能相关的平均奖励水平,Q值在数值上会更集中于“相对奖励”的范围,不会因为大常数奖励或 γ \gamma γ 高而无限膨胀。
我们建议对附录C中的通用伪代码进行两个小但有用的优化。
Python代码可在以下地址获取: https://github.com/abhisheknaik96/continuing-rl-exps。