参考视频:📺王树森教授深度强化学习
前言:
最近在学习深度强化学习,学的一知半解😢😢😢,这是我的笔记,欢迎和我一起学习交流~
这篇博客目前还相对比较乱,后面有时间会整理一次~
由于 CSDN 目前有单篇博客字数限制,故分成两篇博客来展示 😁,这是第一篇
第二篇在这里:深度强化学习 ②(DRL)
文章目录
- 1. 常见名词
- 1.1 强化学习目标
- 1.2 policy 函数
- 1.3 状态转移
- 1.4 强化学习中的随机性来源
- 1.5 强化学习的过程
- 1.6 Return
- 1.7 value function
- 1.7.1 Action-value function
- 1.7.2 Optimal action-value function
- 1.7.3 State-value function
- 1.7.4 Optimal state-value function
- 1.8 如何用 AI 控制 agent
- 2. Deep Q Network(DQN)
- 2.1 Temporal difference(TD) learning
- 2.1.1 传统走完全程更新
- 2.1.2 TD 无需走完全程也能更新
- 2.2 用 TD 算法学习 DQN
- 2.2.1 相邻两个折扣回报之间的关系
- 2.2.2 使用 TD learning 训练 DQN
- 3. Policy Network
- 3.1 目标函数
- 3.2 Policy gradient ascent
- 3.2.1 求策略梯度
- 3.2.2 求 Q π Q_\pi Qπ
- 4. Actor-Critic Methods
- 4.1 训练
- 5. Monte Carlo Algorithms
- 5.1 近似求积分
- 5.2 近似期望
- 6. 随机排列
- 7. TD Learning
- 7.1 Sarsa 算法
- 7.1.1 表格
- 7.1.2 价值网络
- 7.2 Q-Learning
- 7.2.1 表格形式
- 7.2.2 DQN
- 7.3 Multi-Step TD target
- 7.3.1 m-step TD target for Sarsa:
- 7.3.2 one-step TD target for Sarsa
- 7.3.3 m-step TD target for Q-Learning
- 7.3.4 one-step TD target for Q-Learning
- 8. Experience Replay(经验回放)
- 8.1 原始 TD 算法的缺点
- 8.2 经验回放
- 8.3 对经验回放的改进
1. 常见名词
1.1 强化学习目标
获得的奖励总和尽量要高
1.2 policy 函数
π ( a ∣ s ) = P ( A = a ∣ S = s ) \pi(a|s)=P(A=a|S=s) π(a∣s)=P(A=a∣S=s)
计算动作的概率值,从而控制 agent 运动
1.3 状态转移
可以是确定的,也可以是随机的,通常认为状态转移是随机的,随机性是从环境中来的
用概率密度函数来表示状态转移
p ( s ′ ∣ s , a ) = P ( S ′ = s ′ ∣ S = s , A = a ) p(s^{'}|s,a)=P(S^{'}=s^{'}|S=s,A=a) p(s′∣s,a)=P(S′=s′∣S=s,A=a)
1.4 强化学习中的随机性来源
-
agent 动作
动作是根据 policy 函数给出的概率随机抽样得到的
-
状态转移
环境根据状态转移函数给出的概率随机抽样来得到某个状态
1.5 强化学习的过程
- 观察状态 s
- 根据 policy 函数得到动作 a,并执行
- 环境进入状态 s2,并给 agent 一个奖励 r1
- 执行动作 a2
- …
1.6 Return
回报,cumulative future reward
U t = R t + R t + 1 + R t + 2 + R t + 3 + . . . U_{t}=R_t + R_{t+1} + R_{t+2} + R_{t+3} + ... Ut=Rt+Rt+1+Rt+2+Rt+3+...
未来的奖励比当前的奖励价值低,故应当给予未来的奖励较低的权重
Discounted return:折扣回报,cumulative discounted future reward。由于未来的奖励没有现在的奖励值钱,故强化学习中普遍使用 Discounted return,折扣率为 γ \gamma γ (超参),若未来奖励和现在奖励一样,则值为 1。
U t = R t + γ R t + 1 + γ R t + 2 + γ R t + 3 + . . . U_{t}=R_{t}+\gamma R_{t+1}+\gamma R_{t+2}+\gamma R_{t+3}+... Ut=Rt+γRt+1+γRt+2+γRt+3+...
在任务未结束时,Ut 是随机变量,随机性来源于 policy 函数 和 状态转移函数(跟从 t 时刻开始未来所有的动作和状态都有关)。对于任意时刻 i,奖励 Ri 取决于状态 Si 和动作 Ai。
Ut 依赖于未来所有的动作和未来所有的状态
1.7 value function
1.7.1 Action-value function
Ut 是随机变量,在 t 时刻并不知道 Ut 是什么,如何评估当前的形式,对 Ut 求期望(关于未来所有状态和动作求期望,消除了随机变量),将里面的随机性用积分积掉,就得到了一个实数。求期望得到 动作价值函数(Action-value function) Q π Q_\pi Qπ,除了 St 和 At (被作为观测到的数值来对待),其余的随机变量都被积掉了。
Q π ( S t , a t ) = E [ U t ∣ S t = s t , A t = a t ] Q_\pi(S_t,a_t)=E[U_t|S_t=s_t,A_t=a_t] Qπ(St,at)=E[Ut∣St=st,At=at]
Q π Q_\pi Qπ 除了依赖于 st 和 at,还与 policy 函数有关,因为积分的时候会用到 policy 函数,若 policy 函数不一样,则积分得到的 Q π Q_\pi Qπ 也就不一样
直观意义:若使用某个 policy 函数,在状态 st 下,做动作 at 是好还是坏。在使用某个 policy 函数时,用 Q π Q_\pi Qπ 给当前状态下所有动作打分,由此便能知道哪个动作更好。
1.7.2 Optimal action-value function
对 Q π Q_\pi Qπ 关于 π \pi π 求最大化,便可去掉其中的 π \pi π。(使用最好的那个 policy 函数);
Q ⋆ ( S t , a t ) = m a x π Q π ( S t , a t ) Q^\star (S_t,a_t)=max_\pi Q_\pi(S_t,a_t) Q⋆(St,at)=maxπQπ(St,at)
直观意义:在状态 st 时,评价动作 at 好不好。agent 可以根据 Q ⋆ Q^\star Q⋆ 对动作的评价来做决策
1.7.3 State-value function
V π ( S t ) = E A ∼ π [ Q π ( s t , A ) ] V π ( S t ) = E A [ Q π ( s t , A ) ] = ∑ a π ( a ∣ s t ) ∗ Q π ( s t , a ) V π ( S t ) = E A [ Q π ( s t , A ) ] = ∫ π ( a ∣ s t ) ∗ Q π ( s t , a ) d a V_\pi(S_t)=E_{A\sim\pi}[Q_{\pi} (s_t,A)]\\ V_\pi(S_t)=E_A[Q_\pi (s_t,A)]=\sum_a \pi(a|s_t)*Q_\pi(s_t,a)\\ V_\pi(S_t)=E_A[Q_\pi (s_t,A)]=\int \pi(a|s_t)*Q_\pi(s_t,a)da\\ Vπ(St)=EA∼π[Qπ(st,A)]Vπ(St)=EA[Qπ(st,A)]=a∑π(a∣st)∗Qπ(st,a)Vπ(St)=EA[Qπ(st,A)]=∫π(a∣st)∗Qπ(st,a)da
V π V_\pi Vπ 是 Q π Q_\pi Qπ 的期望。 Q π Q_\pi Qπ 和 状态 st、动作 A 都有关,将动作 A 作为随机变量,关于 A 求期望,将 A 消掉,则得到 V π V_\pi Vπ,只和 policy 函数以及状态 St 有关
直观意义
- 评价当前状态的好坏,快赢了还是快输了
- 评价 policy 函数的好坏,policy 函数越好, V π V_\pi Vπ 的平均值 E S [ V π ( S ) ] E_S[V_\pi(S)] ES[Vπ(S)]
1.7.4 Optimal state-value function
V ⋆ ( s ) = max a V π ( s ) . V^\star(s)=\max_aV_\pi(s). V⋆(s)=amaxVπ(s).
评价状态的好坏程度
1.8 如何用 AI 控制 agent
-
学习 policy 函数,将当前状态作为 policy 函数的输入,输出每个动作的概率,根据这个概率随机抽样得到下一步要执行的动作
-
学习最优动作价值函数,将当前状态作为输入,对每个动作都做一个评价,选出 Q 值最高的动作,最高评价的动作在未来获得的奖励更多
a t = a r g m a x a Q ⋆ ( s t , a ) a_t=argmax_a Q^\star(s_t,a) at=argmaxaQ⋆(st,a)
强化学习最常用的标准库 OpenAI Gym,Gym 有几大类控制问题
- 经典控制问题
- Atari games
- MuJoCo 连续控制问题
2. Deep Q Network(DQN)
强化学习目标:最终的奖励尽可能的大
将 Q ⋆ Q^\star Q⋆ 作为一个先知,不能给出确定的答案,只能给出每个动作带来的平均回报,给出的值和实际会发生的并不一样,但我们还是选择平均回报最高的那个动作
DQN 是一种价值学习的方法,用一个神经网络去近似 Q ⋆ Q^\star Q⋆ 函数。神经网络为 Q ( s , a ; w ) Q(s,a;w) Q(s,a;w),s 为输入,w 为神经网络的参数,a 为输出(对所有可能动作的打分),通过奖励来学习神经网络,神经网络的打分会逐渐改进,越来越准
应用:通过 DQN 打分,执行分数最高的动作,然后环境会更新状态,并给 agent 一个奖励,接着继续 DQN 打分…
价值学习:学习一个函数来近似 Q ⋆ Q^\star Q⋆
2.1 Temporal difference(TD) learning
模型无需走完整个过程,也能进行更新
2.1.1 传统走完全程更新
从 A 地到 B 地,模型 Q ( w ) Q(w) Q(w) 预测需要 1000 分钟,实际走完全程花费的时间是 q = 860 q=860 q=860,损失为 L = 1 / 2 ( q − y ) 2 L=1/2(q-y)^2 L=1/2(q−y)2,计算梯度 $ \frac{\partial L}{\partial w}=\frac{\partial q}{\partial w} * \frac{\partial L}{\partial q}=(q-y)*\frac{\partial Q(w)}{\partial w} ,更新梯度: ,更新梯度: ,更新梯度:w_{t+1}=w_t -\alpha * \frac {\partial L}{\partial w}|_{w=w_t}$,这种方式必须完成整个过程才能对模型进行一次更新
2.1.2 TD 无需走完全程也能更新
模型预测从 A 到 B 需要 Q ( w ) = 1000 m i n u t e s Q(w)=1000 minutes Q(w)=1000minutes,而实际只走到了 C,用了 300 minutes,则更新估计,从 A 到 B 预计需要 300 + 600 = 900 m i n u t e s 300 + 600 = 900minutes 300+600=900minutes,称为 TD target,比之前预测的 1000 minutes 更加可靠。损失为 L = 1 2 ( Q ( w ) − y ) 2 L=\frac{1}{2}(Q(w)-y)^2 L=21(Q(w)−y)2,计算梯度 $ \frac{\partial L}{\partial w}=\frac{\partial q}{\partial w} * \frac{\partial L}{\partial q}=(q-y)\frac{\partial Q(w)}{\partial w}=(1000-900)\frac{\partial Q(w)}{\partial w}$,其中 $ q-y$ 即 1000 − 900 1000-900 1000−900 为 TD error,接着用梯度下降更新模型参数。
TD 算法的目标就是让 TD error 尽量接近 0
2.2 用 TD 算法学习 DQN
2.1.2 中,用到公式 T A − > B ≈ T A − > C + T C − > B T_{A->B}\approx T_{A->C} + T_{C->B} TA−>B≈TA−>C+TC−>B, 理想情况下左右两边应该相等,存在这样的公式才能使用 TD 算法(右边有一项是真是观测到的)
2.2.1 相邻两个折扣回报之间的关系
U t = R t + γ ∗ R t + 1 + γ 2 ∗ R t + 2 + γ 3 ∗ R t + 3 + γ 4 ∗ R t + 4 = R t + γ ∗ ( R t + 1 + γ ∗ R t + 2 + γ 2 ∗ R t + 3 + γ 3 ∗ R t + 4 U_t=R_t + \gamma * R_{t+1} + \gamma^2 * R_{t+2} + \gamma^3 * R_{t+3} + \gamma^4 * R_{t+4}\\ =R_t + \gamma *(R_{t+1} + \gamma * R_{t+2} + \gamma^2 * R_{t+3} + \gamma^3 * R_{t+4}\\ Ut=Rt+γ∗Rt+1+γ2∗Rt+2+γ3∗Rt+3+γ4∗Rt+4=Rt+γ∗(Rt+1+γ∗Rt+2+γ2∗Rt+3+γ3∗Rt+4
U t = R t + γ ∗ U t + 1 U_t =R_t+ \gamma * U_{t+1} Ut=Rt+γ∗Ut+1
两边同时求期望可得:
Q ( s t , a t ; w ) ≈ r t + γ ∗ Q ( s t + 1 , a t + 1 ; w ) P r e d i c t i o n ≈ T D t a r g e t Q(s_t,a_t;w)\approx r_t+\gamma*Q(s_{t+1},a_{t+1};w)\\ Prediction \approx TD\ target Q(st,at;w)≈rt+γ∗Q(st+1,at+1;w)Prediction≈TD target
2.2.2 使用 TD learning 训练 DQN
价值网络对期望回报的估计: Q t = Q ( s t , a t ; w ) Q_t=Q(s_t,a_t;w) Qt=Q(st,at;w)
TD target
也是对期望回报的估计,由于用到了真实值 r t r_t rt,故比 Q t Q_t Qt 更靠谱
y t = r t + γ ∗ Q ( s t + 1 , a t + 1 ; w t ) = r t + γ ∗ m a x a Q ( s t + 1 , a ; w t ) y_t=r_t+\gamma*Q(s_{t+1},a_{t+1};w_t)=r_t+\gamma*max_a Q(s_{t+1},a;w_t) yt=rt+γ∗Q(st+1,at+1;wt)=rt+γ∗maxaQ(st+1,a;wt)
Loss
L t = 1 2 [ Q ( s t , a t ; w ) − y t ] 2 L_t=\frac{1}{2}[Q(s_t,a_t;w)-y_t]^2 Lt=21[Q(st,at;w)−yt]2
Gradient descent
w t + 1 = w t − α ∗ ∂ L t ∂ w ∣ w = w t w_{t+1}=w_t-\alpha*\frac{\partial L_t}{\partial w}|_{w=w_t} wt+1=wt−α∗∂w∂Lt∣w=wt
找到 w w w,使得 L ( w ) L(w) L(w) 尽量小。 L ( w ) = 1 T ∑ t = 1 T δ t 2 2 L(w)=\frac{1}{T}\sum_{t=1}^{T}\frac{\delta_t^2}{2} L(w)=T1∑t=1T2δt2.
3. Policy Network
使用神经网络 π ( a ∣ s ; θ ) \pi(a|s;\theta) π(a∣s;θ)去近似 policy 函数 π ( a ∣ s ) \pi(a|s) π(a∣s)。输出动作空间上的概率分布,即每个动作的概率值,根据动作做抽样,让 agent 执行这个动作。
V π ( s t ; θ ) = E A ∼ π [ Q π ( s , A ) ] = ∑ a π ( a ∣ s t ; θ ) ∗ Q π ( s t , a ) \begin{aligned} V_\pi(s_t;\theta) &=E_{A\sim\pi}[Q_{\pi}(s,A)]\\ &=\sum_a \pi(a|s_t;\theta)*Q_\pi(s_t,a) \end{aligned} Vπ(st;θ)=EA∼π[Qπ(s,A)]=a∑π(a∣st;θ)∗Qπ(st,a)
V ( s t ; θ ) V(s_t;\theta) V(st;θ) 可以用来评价策略网络以及状态 s 的好坏,给定状态 s,策略网络越好, V ( s t ; θ ) V(s_t;\theta) V(st;θ) 越大。
3.1 目标函数
通过改进 θ \theta θ,让 V 的值越来越大,故目标函数可以定义如下,关于状态 s 求期望,目标函数就只与 θ \theta θ 有关
J ( θ ) = E S [ V ( S ; θ ) ] J(\theta)=E_S[V(S;\theta)] J(θ)=ES[V(S;θ)]
使用策略函数 π \pi π,agent 的平均胜算有多大,策略函数越好,目标函数越大。agent 的平均胜算也就越大。
3.2 Policy gradient ascent
通过策略梯度上升来改进 θ \theta θ
θ ← θ + β ∗ ∂ V ( s ; θ ) ∂ θ \theta \leftarrow \theta + \beta*\frac{\partial V(s;\theta)}{\partial \theta} θ←θ+β∗∂θ∂V(s;θ)
∂ V ( s ; θ ) ∂ θ \frac{\partial V(s;\theta)}{\partial \theta} ∂θ∂V(s;θ) 称为策略梯度
形式一: ∂ V ( s ; θ ) ∂ θ = ∑ a ∂ π ( a ∣ s ; θ ) ∂ θ ∗ Q π ( s , a ) = ∑ a π ( a ∣ s ; θ ) ∗ ∂ l o g π ( a ∣ s ; θ ) ∂ θ ∗ Q π ( s , a ) 形式二: = E A ∼ π [ ∂ l o g π ( A ∣ s ; θ ) ∂ θ ∗ Q π ( s , A ) ] 形式一:\frac{\partial V(s;\theta)}{\partial \theta}=\sum_a\frac{\partial \pi(a|s;\theta)}{\partial \theta}*Q_\pi(s,a)\\ =\sum_a\pi(a|s;\theta)*\frac{\partial log \pi(a|s;\theta)}{\partial \theta}*Q_\pi(s,a)\\ 形式二:=E_{A\sim\pi}[\frac{\partial log \pi(A|s;\theta)}{\partial \theta}*Q_\pi(s,A)] 形式一:∂θ∂V(s;θ)=a∑∂θ∂π(a∣s;θ)∗Qπ(s,a)=a∑π(a∣s;θ)∗∂θ∂logπ(a∣s;θ)∗Qπ(s,a)形式二:=EA∼π[∂θ∂logπ(A∣s;θ)∗Qπ(s,A)]
3.2.1 求策略梯度
-
若动作是离散的,使用形式一,直接求所有动作的策略梯度并求和
-
若动作是连续的,使用形式二,求期望需要定积分,但无法求,因为 π \pi π 函数是神经网络,非常复杂,无法直接用数学公式计算积分,故做蒙特卡洛近似(对离散的动作同样适用),将期望近似算出来
蒙特卡洛近似:抽一个或多个随机样本,用随机样本(观测值)来近似期望
根据 π \pi π 函数随机采样得到 a ^ \hat a a^,令 g ( a ^ , θ ) = ∂ l o g π ( a ^ ∣ s ; θ ) ∂ θ ∗ Q π ( s , a ^ ) ] g(\hat a,\theta)=\frac{\partial log \pi(\hat a|s;\theta)}{\partial \theta}*Q_\pi(s,\hat a)] g(a^,θ)=∂θ∂logπ(a^∣s;θ)∗Qπ(s,a^)],则 E A [ g ( A , θ ) ] = ∂ V ( s ; θ ) ∂ θ E_A[g(A,\theta)]=\frac{\partial V(s;\theta)}{\partial \theta} EA[g(A,θ)]=∂θ∂V(s;θ), g ( a ^ , θ ) g(\hat a,\theta) g(a^,θ) 是 ∂ V ( s ; θ ) ∂ θ \frac{\partial V(s;\theta)}{\partial \theta} ∂θ∂V(s;θ) 的无偏估计(是这个期望的蒙特卡洛近似),故其可以来近似策略梯度
故更新模型参数的时候,用 g ( a ^ , θ ) g(\hat a,\theta) g(a^,θ) 作为近似梯度,无需计算精确梯度
3.2.2 求 Q π Q_\pi Qπ
- 用观测到的 u t u_t ut 来代替 Q π Q_\pi Qπ 函数。用策略网络 π \pi π 控制 agent 运动,完成一个过程之后(完成一局游戏),记录整个轨迹,计算 u t u_t ut,用 u t u_t ut 来近似 Q π = E [ U t ] Q_\pi=E[U_t] Qπ=E[Ut]
- 用另一个神经网络来近似价值函数 Q π Q_\pi Qπ,则共有两个网络,actor 和 critic,即 actor-critic 方法
4. Actor-Critic Methods
状态价值函数 V π ( S t ) = ∑ a π ( a ∣ s ) ∗ Q π ( s , a ) V_\pi(S_t)=\sum_a \pi(a|s)*Q_\pi(s,a) Vπ(St)=∑aπ(a∣s)∗Qπ(s,a), π \pi π 函数和 Q π Q_\pi Qπ 都不知道,可以用两个神经网络分别近似这两个函数,用 Actor-Critic 方法同时学习这两个网络。用神经网络 π ( a ∣ s ; θ ) \pi(a|s;\theta) π(a∣s;θ) 来近似 π \pi π 函数,用神经网络 q ( s , a ; w ) q(s,a;w) q(s,a;w) 近似价值函数 Q π ( s , a ) Q_\pi(s,a) Qπ(s,a),则状态价值函数可用 V ( s ; θ , w ) = ∑ a π ( a ∣ s ; θ ) ∗ q ( s , a ; w ) V(s;\theta,w)=\sum_a \pi(a|s;\theta)*q(s,a;w) V(s;θ,w)=∑aπ(a∣s;θ)∗q(s,a;w) 来近似。然后同时训练这两个网络
目的:让 actor 的回报越来越高,让 critic 的打分越来越精准
-
更新策略网络:为了让状态价值函数的值越来越高
-
更新价值网络:为了对动作的打分更加精准,从而更好的估计未来奖励的总和
用 Sarsa 训练
4.1 训练
- 观测到当前状态 s t s_t st,将 s t s_t st 作为输入,根据策略函数 π \pi π 来计算动作概率分布,通过随机采样来获得要执行的动作 a t a_t at
- agent 执行动作 a t a_t at, 环境会更新状态 s t + 1 s_t+1 st+1,并给出奖励 r t r_t rt
- 随机采用动作 a ~ t + 1 \tilde a_{t+1} a~t+1,但不执行
- 计算价值网络 q t = q ( s t , a t ; w t ) q_t=q(s_t,a_t;w_t) qt=q(st,at;wt) 和 q t + 1 = q ( s t + 1 , a ~ t + 1 ; w t ) q_{t+1}=q(s_{t+1},\tilde a_{t+1};w_t) qt+1=q(st+1,a~t+1;wt)
- 计算 TD error: δ t = q t − ( r t + γ ∗ q t + 1 ) \delta_t=q_t-(r_t+\gamma*q_{t+1}) δt=qt−(rt+γ∗qt+1)
- 求导: d w , t = ∂ q ( s t , a t ; w ) ∂ w ∣ w = w t d_{w,t}=\frac{\partial q(s_t,a_t;w)}{\partial w}|w=w_t dw,t=∂w∂q(st,at;w)∣w=wt
- 更新价值网络 w t + 1 = w t − α ∗ δ ∗ d w , t w_{t+1}=w_t-\alpha * \delta * d_{w,t} wt+1=wt−α∗δ∗dw,t
- 求导: d θ , t = ∂ l o g π ( a t ∣ s t ; θ ) ∂ θ ∣ θ = θ t d_{\theta,t}=\frac{\partial log \pi(a_t|s_t;\theta)}{\partial \theta}|\theta=\theta_t dθ,t=∂θ∂logπ(at∣st;θ)∣θ=θt
- 更新策略网络: θ t + 1 = θ t + β ∗ q t ∗ d θ , t \theta_{t+1}=\theta_t+\beta*q_t*d_{\theta,t} θt+1=θt+β∗qt∗dθ,t
behavior 泛化能力不好,错误还可能会累加,不如强化学习效果好
5. Monte Carlo Algorithms
蒙特卡洛算法是一大类随机算法,通过随机样本来估算真实值
5.1 近似求积分
求多元函数 f ( x ) f(x) f(x) 的积分 I = ∫ Ω f ( x ) d x I=\int_\Omega f(x)dx I=∫Ωf(x)dx
- 在积分区域随机均匀采样 n 个样本点 X 1 , . . . X n X_1, ... X_n X1,...Xn
- 计算积分区域的体积 V = ∫ Ω d x V=\int_\Omega dx V=∫Ωdx
- 计算 Q n = V ∗ 1 n ∑ i = 1 n f ( X i ) Q_n=V*\frac{1}{n}\sum_{i=1}^{n}f(X_i) Qn=V∗n1∑i=1nf(Xi)
- 将 Q n Q_n Qn 作为对积分的近似
5.2 近似期望
E X ∼ p [ f ( X ) ] = ∫ R d f ( x ) ∗ p ( x ) d x E_{X\sim p}[f(X)]=\int_{R^d}f(x)*p(x)dx EX∼p[f(X)]=∫Rdf(x)∗p(x)dx
- 根据概率密度函数 p ( x ) p(x) p(x) 随机采样 n 个样本 x 1 , . . . x n x_1,...x_n x1,...xn
- 计算 Q n = 1 n ∑ i = 1 n f ( x i ) Q_n=\frac{1}{n}\sum_{i=1}^{n}f(x_i) Qn=n1∑i=1nf(xi)
- 将 Q n Q_n Qn 作为对期望的近似
6. 随机排列
均匀随机排列:所有排列被选中的概率相同。一个元素出现在任何位置的概率都相同。任何位置上出现 n 个元素中任何一个元素的概率都是 1 n \frac{1}{n} n1
7. TD Learning
U t U_t Ut 和 $U_{t+1} 之间的关系为 KaTeX parse error: Can't use function '$' in math mode at position 27: …gamma * U_{t+1}$̲,通常认为 $R_t$ 依赖于…
\begin{aligned}
Q_\pi(s_t,a_t)
&=E[U_t|s_t,a_t]\
&=E[R_t+\gammaU_{t+1}|s_t,a_t]\
&=E[R_t|s_t,a_t]+\gammaE[U_{t+1}|s_t,a_t]\
&=E[R_t|s_t,a_t]+\gammaE[Q_\pi(S_{t+1},A_{t+1})|s_t,a_t]\
&=E[R_t+\gammaQ_\pi(S_{t+1},A_{t+1})]\
\end{aligned}
$$
期望是关于 S t + 1 S_{t+1} St+1 和 A t + 1 A_{t+1} At+1 求的,直接求期望很困难,故对期望做蒙特卡洛近似,将 R t R_t Rt 近似为观测到的奖励 r t r_t rt,将 S t + 1 S_{t+1} St+1 和 A t + 1 A_{t+1} At+1 用观测到的 s t + 1 s_{t+1} st+1 和 a t + 1 a_{t+1} at+1 近似,得到 Q π ( s t + 1 , a t + 1 ) Q_\pi(s_{t+1},a_{t+1}) Qπ(st+1,at+1),从而得到近似的期望 r t + γ ∗ Q π ( s t + 1 , a t + 1 ) r_t+\gamma*Q\pi(s_{t+1},a_{t+1}) rt+γ∗Qπ(st+1,at+1),称为 TD target y t y_t yt。
TD Learning 是为了让动作价值 Q π ( s t , a t ) Q_\pi(s_t,a_t) Qπ(st,at) 接近 y t y_t yt,因为前者完全是估计值,而后者部分是真实的奖励,更可靠,将其作为观测到的值,让前者更接近后者
TD 算法有 Sarsa 算法和 Q-Learning 算法
7.1 Sarsa 算法
目的:学习动作价值函数 Q π Q_\pi Qπ
7.1.1 表格
状态和动作较少的问题,可以使用表格形式的 Sarsa(State-Action-Reward-State-Action)
Action a1 | Action a2 | … | |
---|---|---|---|
State s1 | |||
State s2 | |||
… |
需要做的就是用 Sarsa 算法更新表格
- 观测到一个四元组 transition ( s t , a t , r t , s t + 1 ) (s_t,a_t,r_t,s_{t+1}) (st,at,rt,st+1)
- 用策略函数 π \pi π 计算下一个动作 a t + 1 a_{t+1} at+1
- 计算 TD target: y t = r t + γ ∗ Q π ( s t + 1 , a t + 1 ) y_t=r_t+\gamma*Q\pi(s_{t+1},a_{t+1}) yt=rt+γ∗Qπ(st+1,at+1)
- 计算 TD error: δ t = Q π ( s t , a t ) − y t \delta_t=Q_\pi(s_t,a_t)-y_t δt=Qπ(st,at)−yt
- 更新表格: Q π ( s t , a t ) ← Q π ( s t , a t ) − α ∗ δ t Q_\pi(s_t,a_t) \leftarrow Q_\pi(s_t,a_t)-\alpha*\delta_t Qπ(st,at)←Qπ(st,at)−α∗δt
7.1.2 价值网络
用神经网络 q ( s , a ; w ) q(s,a;w) q(s,a;w) 近似动作价值函数 Q π ( s , a ) Q_\pi(s,a) Qπ(s,a)
在 Action-Critic 中,用 Sarsa 来更新价值网络
- TD target: y t = r t + γ ∗ q ( s t + 1 , a t + 1 ; w ) y_t=r_t+\gamma*q(s_{t+1},a_{t+1};w) yt=rt+γ∗q(st+1,at+1;w)
- TD error: δ t = q ( s t , a t ; w ) − y t \delta_t=q(s_t,a_t;w)-y_t δt=q(st,at;w)−yt
- Loss: δ t 2 / 2 \delta_t^2/2 δt2/2
- Gradient: ∂ δ t 2 / 2 ∂ w = δ t ∗ ∂ q ( s t , a t ; w ) ∂ w \frac{\partial \delta_t^2/2}{\partial w}=\delta_t*\frac{\partial q(s_t,a_t;w)}{\partial w} ∂w∂δt2/2=δt∗∂w∂q(st,at;w)
- Gradient descent: w ← w − α ∗ δ ∗ ∂ q ( s t , a t ; w ) ∂ w w\leftarrow w-\alpha * \delta * \frac{\partial q(s_t,a_t;w)}{\partial w} w←w−α∗δ∗∂w∂q(st,at;w)
7.2 Q-Learning
学习最优动作价值函数 Q ⋆ Q^\star Q⋆
对于任何策略 π \pi π,以下公式都成立 Q π ( s t , a t ) = E [ R t + γ ∗ Q π ( S t + 1 , A t + 1 ) ] Q_\pi(s_t,a_t)=E[R_t+\gamma*Q_\pi(S_{t+1},A_{t+1})] Qπ(st,at)=E[Rt+γ∗Qπ(St+1,At+1)],因此对于最优动作价值函数也成立,即 Q ⋆ ( s t , a t ) = E [ R t + γ ∗ Q ⋆ ( S t + 1 , A t + 1 ) ] Q^\star(s_t,a_t)=E[R_t+\gamma*Q^\star(S_{t+1},A_{t+1})] Q⋆(st,at)=E[Rt+γ∗Q⋆(St+1,At+1)],将等式右边的 Q ⋆ Q^\star Q⋆ 项替换为对动作 a 的最大化 Q ⋆ ( s t , a t ) = E [ R t + γ ∗ max a Q ⋆ ( S t + 1 , a ) ] Q^\star(s_t,a_t)=E[R_t+\gamma*\max_a Q^\star(S_{t+1},a)] Q⋆(st,at)=E[Rt+γ∗maxaQ⋆(St+1,a)],对右边的期望进行蒙特卡洛近似得 r t + γ ∗ max a ∗ Q ⋆ ( s t + 1 , a ) r_t+\gamma*\max_a*Q^\star(s_{t+1},a) rt+γ∗maxa∗Q⋆(st+1,a),记为 TD target y t y_t yt, y t y_t yt 部分基于真实观测,比直接的预测 Q ⋆ ( s t , a t ) Q^\star(s_t,a_t) Q⋆(st,at) 靠谱,让 Q ⋆ ( s t , a t ) Q^\star(s_t,a_t) Q⋆(st,at) 接近 y t y_t yt
7.2.1 表格形式
- 观测到一个四元组 transition ( s t , a t , r t , s t + 1 ) (s_t,a_t,r_t,s_{t+1}) (st,at,rt,st+1)
- 计算 TD target: y t = r t + γ ∗ max a Q ⋆ ( s t + 1 , a ) y_t=r_t+\gamma*\max_a Q^\star(s_{t+1},a) yt=rt+γ∗maxaQ⋆(st+1,a)
- 计算 TD error: δ t = Q ⋆ ( s t , a t ) − y t \delta_t=Q^\star(s_t,a_t)-y_t δt=Q⋆(st,at)−yt
- 更新表格: Q ⋆ ( s t , a t ) ← Q ⋆ ( s t , a t ) − α ∗ δ t Q^\star(s_t,a_t) \leftarrow Q^\star(s_t,a_t)-\alpha*\delta_t Q⋆(st,at)←Q⋆(st,at)−α∗δt
7.2.2 DQN
用神经网络 Q ( s , a ; w ) Q(s,a;w) Q(s,a;w) 来近似最优动作价值函数 Q ⋆ Q^\star Q⋆
输入:状态 s
输出:对所有动作的打分
DQN 控制 agent 执行动作 a t = a r g m a x a Q ( s t , a ; w ) a_t=argmax_a\ Q(s_t,a;w) at=argmaxa Q(st,a;w)
用收集到的 transition 更新参数 w
-
观测到一个四元组 transition ( s t , a t , r t , s t + 1 ) (s_t,a_t,r_t,s_{t+1}) (st,at,rt,st+1). (相当于一条训练数据)
-
计算 TD target: y t = r t + γ ∗ max a Q ( s t + 1 , a ; w ) y_t=r_t+\gamma*\max_a Q(s_{t+1},a;w) yt=rt+γ∗maxaQ(st+1,a;w)
y t y_t yt 部分基于实际观测到的奖励 r t r_t rt,部分基于 DQN 在 t+1 时刻的估计
-
计算 TD error: δ t = Q ( s t , a t ; w ) − y t \delta_t=Q(s_t,a_t;w)-y_t δt=Q(st,at;w)−yt
-
更新参数: w ← w − α ∗ δ t ∗ ∂ Q ( s t , a t ; w ) ∂ w w \leftarrow w-\alpha*\delta_t*\frac{\partial Q(s_t,a_t;w)}{\partial w} w←w−α∗δt∗∂w∂Q(st,at;w)
7.3 Multi-Step TD target
前面的 TD target 都是只包含一个奖励 r t r_t rt,即标准 TD target(One-Step TD target),若用多个奖励,则称为 Multi-Step TD target,效果会更好
对折扣回报的推导得到多步回报
$$
\begin{aligned}
U_t&=R_t+\gammaU_{t+1}\
&=R_t+\gammaR_{t+1}+\gamma^2U_{t+2}\
…\
&=\sum_{i=0}{m-1}\gammaiR_{t+i}+\gamma^m*U_{t+m}
\end{aligned}
$$
7.3.1 m-step TD target for Sarsa:
y t = ∑ i = 0 m − 1 γ i ∗ r t + i + γ m ∗ Q π ( s t + m , a t + m ) (当 m = 1 时,就是标准的 T D t a r g e t ) y_t=\sum_{i=0}^{m-1}\gamma^i*r_{t+i}+\gamma^m*Q_\pi(s_{t+m},a_{t+m})(当 m=1 时,就是标准的 TD target) yt=i=0∑m−1γi∗rt+i+γm∗Qπ(st+m,at+m)(当m=1时,就是标准的TDtarget)
7.3.2 one-step TD target for Sarsa
y t = r t + γ ∗ Q π ( s t + 1 , a t + 1 ) y_t=r_t+\gamma*Q_\pi(s_{t+1},a_{t+1}) yt=rt+γ∗Qπ(st+1,at+1)
7.3.3 m-step TD target for Q-Learning
y t = ∑ i = 0 m − 1 γ i ∗ r t + i + γ m ∗ max a Q ⋆ ( s t + m , a ) (当 m = 1 时,就是标准的 T D t a r g e t ) y_t=\sum_{i=0}^{m-1}\gamma^i*r_{t+i}+\gamma^m*\max_a Q^\star(s_{t+m},a)(当 m=1 时,就是标准的 TD target) yt=i=0∑m−1γi∗rt+i+γm∗amaxQ⋆(st+m,a)(当m=1时,就是标准的TDtarget)
r t + i r_{t+i} rt+i 是多步折扣公式中 R t + i R_{t+i} Rt+i 的观测值, max a Q ⋆ ( s t + m , a ) \max_a Q^\star(s_{t+m},a) maxaQ⋆(st+m,a) 是多步折扣公式中 U t + m U_{t+m} Ut+m 的期望
7.3.4 one-step TD target for Q-Learning
y t = r t + γ ∗ max a Q ⋆ ( s t + 1 , a ) y_t=r_t+\gamma*\max_a Q^\star(s_{t+1},a) yt=rt+γ∗amaxQ⋆(st+1,a)
m 是超参,需要调整,如果 m 大小合适,则多步会比一步的表现更好
多步的 TD target 可以让 TD Learning 的效果变得更好
8. Experience Replay(经验回放)
8.1 原始 TD 算法的缺点
原始的 TD 算法的实现中,将用于训练的四元组 ( s t , a t , r t , s t + 1 ) (s_t,a_t,r_t,s_{t+1}) (st,at,rt,st+1) 训练完一轮之后就丢弃掉了,找到 w w w,使得 L ( w ) L(w) L(w) 尽量小。 L ( w ) = 1 T ∑ t = 1 T δ t 2 2 L(w)=\frac{1}{T}\sum_{t=1}^{T}\frac{\delta_t^2}{2} L(w)=T1∑t=1T2δt2.
经验:从开始到结束所有的 transition
原始的 TD 算法缺点
-
用完一个 transition 之后就丢弃掉了,会造成对经验的浪费。
这些经验是可以被重复利用的,因此可以使用经验回放来改进
-
相邻两条 transition 之间有很强的相关性,这种相关性是有害的。
若把序列打散,消除相关性,则有利于将 DQN 训练的更好
8.2 经验回放
经验回放可以克服这个缺点,既可以重复利用经验,避免浪费,也可以把序列打散,消除相关性
将最新的 transition 存放到一个队列中(Replay Buffer),队列容量为 n,队列存满之后,再继续往进存时,需要删除最老的一条 transition。n 是一个超参数,通常设置在 1 0 5 ∼ 1 0 6 10^5\sim 10^6 105∼106,n 的设置取决于具体应用。
DQN 的目标函数为 L ( w ) = 1 T ∑ t = 1 T δ t 2 2 L(w)=\frac{1}{T}\sum_{t=1}^{T}\frac{\delta_t^2}{2} L(w)=T1∑t=1T2δt2.
训练过程
使用随机梯度下降(SGD)最小化 L ( w ) L(w) L(w)
-
每次从队列中随机抽取一个 transition, ( s i , a i , r i , s i + 1 ) (s_i,a_i,r_i,s_{i+1}) (si,ai,ri,si+1)
-
计算 TD error, δ i \delta_i δi
-
计算随机梯度: g i = ∂ δ i 2 / 2 ∂ w = δ i ⋅ ∂ Q ( s i , a i ; w ) ∂ w g_i=\frac{\partial \delta_i^2/2}{\partial w}=\delta_i \cdot \frac{\partial Q(s_i,a_i;w)}{\partial w} gi=∂w∂δi2/2=δi⋅∂w∂Q(si,ai;w)
-
参数更新: w ← w − α ⋅ g i w\leftarrow w-\alpha \cdot g_i w←w−α⋅gi
这里只用了一个 transition 来更新 w,实践中通常使用 mini batch SGD,每次随机抽取多个 transition,算出多个随机梯度,用梯度的平均来更新 w
8.3 对经验回放的改进
**Prioritized Experience Replay(优先经验回放)**是对经验回放改进中的一种,用非均匀抽样代替均匀抽样。
-
buffer 中有很多 transition,但它们的重要性不一样。可以用 TD error 来判断 transition 的重要性, ∣ δ t ∣ |\delta_t| ∣δt∣ 越大,transition 越重要,transiton 被抽样的概率越大。
- p t ∝ ∣ δ t ∣ + ϵ p_t\propto |\delta_t| + \epsilon pt∝∣δt∣+ϵ
- p t ∝ 1 r a n k ( t ) p_t\propto \frac{1}{rank(t)} pt∝rank(t)1
-
若是均匀抽样,所有的 transition 都应该有相同的学习率,若是非均匀抽样,应根据抽样概率来调整学习率。若一条 transition 有较大的抽样概率,那么应该将学习率设置的小一些。用 ( n ⋅ p t ) − β (n\cdot p_t)^{-\beta} (n⋅pt)−β 来缩放学习率, β ∈ ( 0 , 1 ) \beta \in(0,1) β∈(0,1) (均匀抽样时, p 1 = p 2 = . . . = p n = 1 n p_1=p_2=...=p_n=\frac{1}{n} p1=p2=...=pn=n1)。
β \beta β 是超参,建议一开始让它小一点,逐渐增长到 1
一条 transition 越重要,抽样概率越大,用小的学习率抵消大抽样概率造成的偏差
-
要实现优先经验回放,需要给每条 transition 标上 δ t \delta_t δt,决定了这条数据的重要性,若一条 transition 刚刚收集到,还没用来训练,不知道 δ t \delta_t δt,那么就直接设置为最大值,即最高的优先级。
每次使用 transtion 都要重新计算 δ t \delta_t δt,并更新它